Как применить патч Git в файле с другим именем и пути?


у меня есть два хранилища. В одном, я делаю изменения в файл ./hello.test. Я фиксирую изменения и создаю патч из этой фиксации с помощью git format-patch -1 HEAD. Теперь у меня есть второй репозиторий, который содержит файл с тем же содержимым, что и hello.тест, но помещается в другой каталог под другим именем:./blue/red/hi.test. Как я могу применить вышеупомянутый патч к ? Я пытался git am --directory='blue/red' < patch_file но это, конечно, жалуется, что файлы не называются одинаково (что я думал Git не волнует?). Я знаю, что, вероятно, могу отредактировать diff, чтобы применить его к этому конкретному файлу, но я ищу командное решение.

5 64

5 ответов:

вы можете создать патч с помощью git diff а затем применить его с помощью patch утилита, которая позволяет указать файл, к которому вы хотите применить diff.

например:

cd first-repo
git diff HEAD^ -- hello.test > ~/patch_file

cd ../second-repo
patch -p1 blue/red/hi.test ~/patch_file

существует простое решение, которое не включает в себя ручное редактирование патчей или внешний скрипт.

в первом репозитории (это также может экспортировать диапазон фиксации, используйте -1 Если вы хотите выбрать только один коммит) :

git format-patch --relative <committish> --stdout > ~/patch

во втором репозитория :

git am --directory blue/red/ ~/patch

вместо --relative на git format-patch, другое решение-использовать на git am на полосу n каталоги из пути патчей, как указано в a ответ на аналогичный вопрос.

также можно запустить git format-patch --relative <committish> без --stdout, и он будет генерировать набор .patch файлы. Затем эти файлы могут быть переданы непосредственно в git am С git am --directory blue/red/ path/to/*.patch.

отвечая на мой собственный вопрос с помощью скрипта, который делает именно это:https://github.com/mprpic/apply-patch-to-file

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

основываясь на ответе @georgebrock, вот решение, которое я использовал:

во-первых, создайте файлы исправлений как обычно (например. git format-patch commitA..commitB).

затем убедитесь, что ваш целевой репозиторий чист (не должно быть никаких измененных или неотслеженных файлов) и примените исправления следующим образом:

cd second-repo
git am ~/00*.patch

для каждого файла патча вы получите сообщение об ошибке типа "ошибка: XYZ не существует в индексе". Теперь вы можете применить этот патч вручную:

patch --directory blue/red < ~/0001-*.patch
git add -a
git am --continue

вы должны сделать эти три шага для каждого файла патч.

это сохранит исходное сообщение фиксации и т. д. не требуя каких-либо специальных git format-patch команда или редактирование файлов исправлений.

Я понимаю, что два файла точно такие же в вашей ситуации, поэтому патч, скорее всего, удастся.

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

скажем, вы изменили файл A, обозначим A~1 как и в предыдущей версии, и вы хотите применить разницу между A~1 to A в файл B.

откройте трехсторонний инструмент слияния, например, вне сравнения, путь левой панели A, средняя панель является общим предком, поэтому путь A~1, путь правой панели B. Затем на нижней панели отображается результат применения разницы между A~1 to A в файле B.

следующий рисунок иллюстрирует эту идею.

enter image description here