【问题标题】:Patch file that works on different base commits?适用于不同基本提交的补丁文件?
【发布时间】:2019-01-30 10:20:49
【问题描述】:

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

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

编辑:还应该注意,我不需要能够反向应用补丁。

【问题讨论】:

    标签: git patch


    【解决方案1】:

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

    当然,您可以推出自己的补丁软件(例如不使用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 或其他情况下的100644git update-index --chmod= 选项提供文件的+x-x 状态。)

    例如,假设您希望将补丁应用到(如您所说)foo.txt,其中补丁基于提交 A,但当前版本的 foo.txt 改为提交 Bindex 行告诉 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 文件),并直接使用生成的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多