Я хотел бы получить список коммитов в виде патчей, а затем попытаться применить их к другому репо, в котором я сохранил проект, очень близкий к тому, из которого я хочу получить патч: как я могу одной командой получить все патчи ? каков наилучший метод (и различия) между 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. Они не всегда являются последовательными коммитами. Например, взяв патчи, соответствующие данному пользователю:
git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
Параметр --reverse необходим, чтобы выдать вам патч в хронологическом порядке, потому что git log сначала выдает самые последние.
git bundle
? - person Adam Dymitruk   schedule 17.01.2013git bundle
очень просто: создайте пакет сgit bundle create my-bundle HEAD~10..HEAD
(извлекает последние десять коммитов,HEAD~10
должен присутствовать в месте назначения). Получите его в пункте назначения с помощьюgit fetch my-bundle :somebranch
. Теперь у вас есть коммиты какsomebranch
, которые вы можете объединить или перебазировать по своему усмотрению. - person user4815162342   schedule 17.01.2013