Mic*_*hař 8 git diff search branching-and-merging
我有一个git存储库(包含或多或少的项目历史记录)和单独的源代码(只是一个包含少量文件的tarball),它们已经分了一段时间(实际上在2004年或2005年的某个地方).
tarball的来源经历了很多变化,我想从中加入一些变化.现在的问题是 - 如何找出变化的源的实际分支点,以获得最小的差异.
所以我基本上想要的是在git历史中找到位置,其中代码与我拥有的源代码的tarball最相似.我不想手动这样做.
还值得一提的是,更改的源仅包含文件子集,并将一些文件拆分为更多.然而,那里的代码似乎只得到了很小的修改和几个补充.
如果你想自己玩这个,有源的tarball就在这里,Git在Gitorious托管:git://gitorious.org/gammu/mainline.git
在一般情况下,您实际上必须检查每一个提交,因为您无法知道一个提交是否存在巨大差异,下一个提交是否存在小差异,然后是另一个巨大差异,然后是中等差异......
您最好的选择可能是将自己限制在特定文件上。如果您只考虑一个文件,那么迭代该文件的所有版本应该不会花很长时间(用于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
Run Code Online (Sandbox Code Playgroud)
获得所有提交及其差异大小的良好列表(前三列将是 SHA1、添加的行数和删除的行数)。然后你可以将它通过管道传输到awk '{print $1,$2+$3}' | sort -n -k 2,你就会得到一个提交的排序列表及其差异大小!
如果您不能将自己限制在一小部分文件进行测试,我可能会想手动实现类似的东西git-bisect- 只是尝试将您的方式缩小到一个小的差异,假设很可能会在附近提交在最好的情况下也会有较小的差异,而远离它的提交会有较大的差异。(可能介于牛顿法和完整的二分/网格搜索之间?)
编辑:道格拉斯的回答中建议的另一种可能性是,如果您认为某些文件可能与某些提交中的文件相同,则使用散列它们git-hash-object,然后查看历史记录中的哪些提交具有该斑点。有一个问题,关于如何做到这一点,有一些很好的答案。如果您使用少量文件(最好是经常更改的文件)执行此操作,您可能能够很快缩小目标提交范围。