Git 找到无回购代码的分支点

Git 找到无回购代码的分支点,git,ruby-on-rails-plugins,Git,Ruby On Rails Plugins,我有一个Rails插件,它是从git repo复制的,在某个时候安装了脚本/插件。后来,局部补丁被添加到它。现在,我们希望将代码作为原始插件自己的repo分支中的一个单独分支进行维护 给定git repo和代码树,找到最接近新代码的提交的好方法是什么,例如最小化差异行的总量?如果在克隆repo时可以恢复时间戳,我会查找最接近的提交并从那里进行分支。否则,你将度过一段难熬的时光 实际上,您要求的是代码与git repo之间的最小编辑距离,这是一个NP难问题,在本例中是一个糟糕的问题,因为您需要树差

我有一个Rails插件,它是从git repo复制的,在某个时候安装了脚本/插件。后来,局部补丁被添加到它。现在,我们希望将代码作为原始插件自己的repo分支中的一个单独分支进行维护


给定git repo和代码树,找到最接近新代码的提交的好方法是什么,例如最小化差异行的总量?

如果在克隆repo时可以恢复时间戳,我会查找最接近的提交并从那里进行分支。否则,你将度过一段难熬的时光

实际上,您要求的是代码与git repo之间的最小编辑距离,这是一个NP难问题,在本例中是一个糟糕的问题,因为您需要树差异和每个git blob(即代码文件和其他对象)的编辑距离

您可以尝试在帮助下大海捞针,首先克隆插件的repo,创建一个分支,然后在上面提交所有更改。tree diff将让您评估差异,但您必须在每次提交时重复此操作,这将是地狱

相反,我会用你当前的代码,做上面的工作,这样你就可以从插件repo的主管那里得到一个巨大的差异,然后尽你所能去尝试

这会很痛,但你可能会看到结局

编辑:这里有一个可能被证明是易于处理的替代方案,尽管仍然令人讨厌。由于您有历史记录并且可以获得最早的版本,因此可以计算“原始”文件的git哈希blob,并在所有者回购的历史记录中找到它们。在您的历史记录中,在进行任何更改之前请先查看插件。这将允许您计算任何单个文件及其内容的blob散列。然后,您可以在官方回购协议上的git历史中搜索找到的blob散列。这将确定插件文件最初安装时的位置,特别是提交位置。然后您可以比较并找到最早的提交

下面提供了一个示例来实现这一点:

 git log --raw --abbrev=40 --pretty=oneline |
 grep -B 1 `git hash-object filename`

这将为您找到commit w/hash、author和timestamp。我将尝试想出一种更容易实现自动化的方法。

如果在克隆repo时可以恢复时间戳,我将查找最接近该时间戳的提交并从那里进行分支。否则,你将度过一段难熬的时光

实际上,您要求的是代码与git repo之间的最小编辑距离,这是一个NP难问题,在本例中是一个糟糕的问题,因为您需要树差异和每个git blob(即代码文件和其他对象)的编辑距离

您可以尝试在帮助下大海捞针,首先克隆插件的repo,创建一个分支,然后在上面提交所有更改。tree diff将让您评估差异,但您必须在每次提交时重复此操作,这将是地狱

相反,我会用你当前的代码,做上面的工作,这样你就可以从插件repo的主管那里得到一个巨大的差异,然后尽你所能去尝试

这会很痛,但你可能会看到结局

编辑:这里有一个可能被证明是易于处理的替代方案,尽管仍然令人讨厌。由于您有历史记录并且可以获得最早的版本,因此可以计算“原始”文件的git哈希blob,并在所有者回购的历史记录中找到它们。在您的历史记录中,在进行任何更改之前请先查看插件。这将允许您计算任何单个文件及其内容的blob散列。然后,您可以在官方回购协议上的git历史中搜索找到的blob散列。这将确定插件文件最初安装时的位置,特别是提交位置。然后您可以比较并找到最早的提交

下面提供了一个示例来实现这一点:

 git log --raw --abbrev=40 --pretty=oneline |
 grep -B 1 `git hash-object filename`

这将为您找到commit w/hash、author和timestamp。我将尝试想出一种更容易实现自动化的方法。

你所说的“添加了本地补丁”到底是什么意思?你是在克隆回购并提交它们,还是只是应用了一系列更改,现在就有了代码?一系列更改应用于超级项目的回购,所以我们知道历史,可以得到插件的最早版本;但我们不知道在插件自己的repo中是什么commit,我考虑了很多,然后在git hash对象上搜索文档,它为文件及其内容生成hash blob。由于您有历史记录,并且可以获得最早的版本,因此您可以计算“原始”文件的哈希blob,并在所有者回购的历史记录中找到它们。您所说的“添加了本地补丁”到底是什么意思?您是否正在进行克隆回购并提交它们,或者只是应用了一系列的更改,现在就有了代码?一系列的更改被应用到超级项目的repo中,所以我们知道了历史,可以得到插件的最早版本;但我们不知道在插件自己的repo中是什么commit,我考虑了很多,然后在git hash对象上搜索文档,它为文件及其内容生成hash blob。由于您拥有历史记录并可以获得最早的版本,因此可以计算“原始”文件的哈希blob,并在所有者回购的历史记录中找到它们。