如何通过子模块的SHA查找提交?

时间:2015-12-31 07:39:26

标签: git

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

如何使用最新版本的git进行此操作?

1 个答案:

答案 0 :(得分:0)

您可以使用git ls-tree来读取 gitlink (a special entry in the index)来阅读子模块的SHA1:

git ls-tree HEAD mysubmodule 
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  mysubmodule 

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

知道这一点,您可以使用索引过滤器将其与git filter-branch结合使用(以避免每次提交都必须签出父回购)

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>

这应该更容易。