【发布时间】:2019-01-30 10:20:49
【问题描述】:
我有一个补丁可以更改文件foo.txt。它是使用来自提交a 的差异生成的。但是,现在我想在提交b 之上应用此补丁,但如果foo.txt 在提交a 与提交b 中不同,这将失败。
- 是否可以创建一个仅替换
foo.txt的补丁,而不管它应用在什么之上? - 如果没有,我可以使用支持此行为的补丁文件替代方法吗?
编辑:还应该注意,我不需要能够反向应用补丁。
【问题讨论】:
我有一个补丁可以更改文件foo.txt。它是使用来自提交a 的差异生成的。但是,现在我想在提交b 之上应用此补丁,但如果foo.txt 在提交a 与提交b 中不同,这将失败。
foo.txt 的补丁,而不管它应用在什么之上?编辑:还应该注意,我不需要能够反向应用补丁。
【问题讨论】:
现有的补丁工具被明确设计为不替换不匹配的文件,基于历史事实证明这是一个坏主意。
当然,您可以推出自己的补丁软件(例如不使用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 是文件的“之前”和“之后”图像的那些。这使 Git 可以在必要时进行完整的三向合并。 (末尾的100755 或其他情况下的100644 为git update-index --chmod= 选项提供文件的+x 或-x 状态。)
例如,假设您希望将补丁应用到(如您所说)foo.txt,其中补丁基于提交 A,但当前版本的 foo.txt 改为提交 B。 index 行告诉 Git:foo.txt 版本的哈希 ID 是 <...>(其中缺少的部分来自 git rev-parse A:foo.txt,即存储在提交 @ 中的 blob 987654339@)。因此,Git 可以从存储库中提取提交 A,将补丁成功应用到 A:foo.txt,并生成正确的更新文件,因为现在将应用补丁。现在 Git 有了“之前”和“之后”图像,它也可以将“之前”图像与您当前的 B:foo.txt 进行比较,以便它知道您更改了什么。
Git 现在可以将这三个文件中的每一个都放在某个地方——实际上,放在索引中的插槽 1、2 和 3 中,就像在任何其他基于合并的操作中一样。这使 Git 能够对三个输入(基础、我们的、他们的)进行常规的三向合并,并且可以自行完成合并,或者让您有机会解决冲突。
使用同样的基本思想,如果您愿意,您可以使用index 行来查找 blob,并对其进行修补(保证成功,因为修补程序适用于 A:foo.txt 文件),并直接使用生成的文件。
【讨论】: