Git format-patch против git log -p

Я хотел бы получить список коммитов как патчи, а затем попытаться применить их к другому репо, в котором я сохранил очень близкий проект к тому, из которого я хочу получить патч: как я могу в одной команде получить все патчи? Каков наилучший метод (и различия) между git format-patch и git log -p?

3 ответа

Решение

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

Однако я бы сказал, что этот подход не так гибок, чем использование git format-patch а также git am, но может быть быстрее, если вы не хотите просматривать каждый патч вручную.

git bundle create file.name revision..list - создаст файл с file.name в текущую папку и положить в нее содержимое указанных ревизий.

git bundle unbundle file.name восстановить ревизии в другом месте.

git log -p показывает изменения в обратном хронологическом порядке (самые последние сначала). Обычно это не очень хорошо для генерации патчей, так как вы хотите начать патч с самого раннего изменения, а не с самого последнего.

git format-patch генерирует патчи в правильном направлении (патч 0001 будет самым ранним изменением), и он сохраняет патчи по одному файлу и форматирует их как сообщения электронной почты, подходящие для использования с git am на принимающей стороне.

Так что для того, что вы хотите, вероятно, имеет смысл запустить git format-patch в одном хранилище, а затем git am в целевом хранилище:

cat *.patch | git am

Если вы отформатируете хеш, полученный в git log, добавив перед номером пути символ "-", все патчи могут быть сгенерированы одновременно в разных файлах. Пример:

git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')

Это покроет весь фильтр, который вы можете применить из git log. Они не всегда последовательные коммиты. Например, принимая патчи, соответствующие данному пользователю:

git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')

Опция --reverse необходима для того, чтобы предоставить вам патч в хронологическом порядке, потому что git log в первую очередь дает наибольшее количество изменений.

Другие вопросы по тегам