Comment trouver le hash de la branche dans Git?

88

Étant donné un nom de branche locale / distante, comment pourrais-je obtenir le hachage du commit vers lequel cette branche pointe?

Misha Moroshko
la source

Réponses:

143

La commande git rev-parseest votre ami, par exemple:

$ git rev-parse development
17f2303133734f4b9a9aacfe52209e04ec11aff4

... ou pour une agence de télésurveillance:

$ git rev-parse origin/master
da1ec1472c108f52d4256049fe1f674af69e785d

Cette commande est généralement très utile, car elle peut analyser toutes les façons de spécifier les noms de branche dans git, telles que:

git rev-parse master~3
git rev-parse HEAD@{2.days.ago}

... etc.

Mark Longair
la source
comment voir tout le hachage de validation d'une branche locale?
Mahdi
1
@Kenji: vous devriez probablement créer une nouvelle question pour ça, mais si vous voulez juste les hachages de chaque commit dans une branche foo, vous pouvez faire:git log --pretty=format:'%H'
Mark Longair
quand je suis en la ligne suivante JenkinsFile: def BranchHash = sh "git rev-parse ${BRANCH-NAME}Je reçois: fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.. Qu'est-ce qui ne va pas?
arielma
5

Les hachages sont stockés sous .git/refs/, par exemple.git/refs/heads/master

Mais utilisez systématiquement git rev-parsecomme suggéré par Mark Longair car il est plus sûr.

Mark Fisher
la source
2

N'oubliez pas que depuis Git 2.19 (Q2 2018), Git prépare une transition des hachages SHA1 vers SHA2: voir " Pourquoi Git n'utilise-t-il pas SHA plus moderne? "

Avec Git 2.25 (Q1 2020), git rev-parse évolue et reflète ce nouveau hachage possible.

Voir commettre fa26d5e , engager cf02be8 , engager 38ee26b , engager 37ab8eb , engager 0370b35 , engager 0253e12 , engager 45e2ef2 , engager 79b0edc , engager 840624f , engager 32a6707 , engager 440bf91 , engager 0b408ca , commettre 2eabd38 (28 octobre 2019), et engager 1bcef51 , commettre ecde49b (05 octobre 2019) par brian m. carlson ( bk2204) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit 28014c1 , 10 nov.2019)

rev-parse: ajouter une --show-object-formatoption

Signé par: Brian M. Carlson

Ajoutez une option pour imprimer le format d'objet utilisé pour l'entrée, la sortie ou le stockage.
Cela permet aux scripts shell de découvrir l'algorithme de hachage utilisé.

Étant donné que le plan de transition permet plusieurs algorithmes d'entrée, document que nous pouvons fournir plusieurs résultats pour l'entrée, et le format que les résultats peuvent prendre.
Bien que nous ne soutenions pas cela maintenant, le documenter tôt signifie que les auteurs de scripts peuvent pérenniser leurs scripts pour quand nous le faisons.

La git rev-parsedocumentation comprend désormais:

--show-object-format[=(storage|input|output)]:

Affiche le format d'objet (algorithme de hachage) utilisé pour le référentiel pour le stockage dans le .gitrépertoire, l'entrée ou la sortie. Pour l'entrée, plusieurs algorithmes peuvent être imprimés, séparés par des espaces. S'il n'est pas spécifié, la valeur par défaut est "stockage".


Avec Git 2.29 (Q4 2020), vous pouvez vous assurer du format à utiliser pour lire le commit de hachage d'une branche (ou de tout autre objet).

Voir commettre e023ff0 , engager 4feb562 , engager 8a06d56 , engager c49fe07 , engager 02a32db , engager ceaa4b3 , engager eff45da , engager b5b46d7 , engager c5aecfc , engager e74b606 , engager 439d3a1 , engager 6c2adf8 , engager de5737c , engager e0a646e , engager 6ff6a67 , engager 831279d , commit b6e5005 , validation 287bb3a , validation 22f1824 , commettre db00af9 ,commit 7187eb1 , commit 98de0b2 , commit a5587b8 , commit 66b6d43 , commit 2197f87 , commit c0b65ea , commit d62607d , commit d482c23 , commit 866be6e , commit 4bacb6d , commit 252a4ee , commit 66b6d43 , commit 2197f87 , commit c0b65ea , commit d62607d , commit d482c23 , commit 866be6e , commit 4bacb6d , commit 252a4ee , commit 368f3cb , commit abe3dc5d , commit 8bcef , commit 094a685 (29 juil.2020 ) par brian m. carlson ( bk2204) .
Voircommit 800e6a7 (29 juil.2020 ) parJohannes Schindelin ( dscho) .
(Fusionné par Junio ​​C Hamano - gitster- in commit e0ad957 , 11 août 2020)

docs: ajouter de la documentation pour extensions.objectFormat

Signé par: Brian M. carlson Révisé
par: Eric Sunshine

Documentez le extensions.objectFormatparamètre de configuration.
Avertissez les utilisateurs de ne pas le modifier eux-mêmes.

git configinclut désormais dans sa page de manuel :

extensions.objectFormat

Spécifiez l'algorithme de hachage à utiliser.

Les valeurs acceptables sont sha1et> sha256.
Si non spécifié, sha1est supposé.
C'est une erreur de spécifier cette clé sauf sicore.repositoryFormatVersion soit 1.

Notez que ce paramètre ne doit être défini que par git initou git clone.
Essayer de le changer après l'initialisation ne fonctionnera pas et produira des problèmes difficiles à diagnostiquer.


Pour être clair, avec Git 2.29 (Q4 2020), l'ajout récent du support SHA-256 est marqué comme expérimental dans la documentation.

Voir commit ff233d8 (16 août 2020) par Martin Ågren ( none) .
(Fusionné par Junio ​​C Hamano - gitster- in commit d1ff741 , 24 août 2020)

Documentation: marquer --object-format=sha256comme expérimental

Signé par: Martin Ågren

Après eff45daab8 (" repository: activer le support SHA-256 par défaut", 2020-07-29, Git v2.29.0 - fusion répertoriée dans le lot # 6 ), les versions vanilla de Git permettent à l'utilisateur de s'exécuter, par exemple,

git init --object-format=sha256  

et pirater.
Cela peut être un bon moyen d'acquérir de l'expérience avec le monde SHA-256, par exemple pour trouver des bogues qui

GIT_TEST_DEFAULT_HASH=sha256 make test  

ne repère pas.

Mais c'est vraiment un monde à part: de tels dépôts SHA-256 vivront entièrement séparés de l'ensemble (désormais assez grand) de dépôts SHA-1.
Interagir au-delà de la frontière est en principe possible, par exemple via " diff+ apply" (ou " format-patch+ am"), mais même cela a ses limites: l'application d'un diff SHA-256 dans un repo SHA-1 fonctionne dans le cas simple, mais si vous besoin de recourir -3, vous n'avez pas de chance.

De la même manière, " push+ pull" devrait fonctionner, mais vous allez vraiment fonctionner principalement en décalage avec le reste du monde. Cela peut être correct au moment où vous initialisez votre référentiel, et cela peut fonctionner pendant plusieurs mois après cela, mais il se peut qu'un jour vous commencez à regretter votre utilisation de [git init --object-format = sha256 ](https://github.com/git/git/blob/ff233d8dda12657a90d378f2b403bc6c85838c59/Documentation/git-init.txt#L52)<sup>([man](https://git-scm.com/docs/git-init#Documentation/git-init.txt---object-formatltformatgt))</sup>et creusé dans un trou assez profond.

Il y a actuellement des sujets en cours pour documenter nos formats de données et nos protocoles concernant SHA-256 et dans certains cas (midx et commit-graph), nous envisageons d'ajuster la façon dont les formats de fichier indiquent le format d'objet à utiliser.

Partout où il --object-formatest mentionné dans notre documentation, précisons clairement que son utilisation avec "sha256" est expérimentale.
Si nous devons ultérieurement expliquer pourquoi nous ne pouvons pas gérer les données que nous avons générées en 2020, nous pouvons toujours pointer vers ce paragraphe que nous ajoutons ici.

En "include ::" - dans un petit texte de présentation, nous devrions pouvoir être cohérents tout au long de la documentation et pouvons éventuellement atténuer progressivement la sévérité de ce texte.
Un jour, nous pourrions même l'utiliser pour commencer à nous retirer --object-format=sha1, mais ne prenons pas de l'avance sur nous-mêmes ...

Il y en a aussi extensions.objectFormat, mais ce n'est mentionné que trois fois. Deux fois où nous ajoutons cette nouvelle clause de non-responsabilité et à la troisième place, nous avons déjà un avertissement "ne pas modifier". À partir de là, les lecteurs intéressés devraient éventuellement trouver ce nouveau que nous ajoutons ici.

Parce que GIT_DEFAULT_HASHfournit un autre point d'entrée à cette fonctionnalité, documentez également la nature expérimentale de celle-ci.

gitinclut désormais dans sa page de manuel :

est utilisé à la place. La valeur par défaut est "sha1". CETTE VARIABLE EST EXPÉRIMENTALE! Voir --object-formaten git init.

object-format-disclaimerinclut désormais dans sa page de manuel :

CETTE OPTION EST EXPÉRIMENTALE!
Le support SHA-256 est expérimental et encore à un stade précoce.

Un référentiel SHA-256 ne pourra en général pas> partager le travail avec des référentiels SHA-1 "normaux".
Il faut supposer que, par exemple, les formats de fichiers internes Git en relation avec les référentiels SHA-256 peuvent changer de manière incompatible avec les versions antérieures.
Utilisez uniquement --object-format=sha256à des fins de test.


Le même Git 2.29 (Q4 2020) s'assure que " git clone" ( man ) fonctionnera quand on clone à partir du dépôt SHA-1, alors qu'il GIT_DEFAULT_HASHest déjà configuré pour utiliser SHA-256.
Avant la version 2.29, cela aboutissait à un référentiel inutilisable qui prétendait à moitié être un référentiel SHA-256 avec des objets et des références SHA-1.
Cela a été corrigé.

Voir commit 47ac970 (20 sept.2020 ) par brian m. carlson ( bk2204) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit b28919c , 29 sept.2020 )

builtin/clone: éviter l'échec avec GIT_DEFAULT_HASH

Signalé par: Matheus Tavares
Signé par: brian m. Carlson

Si un utilisateur clone un référentiel SHA-1 avec GIT_DEFAULT_HASH" sha256", alors nous pouvons nous retrouver avec un référentiel où la version du format du référentiel est 0 mais la extensions.objectformatclé est définie sur " sha256".
C'est à la fois faux (l'utilisateur a un référentiel SHA-1) et non fonctionnel (car l'extension ne peut pas être utilisée dans un référentiel v0).

Cela se produit parce que dans un clone, nous configurons initialement le référentiel, puis modifions son algorithme en fonction de ce que le côté distant nous dit qu'il utilise.
Nous avons initialement configuré le référentiel en tant que SHA-256 dans ce cas, puis nous avons réinitialisé plus tard la version du référentiel sans effacer l'extension.

Nous pourrions simplement toujours définir l'extension dans ce cas, mais cela signifierait que nos dépôts SHA-1 ne sont pas compatibles avec les anciennes versions de Git, même s'il n'y a aucune raison pour laquelle ils ne devraient pas l'être.
Et nous ne voulons pas non plus initialiser le référentiel en tant que SHA-1 au départ, car cela signifie que si nous clonons un référentiel vide, nous n'aurons pas réussi à honorer la GIT_DEFAULT_HASHvariable et nous nous retrouverons avec un référentiel SHA-1, pas un référentiel SHA-256.

Ni l'un ni l'autre ne sont attrayants, alors disons au code d'initialisation du référentiel si nous faisons une réinitialisation comme celle-ci, et si c'est le cas, pour effacer l'extension si nous utilisons SHA-1.
Cela garantit que nous produisons un référentiel valide et fonctionnel et ne rompt aucun de nos autres cas d'utilisation.

VonC
la source