Inicio > Comandos Linux, Git, Java > JGit usando Git desde Java – Parte 1

JGit usando Git desde Java – Parte 1

27 noviembre, 2012 Deja un comentario Go to comments

En un anterior post estuve hablando de GIT, que es un sistema de gestión de versiones en fuerte competencia con SVN. El principio de versiones es el mismo, pero muchos conceptos son diferentes. Sino estan familiarizados, ver aquí para la pequeña introducción.

Hoy quiero compatirles una API que pude conocer en el trabajo por una misión que me encargaron. Se trata de JGit, que en grandes rasgos vamos a describir como Java para usar Git. El objetivo de mi misión era de poder explotar un deposito GIT desde un batch para recuperar ciertas informaciones. Lo interesante de esta API es que puedes ejecutar los mismos comandos básicos de git, como un git log, git commit, etc, vía codigo Java. Este post lo voy a dividir en dos partes. Aquí una primera pequeña guía de como utilizar este API.

Instanciar el depósito à partir de la copia local

Supongamos que tenemos ya en nuestra máquina un clon de un depósito remoto en Git. En este ejemplo me voy a basar en el depósito de EGit. Si quieren clonarlo, así procedemos:

joan@jomaora:workspace$ git clone https://git.eclipse.org/r/p/egit/egit.git
Cloning into 'egit'...
remote: Counting objects: 42047, done
remote: Finding sources: 100% (42047/42047)
remote: Total 42047 (delta 18399), reused 36312 (delta 18399)
Receiving objects: 100% (42047/42047), 31.71 MiB | 726 KiB/s, done.
Resolving deltas: 100% (18399/18399), done.

Ahora miremos ciertas informaciones generales del depósito.

joan@jomaora:~/workspace/egit$ git branch --remote
origin/HEAD -> origin/master
origin/master
origin/stable-0.10
origin/stable-0.11
origin/stable-0.12
origin/stable-0.7
origin/stable-0.8
origin/stable-0.9
origin/stable-1.0
origin/stable-1.1
origin/stable-1.2
origin/stable-1.3
origin/stable-2.0
origin/stable-2.1
joan@jomaora:~/workspace/egit$ git branch
* master
joan@jomaora:~/workspace/egit$ git checkout stable-2.0
Branch stable-2.0 set up to track remote branch stable-2.0 from origin.
Switched to a new branch 'stable-2.0'
joan@jomaora:~/workspace/egit$ git branch
master
* stable-2.0

Pudimos listar todas las branch remotas, luego ver las branch que tenemos en el clon local, y finalmente se hizo un checkout de la branch 2.0, a la que apuntamos actualmente. El clon se encuentra en la carpeta /home/joan/workspace/egit. Para inicializar el clon usando JGit debemos hacer lo siguiente:

FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repository = builder.setGitDir(new File("/home/joan/workspace/egit/.git"))
.readEnvironment()
.findGitDir()
.build();

La clase Repository va contener la información correspondiente al clon, tanto información remota como local, todo esto a partir del archivo .git, del que hablé en el post anterior. Ahora empecemos a hacer una inspección al clon a partir de Java:

  • Mostrar informaciones generales del clon y del déposito:

Config storedConfig = repository.getConfig();
System.out.println("\n***** Config file *****");
System.out.println(storedConfig.toText());

***** Config file *****
 [core]
 _____repositoryformatversion = 0
 _____filemode = true
 _____bare = false
 _____gallrefupdates = true
 [remote "origin"]
 _____fetch = +refs/heads/*:refs/remotes/origin/*
 _____url = https://git.eclipse.org/r/p/egit/egit.git
 master
 _____remote = origin
 _____merge = refs/heads/master
 stable-2.0
 _____remote = origin
 _____merge = refs/heads/stable-2.0

  • Ver la branch actual en la que se encuentra el clon

System.out.println(repository.getBranch());
System.out.println(repository.getFullBranch());

stable-2.0
refs/heads/stable-2.0
  • git branch

Podemos explotar la información del objeto storedConfig, al cual podemos interrogar sobre 4 subsecciones : core, remote, branch y user. En este caso la que nos interesa en branch:

Set<String> branches = storedConfig.getSubsections("branch");
for (String branchName : branches) {
_____System.out.println(branchName);
}

master
stable-2.0
  • git branch –remote

for(String s :repository.getAllRefs().keySet()){
_____System.out.println(repository.getAllRefs().get(s).getName());
}

HEAD
refs/heads/master
refs/heads/stable-2.0
refs/remotes/origin/HEAD
refs/remotes/origin/master
refs/remotes/origin/stable-0.10
refs/remotes/origin/stable-0.11
refs/remotes/origin/stable-0.12
refs/remotes/origin/stable-0.7
refs/remotes/origin/stable-0.8
refs/remotes/origin/stable-0.9
refs/remotes/origin/stable-1.0
refs/remotes/origin/stable-1.1
refs/remotes/origin/stable-1.2
refs/remotes/origin/stable-1.3
refs/remotes/origin/stable-2.0
refs/remotes/origin/stable-2.1
refs/tags/spearce-gpg-pub
refs/tags/v0.10.1
refs/tags/v0.11.1
refs/tags/v0.11.3
refs/tags/v0.12.1
refs/tags/v0.7.0
refs/tags/v0.7.1
refs/tags/v0.8.1
refs/tags/v0.8.4
refs/tags/v0.9.1
refs/tags/v0.9.3
refs/tags/v1.0.0.201106011211-rc3
refs/tags/v1.0.0.201106051725-r
refs/tags/v1.0.0.201106071701-r
refs/tags/v1.0.0.201106081625-r
refs/tags/v1.0.0.201106090707-r
refs/tags/v1.1.0.201109011030-rc2
refs/tags/v1.1.0.201109071825-rc3
refs/tags/v1.1.0.201109151100-r
refs/tags/v1.2.0.201112221803-r
refs/tags/v1.3.0.201202121842-rc4
refs/tags/v1.3.0.201202151440-r
refs/tags/v2.0.0.201205301645-rc2
refs/tags/v2.0.0.201206060730-rc3
refs/tags/v2.0.0.201206130900-r
refs/tags/v2.1.0.201209190230-r

Inspeccion de los archivos del clon

Otra cosa interesante que podemos hacer, es tener acceso al sistema de archivos que hacen parte del clon. A grandes rasgos, JGit permite de hacer un ls sobre el directorio del clon. Desde un terminal tendriamos:

En Jgit, el principio es simple. El objeto Repository tiene un método getWorkTree() que devuleve un objeto File estándar de java.io, y el que podemos explotar de manera convencional:

System.out.println("\n***** Working copy *****");
File root = repository.getWorkTree();
System.out.println(root.getName());

System.out.println("\n***** Archivos *****");
for(File f : root.listFiles()){
_____System.out.println(f.getName());
}

***** Working copy *****
 egit
***** Archivos *****
 org.eclipse.egit
 org.eclipse.egit.core
 org.eclipse.egit.repository
 EGIT_INSTALL
 .eclipse_iplog
 egit.psf
 org.eclipse.egit.psf-feature
 org.eclipse.egit.target
 .gitattributes
 org.eclipse.egit.mylyn.ui
 org.eclipse.egit.import-feature
 org.eclipse.egit.core.test
 SUBMITTING_PATCHES
 pom.xml
 org.eclipse.egit.ui.test
 org.eclipse.egit-feature
 LICENSE
 .git
 org.eclipse.egit.mylyn.ui.test
 tools
 .gitignore
 org.eclipse.egit.ui
 org.eclipse.egit.source-feature
 org.eclipse.egit.import
 README
 org.eclipse.egit.doc
 org.eclipse.egit.mylyn-feature
Categorías:Comandos Linux, Git, Java Etiquetas: , , ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Hype Driven Development

coz' geeks love new stuff !

My experiments with SCRUM

Site to discuss Agile (Scrum, XP, etc) concepts and ideas.

CommitStrip

Mi propia cheatsheet...

Chris Aniszczyk's (zx) diatribe

work. life. open source. diatribes.

GermanTrevi

repositorio de mi mente...

A %d blogueros les gusta esto: