如何引用初始提交?

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

我想这么做:

git show TAIL

我有一个选择:

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

这非常古怪,并且取决于 git 日志的输出不变。

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

62461 次浏览

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

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

你的问题还有一个额外的问题: 存储库中可能存在 不止一个这样的 TAIL 根提交(无父级提交)(即使我们忽略了断开连接的分支,比如 git.git 存储库中的‘ html’、‘ man’和‘ todo’)。这通常是将单独的项目合并到一个项目中,或者使用单独开发的子项目的子树合并的结果。

例如,git 仓库有6个 root 提交: git-gui,gitk (子树合并) ,gitweb (合并,不再单独开发) ,git 邮件工具(合并在项目历史的早期) ,和 p4快速导出(可能是偶然的)。这还不包括‘ html 和‘ man’分支的根、包含预生成文档的“便利”分支以及带有 TODO 列表和脚本的‘ TODO’分支。


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

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

否则,您可以使用以下方法从当前分支获得所有无父(root)提交的列表:

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

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

git rebase --interactive --root main

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

git rev-list --reverse --topo-order --first-parent HEAD | sed 1q

考虑到可能有多个初始化(孤立) ,但这些提交仍然可以从任何参考使用:

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

或者

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

但是,如果需要查找 root 提交(包括不可到达的提交) ,可以使用 git fsck:

git fsck --root --no-dangling

--no-dangling选项禁止有关悬空提交的警告消息,这使得在脚本中处理输出更加容易。