Как применить патч 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~1toAв файлB.откройте трехсторонний инструмент слияния, например, вне сравнения, путь левой панели
A, средняя панель является общим предком, поэтому путьA~1, путь правой панелиB. Затем на нижней панели отображается результат применения разницы междуA~1toAв файлеB.следующий рисунок иллюстрирует эту идею.
