我在repo中提交了一个名为testing.txt
的文件,其中包含以下内容:
First line
我正在尝试应用此修补程序,该修补程序会修改两个文件testing.txt
和nonexistent.txt
:
diff --git a/testing.txt b/testing.txt
index 5e867b1..e5c47f2 100644
--- a/testing.txt
+++ b/testing.txt
@@ -1 +1,2 @@
Non-matching first line
+Second line from patch
diff --git a/nonexistent.txt b/nonexistent.txt
index 9649cde..8aab0eb 100644
--- a/nonexistent.txt
+++ b/nonexistent.txt
@@ -1 +1,2 @@
First line
+Second line from patch
使用此命令:
git apply --verbose --3way patch.txt
在执行命令期间,testing.txt
hunk成功应用了回退三向合并:
Checking patch testing.txt...
error: while searching for:
Non-matching first line
error: patch failed: testing.txt:1
Falling back to three-way merge...
Applied patch to 'testing.txt' with conflicts.
和(正如预期的那样)nonexistent.txt
hunk失败(因为该文件不存在):
Checking patch nonexistent.txt...
error: nonexistent.txt: does not exist in index
整个apply
命令被中止,因为nonexistent.txt
hunk失败。
testing.txt
hunk的三向合并被丢弃,即使它成功了。
这在docs:
中说明对于原子性,默认情况下
git apply
会失败整个补丁,并且当某些黑客不适用时不会触及工作树。
我希望将成功的testing.txt
hunk应用于该文件,而不是丢弃。我怎么能这样做?
换句话说,如何将nonexistent.txt
致命错误更改为非致命警告,以便apply
命令不会中止?
(通过这个简单的例子,我可以从补丁文件中删除nonexistent.txt
hunk,但这对于需要删除数百个帅哥的大型补丁来说并不实用。)
我查看了docs,但我找不到这样做的选项。
--reject
选项“使其应用适用的修补程序部分,并将拒绝的数据保留在相应的* .rej文件”中,但它与{{{}不兼容1}}选项。
我也尝试了--3way
和-C0
(忽略所有上下文)。
答案 0 :(得分:3)
这对我有用:
git apply --verbose --3way --exclude=nonexistent.txt patch.txt