我有一个 git 存储库(或多或少涵盖了项目历史)和单独的源代码(只是一个只有几个文件的 tarball),它们在不久前(实际上是在 2004 年或 2005 年的某个地方)分叉了。
tarball 的源代码已经发生了相当多的变化,我想从中合并一些。现在的问题是 - 如何找出更改源的实际分支点,以获得那里发生的情况的最小差异。
所以我基本上想要的是在 git 历史记录中找到代码与我拥有的源代码包最相似的位置。我不想手动执行此操作。
还值得一提的是,更改的源仅包括文件的子集,并将一些文件拆分为更多文件。然而,其中的代码似乎只进行了小的修改和一些添加。
如果你想自己玩一下,带有源代码的 tarball 是hereGit 托管于吉托里斯: 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
获得所有提交及其差异大小的良好列表(前三列将是 SHA1、添加的行数和删除的行数)。然后你可以把它通过管道输送到awk '{print $1,$2+$3}' | sort -n -k 2
,您将获得一个已排序的提交列表及其差异大小!
如果您不能将自己限制在一小部分文件进行测试,我可能会想手动实现类似的东西git-bisect
- 只是尝试将范围缩小到一个小的差异,并假设接近最佳情况的提交也很可能具有较小的差异,而远离最佳情况的提交将具有较大的差异。 (可能介于牛顿法和完整的二分/网格搜索之间?)
编辑:另一种可能性,建议道格拉斯的回答,如果您认为某些文件可能是完全相同的对于某些提交中的那些人来说,就是使用git-hash-object,然后查看历史记录中的哪些提交有该 blob。有一个问题有一些很好的答案关于如何做到这一点。如果您对少数文件(最好是经常更改的文件)执行此操作,您可能能够很快缩小目标提交范围。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)