这个问题与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的应用中是不是有像内置解决方案?
答案 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 行”,则有明确定义的结果:
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
都成功,您需要增加补丁的上下文以消除歧义。您甚至可以以编程方式重复增加补丁的上下文进行测试,直到它按预期工作,如果您不手动完成。