2010-03-04 15 views
40

¿Cómo puedo obtener una lista las etiquetas contenidas por una rama determinada, lo contrario de:etiquetas lista contenida por una rama

git tag --contains <commit> 

cual "sólo etiquetas de lista que contienen la confirmación especificada".

Si algo como esto no existe, ¿cómo pruebo si una confirmación está contenida en otra confirmación para que pueda crear una secuencia de comandos?

que podía hacer esto:

commit=$(git rev-parse $branch) 
for tag in $(git tag) 
do 
    git log --pretty=%H $tag | grep -q -E "^$commit$" 
done 

Pero espero que hay una mejor manera ya que esto podría tardar mucho tiempo en un repositorio con muchas etiquetas y compromete.

+0

Vea [esta respuesta a esta publicación duplicada] (http://stackoverflow.com/a/10603278/11343) para otra buena manera de hacerlo – CharlesB

Respuesta

37

Esto podría estar cerca de lo que quiere:

git log --simplify-by-decoration --decorate --pretty=oneline "$committish" | fgrep 'tag: ' 

embargo, la situación más común es simplemente encontrar la etiqueta más reciente:

git describe --tags --abbrev=0 "$committish" 
  • --tags buscará contra etiquetas ligeros , no lo use si solo desea considerar las etiquetas anotadas.
  • No use --abbrev=0 si también desea ver el sufijo habitual de "número de confirmaciones en la parte superior" y abreviado "hash" (por ejemplo, v1.7.0-17-g7e5eb8).
+1

A partir de Git 1.7.10 no funciona '--pretty = formato:% d' enumera refs sin decir si es una etiqueta o una rama – CharlesB

+1

@CharlesB: Editado para cambiar a 'log'. No lo he dividido correctamente, pero parece que el cambio (¿regresión?) Puede haber ocurrido en 1.7.2: [a7524128] (https://github.com/git/git/commit/a7524128750ebf34fe0639e1e5d7abd03aff0302) cambió la decoración interna texto, pero solo se ajustó una de las funciones de formato para compensar (log-tree.c: show_decoration se ajustó, mientras que pretty.c: format_decoration se marcó con el cambio (involuntario?)). –

+0

Para mí esto da: fatal: ambiguous argument '': revisión desconocida o ruta no en el árbol de trabajo. Use '-' para separar las rutas de las revisiones (versión de Git 1.7.9.5) – rooby

0

git describe (o alguna variante) podría ser lo que estás buscando.

+1

No, 'git describe' solo mostrará una etiqueta/ref. – sleske

11

para enumerar todas las etiquetas accesibles a la rama actual:

git log --decorate=full --simplify-by-decoration --pretty=oneline HEAD | \ 
sed -r -e 's#^[^\(]*\(([^\)]*)\).*$#\1#' \ 
     -e 's#,#\n#g' | \ 
grep 'tag:' | \ 
sed -r -e 's#[[:space:]]*tag:[[:space:]]*##' 
+0

Reemplace 'sed -r' por' sed -E 'en OS X. – CharlesB

+0

Formato de 'git log --decorate = completo --simplificar por decoración --pretty = oneline HEAD' ha cambiado un poco desde que esta respuesta fue redactada – CharlesB

+0

' git log --decorate --oneline | egrep '^ [0-9a-f] + \ (tag:' | sed -r 's /^.+ tag: ([^] +) [, \)]. + $/\ 1/g'' – shkschneider

0

podría utilizar este:

# get tags on the last 100 commits: 
base_rev=master~100 
end_rev=master 
for rev in $(git rev-list $base_rev..$end_rev) 
do 
    git describe --exact-match $rev 2> /dev/null 
done 
+0

Esto solo funciona si su repositorio tiene> 100 confirmaciones y si la etiqueta que necesita es> 100 confirmaciones hace, no tiene suerte. –

0

Hay una git branch --contains (Git desde 1.5.7, por lo menos)

+0

esto ni siquiera remotamente hace lo que se le pide. "Con --contains, muestra solo las ramas que contienen la confirmación nombrada" ... no solicitó las ramas que contienen una confirmación. Pidió etiquetas en una rama. – masukomi

5

No tengo suficiente reputación para comentar las publicaciones de otras personas, pero esto es en respuesta a la respuesta y sus comentarios al https://stackoverflow.com/a/7698213/2598329. Con el fin de mostrar todas las etiquetas accesible en la rama actual, incluyendo la etiqueta en la cabeza de comprometerse, puede utilizar el siguiente:

git log --decorate --oneline | egrep '^[0-9a-f]+ \((HEAD,)?tag: ' | ssed -r 's/^.+tag: ([^ ]+)[,\)].+$/\1/g' 

Una advertencia - utilizo súper sed, por lo que puede que tenga que cambiar mi "ssed" a sed.

Y para el placer de hacerlo, aquí está en PowerShell:

git log --decorate --oneline | % { if ($_ -match "^[0-9a-f]+ \((HEAD,)?tag: ") { echo $_} } | % { $_ -replace "^.+tag: ([^ ]+)[,\)].+$", "`$1" } 

- -a

+1

¿Existe alguna razón por la cual no solo cambies tu respuesta para usar sed en lugar de ver ssed ya que es más probable que sea lo que otros usuarios tengan? – rooby

+0

estoy de acuerdo, pero debe tenerse en cuenta que en os x el sed predeterminado no tiene la opción '-r'. necesita cambiar a 'gnu-sed' a través de homebrew ... o lo que sea. – masukomi

1

Así es como enumero etiquetas anotadas coinciden con un patrón (TAG_PREFIX *) en orden cronológico inverso . Esta receta usa git-describe.

#!/usr/bin/env bash 

tag=$(git describe --abbrev=0 --match TAG_PREFIX*) 
until [ -z $tag ]; do 
    echo $tag 
    tag=$(git describe --abbrev=0 --match TAG_PREFIX* $tag^ 2>/dev/null); 
done 

Esto no funcionará si varias etiquetas que coinciden con el patrón apuntan a la misma confirmación.Para eso, aquí hay otra receta que usa git-rev-list y git-tag para listar todas las etiquetas, haciendo coincidir TAG_PREFIX *, comenzando desde una confirmación (HEAD en este ejemplo).

#!/usr/bin/env bash 

git rev-list HEAD | while read sha1; do 
    tags=("$(git tag -l --points-at $sha1 TAG_PREFIX*)") 
    [[ ! -z ${tags[*]} ]] && echo "${tags[@]}" | sort -r 
done 
0

eficiente para un gran número de etiquetas y obtiene formato fácil de flexibilidad:

{ git rev-list --first-parent ${1:-HEAD} 
    git for-each-ref --format='%(objectname) %(objecttype) %(refname) 
          %(*objectname) *(%(objecttype)) %(refname)' 
} \ 
| awk ' 
    NF==1 { revs[$1]=1; next } 
      { if ($1 in revs) print $1,$2,$3 } 
' 

que recibe todos los árbitros, añadir refs/tags a la f-e-r para restringirlo.

28
git tag --merged <branch> 

Desde la página del manual:

--[no-]merged <commit> 

Only list tags whose tips are reachable, or not reachable if --no-merged is used, from the specified commit (HEAD if not specified). 

Creo que esta opción se añadió hace poco - que definitivamente no estaba disponible atrás cuando la pregunta original fue planteado y las respuestas anteriores sugiere. Dado que este hilo sigue siendo el primer golpe en Google para la pregunta, pensé que lo lanzaría para cualquiera que se desplace hacia abajo buscando una respuesta que implique menos tipeo que la respuesta aceptada (y para mi propia referencia cuando me olvido esta respuesta nuevamente la próxima semana).

+1

Se agregó en septiembre de 2015, [parece] (http://stackoverflow.com/a/32991687/777285).Ahora debería ser la respuesta aceptada OMI. –

+0

de acuerdo, esto era exactamente lo que estaba buscando. – Mobius

+1

listar etiquetas en una rama pero no en otra también es posible: 'tag git --mergen debian --no-fusionado upstream' (útil cuando una rama se fusiona en la otra) –

Cuestiones relacionadas