git apply --3way:如果一些帅哥失败,不要中止

时间:2015-07-21 10:45:28

标签: git

情况

我在repo中提交了一个名为testing.txt的文件,其中包含以下内容:

First line

我正在尝试应用此修补程序,该修补程序会修改两个文件testing.txtnonexistent.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(忽略所有上下文)。

1 个答案:

答案 0 :(得分:3)

这对我有用:

git apply --verbose --3way --exclude=nonexistent.txt patch.txt