我有一个需要在存储库中引用初始提交的脚本。 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。但是,我想发布一个通用工具,所以这不是一个很好的选择。
答案 0 :(得分:131)
不要使用git-log进行脚本编写:使用git-rev-list或带指定自定义格式的git-log(“--format = &lt; sth&gt; ”选项)。< / p>
您的问题还有一个问题:存储库中可能存在多个此类TAIL根提交(无父提交)(即使我们对已断开连接的分支进行折扣,例如'html',' git.git存储库中的man'和'todo')。这通常是将单独的项目合并为一个,或者使用单独开发的子项目的子树合并的结果。
例如git repository有6个root提交:git-gui,gitk(子树合并),gitweb(合并,不再单独开发),git mail工具(在项目历史的早期合并)和p4-fast - 出口(也许是偶然的)。这不包括'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}$"
答案 1 :(得分:28)
git rev-list HEAD | tail -n 1
是一个更稳定的选择。
答案 2 :(得分:2)
不确定您要在这里做什么,但是某些git命令将--root
作为选项,以引用提交树的根,例如
git rebase --interactive --root main
答案 3 :(得分:2)
假设合并的第一个父级是开发的主线:
git rev-list --reverse --topo-order --first-parent HEAD | sed 1q