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.
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}$"
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.
git rev-list HEAD | tail -n 1
etgit rev-list --max-parents=0 HEAD
ne renvoient pas la même valeur de hachage pour moi. Celui qui utilise le--max-parents=0
obtient en fait le commit initial. Je pensais juste que je voudrais souligner que ce dernier semble plus fiable.--topo-order
à larev-list
devrait corriger cela, même si je pense que la--max=parents=0
réponse est la meilleure.git rev-list HEAD | tail -n 1
est une option plus stable.la source
git rev-list --max-parents=0 HEAD
3 commits ont été renvoyés.