[英]check if git apply was already applied
这个问题是关于git apply
有没有办法区分:它失败了,因为......
我工作的目录不是 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 的 apply 中不是有类似内置解决方案的东西吗?
简短的回答是否定的,或者至少一般来说不是。
考虑:补丁是一组说明“删除此行”和“添加这些其他行”的说明。 假设整个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)条沉闷的行,但它仍然以至少 4 条沉闷的行结束。 该文件现在已经超过 50 行,至少相对而言,大多数顶级文件都非常令人兴奋。
你能,作为一个聪明的人,知道与否补丁到该文件是否已经被应用? 我要告诉您的是,补丁可能已应用,也可能未应用,以及在文件顶部添加了许多令人兴奋的行的其他更改。
如果你不知道,你为什么会相信 Git 可以? 我不了解你,但我不知道添加激动人心的台词的变化是否也删除了最后的沉闷台词。
(现在,在某些情况下,特别是如果你有一个index 87cdbbd..3d8696b 100644
线路有一种方法来告诉,前提是你也有其哈希ID是该文件的提交版本87cdbbd
,因为现在我们可以提取文件的特定版本。但你没有说你是否有索引行,如果有,你是否还有一个带有匹配哈希 ID 的 blob。)
实际上, git apply --reverse --check
是您正在寻找的“git 内置”解决方案。 对于其他答案中描述的许多相同行的情况,您需要做的就是确保您的补丁文件具有更多/足够的上下文来消除歧义(例如使用git diff -U60
)。
示例:如果补丁说“删除这 50 条相同的行中的一条,留下 49 行”,则有明确定义的结果:
get apply --check
和git apply --reverse --check
都将失败。git apply --check
将失败而git apply --reverse --check
将成功。git apply --check
将成功,而git apply --reverse --check
将失败。get apply --check
和git apply --reverse --check
都成功,则需要增加补丁的上下文以消除歧义。如果您不是手动操作,您甚至可以以编程方式重复增加补丁的上下文,直到它按预期工作为止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.