¿Cómo puedo encontrar la primera confirmación de una rama con JGit?

2 minutos de lectura

avatar de usuario
El artesano

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 anothervas 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.

  • Oh, está bien, esto tiene mucho sentido. Gracias por tomarte el tiempo para responder 🙂

    – El artesano

    29 de octubre de 2019 a las 8:09

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.

  • No, me refería al primer compromiso que se comprometió con la rama. El origen/raíz de esta rama.

    – El artesano

    17 de octubre de 2019 a las 7:08

  • Ah, leí mal el ‘gráfico de compromiso’: actualizaré mi respuesta en consecuencia.

    – Rudiger Herrmann

    17 de octubre de 2019 a las 7:15

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad