Como referenciar o commit inicial?

131

Eu tenho um script que precisa fazer referência ao commit inicial em um repositório. O git tem a referência especial HEAD, mas não tem a correspondente TAIL. Não consigo encontrar nada git help rev-parseque possa me ajudar.

Aqui está o que eu gostaria de fazer:

git show TAIL

Aqui está uma opção que tenho:

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

Isso é bastante hacky e depende da saída do git log não mudar.

No momento, apenas identifico o commit inicial e o uso como meu refspec. No entanto, eu gostaria de lançar uma ferramenta geral, portanto essa não é uma ótima opção.

Bryan Larsen
fonte

Respostas:

151

Não use o git-log para scripts: use git-rev-listou git-logcom o formato personalizado especificado ( --format=*<sth>*opção).

Há um problema adicional com sua pergunta: pode existir mais de um commit raiz TAIL (commit parentless) em um repositório (mesmo se descontarmos ramos desconectados, como 'html', 'man' e 'todo' no git.git repositório). Isso geralmente resulta da junção de projetos separados em um ou do uso da mesclagem de subárvore do subprojeto desenvolvido separadamente.

Por exemplo, o repositório git tem 6 confirmações de raiz: git-gui, gitk (subárvore-mesclada), gitweb (mesclado, não mais desenvolvido separadamente), ferramentas de correio git (mescladas muito cedo no histórico do projeto) e p4-fast-export ( talvez acidental). Isso não está contando as raízes das ramificações 'html e' man ', ramificações de "conveniência" que contêm documentação pré-gerada e ramificação' todo 'com a lista e os scripts do TODO.


Se você possui o git 1.7.4.2 ou mais recente, pode usar a --max-parentsopção:

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

Caso contrário, você pode obter uma lista de todos os commits sem pai (raiz) acessíveis a partir da ramificação atual usando:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Jakub Narębski
fonte
Para mim, o git rev-list HEAD | tail -n 1e git rev-list --max-parents=0 HEADnão está retornando o mesmo valor de hash para mim. Aquele que usa o --max-parents=0está de fato recebendo o commit inicial. Apenas pensei em salientar que o último parece mais confiável.
Jbranchaud
1
@ Treebranch isso pode acontecer se você tiver confirmações com carimbos de data / hora ímpares. acrescentando --topo-orderao que rev-listdeveria corrigir isso, embora eu ache a --max=parents=0resposta melhor.
jthill
35

git rev-list HEAD | tail -n 1 é uma opção mais estável.

Robert Munteanu
fonte
14
Isso retornaria um dos commit de cauda; não pode haver mais de uma raiz (sem pais) comprometer
Jakub Narębski
Essa resposta funcionou perfeitamente e retornou apenas um commit sha, enquanto git rev-list --max-parents=0 HEADretornou 3 commits.
ProtoEvangelion
tail também não é um comando que existe por padrão no Windows - funciona no GitBash no Windows. :)
Johny Skovdal