我有一个Rails插件,它在某些时候从带有脚本/插件安装的git repo中复制过来。后来,添加了本地补丁。现在我们希望将代码保存为原始插件自己的repo的分支中的单独分支。
给定git repo和代码树,找到最接近新代码的提交的好方法是,例如最小化差异线的总量?
答案 0 :(得分:1)
如果您可以在克隆repo时恢复时间戳,我会查找最接近它的提交并从那里进行分支。否则,你将有一个毛茸茸的时间。
你基本上要求代码和git repo之间的最小编辑距离,这是一个NP难题,在这种情况下是一个坏的,因为你需要树差异和每个git blob的编辑距离(也就是代码文件和其他对象。)
您可以尝试在git-tree-diff的帮助下在大海捞针中找到一根针,首先克隆插件的回购,制作一个分支,然后在其上面提交所有更改。树差异会让你评估差异,但是你必须为每次提交重复这一点,这将是地狱。
相反,我会拿你当前的代码,执行上面的操作,这样你就可以从插件仓库的主人的HEAD中获得一个巨大的差异,然后尽可能地尝试split your changes into as many atomic commits。
它会受伤,但你可能会看到它的结束。
编辑:这是一个可以证明易处理的替代方案,尽管仍然很烦人。由于您拥有历史记录并且可以获得最早的版本,因此您可以计算“原始”文件的git哈希blob,并在所有者仓库的历史记录中找到它们。在您的历史记录中,请在进行任何更改之前查看插件。这将允许您计算任何单个文件及其内容的blob哈希值。然后,您可以通过官方回购中的git历史记录搜索您找到的blob哈希值。这将确定插件文件在最初安装时的具体位置,特别是在哪个提交时。然后你可以比较并找到最早的提交。kernel.org git docs提供了一个示例:
git log --raw --abbrev=40 --pretty=oneline |
grep -B 1 `git hash-object filename`
这将找到提交w / hash,author和timestamp。我将尝试考虑一种进一步自动化的方法。