git 如何引用初始提交?

yyhrrdl8  于 2022-12-17  发布在  Git
关注(0)|答案(6)|浏览(130)

我有一个脚本需要引用仓库中的初始提交。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。然而,我想发布一个通用工具,所以这不是一个很好的选择。

pgccezyw

pgccezyw1#

不要使用git-log编写脚本:使用git-rev-list或指定自定义格式的git-log--format=*<sth>*选项)。
您的问题还有其他问题:仓库中可以存在多个这样的TAIL根提交(无父提交)(即使我们忽略不连接的分支,如git.git仓库中的'html','man'和'todo')。这通常是将单独的项目合并为一个项目,或使用单独开发的子项目的子树合并的结果。
例如,git仓库有6个根提交:git-gui,gitk(subtree-merged),gitweb(merged in,不再单独开发),git mail tools(在项目历史早期就合并了),p4-fast-export(可能是偶然的).这还不包括'html和'man'分支的根,包含预生成文档的“convenience”分支,以及包含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}$"
6gpjuf90

6gpjuf902#

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

6jygbczu

6jygbczu3#

不知道你想在这里做什么,但是有些git命令会把--root作为一个选项,以便引用提交树的根,例如:

git rebase --interactive --root main
tjvv9vkg

tjvv9vkg4#

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

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

rjjhvcjd5#

考虑到可能有多个初始提交(孤立提交),但这些提交仍然可以从任何一个引用访问,因此可以用途:

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

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

但是如果需要查找根提交,包括不可达的根提交,可以使用git fsck

git fsck --root --no-dangling

--no-dangling选项会抑制有关悬空提交的警告消息,从而更容易处理脚本中的输出。

c9qzyr3d

c9qzyr3d6#

要获得仓库上的第一个提交,请运行以下命令:

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

相关问题