[英]How to reference the initial commit?
我有一个脚本需要引用存储库中的初始提交。 git 有特殊参考HEAD
,但没有相应的TAIL
。 我在git help rev-parse
中找不到任何似乎对我有帮助的内容。
这是我想做的:
git show TAIL
这是我的一个选择:
git show `git log --reverse | if read a commit ; then echo $commit ; fi`
这很老套,取决于 git 日志的 output 没有改变。
现在我只是标记初始提交并将其用作我的 refspec。 但是,我想发布一个通用工具,所以这不是一个很好的选择。
不要使用 git-log 编写脚本:使用git-rev-list
或具有指定自定义格式git-log
(--format --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}$"
git rev-list HEAD | tail -n 1
git rev-list HEAD | tail -n 1
是一个更稳定的选项。
不确定您在这里要做什么,但是一些 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
但是,如果需要查找根提交,包括不可访问的提交,则可以使用git fsck
:
git fsck --root --no-dangling
--no-dangling
选项会抑制有关悬空提交的警告消息,从而更容易在脚本中处理 output。
要在存储库上进行首次提交,请运行以下命令:
git rev-list --oneline HEAD | tail -n 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.