【问题标题】:How to reference the initial commit?如何引用初始提交?
【发布时间】:2010-11-03 15:42:40
【问题描述】:

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

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

【问题讨论】:

    标签: git git-commit


    【解决方案1】:

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

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

    例如 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 的人实际上正在获得初始提交。只是想我会指出后者似乎更可靠。
    • @Treebranch 如果您的提交具有奇数时间戳,则可能会发生这种情况。将--topo-order 添加到rev-list 应该可以解决这个问题,尽管我认为--max=parents=0 答案是最好的。
    【解决方案2】:

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

    【讨论】:

    • 这将返回 一个 的尾提交;可以有多个根(无父)提交
    • 这个答案工作得很好,只返回了一个提交 sha 而git rev-list --max-parents=0 HEAD 返回了 3 个提交。
    • tail 也不是默认情况下在 Windows 中存在的命令 - 但在 Windows 上的 GitBash 中有效。 :)
    【解决方案3】:

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

    git rebase --interactive --root main
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 如果我可以通过使用sed 而不是head 来奖励积分,那么我会的。顺便说一句,sed 1q 可以毫无意义地缩短为 sed q
      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 2015-04-21
      • 2011-01-05
      • 2015-08-15
      • 2011-10-07
      • 2018-02-10
      • 2019-02-18
      • 2019-06-09
      相关资源
      最近更新 更多