java - JGit y encontrar la cabeza
scala (4)
En aras de la integridad, aquí hay un ejemplo completamente funcional de cómo obtener el hash para la confirmación HEAD:
public String getHeadName(Repository repo) {
String result = null;
try {
ObjectId id = repo.resolve(Constants.HEAD);
result = id.getName();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
Estoy tratando de poner mis manos en el HEAD commit con JGit:
val builder = new FileRepositoryBuilder()
val repo = builder.setGitDir(new File("/www/test-repo"))
.readEnvironment()
.findGitDir()
.build()
val walk: RevWalk = new RevWalk(repo, 100)
val head: ObjectId = repo.resolve(Constants.HEAD)
val headCommit: RevCommit = walk.parseCommit(head)
Encuentro que abre el repositorio bien, pero el valor principal se establece en null
. Me pregunto por qué no puede encontrar HEAD.
Estoy leyendo esta documentación: http://wiki.eclipse.org/JGit/User_Guide
El repositorio se construye tal como lo dice el documento, y el RevWalk
también. Estoy usando la última versión de JGit que es 2.0.0.201206130900-r
de http://download.eclipse.org/jgit/maven .
Mi pregunta: ¿qué necesito cambiar en mi código para que JGit devuelva instancias reales de RevCommit
lugar de null
como hace ahora?
Actualización: Este código:
val git = new Git(repo)
val logs: Iterable[RevCommit] = git.log().call().asInstanceOf[Iterable[RevCommit]]
Me da esta excepción: No HEAD exists and no explicit starting revision was specified
La excepción es impar, porque un simple git rev-parse HEAD
me dice 0b0e8bf2cae9201f30833d93cc248986276a4d75
, lo que significa que hay una HEAD en el repositorio. He probado diferentes repositorios, el mio y de otras personas.
Para mí (usando 4.5.0.201609210915-r) la solución fue usar solo RepositoryBuilder
lugar de FileRepositoryBuilder
. Hasta que hice este cambio todos los métodos volvían a ser null
.
rb = new org.eclipse.jgit.lib.RepositoryBuilder()
.readEnvironment()
.findGitDir()
.build();
headRef = rb.getRef(rb.getFullBranch());
headHash = headRef.getObjectId().name();
También puede usar val git: Git = Git.open( new File( "/www/test-repo" ) )
. JGit luego escaneará la carpeta dada para el meta directorio de git (generalmente .git
). Si no encuentra esta carpeta, se lanzará una IOException
.
setGitDir
llamar al directorio de metadatos de Git (probablemente /www/test-repo/.git
) cuando llame a setGitDir
, no al directorio de trabajo ( /www/test-repo
).
Debo admitir que no estoy seguro de lo que se supone que debe hacer findGitDir
, pero me he topado con este problema antes y especificé el directorio .git
funcionó.