【问题标题】:How to find commit by SHA of a submodule?如何查找子模块的 SHA 提交?
【发布时间】:2015-12-31 16:17:26
【问题描述】:

我有一个包含子模块的仓库。对于子模块的给定 SHA,我想在该子模块存在并具有给定 SHA 的 repo 中找到提交。

我将如何使用最新版本的 git 来做到这一点?

【问题讨论】:

    标签: git


    【解决方案1】:

    您可以使用git ls-tree 来读取 gitlinkspecial entry in the index)来读取子模块的 SHA1:

    git ls-tree HEAD mysubmodule 
    160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  mysubmodule 
    

    这将包括子模块在父 repo 中记录的 SHA1。

    知道了这一点,您可以将其与 git filter-branch 结合使用,使用索引过滤器(以避免每次提交都检查父 repo)

    git filter-branch --prune-empty --index-filter 'git ls-tree mysubmodule' -- --all|grep <yourSHA1>
    

    结合git rev-listgit ls-tree 的shell 方法可能更简洁:

    #!/bin/sh
    for r in $(git rev-list FIRST_REV..LAST_REV) 
    do 
        git ls-tree $r mysubmodule
    done | grep <yourSHA1>
    

    git 2.7, you will soon get:

    git for-each-ref --contains <SHA1>
    

    这应该更容易。

    【讨论】:

    • 这不是我要求的。我希望子模块的给定 SHA 在包含它的 repo 中找到提交。
    • @Kentzo 所以在父 repo 中找到提交引用 gitlink 特定 SHA1 的提交?
    • @Kentzo 好的。我必须对其进行测试,但第一种方法是使用过滤器分支。我已经更新了答案。
    • 嗯,这让我觉得滥用过滤器分支,虽然它应该可以正常工作(当你不重写时使用重写工具只是“感觉不对” - 和@ 987654336@ 实际上也可能会进行更改)。不过,没有其他命令可以快速扫描每个提交。也许 git 需要一个 for-each-object 命令,比如 for-each-ref...
    • @torek 我同意。我们说话时我仍在试验(写)
    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多