Um Guia para JGit
1. Introdução
O JGit é uma implementação de biblioteca Java leve e pura do sistema de controle de versão Git - incluindo rotinas de acesso ao repositório, protocolos de rede e algoritmos principais de controle de versão.
O JGit é uma implementação relativamente completa do Git, escrita em Java e é amplamente usada na comunidade Java. O projeto JGit está sob o guarda-chuva do Eclipse e seu início pode ser encontrado emJGit.
Neste tutorial, explicaremos como trabalhar com isso.
2. Começando
Existem várias maneiras de conectar seu projeto ao JGit e começar a escrever o código. Provavelmente, a maneira mais fácil é usar o Maven - a integração é realizada adicionando o seguinte snippet à tag<dependencies> em nosso arquivopom.xml:
org.eclipse.jgit
org.eclipse.jgit
4.6.0.201612231935-r
VisiteMaven Central repository para obter a versão mais recente do JGit. Assim que esta etapa for concluída, o Maven irá adquirir e usar automaticamente as bibliotecas JGit de que precisaremos.
Se você preferir pacotes configuráveis OSGi, também há um repositório p2. VisiteEclipse JGit para obter as informações necessárias sobre como integrar esta biblioteca.
3. Criando um Repositório
JGit possui dois níveis básicos de API:plumbingeporcelain. A terminologia para isso vem do próprio Git. O JGit é dividido nas mesmas áreas:
-
APIsporcelain - front-end para ações comuns no nível do usuário (semelhante à ferramenta de linha de comando Git)
-
APIsplumbing - interação direta com objetos de repositório de baixo nível
O ponto de partida para a maioria das sessões JGit está na classeRepository. A primeira coisa que faremos é a criação de uma nova instânciaRepository.
O comandoinit nos permitirá criar um repositório vazio:
Git git = Git.init().setDirectory("/path/to/repo").call();
Isso criará um repositório com um diretório de trabalho no local fornecido asetDirectory().
Um repositório existente pode ser clonado com o comandocloneRepository:
Git git = Git.cloneRepository()
.setURI("https://github.com/eclipse/jgit.git")
.setDirectory("/path/to/repo")
.call();
O código acima clonará o repositório JGit no diretório local denominadopath/to/repo.
4. Objetos Git
Todos os objetos são representados por um ID SHA-1 no modelo de objeto Git. No JGit, isso é representado pelas classesAnyObjectIdeObjectId.
Existem quatro tipos de objetos no modelo de objeto Git:
-
blob - usado para armazenar dados de arquivo
-
tree - um diretório; faz referência a outrostreeseblobs
-
commit - aponta para uma única árvore
-
tag - marca um commit como especial; geralmente usado para marcar lançamentos específicos
Para resolver um objeto de um repositório, simplesmente passe a revisão correta como na seguinte função:
ObjectId head = repository.resolve("HEAD");
4.1. Ref
ORef é uma variável que contém um único identificador de objeto. O identificador de objeto pode ser qualquer objeto Git válido (blob,tree,commit,tag).
Por exemplo, para consultar a referência ao cabeçalho, você pode simplesmente chamar:
Ref HEAD = repository.getRef("refs/heads/master");
4.2. RevWalk
ORevWalk percorre um gráfico de commit e produz os commits correspondentes na ordem:
RevWalk walk = new RevWalk(repository);
4.3. RevCommit
ORevCommit representa um commit no modelo de objeto Git. Para analisar um commit, use uma instânciaRevWalk:
RevWalk walk = new RevWalk(repository);
RevCommit commit = walk.parseCommit(objectIdOfCommit);
4.4. RevTag
ORevTag representa uma tag no modelo de objeto Git. Você pode usar uma instânciaRevWalk para analisar uma tag:
RevWalk walk = new RevWalk(repository);
RevTag tag = walk.parseTag(objectIdOfTag);
4.5. RevTree
ORevTree representa uma árvore no modelo de objeto Git. Uma instânciaRevWalk também é usada para analisar uma árvore:
RevWalk walk = new RevWalk(repository);
RevTree tree = walk.parseTree(objectIdOfTree);
5. API de porcelana
Enquanto JGit contém muitos códigos de baixo nível para trabalhar com repositórios Git, ele também contém uma API de alto nível que imita alguns dos comandos Gitporcelain no pacoteorg.eclipse.jgit.api.
5.1. AddCommand (git-add)
OAddCommand permite que você adicione arquivos ao índice por meio de:
-
addFilepattern ()
Aqui está um exemplo rápido de como adicionar um conjunto de arquivos ao índice usando a APIporcelain:
Git git = new Git(db);
AddCommand add = git.add();
add.addFilepattern("someDirectory").call();
5.2. CommitCommand (git-commit)
OCommitCommand permite que você execute commits e tem as seguintes opções disponíveis:
-
setAuthor ()
-
setCommitter ()
-
setAll ()
Aqui está um exemplo rápido de como se comprometer usando a APIporcelain:
Git git = new Git(db);
CommitCommand commit = git.commit();
commit.setMessage("initial commit").call();
5.3. TagCommand (git-tag)
OTagCommand suporta uma variedade de opções de marcação:
-
setName ()
-
setMessage ()
-
setTagger ()
-
setObjectId ()
-
setForceUpdate ()
-
setSigned ()
Aqui está um exemplo rápido de marcação de um commit usando a APIporcelain:
Git git = new Git(db);
RevCommit commit = git.commit().setMessage("initial commit").call();
RevTag tag = git.tag().setName("tag").call();
5.4. LogCommand (git-log)
OLogCommand permite que você percorra facilmente um gráfico de confirmação.
-
adicionar (AnyObjectId start)
-
addRange (AnyObjectId desde, AnyObjectId até)
Aqui está um exemplo rápido de como obter algumas mensagens de registro:
Git git = new Git(db);
Iterable log = git.log().call();
6. Ant Tasks
O JGit também possui algumas tarefas Ant comuns contidas no pacoteorg.eclipse.jgit.ant.
Para usar essas tarefas:
Isso forneceria as tarefasgit-clone, git-initegit-checkout.
6.1. git-clone
Os seguintes atributos são necessários:
-
uri: o URI do qual clonar
Os seguintes atributos são opcionais:
-
dest: o destino para clonar (o padrão é usar um nome de diretório legível com base no último componente do caminho deURI)
-
bare:true /false /yes /no para indicar se o repositório clonado deve estar vazio ou não (o padrão éfalse)
-
branch: o branch inicial a ser verificado ao clonar o repositório (o padrão éHEAD)
6.2. git-init
Nenhum atributo é necessário para executar a tarefagit-init.
Os seguintes atributos são opcionais:
-
dest: o caminho onde um repositório git é inicializado (o padrão é$GIT_DIR ou o diretório atual)
-
bare:true /false /yes /no para indicar se o repositório deve estar vazio ou não (o padrão éfalse)
6.3. git-checkout
Os seguintes atributos são necessários:
-
src: o caminho para o repositório git
-
branch: o branch inicial para checkout
Os seguintes atributos são opcionais:
-
createbranch:true /false /yes /no para indicar se o ramo deve ser criado se ainda não existir (o padrão éfalse)
-
force:true /false /yes /no: setrue /yes e a ramificação com o nome fornecido já existir, o ponto inicial de uma ramificação existente será definido como um novo ponto inicial; sefalse, o branch existente não será alterado (o padrão éfalse)
7. Conclusão
A API JGit de alto nível não é difícil de entender. Se você souber qual comando git usar, poderá adivinhar facilmente quais classes e métodos usar no JGit.
Há uma coleção de snippets de código JGit prontos para execução disponíveishere.
Se você ainda tiver dificuldades ou perguntas, deixe um comentário aqui ou peça ajuda aJGit community.