2016-08-08 2 views
1

Я хочу перечислить complete history of Linux как ряд патчей (в унифицированном формате diff), который я могу автоматически обрабатывать от первого до сегодняшнего мастера. Теоретически это позволило бы мне восстановить современную версию из журнала. Для этого я бегу следующую команду:Как я могу получить с git журнал серии патчей, которые могут быть автоматически применены?

git -c diff.renameLimit=30000 log -m -M -C --pretty=tformat:'commit %H %ct' --topo-order --reverse -U0

К сожалению, кажется, что git log, либо из-за неправильных вариантов, которые я даю это или из-за ошибки, начинается (после 1280 фиксаций) выводящий различия, которые делают не соответствуют предыдущему состоянию и поэтому не могут применяться автоматически (например, через патч).

В качестве примера, работает git log -m -M -C --pretty=tformat:'commit %H %ct' --topo-order --reverse -U0 43acd296..9b7855ca -- drivers/usb/auerswald.c генерирует диф, что патча (1) не может применяться к извлеченной системе при пересмотре 43acd296. (Проблема такая же, как и при непрерывном выходе журнала.) Напротив, запуск git diff -U0 43acd296 9b7855ca -- drivers/usb/auerswald.c создает diff, который может быть применен к ревизии 43acd296 без проблем.

Есть ли дополнительные опции, которые я должен давать git log, чтобы получить результат, который я хочу? (Я пытался --full-history, но проблема сохраняется.)

ответ

1

Вы, вероятно, следует использовать git format-patch:

Prepare each commit with its patch in one file per commit, formatted to resemble UNIX mailbox format. The output of this command is convenient for e-mail submission or for use with git am.

Общий синтаксис:

git format-patch <revision range> 

Где <revision range> это может быть диапазон коммитов , как 88236e3..40bc760.

Вы получите в качестве выходного файла один файл за фиксацию, названный последовательно.

+0

Спасибо! Почему вы думаете, что 'git-format-patch' избежит проблемы, которую я видел с помощью git-log? Кроме того, я хотел бы указать краткий машиночитаемый выходной формат, а 'git-format-patch', похоже, не предлагает опцию' --format'. –

+1

Я предлагал 'git-format-patch', потому что он, похоже, предназначен для того, чтобы делать то, что вы хотите сделать (создать серию однократных патчей), и в отличие от' git log' он явно разработан для обеспечения * ввода * вернуться в git. Я не уверен, как примирить «точный, машиночитаемый» с «сгенерировать патч», поэтому я не могу предложить никаких предложений. – larsks

+0

Не похоже, что 'git format-patch' достаточно прост, чтобы экспортировать весь репозиторий. Когда я копирую репозиции с '(cd" $ 1 "&& git --no-stat -M -C --stdout --root HEAD) | (rm -rf "$ 2" && mkdir "$ 2" && cd "$ 2" && git init && git am) 'на Docker Git repo Я получаю ошибку' error: patch failed: filesystem.go: 7 error: filesystem.go : патч не применяется. Патч не выполнен на 0062' –

Смежные вопросы