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

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


person epsilones    schedule 17.01.2013    source источник
comment
Вы смотрели на git bundle?   -  person Adam Dymitruk    schedule 17.01.2013
comment
спасибо, это кажется очень интересным, но я ищу что-то простое   -  person epsilones    schedule 17.01.2013
comment
@Newben Если коммиты разделяют историю, git bundle очень просто: создайте пакет с git bundle create my-bundle HEAD~10..HEAD (извлекает последние десять коммитов, HEAD~10 должен присутствовать в месте назначения). Получите его в пункте назначения с помощью git fetch my-bundle :somebranch. Теперь у вас есть коммиты как somebranch, которые вы можете объединить или перебазировать по своему усмотрению.   -  person user4815162342    schedule 17.01.2013


Ответы (3)


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

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

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

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

person shytikov    schedule 17.01.2013

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

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

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

cat *.patch | git am
person larsks    schedule 17.01.2013
comment
В настоящее время существует журнал git --reverse. - person yucer; 16.05.2016

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

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

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

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

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

person yucer    schedule 16.05.2016
comment
спасибо за ваш ответ, я наконец-то решил свою проблему;) - person epsilones; 16.05.2016