Git: gráfico / list de dependencia entre sucursales

A veces tengo algunas twigs de características relacionadas, con algunas basadas en otras, como

o feature-B / / o--o feature-A / / master o \ o feature-C 

Me gustaría mostrar un gráfico que muestre qué twigs dependen de cada una de ellas, pero me cuesta mucho get el git log --graph para get lo que quiero.

Lo siguiente no muestra las relaciones entre las twigs.

 $ git log --graph --format='%h%d' ^master feature-{A,B,C} * 801ecee208 (HEAD -> feature-B) * e568acd804 (feature-A) * f49ecc9e28 * a42d73d4bc (feature-C) 

Cambiar ^master por ^master~ mejora las cosas, pero me obliga a include un compromiso anterior que no me importa ( origin/some-earlier-branch ).

 $ git log --graph --format='%h%d' ^master~ feature-{A,B,C} * 801ecee208 (HEAD -> feature-B) * e568acd804 (feature-A) * f49ecc9e28 | * a42d73d4bc (feature-C) |/ * 67cf54dd0e (master) * 40b72ecc6a (origin/some-earlier-branch) 

Eso está muy cerca de lo que quiero, aunque sería bueno omitir esa última línea.

Lo que realmente estoy tratando de conseguir es una especie de listdo manifiesto de qué twigs dependen de qué otras twigs. Algo como

 feature-A -> master feature-B -> feature-A feature-C -> master 

entonces puedo generar un gráfico gráfico de las dependencies.

Estas no son en realidad dependencies (aunque eso probablemente no sea importante para su propósito).

Considere esta breve variante, por ejemplo:

  o <-- foo / o / o <-- master 

Ahora usamos git branch bar foo~1 para agregar una bar tags de twig:

  o <-- foo / o <-- bar / o <-- master 

Parece extraño decir que foo "depende de" la bar cuando la bar puede parpadear y desaparecer en cualquier momento. Lo que necesita en su lugar, esto le informará a su pensamiento cuando vaya a build su gráfico, es tratar esto como "las acciones de foo comparten compromisos con la bar ". Es decir, lo que querrá aquí es hacer una list de confirmaciones y sus ID principales, luego correlacionar las distintas ID. Si se puede acceder a alguna ID desde una twig, las sugerencias A, B y C, esa confirmación comparte su razón de existir con esos tres nombres de twig.

Ahora solo necesita generar dos lists:

  • la identificación hash de cada sugerencia de twig, y
  • la identificación hash de cada confirmación alcanzable desde cada sugerencia de sucursal, excluyendo todas las confirmaciones accesibles desde cualquier nombre que desee excluir (como el master )

que esto, por ejemplo, debería hacer (no lo he probado):

 for name in $names; do echo $name $(git rev-parse $name) done echo -- git rev-list --parents $names --not $exclude 

El primer set de líneas, hasta el -- , le proporciona asignaciones de nombre a ID para las sugerencias de twigs (suponiendo, por supuesto, que todos los nombres en $names son válidos). El segundo set de líneas, después de EOF, le proporciona identificadores de compromiso seguidos de los ID de todos los padres de ese compromiso (uno para los commits regulares, dos o más para los commits de fusión, y no hay padres para los commits de root). El --not $exclude se asegura de que no se llegue a ninguna confirmación desde la list de nombres en $exclude .

Tenga en count que los nombres de varias sucursales pueden apuntar a una única confirmación de sugerencia de bifurcación, y si todas las sugerencias de bifurcación están "en o detrás" de la (s) exclusión (es), la segunda list de ID-sets puede estar vacía.