Создайте git-патч для определенного коммита - PullRequest
1101 голосов
/ 12 июля 2011

Мне нужно написать скрипт, который создает патчи для списка номеров коммитов SHA1.

Я пытался использовать git format-patch <the SHA1>, но он генерировал патч для каждого коммита начиная с этого SHA1.После того, как было сгенерировано несколько сотен патчей, мне пришлось убить процесс.

Есть ли способ сгенерировать патч только для определенного SHA1?

Ответы [ 9 ]

1750 голосов
/ 12 июля 2011

Попробуйте:

git <a href="https://www.kernel.org/pub/software/scm/git/docs/git-format-patch.html" rel="noreferrer">format-patch</a> -1 <sha>

или

git format-patch -1 HEAD

В соответствии со ссылкой на документацию выше, флаг -1 указывает git, сколько коммитов должно быть включено в патч;

-

Подготовка патчей из верхних коммитов.


Примените патч с помощью команды:

git am < file.patch
263 голосов
/ 23 апреля 2013

Для генерации патчей из верхних коммитов из определенного хэша sha1:

git format-patch -<n> <SHA1>

Последние 10 патчей из головы в одном файле патчей:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
78 голосов
/ 12 июля 2011

Скажем, у вас есть коммит 2 после коммита 1, который вы сможете запустить:

git diff 2 1 > mypatch.diff

, где 2 и 1 - хеш SHA.

55 голосов
/ 28 июля 2016

Эта команда (как уже предложено @ Нафтули Цви Кей ):

git format-patch -1 HEAD

Заменить HEAD на определенный хэш или диапазон.

создаст файл патча для последнего коммита, отформатированного в формате почтового ящика UNIX.

-<n> - Подготовить патчи из верхних коммитов.

Затем вы можете повторно применить файл исправления в формате почтового ящика:

git am -3k 001*.patch

См .: man git-format-patch.

25 голосов
/ 06 июля 2017
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

Быстрое и простое решение.

9 голосов
/ 24 мая 2016

Если вы хотите быть уверенным, что патч (одиночный коммит) будет применен поверх определенного коммита, вы можете использовать новую опцию git 2.9 (июнь 2016) git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

См. коммит bb52995 , коммит 3de6651 , коммит fa2ab86 , коммит ded2c09 (26 апреля 2016) Сяолун Е. (``).
(Объединено с Junio ​​C Hamano - gitster - in commit 72ce3ff , 23 мая 2016 г.)

format-patch: добавьте опцию '--base' для записи информации о базовом дереве

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

БазаДревовидная информация состоит из «базового коммита», который является хорошо известным коммитом, который является частью стабильной части истории проекта, на котором все остальные работают, и ноль или более «обязательных патчей», которые являются хорошо известными патчами вПолет, который еще не является частью «базового коммита», который необходимо применить поверх «базового коммита» в топологическом порядке, прежде чем патчи могут быть применены.

«Базовый коммит» отображается как «base-commit: ", за которым следует 40-шестнадцатеричный код имени объекта фиксации.
" Предварительно установленный патч "отображается как" prerequisite-patch-id: ", за которым следует 40-шестнадцатеричный" идентификатор патча ", который можно получить, передав патччерез команду "git patch-id --stable".


Git 2.23 (Q3 2019) улучшит это, потому что опция "--base" в "format-patch" вычислила patch-idsдля обязательных патчей в нестабильномСпособ, который был обновлен для вычислений способом, совместимым с "git patch-id --stable".

См. commit a8f6855 , commit 6f93d26 (26 апреля 2019 г.) Стивен Бойд (akshayka) .
(Объединено Junio ​​C Hamano - gitster - в коммит 8202d12 , 13 июня 2019 г.)

format-patch: сделать --base patch-id вывод стабильным

Мы не очищали контекст каждый раз, когда обрабатывали блок в patch-id генерация кода в diff.c, но мы делали это, когда генерировали «стабильные» идентификаторы исправлений с помощью инструмента patch-id.

Давайте перенесем эту похожую логику из patch-id.c в diff.c, чтобы мы могли получить тот же хеш, когда мы генерируем идентификаторы исправлений для типов команд format-patch --base=.

6 голосов
/ 04 мая 2016

Чтобы сгенерировать путь из определенного коммита (не последнего коммита):

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
4 голосов
/ 01 июня 2018

, если вы хотите просто изменить указанный файл, вы можете:

git diff master 766eceb - соединения /> 000-mysql-connector.patch

0 голосов
/ 17 января 2017

Как создать патч только для определенного SHA1?

Все довольно просто:

Вариант 1. git show commitID > myFile.patch

Вариант 2. git commitID~1..commitID > myFile.patch

Примечание: замените commitID на фактический идентификатор фиксации (код фиксации SHA1).

...