tag - guida git pdf




Come determinare a livello di codice se il checkout Git è un tag e, in tal caso, qual è il nome del tag (4)

Una soluzione migliore (dalla risposta di Greg Hewgill nell'altra domanda) sarebbe:

git name-rev --name-only --tags HEAD

Se restituisce "indefinito", allora non sei su un tag. Altrimenti restituisce il nome del tag. Quindi un one-liner per fare qualcosa come la mia altra risposta sarebbe:

git_tag=`git name-rev --name-only --tags HEAD | sed 's/^undefined$//'`

Esempio di shell interattiva di come funziona:

$ git checkout master
Already on "master"
$ git name-rev --name-only --tags HEAD
undefined
$ git checkout some-tag
Note: moving to "some-tag" which isnt a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 1234567... Some comment blah blah
$ git name-rev --name-only --tags HEAD
some-tag

In un ambiente di scripting Unix o GNU (ad esempio una distro Linux, Cygwin, OSX), qual è il modo migliore per determinare se il checkout corrente è un tag Git. Se si tratta di un tag, come posso determinare il nome del tag?

Un uso di questa tecnica sarebbe automaticamente l'etichettatura di una versione (come svnversion avrebbe fatto con Subversion).

Vedi la mia domanda relativa sulla rilevazione programmatica del ramo Git .


La soluzione alla tua domanda è da usare

git describe --exact-match HEAD

(che prenderebbe in considerazione solo i tag annotati , ma dovresti usare tag annotati e probabilmente anche firmati per il tagging delle versioni).

Se si desidera prendere in considerazione tutti i tag, anche i tag leggeri (che di solito vengono utilizzati per i tag locali), è possibile utilizzare --tags opzione --tags :

git describe --exact-match --tags HEAD

Ma penso che tu abbia il " problema XY " qui, in quanto stai facendo domande sulla possibile soluzione al problema, piuttosto che fare domande su un problema ... che può avere una soluzione migliore.

La soluzione al tuo problema è dare un'occhiata a come Git lo fa nello script GIT-VERSION-GEN e come lo usa nel suo Makefile .


Il modo migliore per farlo è usare il comando git describe :

git-describe: mostra il tag più recente raggiungibile da un commit

Il comando trova il tag più recente che è raggiungibile da un commit. Se il tag punta al commit, viene mostrato solo il tag. In caso contrario, il nome del tag è suffisso con il numero di commit aggiuntivi sopra l'oggetto taggato e il nome oggetto abbreviato del commit più recente.


L'uso di git-name-rev è preferito per gli script, dato che fa parte di git plumbing , mentre git-describe è parte della porcellana .

Utilizzare questo comando per stampare il nome del tag se l'HEAD punta a uno, altrimenti nulla.

git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed -n 's/^\([^^~]\{1,\}\)\(\^0\)\{0,1\}$/\1/p'

Nota il reindirizzamento di stderr a / dev / null - altrimenti riceverai un messaggio di errore che dice:

fatal: cannot describe 'SOMESHA'"

EDIT: correzione della regex in sed per supportare tag sia lighweight sia annotati / firmati.





shell