Una guía para JGit

1. Introducción

JGit es una implementación de biblioteca Java pura y liviana del sistema de control de versiones de Git, que incluye rutinas de acceso al repositorio, protocolos de red y algoritmos de control de versiones centrales.

JGit es una implementación relativamente completa de Git escrita en Java y se usa ampliamente en la comunidad Java. El proyecto JGit está bajo el paraguas de Eclipse, y su hogar se puede encontrar en JGit.

En este tutorial, explicaremos cómo trabajar con él.

2. Comenzando

Hay varias formas de conectar su proyecto con JGit y comenzar a escribir código. Probablemente la forma más fácil es usar Maven: la integración se logra agregando el siguiente fragmento a laetiqueta en nuestro archivo pom.xml :

 org.eclipse.jgit org.eclipse.jgit 4.6.0.201612231935-r 

Visite el repositorio de Maven Central para obtener la versión más reciente de JGit. Una vez realizado este paso, Maven adquirirá y utilizará automáticamente las bibliotecas JGit que necesitaremos.

Si prefiere los paquetes OSGi, también hay un repositorio p2. Visite Eclipse JGit para obtener la información necesaria sobre cómo integrar esta biblioteca.

3. Creación de un repositorio

JGit tiene dos niveles básicos de API: plomería y porcelana . La terminología para estos proviene del propio Git. JGit se divide en las mismas áreas:

  • API de porcelain : interfaz para acciones comunes a nivel de usuario (similar a la herramienta de línea de comandos de Git)
  • API de plomería : interacción directa con objetos de repositorio de bajo nivel

El punto de partida para la mayoría de las sesiones de JGit es la clase Repository . Lo primero que vamos a hacer es la creación de una nueva instancia de Repository .

El comando init nos permitirá crear un repositorio vacío:

Git git = Git.init().setDirectory("/path/to/repo").call();

Esto creará un repositorio con un directorio de trabajo en la ubicación dada a setDirectory () .

Un repositorio existente se puede clonar con el comando cloneRepository :

Git git = Git.cloneRepository() .setURI("//github.com/eclipse/jgit.git") .setDirectory("/path/to/repo") .call();

El código anterior clonará el repositorio de JGit en el directorio local llamado ruta / a / repo .

4. Objetos de Git

Todos los objetos están representados por una identificación SHA-1 en el modelo de objetos de Git. En JGit, esto está representado por las clases AnyObjectId y ObjectId .

Hay cuatro tipos de objetos en el modelo de objetos de Git:

  • blob : se utiliza para almacenar datos de archivos
  • árbol - un directorio; hace referencia a otros árboles y manchas
  • commit - apunta a un solo árbol
  • etiqueta : marca una confirmación como especial; generalmente utilizado para marcar lanzamientos específicos

Para resolver un objeto de un repositorio, simplemente pase la revisión correcta como en la siguiente función:

ObjectId head = repository.resolve("HEAD");

4.1. Árbitro

La Ref es una variable que contiene un único identificador de objeto. El identificador de objeto puede ser cualquier objeto Git válido ( blob , árbol , confirmación , etiqueta ).

Por ejemplo, para consultar la referencia al encabezado, simplemente puede llamar:

Ref HEAD = repository.getRef("refs/heads/master");

4.2. RevWalk

El RevWalk camina un gráfico cometer y produce los commit coincidentes en orden:

RevWalk walk = new RevWalk(repository);

4.3. RevCommit

El RevCommit representa una confirmación en el modelo de objetos Git. Para analizar una confirmación, use una instancia de RevWalk :

RevWalk walk = new RevWalk(repository); RevCommit commit = walk.parseCommit(objectIdOfCommit);

4.4. RevTag

El RevTag representa una etiqueta en el modelo de objetos Git. Puede utilizar una instancia de RevWalk para analizar una etiqueta:

RevWalk walk = new RevWalk(repository); RevTag tag = walk.parseTag(objectIdOfTag);

4.5. RevTree

El RevTree representa un árbol en el modelo de objetos de Git. Una instancia de RevWalk también se usa para analizar un árbol:

RevWalk walk = new RevWalk(repository); RevTree tree = walk.parseTree(objectIdOfTree);

5. API de porcelana

Si bien JGit contiene una gran cantidad de código de bajo nivel para trabajar con repositorios de Git, también contiene una API de nivel superior que imita algunos de los comandos de porcelana de Git en el paquete org.eclipse.jgit.api .

5.1. AddCommand ( git-add )

El addCommand le permite añadir archivos al índice a través de:

  • addFilepattern ()

Aquí hay un ejemplo rápido de cómo agregar un conjunto de archivos al índice utilizando la API de porcelana :

Git git = new Git(db); AddCommand add = git.add(); add.addFilepattern("someDirectory").call();

5.2. CommitCommand ( git-commit )

El CommitCommand le permite realizar confirmaciones y tiene las siguientes opciones disponibles:

  • setAuthor ()
  • setCommitter ()
  • setAll ()

Aquí hay un ejemplo rápido de cómo comprometerse usando la API de porcelana :

Git git = new Git(db); CommitCommand commit = git.commit(); commit.setMessage("initial commit").call();

5.3. TagCommand ( git-tag )

El TagCommand es compatible con una variedad de opciones de etiquetado:

  • setName ()
  • setMessage ()
  • setTagger ()
  • setObjectId ()
  • setForceUpdate ()
  • setSigned ()

Aquí hay un ejemplo rápido de cómo etiquetar una confirmación con la API de porcelain :

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 )

El LogCommand le permite caminar fácilmente una confirmación gráfica.

  • agregar (inicio de AnyObjectId)
  • addRange (AnyObjectId desde, AnyObjectId hasta)

Aquí hay un ejemplo rápido de cómo obtener algunos mensajes de registro:

Git git = new Git(db); Iterable log = git.log().call();

6. Tareas de hormigas

JGit también tiene algunas tareas Ant comunes contenidas en el paquete org.eclipse.jgit.ant .

Para usar esas tareas:

Esto proporcionaría las tareas git-clone, git-init y git-checkout .

6.1. git-clon

Se requieren los siguientes atributos:

  • uri : el URI para clonar

Los siguientes atributos son opcionales:

  • dest : el destino al que se clona (el valor predeterminado es usar un nombre de directorio legible por humanos basado en el último componente de ruta del URI )
  • desnudo : verdadero / falso / / no para indicar si el repositorio clonado debe estar desnudo o no (el valor predeterminado es falso )
  • rama : la rama inicial para verificar al clonar el repositorio (por defecto es HEAD )

6.2. git-init

No se requieren atributos para ejecutar la tarea git-init .

Los siguientes atributos son opcionales:

  • dest : la ruta donde se inicializa un repositorio de git (por defecto es $ GIT_DIR o el directorio actual)
  • desnudo : verdadero / falso / / no para indicar si el repositorio debe estar vacío o no (el valor predeterminado es falso )

6.3. git-checkout

Se requieren los siguientes atributos:

  • src : la ruta al repositorio de git
  • sucursal : la sucursal inicial para pagar

Los siguientes atributos son opcionales:

  • createbranch : verdadero / falso / / no para indicar si se debe crear la rama si aún no existe (el valor predeterminado es falso )
  • forzar : verdadero / falso / / no : si verdadero / y la rama con el nombre dado ya existe, el punto de inicio de una rama existente se establecerá en un nuevo punto de inicio; si es falso , la rama existente no se cambiará (el valor predeterminado es falso )

7. Conclusión

La API JGit de alto nivel no es difícil de entender. Si sabe qué comando git usar, puede adivinar fácilmente qué clases y métodos usar en JGit.

Hay una colección de fragmentos de código JGit listos para ejecutar disponibles aquí.

Si aún tiene dificultades o preguntas, deje un comentario aquí o solicite ayuda a la comunidad de JGit.