只有在特定版本以上时,Git才会应用补丁

时间:2016-04-27 09:31:31

标签: git shell

我有一个git repo(比如RepoA)克隆说具体修改(比如RevX)。 我有另一个存储库(比如RepoB),它有一个" git补丁"文件(比如Patch1)代表RevX的RepoA中的代码。

现在有人将RepoA中的代码更新为新版本(例如RevY),使我的补丁文件现在失败。 所以我为RevY创建了一个新的补丁文件(比如Patch2)。

我的查询:在shell脚本中,如果RepoA的本地副本在RevY之前,我想应用Patch1,如果RepoA的本地副本在RevY之后,则应用Patch2。

如何做到这一点?

编辑:RevX和RevY之间可以进行多次修改。例如: RevX

RevX + 1

RevX + 2

...

RevX + N

RevY

RevY + 1

3 个答案:

答案 0 :(得分:0)

您可以使用git rev-parse HEAD确定当前版本,然后决定应用Patch1或Patch2。

答案 1 :(得分:0)

您还可以尝试git log

git log --pretty=oneline HEAD~10..HEAD

这将打印10个最近提交的哈希和提交消息,您可以更改上面的数字以打印更多。然后,您可以在列表中搜索RevXRevY

但我会建议另一个工作流程:

Checkout the specific `Rev` -> Apply the patch -> Commit -> Merge with the newest commit

答案 2 :(得分:0)

您问的问题有一个直接的解决方案:git merge-base --is-ancestor A B测试commit-ID A 是否是commit-ID {{1}的祖先} ,因此您可以简单地测试当前提交是否是已知更改所需修补程序的提交的祖先。

此方法的问题在于它只测试它所测试的内容:提交 B 是特定提交 A ,而不是"某些提交使提交 B "相同的更改。如果有人提交 B ,他们会获得相同的更改,但会使用新的(不同的)提交ID。旧补丁将失败,而新的补丁将是必需的,但它们的分支将不包含提交 B 本身,只是等效的

如果这种情况对您不重要,您可以使用B测试。否则我会建议一个不同的策略,例如检查要修补的代码以用于各种签名(例如,"如果函数调用merge-base --is-ancestor附近的代码看起来像版本A,则使用补丁A;如果它看起来像B,使用补丁B;如果它看起来像C或D,使用PatchCD;如果它看起来像固定版本E,什么都不做;否则抱怨我们不知道如何修补这个版本")