Как применить патч, не зная оригинальной версии файла diff? - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь применить файл патча (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/

1 Ответ

0 голосов
/ 04 ноября 2018

... Есть ли какой-нибудь простой способ узнать, к какой версии патч следует применить?

Только если патч содержит строку index. (Даже тогда, это не обязательно easy , и может быть много исправлений, к которым патч может применяться.) В этом случае у этого патча есть такая строка:

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]

Строка index в Git diff предоставляет старый и новый хэш-идентификаторы BLOB-объектов. Это означает, что версия CMakeLists.txt, к которой применяется исправление, представляет собой большой двоичный объект, сокращенный идентификатор хэша которого равен 91919ad. Если этот хэш-идентификатор не является каким-то конкретным конкретным BLOB-объектом, у него проблемы; клонируя хранилище, как сегодня, я нахожу:

$ git rev-parse 91919ad
91919adb4a289234062a27bed0276cb098d1e5d5

чтобы мы могли использовать ответы из Какой коммит имеет этот BLOB-объект?

Вместо необычного сценария на Perl я согласился с ответом VonC:

$ 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

Лучше хранить полный идентификатор хэша, хотя, в конце концов, сокращенный хэш может стать неуникальным, и будет служить только более длинный хэш. (Полный хеш будет работать всегда, так как нет ничего длиннее, чем полный хеш.)

Обратите внимание, что существует много коммитов "между" этими двумя:

$ 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 (после чего никакая другая версия master-branch не использует его).

...