如何在不知道差异文件来自原始版本的情况下应用补丁?
How to apply patch without knowing the original version the diff file comes from?
我正在尝试将我在网上找到的补丁文件 (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/
... Is there any easy way to tell which version the patch should be applied to?
仅当补丁包含 index
行时。 (即便如此,它也不一定 easy,并且补丁可能适用于许多修订。)在这种情况下,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,但最终,缩短的哈希可能会变得不唯一,并且只会提供更长的哈希。 (完整的散列将始终有效,因为没有比完整的散列更长的了。)
注意有很多提交"between"这两个:
$ git rev-list --count e8daf2e3ea1..e0597baed57
752
所有 那些提交(除了最后一个)share 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
版本的提交(之后没有其他主分支版本使用它)。
我能够使用 blender v2.79 (8ef39d5c882896bd75e0d4d17fb3e3d4710fc768) 应用补丁。
我正在尝试将我在网上找到的补丁文件 (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/
... Is there any easy way to tell which version the patch should be applied to?
仅当补丁包含 index
行时。 (即便如此,它也不一定 easy,并且补丁可能适用于许多修订。)在这种情况下,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,但最终,缩短的哈希可能会变得不唯一,并且只会提供更长的哈希。 (完整的散列将始终有效,因为没有比完整的散列更长的了。)
注意有很多提交"between"这两个:
$ git rev-list --count e8daf2e3ea1..e0597baed57
752
所有 那些提交(除了最后一个)share 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
版本的提交(之后没有其他主分支版本使用它)。
我能够使用 blender v2.79 (8ef39d5c882896bd75e0d4d17fb3e3d4710fc768) 应用补丁。