143

我有一个脚本需要引用存储库中的初始提交。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 的输出不会改变。

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

4

4 回答 4

168

不要使用 git-log 编写脚本:使用git-rev-list, 或git-log指定自定义格式(--format=*<sth>*选项)。

您的问题还有一个问题:存储库中可能存在多个这样的 TAIL 根提交(无父提交)(即使我们折扣断开的分支,例如 git.git 中的 'html'、'man' 和 'todo'存储库)。这通常是将单独的项目合并为一个,或者使用单独开发的子项目的子树合并的结果。

例如 git 存储库有 6 个根提交: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}$"
于 2009-06-17T14:51:24.660 回答
39

git rev-list HEAD | tail -n 1是更稳定的选择。

于 2009-06-17T12:54:12.430 回答
7

不确定您要在这里做什么,但是一些 git 命令可以--root作为一个选项,以引用提交树的根,例如

git rebase --interactive --root main
于 2020-08-14T15:05:02.703 回答
3

假设合并的第一个父级是开发的主线:

git rev-list --reverse --topo-order --first-parent HEAD | sed 1q
于 2021-02-12T17:59:08.720 回答