Comment référencer le commit initial?

131

J'ai un script qui doit référencer le commit initial dans un référentiel. git a la référence spéciale HEAD, mais n'a pas le correspondant TAIL. Je n'y trouve rien git help rev-parsequi semble m'aider.

Voici ce que j'aimerais faire:

git show TAIL

Voici une option que j'ai:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

C'est assez hacky et dépend de la sortie de git log qui ne change pas.

Pour le moment, je marque juste le commit initial et l'utilise comme refspec. Cependant, j'aimerais publier un outil général, ce n'est donc pas une excellente option.

Bryan Larsen
la source

Réponses:

151

N'utilisez pas git-log pour les scripts: utilisez l'un git-rev-listou l' autre , ou git-logavec le format personnalisé spécifié ( --format=*<sth>*option).

Il y a un problème supplémentaire avec votre question: il peut exister plus d'un tel commit racine TAIL (commit sans parent) dans un référentiel (même si nous actualisons les branches déconnectées, telles que 'html', 'man' et 'todo' dans git.git dépôt). Cela résulte généralement de la jonction de projets séparés en un seul, ou de l'utilisation de la fusion de sous-arborescences de sous-projets développés séparément.

Par exemple, le dépôt git a 6 commits root: git-gui, gitk (sous-arborescence), gitweb (fusionné, plus développé séparément), git mail tools (fusionné très tôt dans l'historique du projet) et p4-fast-export ( peut-être accidentel). Cela ne compte pas les racines des branches 'html et' man ', les branches "commodité" qui contiennent la documentation pré-générée et la branche "todo" avec la liste et les scripts TODO.


Si vous avez git 1.7.4.2 ou plus récent, vous pouvez utiliser l' --max-parentsoption:

$ git rev-list --max-parents=0 HEAD

Sinon, vous pouvez obtenir la liste de tous les commits sans parent (racine) accessibles depuis la branche actuelle en utilisant:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Jakub Narębski
la source
Pour moi, les git rev-list HEAD | tail -n 1et git rev-list --max-parents=0 HEADne renvoient pas la même valeur de hachage pour moi. Celui qui utilise le --max-parents=0obtient en fait le commit initial. Je pensais juste que je voudrais souligner que ce dernier semble plus fiable.
jbranchaud
1
@Treebranch cela peut arriver si vous avez des commits avec des horodatages impairs. ajouter --topo-orderà la rev-listdevrait corriger cela, même si je pense que la --max=parents=0réponse est la meilleure.
jthill
35

git rev-list HEAD | tail -n 1 est une option plus stable.

Robert Munteanu
la source
14
Cela renverrait un des commits de queue; il peut y avoir plus d'un commit root (sans parent)
Jakub Narębski
Cette réponse a parfaitement fonctionné et n'a renvoyé qu'un seul sha de commit alors que git rev-list --max-parents=0 HEAD3 commits ont été renvoyés.
protoEvangelion
tail n'est pas non plus une commande qui existe par défaut dans Windows - fonctionne cependant dans GitBash sur Windows. :)
Johny Skovdal