Патч-файл, который работает на разных базовых коммитах? - PullRequest
0 голосов
/ 30 января 2019

У меня есть патч, который изменяет файл foo.txt.Он был сгенерирован с использованием diff из commit a.Однако теперь я хочу применить этот патч поверх коммита b, но это не получится, если foo.txt отличается в коммите a против коммита b.

  • Можно ли создать патч, который просто заменяет foo.txt, независимо от того, к чему он применяется?
  • Если нет, есть ли альтернатива файлам патчей,Я могу использовать, который поддерживает это поведение?

РЕДАКТИРОВАТЬ: Следует также отметить, что мне не нужно иметь возможность отменить применение патча.

1 Ответ

0 голосов
/ 30 января 2019

Существующие инструменты исправлений специально разработаны , а не для замены файлов, которые не соответствуют, исходя из того факта, что исторически это было плохой идеей.

Конечно, возможно накатить свое собственное программное обеспечение исправления (не используя, например, 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

Два больших уродливых идентификатора хешаВот изображения «до» и «после» файла.Это позволяет Git выполнять полное трехстороннее слияние, если это необходимо.(100755 в конце или 100644 в других случаях дает статус +x или -x файла для опции git update-index --chmod=.)

Предположим, например, что выВы хотите применить патч к (как вы сказали) foo.txt, где патч основан на коммите А, но текущая версия foo.txt вместо фиксации B.Строка index сообщает Git: идентификатор хэша версии foo.txt равен <...> (где недостающая часть от git rev-parse A:foo.txt, то есть от большого двоичного объекта, сохраненного в коммите * 1035)*).Поэтому Git может извлечь коммит A из репозитория, успешно применить патч к A:foo.txt и создать правильный обновленный файл, так как патч теперь будет применяться.Теперь, когда у Git есть изображения «до» и «после», он может также различать изображение «до» относительно вашего текущего B:foo.txt, чтобы он знал , что вы изменили .

Git теперь может поместить каждый из этих трех файлов где-то - на самом деле, в индекс, в слоты 1, 2 и 3, как и в любой другой операции, основанной на слиянии.Это дает Git возможность выполнять обычное трехстороннее слияние на трех входах (базовый, наш, их) и либо завершить слияние самостоятельно, либо дать вам возможность разрешать конфликты.

Используя этота же самая базовая идея, вы можете, если хотите - вообще не очень хорошая идея - использовать строку index, чтобы найти блоб, залатать его (с гарантированным успехом, поскольку патч применяет к , что A:foo.txt file) и используйте полученный файл напрямую.

...