适用于不同基础提交的补丁文件?

时间:2019-01-30 10:20:49

标签: git patch

我有一个补丁可以更改文件foo.txt。它是使用提交a的差异生成的。但是,现在我想在提交b上应用此补丁,但是如果foo.txt在提交a与提交b中不同,则此补丁将失败。

  • 是否可以创建一个替换foo.txt的补丁程序,而不管其之上应用了什么?
  • 如果没有,我可以使用支持此行为的补丁文件替代方法吗?

编辑:还应该注意,我不需要能够撤消该补丁程序的应用。

1 个答案:

答案 0 :(得分:0)

基于历史事实证明,这是一个坏主意,现有的补丁工具被明确设计为 not 来替换不匹配的文件。 / p>

当然,可以运行自己想要执行的补丁程序软件(例如,不使用git apply)。

鉴于您已将其交叉发布到git,请考虑以下事实:git diff的输出包含index:行:

diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 216beefc50..d1a2814ec7 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
 #!/bin/sh

 GVF=GIT-VERSION-FILE
-DEF_VER=v2.20.0
+DEF_VER=v2.20.1

 LF='
 '

使用--full-index扩展此行:

index 216beefc50d54d132991636d5f049ea0916f1696..d1a2814ec7e415a525e58ac234df8184a2d0f93c 100755

此处的两个大的丑陋哈希ID是文件的“之前”和“之后”图像的ID。这使得Git可以在必要时进行完整的三向合并。 (末尾的100755或其他情况下的100644+x选项提供了文件的-xgit update-index --chmod=状态。)

例如,假设您希望将补丁应用于(如您所说的)foo.txt,该补丁基于提交A,但是当前的foo.txt版本是提交{{1 }}。 B行告诉Git: index版本的哈希ID为<...> (其中缺少的部分来自foo.txt,即,存储在提交git rev-parse A:foo.txt中的Blob。因此,Git可以从存储库中提取提交A,将补丁成功应用到A,并生成正确的更新文件,因为现在将应用补丁。现在,Git具有“之前”和“之后”图像,它也可以将“之前”图像与您当前的A:foo.txt进行比较,以使您知道您所做的更改

现在,Git可以将这三个文件中的每个文件确实放置在索引中的插槽1、2和3处,就像在任何其他基于合并的操作中一样。这使Git能够对三个输入(基础,我们的,他们的)进行常规的三向合并,并且可以自己完成合并,也可以给您解决冲突的机会。

使用相同的基本思想,如果愿意,您可以使用B:foo.txt行来查找blob,并对其进行修补(通常来说,这并不是一个好主意)(由于补丁适用 index文件),然后直接使用生成的文件。

相关问题