检查 git apply 是否已经应用

ata*_*xis 9 linux git patch git-apply

这个问题是关于 git apply

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

  1. ...补丁已经应用
  2. ...源代码真的不一样

我工作的目录不是 git 目录,因此我不能使用git log或其他东西。

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

git apply abc.patch || git apply abc.patch -R --check && echo already applied
Run Code Online (Sandbox Code Playgroud)

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

但我不喜欢它,在 git 的 apply 中不是有类似内置解决方案的东西吗?

LB-*_*B-- 8

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

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

  • 如果这些行少于 49 行或多于 50 行,则修补程序不适用:两者git apply --check都会git apply --reverse --check失败。
  • 正好有 49 行,补丁就已经被应用了:git apply --check会失败,git apply --reverse --check也会成功。
  • 正好有 50 行,补丁尚未应用:git apply --check会成功,git apply --reverse --check也会失败。
  • 如果git apply --check两者都git apply --reverse --check成功,则需要增加补丁的上下文以消除歧义。

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


tor*_*rek 6

简短的回答是否定的,或者至少一般来说不是。

\n\n

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

\n\n
diff --git a/file b/file\nindex 87cdbbd..3d8696b 100644\n--- a/file\n+++ b/file\n@@ -7,4 +7,3 @@ this file is dull\n this file is dull\n this file is dull\n this file is dull\n-this file is dull\n
Run Code Online (Sandbox Code Playgroud)\n\n

换句话说,输入文件非常乏味,至少在最后是这样,它只是不断重复“这个文件很乏味”。

\n\n

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

\n\n

自从补丁生成后,有人修改了文件的顶部,使其不再只有 10(或 9)行枯燥的行,但它仍然以至少 4 行枯燥的行结尾。该文件现在已超过 50 行,至少相对而言,大多数最热门的行都相当令人兴奋。

\n\n

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

\n\n

如果你无法判断,为什么你会相信 Git 可以呢?我不了解你的情况,但无法判断添加了令人兴奋的台词的更改是否也删除了最后的沉闷台词。

\n\n

(现在,在某些情况下\xe2\x80\x94,特别是如果您有该index 87cdbbd..3d8696b 100644行\xe2\x80\x94,则有一种方法可以判断,前提是您还有哈希 ID 为 的文件的已提交版本87cdbbd,因为现在我们可以提取文件的特定版本。但是您没有说明是否有索引行,如果有,是否还有一个具有匹配哈希 ID 的 blob。)

\n