Quiero encontrar la primera confirmación para una rama específica, usando la biblioteca JGit de Eclipse. por ejemplo si tengo
master -- a -- c -- d -- e
\
feature b -- f -- g -- h
\
another j -- k -- l
// findBranchRoot() is the magic method we want to create
repository.resolve("feature").findBranchRoot().getId(); // this would return b
repository.resolve("another").findBranchRoot().getId(); // this would return j
¿Alguien sabe cómo hacer eso?
El problema que vas a tener es que, y tengan paciencia conmigo, las confirmaciones no están “en” las ramas. Para ver esto, considera el gráfico que dibujaste. Es ambiguo. Inevitablemente así. Tu dibujaste
A---C---D---E master
\
B---F---G---H feature
\
J---k---L another
y simplemente no hay manera de determinar si B
se hizo “sobre” feature
o another
(o, para el caso, cuál de los tres A
se hizo “encendido”).
A---C---D---E master
\
B---J---K---L another
\
F---G---H feature
espectáculos exactamente la misma historia Todo depende de cómo elijas interpretarlo.
Si desea vincular una confirmación a algún registro administrativo externo, coloque un marcador en el mensaje de confirmación, eso lo hará, pero en Git en sí (y en el trabajo real) lo que importa es la estructura de la historia, no cómo partes de ella se hace referencia en este informe o aquél.
Si llega el momento de publicar feature
o another
vas a necesitar empujar la confirmación B
de cualquier manera, a menos que ya haya sido empujado como parte de algún otro trabajo. La ascendencia importa. Los nombres de las sucursales no.
Si primer compromiso significa el compromiso más reciente/más joven de una rama, puede usar el ObjectId
devuelto por Repository::resolve
para obtener el RevCommit
(representación de JGit de un objeto de confirmación) con un RevWalk
:
ObjectId commitId = repository.resolve("refs/heads/feature");
try(RevWalk revWalk = new RevWalk(repository)) {
RevCommit commit = revWalk.parseCommit(commitId);
}
Recomiendo pasar el árbitro completamente calificado a resolve
(como en el ejemplo). De lo contrario, es probable que obtenga un AmbiguousObjectException
o el método devuelve una nota o etiqueta del mismo nombre abreviado.