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