如何定位一个git合并提交意外倒回一个子模块



我们有一个包含几个子模块的大型存储库。每隔一段时间,当提交合并时,一个子模块就会意外地倒回。(有时它发生在使用TortoiseGIT和子模块被检查时。在使用VS-Code时也会发生这种情况。)

是否有git命令来查找包含倒带的提交。

作为第一步,应该让候选代码进入容易观察的领域,您要寻找的提交中更改的子模块条目不是从之前的条目派生出来的。

方便地检查这个是硬核的,但并不难。

find $PWD -type d -name objects -execdir test -f HEAD -a -d refs ; -print 
| sed \,$PWD/.git/objects,d >.git/objects/info/alternates
git log -m --raw --no-abbrev --pretty=format:%H 
| awk ' NF==1 { commit=$1 }
$1$2==":160000160000" {
print "[[ `git merge-base "$3" "$4"` != "$3" ]] && echo "commit
}
' | bash

第一组告诉Git在其他地方找到它将要感兴趣的对象,通过查找为这个repo克隆的所有子模块repo(可能通过git submodule update --init --recursive或其他类似的助手)。如果你已经一个objects/info/alternates文件,如果你使用的是参考克隆,你可能需要保存当前的alternates文件,并将>替换为上面的>>

第二组:日志快速扫描历史记录,awk查找更改但未添加或删除的子模块,并打印shell命令以检查新版本是否是旧版本的正确后代,如果不是,则打印提交id;通过管道将这些命令通过shell实际执行它们。

在我的sed历史中运行此操作会产生51个子模块更新,其中没有一个无法通过测试:它们都只是快速转发到较新的子模块版本。

相关内容

最新更新