【问题标题】:How to apply patch without knowing the original version the diff file comes from?如何在不知道差异文件的原始版本的情况下应用补丁?
【发布时间】:2023-03-24 01:39:01
【问题描述】:

我正在尝试将我在网上找到的补丁文件 (1) 应用到 Blender (2)。但是,由于官方存储库中有这么多版本,我不确定应该将补丁应用到哪个版本。

我检查了几个早期版本的 Blender 并尝试过

patch -p1 < ../blender-custom-nodes/patch/compositor_nodes.diff

但所有这些都会导致一些拒绝。有什么简单的方法可以判断补丁应该应用到哪个版本?

(1)https://github.com/bitsawer/blender-custom-nodes (2)https://developer.blender.org/diffusion/B/branches/master/

【问题讨论】:

    标签: git blender patch


    【解决方案1】:

    ... 有什么简单的方法可以判断补丁应该应用到哪个版本?

    仅当补丁包含index 行时。 (即便如此,它也不一定容易,并且可能有许多修订版可能适用补丁。)在这种情况下,that patch 确实有这样一行:

    diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
    index 91919ad..fed9e0c 100644
    --- a/extern/CMakeLists.txt
    +++ b/extern/CMakeLists.txt
    @@ -37,6 +37,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
    [snip]
    

    Git diff 中的 index 行提供旧的和新的 blob 哈希 ID。这意味着补丁应用的CMakeLists.txt 版本是一个blob,其哈希ID 缩写为91919ad。如果这个哈希 ID 不是唯一的某个特定 blob,那么就有麻烦了;像今天一样克隆存储库,我发现:

    $ git rev-parse 91919ad
    91919adb4a289234062a27bed0276cb098d1e5d5
    

    所以我们可以使用Which commit has this blob?的答案

    我选择了 VonC 的答案,而不是花哨的 perl 脚本:

    $ git log --oneline --find-object=91919adb4a289234062a27bed0276cb098d1e5d5
    e0597baed57 Remove Carve boolean
    e8daf2e3ea1 CMake: cleanup
    

    请注意,我们可以在这里使用缩写哈希,因为它仍然是唯一的:

    $ git log --oneline --find-object=91919ad
    e0597baed57 Remove Carve boolean
    e8daf2e3ea1 CMake: cleanup
    

    最好保留完整的散列 ID,但最终,缩短的散列可能会变得不唯一,只有更长的散列才会提供服务。 (完整的散列将始终有效,因为没有什么比完整的散列更长。)

    请注意,这两个“之间”有很多提交:

    $ git rev-list --count e8daf2e3ea1..e0597baed57
    752
    

    所有这些提交(最后一个除外)分享extern/CMakeLists.txt的一个版本:

    $ git show e8daf2e3ea1 -- extern/CMakeLists.txt
    commit e8daf2e3ea17c2e9569e6fc9b49879c74d9a8c22
    Author: Campbell Barton [snip]
    
    diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
    index f7e98525b8b..91919adb4a2 100644
    --- a/extern/CMakeLists.txt
    +++ b/extern/CMakeLists.txt
    [snip]
    

    此提交是包含该文件版本的 751 个提交的开始。同时:

    $ git show e0597baed57 -- extern/CMakeLists.txt
    commit e0597baed57fa7a9dfaf6dff6d0fa120784d21ea
    Author: Sergey Sharybin [snip]
    
    diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
    index 91919adb4a2..2e8589ffd17 100644
    --- a/extern/CMakeLists.txt
    +++ b/extern/CMakeLists.txt
    

    这是使用该版本的extern/CMakeLists.txt 的第一个停止提交(之后没有其他主分支版本使用它)。

    【讨论】:

    • "我选择了 VonC 的答案,而不是花哨的 perl 脚本:" 警告,我的答案 (stackoverflow.com/a/48590251/6309) 及其 git log --oneline --find-object=v2.0.0:Makefile 适用于 Git 2.17 或更高版本。
    • 谢谢!因此,鉴于每个文件都已更改而不是不同的提交,有没有办法只签出分支中的一个版本,以便我可以在一行中将补丁应用于所有文件?
    • @matohak:不,但这没有任何意义。考虑这个相当弱的类比:有人说如果你周二戴红帽子,周五穿蓝鞋,你就可以进入某个特定的俱乐部。周三或周四同时佩戴红色帽子蓝色鞋子并不是一个成功的组合。如果您有版本 A 的补丁 A、版本 B 的补丁 B 和版本 C 的补丁 C,则并不意味着将所有三个补丁应用于任何一个版本都会产生有效的东西。这当然是 commits 而不是补丁的重点:提交是 [继续]
    • ...一次提交是一个单一版本,其中每个文件与每个其他文件一致。如果有人发送补丁而不是提交,他们应该告诉您补丁适用于哪个提交,而不是让您猜测。然后,该补丁将应用于该特定提交中的所有文件。
    • 这就是我想知道的。如果他们没有告诉我补丁适用于哪个提交,我怎么能找到?这是否意味着我必须猜测?
    【解决方案2】:

    我能够使用 blender v2.79 (8ef39d5c882896bd75e0d4d17fb3e3d4710fc768) 应用补丁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2011-04-29
      相关资源
      最近更新 更多