我有一个Rails插件,它是从git存储库复制的,并在某个时候安装了脚本/插件。后来,它又添加了本地补丁。现在,我们希望将代码作为原始插件自己的代码库分支中的单独分支进行维护。
给出一个git代码库和一个代码树,什么是找到最接近新代码的提交的好方法,例如最小化diff行的总数?
发布于 2011-07-08 09:06:56
如果您可以恢复克隆存储库时的时间戳,我会查找最接近该时间戳的提交,并从那里进行分支。否则,你将会经历一段艰难的时光。
实际上,您要求的是代码和git代码库之间的最小编辑距离,这是一个NP难题,在本例中是一个糟糕的问题,因为您需要树差异和每个git blob (即代码文件和其他对象)的编辑距离。
您可以尝试在git-tree-diff的帮助下大海捞针,方法是首先克隆插件的代码库,创建一个分支,然后在其上提交所有更改。tree-diff会让你评估不同之处,但之后你不得不在每次提交时重复这一点,这将是地狱。
相反,我会采用你当前的代码,执行上面的操作,这样你就可以从插件代码库的主控者那里得到一个巨大的差异,然后尽可能地尝试split your changes into as many atomic commits。
这会很痛,但你可能会看到它的结束。
编辑:这里有一个替代方案,它可能被证明是容易处理的,尽管仍然令人讨厌。因为你有历史并且可以得到最早的版本,所以你可以计算“原始”文件的git hash blob,并在所有者的repo历史中找到它们。在您的历史记录中,在进行任何更改之前,请先检查该插件。这将允许您计算任何单个文件及其内容的blob散列。然后,您可以在官方存储库上搜索git历史,查找您找到的blob散列。这将确定插件文件最初安装时的位置,特别是提交位置。然后,您可以比较并找到最早的提交。
kernel.org git docs提供了一个执行此操作示例:
git log --raw --abbrev=40 --pretty=oneline |
grep -B 1 `git hash-object filename`这将为您找到提交w/ hash、作者和时间戳。我会试着想出一种更容易实现自动化的方法。
https://stackoverflow.com/questions/6618853
复制相似问题