在一般情况下,您实际上必须检查每一个提交,因为您无法知道您是否可能有一个巨大的差异,然后是小差异,然后是另一个巨大的差异,然后是中等差异......
您最好的选择可能是将自己限制在特定文件中。如果您只考虑一个文件,那么迭代该文件的所有版本应该不会花费很长时间(用于git rev-list <path>
获取列表,因此您不必测试每个提交)。对于修改文件的每个提交,您可以检查差异的大小,并很快找到最小值。对少数文件执行此操作,希望他们会同意!
设置差异的最佳方法是通过简单地复制到您的 tarball 中进行临时提交,这样您就可以调用一个分支tarball
来进行比较。这样,你可以这样做:
git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done
获取所有提交及其差异大小的漂亮列表(前三列将是 SHA1、添加的行数和删除的行数)。然后,您可以将其通过管道传输到awk '{print $1,$2+$3}' | sort -n -k 2
中,并且您将获得提交的排序列表及其差异大小!
如果您不能将自己限制在一小部分要测试的文件中,我可能会想手动实现类似的东西git-bisect
- 只需尝试将您的方式缩小到一个小的差异,假设很可能提交接近在你最好的情况下,差异也会更小,远离它的提交也会有更大的差异。(可能介于牛顿方法和完整的二进制/网格搜索之间?)
编辑:道格拉斯的回答中建议的另一种可能性,如果您认为某些文件可能与某些提交中的文件相同,请使用 对它们进行哈希处理git-hash-object
,然后查看您的历史记录中的哪些提交具有该 blob。关于如何做到这一点,有一个问题有一些很好的答案。如果您使用少量文件(最好是经常更改的文件)执行此操作,您可能能够很快缩小目标提交的范围。