如何引用初始提交?

166

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

这是我想做的事情:

git show TAIL

这是我拥有的一个选项:

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

这种方法非常不可靠,而且要依赖于git log的输出不发生变化。

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

6个回答

185
不要在脚本中使用git-log,应该使用git-rev-list或指定自定义格式(--format=*<sth>*选项)的git-log
你的问题还有一个额外的问题:存储库中可能存在多个这样的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}$"

对我来说,git rev-list HEAD | tail -n 1git rev-list --max-parents=0 HEAD 返回的哈希值不同。使用 --max-parents=0 的那个实际上获取了初始提交。只是想指出后者似乎更可靠。 - jbranchaud
4
如果您的提交具有奇怪的时间戳,那么就会出现这种情况。在“rev-list”中添加“--topo-order”应该可以解决这个问题,尽管我认为“--max=parents=0”的答案是最好的。 - jthill

44

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


18
这将返回一个尾提交;可能会有多个根(无父)提交。 - Jakub Narębski
3
这个答案完美地工作了,只返回了一个提交 sha,而 git rev-list --max-parents=0 HEAD 返回了 3 个提交。 - protoEvangelion
tail在Windows中不是默认的命令 - 但在GitBash上可以使用。 :) - Johny Skovdal

13

不确定您在这里想要做什么,但是一些Git命令将--root作为选项,以便引用提交树的根节点,例如:

git rebase --interactive --root main

7
假设合并的第一个父版本是主要的开发线路:
git rev-list --reverse --topo-order --first-parent HEAD | sed 1q

如果我能因使用 sed 而不是 head 而授予奖励分数,那么我会这样做。顺便说一下,sed 1q 可以毫无意义地缩短为 sed q - David Jones

2

考虑到可能存在多个初始(孤立)提交,但这些提交仍可从任何引用中访问,因此可以使用:

git rev-list --all --max-parents=0

或者

git rev-list --reflog --max-parents=0

但如果需要找到包括不可达的根提交在内的提交记录,可以使用git fsck命令:

git fsck --root --no-dangling
< p > --no-dangling选项可以抑制有关悬空提交的警告消息,使得在脚本中处理输出更加容易。


1

要在存储库上获得第一次提交,请运行此命令:

 git rev-list --oneline HEAD | tail -n 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接