如何引用初始提交?


131

我有一个脚本,需要引用存储库中的初始提交。git有特殊的参考HEAD,但没有相应的参考TAIL。我找不到任何git help rev-parse可以帮助我的东西。

这是我想做的:

git show TAIL

这是我的一种选择:

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

这很hacky,取决于git log的输出是否不变。

现在,我只是标记初始提交并将其用作我的refspec。但是,我想发布一个通用工具,所以这不是一个好选择。

Answers:


151

请勿使用git-log编写脚本:使用git-rev-listgit-log指定的自定义格式(--format=*<sth>*选项)。

您的问题还有另一个问题:存储库中可以存在多个这样的TAIL根提交(无父提交)(即使我们在git.git中打折断开的分支,如“ html”,“ man”和“ todo”存储库)。这通常是由于将单独的项目合并为一个,或使用单独开发的子项目的子树合并而导致的。

例如git仓库有6个root提交:git-gui,gitk(子树合并),gitweb(合并,不再单独开发),git邮件工具(在项目历史的早期合并)和p4-fast-export(也许是偶然的)。这不包括“ html”和“ man”分支,包含便捷文档的“便捷”分支以及带有TODO列表和脚本的“ todo”分支的根。


如果您具有git 1.7.4.2或更高版本,则可以使用以下--max-parents选项:

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

否则,您可以使用以下命令获取可从当前分支访问的所有无父(根)提交的列表:

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

对我来说,git rev-list HEAD | tail -n 1git rev-list --max-parents=0 HEAD不会为我返回相同的哈希值。--max-parents=0实际上,使用的是初始提交。只是以为我会指出,后者似乎更可靠。
jbranchaud

1
@Treebranch如果您的提交带有奇怪的时间戳,可能会发生这种情况。添加--topo-orderrev-list应该解决的问题,尽管我认为--max=parents=0答案是最好的。
jthill 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.