Liste des balises Git, affiche les hachages sha1 de commit

101

donc la git tagcommande liste les balises git actuelles

tag1
tag2

git tag -n imprime le message de la balise

tag1  blah blah
tag2  blah blah

Quelle est la meilleure façon d'obtenir le hachage de tag1 et tag2?

Quang Van
la source
1
Ce n'est pas une question que j'envisage de poser séparément, mais je me demande pourquoi git tag( -nou une autre option ...) n'affiche pas les hachages de validation en premier lieu. C'est bien de voir quelles solutions les gens proposent, mais je considère cela comme un défaut de conception dans les options disponibles.
andreee

Réponses:

142

Pour obtenir des balises git avec le hachage SHA1 de l'objet Tag, vous pouvez exécuter:

git show-ref --tags

La sortie ressemblera alors à quelque chose comme:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Chaque ligne est le hachage SHA1 de la balise, suivi du nom de la balise précédé du préfixe refs/tags/.

Si vous voulez le hachage SHA1 du commit, au lieu de l'objet tag, vous pouvez exécuter:

git show-ref --tags -d

Cela produira une sortie comme:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

Les lignes se terminant par ^{}commencent par le hachage SHA1 du commit réel vers lequel pointe la balise.

Peterjmag
la source
7
Notez que cela ne fera pas la différence entre les balises légères et annotées. Pour les balises légères, il affichera le commit et pour les balises annotées, le hachage de l'objet tag lui-même.
Lily Ballard
20
Pour afficher une liste de balises avec des références déréférencées (en cas de balises annotées), utilisez git show-ref --tags -d. Les balises déréférencées sont postfixées avec un ^{}.
S. Christoffer Eliesen
49

La git tagcommande est sous-développée. Beaucoup est souhaité mais manquant, comme les détails complets des balises et les balises dans l'ordre de l'historique de validation.

J'aime plutôt ça, qui donne exactement ce que je veux mais je ne peux pas obtenir de git tag:

git log --oneline --decorate --tags --no-walk

Cela donne une très belle vue codée par couleur des balises dans l'ordre chronologique inverse (comme ce serait dans le journal complet). De cette façon, non seulement vous voyez les balises, mais vous verrez également les hachages abrégés et les messages de validation des validations de balise.


Je l'ai aliasé git tet git tagscomme suit:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Remarque: j'ai dû utiliser la redirection bash git tcar Git ne prend pas en charge l'appel d'un alias à partir d'un autre alias (ce qui est décevant).


Si vous voulez voir la date et l'heure de validation, essayez:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

Vous pouvez utiliser d'autres formats de date dans l' --dateoption ainsi que contrôler entièrement la sortie pour correspondre à votre goût unique dans l' --prettyoption. Les deux options sont bien documentées dans la documentation de git-log .

ADTC
la source
2
Bien que ce ne soit pas ce que l'OP a demandé (afficher les hachages de validation sha1 ), c'est très utile car les messages de validation peuvent également être utiles. +1 de moi.
Stelios Adamantidis
2
@nealmcb git logest puissant! Vous pouvez lui faire montrer exactement ce que vous voulez. Essayez git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. D'autres formats de date sont également possibles. Recherchez simplement --datedans la page d'aide. J'ai mis à jour ma réponse pour inclure cette option.
ADTC
1
@SteliosAdamantidis En fait, ma réponse donne les hachages SHA1 abrégés (7 premiers caractères), et si vous voulez des hachages complets, vous pouvez toujours le modifier avec --prettyet %H. Merci pour le +1 :)
ADTC
15

Les balises annotées ont leur propre SHA − 1, nous devons donc les déréférencer. Cependant, les balises légères ne peuvent pas être déréférencées, car elles pointent déjà vers un commit. Pour résoudre, nous devons lister les deux et filtrer les objets de commit:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Résultat avec des balises légères:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Résultat avec des balises annotées:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}
Steven Penny
la source
L'utilisation git log --tags --oneline --no-walkdéférera également automatiquement les balises annotées. :)
ADTC
11

Pour obtenir le SHA1 référencé par toute sorte de ref (branche, balise ...), utilisez git rev-parse:

git rev-parse tag1^0 tag2^0

Il n'imprimera que les SHA1 complets, sur des lignes séparées. Le ^0suffixe est une syntaxe spéciale, pour s'assurer que cela affichera le SHA1 du commit pointé par la balise, qu'il soit annoté ou non. (Les balises annotées sont des objets à part entière, qui contiennent un pointeur vers un commit ainsi que des métadonnées. Si vous savez qu'une balise est annotée et que vous souhaitez que le SHA1 de la balise soit désactivé, laissez simplement^0 .)

Bien sûr, vous ne devriez pas souvent avoir besoin de le faire, car toute commande Git qui accepterait un SHA1 devrait également accepter une balise!

Cascabel
la source
Meilleure réponse ici, merci @Jefromi. Notez que dans un shell cmd Windows, toute commande git utilisant ^ doit être citée: par exemple git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo
8

J'avais une question similaire, mais je voulais le hachage de (plusieurs) balises spécifiques. J'ai trouvé que "show-ref" prendra une liste de balises, donc cela fait le travail:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Cependant, quelques expériences avec "git show" ont abouti à cette commande:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

Comme je suis beaucoup plus habitué à utiliser "show" que "show-ref", je trouve ce dernier plus facile à retenir et plus utile aussi.

Voir aussi le joli résumé dans Comment savoir sur quel commit une balise pointe dans Git? .

Ted
la source
3

Les tags doivent être signés et / ou envoyés par message. Les balises légères n'ont pas d'objets SHA1 et ne sont que des références. Sinon, essayez git show.

Adam Dymitruk
la source
3
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

Cela donne une liste de tous les commits pour les balises. Les balises annotées sont déréférencées. Envoyez vos remerciements ici .

anatoly techtonik
la source
Excellente solution. Si vous préférez avoir Only tagenames au lieu du refname complet, vous pouvez changer d'utilisation %(refname:short)au lieu de %(refname).
Radon8472
2

J'ai pris la commande du poste de techtonik anatoly ajouté le message de titre des balises / commits et l' comme de jolis cols.

Le résultat est une sortie identique à git tag -nmais avec commit-hash comme préfixe.

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Si vous préférez avoir le hachage long au lieu du court, remplacez-le objectname:shortpar objectname.

Radon8472
la source