检查是否已应用git apply

时间:2018-01-09 12:05:47

标签: linux git patch git-apply

这个问题与git apply

有关

有没有办法区分:它失败了因为......

  1. ...补丁已经已应用
  2. ...源代码真的不同
  3. 我工作的目录不是git目录,因此我无法使用git log或其他内容。

    我知道-R(反向)选项,因此我目前的解决方法是:

    git apply abc.patch || git apply abc.patch -R --check && echo already applied
    

    这种方式git apply abc.patch -R --check && git apply abc.patch只会在git apply abc.patch失败时执行,然后检查它是否失败,因为补丁已经应用(git apply abc.patch -R --check),如果是这种情况,它会回应“已经申请”

    但是我不喜欢它,在git的应用中是不是有像内置解决方案?

2 个答案:

答案 0 :(得分:3)

简短的回答是,或者至少不是一般的。

考虑:补丁是一组说明“删除此行”和“添加其他行”的说明。假设file的补丁完全读取:

diff --git a/file b/file
index 87cdbbd..3d8696b 100644
--- a/file
+++ b/file
@@ -7,4 +7,3 @@ this file is dull
 this file is dull
 this file is dull
 this file is dull
-this file is dull

换句话说,输入文件非常枯燥,至少在结束时,它只是不断重复“这个文件很无聊”。

文件的更改是删除其中一条枯燥的线条。 上下文是更多,同样枯燥的行,后面是“文件结束”。

由于生成了补丁,有人修改了文件的顶部,使其不再仅仅是10(或9)条暗淡的线条,但它仍然以至少四条暗淡的线条结束。该文件现在超过50行,大多数顶级文件非常令人兴奋,至少相对而言。

,作为一个聪明的人,可以判断该文件的补丁是否已经应用了吗?我将告诉你的是,补丁可能已经或可能没有被应用,以及在文件顶部添加了许多令人兴奋的行的其他更改。

如果你不知道,为什么你会相信Git可以?我不了解你,但无法判断添加激动线的变化是否也删除了最后的沉闷。

(现在,在某些情况下 - 特别是如果你有index 87cdbbd..3d8696b 100644行 - 那里一种告诉方法,提供你也已经提交了哈希标识为87cdbbd的文件的版本,因为现在我们可以提取文件的特定版本。但是你还没有说过你是否有索引行,如果有,是否还有一个具有匹配哈希ID的blob。)

答案 1 :(得分:1)

实际上,git apply --reverse --check 您正在寻找的“git 内置”解决方案。对于其他答案中描述的许多相同行的情况,您需要做的就是确保您的补丁文件有更多/足够的上下文来消除歧义(例如使用 git diff -U60)。

示例:如果补丁说“删除这 50 条相同的行中的一条,留下 49 行”,则有明确定义的结果:

  • 如果这些行少于 49 行或超过 50 行,则补丁不适用:get apply --checkgit apply --reverse --check 都会失败。
  • 恰好有 49 行,补丁已经应用:git apply --check 将失败,git apply --reverse --check 将成功。
  • 正好有 50 行,补丁尚未应用:git apply --check 将成功,git apply --reverse --check 将失败。
  • 如果 get apply --checkgit apply --reverse --check 都成功,您需要增加补丁的上下文以消除歧义。

您甚至可以以编程方式重复增加补丁的上下文进行测试,直到它按预期工作,如果您不手动完成。