2011-12-21 23 views
18

Con git describe puede obtener el número de confirmaciones desde la última etiqueta. Si solo tenía la etiqueta y el número de confirmaciones, ¿cuál es la mejor manera de mostrar la confirmación que se describió?Cómo mostrar la confirmación de git utilizando el número de confirmaciones desde una etiqueta

Sé que podría usar git log tag.. y conectarlo a un script que hace el conteo, pero esperaba una solución más elegante similar a git show tag~n.

Para añadir más contexto, estamos planeando usar git describe para crear números de liberación, por ejemplo, con

$ git describe 
v1.5-39-g5ede964 

usaríamos foo_1.5.39. Lo que nos gustaría hacer es saber que 1.5.39 significa el compromiso número 39 después de la etiqueta v1.5, encontrar ese compromiso, es decir, encontrar g5ede964. Como se señala en un comentario, la 39ª confirmación después de la v1.5 puede no ser única. Entonces, quizás una mejor forma de preguntar esto es cuál es la mejor manera de encontrar todos los commits X de manera que si HEAD apuntaba a X git describe devolvería v1.5-39-*****.

+2

Puede hacer 'git show tag ~ n' para mostrar la n-ésima confirmación antes de esa etiqueta. Tal vez estoy malinterpretando algo ... – knittl

+0

Creo que avanzar desde la etiqueta no es posible. Cada confirmación (excepto la inicial) en git tiene al menos un padre, por lo que puede retroceder por confirmaciones. Por otro lado, este commit etiquetado (como cualquier otro commit) podría ser un padre de más de un commit y no tiene ninguna referencia a sus hijos, por lo que la única forma en que puede moverse es de hijos a padres y no viceversa . –

+0

@ KL-7 Gracias, eso tiene sentido. Agregué más contexto a mi pregunta sobre lo que estamos tratando de lograr. Basado en su punto de que los padres no hacen referencia a los niños, supongo que no hay forma de hacerlo. En ese caso, si agrega esto como respuesta, lo aceptaré. – Joel

Respuesta

4

Lo que estamos pidiendo es imposible en el caso general. El número de confirmaciones por sí solo no puede decirle nada si hay alguna fusión en su historial.

Por ejemplo, dada la siguiente estructura repo:

a - b - c - d - h 
    \   /
    e - f - g 

Con una etiqueta de poner en a, las salidas de git describe d y git describe g son idénticos salvo por el SHA1:

> git describe d 
tag-3-ge8dca33 
> git describe g 
tag-3-g4fecc2e 

Dicho esto, Si no tiene una gran cantidad de ramas paralelas funcionando a la vez, entonces podrá resolver un determinado número de confirmación en una sola confirmación, pero si tiene una sola rama lateral activa en el momento de su etiqueta, entonces esta puede que no funcione.

Si necesita números de versión confiables, debe atenerse a las etiquetas explícitas.

+0

Consulte la respuesta de @Sam –

2

Puede:

git log --oneline tag.. | wc -l 

esto le dará el número de confirmaciones

+1

Pero quiero la enésima confirmación desde una etiqueta, no el número de confirmaciones desde una etiqueta. Básicamente, el inverso de git describe. – Joel

+3

No use 'git log' para scripts, use' git rev-list' en su lugar – knittl

+1

@knittl, ¿podría agregar algún detalle a esa idea? ¿Por qué favorecer '' rev-list'' sobre '' log''? Estoy en una situación en la que el scripting con '' log'' parece ser el camino a seguir, y me gustaría seguir las mejores prácticas. –

19

Trate

git rev-list tag..HEAD --count 

O

git rev-list tag.. --count 

que significan la misma cosa.

10

Si usted está buscando el número de confirmaciones desde la última etiqueta, los siguientes trabajó para mí

git rev-list `git rev-list --tags --no-walk --max-count=1`..HEAD --count 
0

Como se explica Kevin's answer, esto no es generalmente posible. Para resolver el problema en casos especiales, mencionó:

Dicho esto, si no tiene un montón de ramas paralelas funcionando a la vez, entonces podrá resolver un número de confirmación dado de nuevo a una sola confirmar, pero si tiene incluso una sola rama lateral activa en el momento de su etiqueta, es posible que esto no funcione.

puede utilizar el siguiente comando (con n siendo el número de confirmaciones ya que la etiqueta)

git rev-list tag..HEAD --reverse | awk NR==n 
0

¿cuál es la mejor manera de encontrar todos los envíos X tal que si HEAD estaba apuntando a X git describe devolvería v1.5-39-*****

sigue siendo la pregunta incorrecta. La pregunta correcta es

cómo encontrar todas las confirmaciones X tal que si la cabeza estaba apuntando a X una ordinaria git describepodría jamás han regresadov1.5-39-*****

y no es tan fácil de responder a eso. Sin embargo, la acción del enemigo ausente este procedimiento mostrará una lista de la derecha cometer tal vez entre algunas otras posibilidades:

ancestor=v1.5 n=39 
git rev-list --all --reverse --topo-order --parents --ancestry-path ^$ancestor \ 
| awk ' function minmore(  i) { 
       for (i=2; i <= NF; ++i) 
         if (gen[$i] > gen[$1]) 
           gen[$1]=gen[$i] 
       return ++gen[$1] 
     } 
     minmore()<=n { 
       print "[[ $(git rev-list --count "ancestor".."$1") == "n" ]] &&" 
       print "   git describe --match="ancestor" "$1 } 
     ' ancestor=$ancestor n=$n \ 
# | sh # lose the first `#` here to actually run the generated checks 

La razón de la incertidumbre y la complejidad es que git describe está tratando de conseguir una base razonable, por lo que (ver its docs) se Escogerá las etiquetas actuales más cercanas que pueda ver, y contará cuántas confirmaciones adicionales hay en la historia descrita, y generará un apodo de esa manera. Por ejemplo, las nuevas etiquetas pueden cambiar su base preferida de modo que un git describe desnudo ya no generaría ese apodo; y aunque los de SHA son inmutables, las referencias se pueden reescribir.

Cuestiones relacionadas