Создайте патч git для определенного коммита
Мне нужно написать script, который создает исправления для списка номеров фиксации SHA1.
Я попытался использовать git format-patch <the SHA1>
, но сгенерировал патч для каждой фиксации с этого SHA1. После того, как было создано несколько сотен исправлений, мне пришлось убить процесс.
Есть ли способ создать патч только для конкретного SHA1?
Ответы
Ответ 1
Пытаться:
git format-patch -1 <sha>
или же
git format-patch -1 HEAD
Согласно приведенной выше ссылке на документацию, флаг -1
сообщает git, сколько -1
должно быть включено в патч;
- <п>
Подготовьте патчи из верхних коммитов.
Примените патч с помощью команды:
git am < file.patch
Ответ 2
Для создания патчей с самого верхнего значения происходит фиксация определенного хэша sha1:
git format-patch -<n> <SHA1>
Последние 10 патчей из головы в одном файле патча:
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
Ответ 3
Скажите, что у вас есть идентификатор 2 после фиксации 1, который вы могли бы запустить:
git diff 2 1 > mypatch.diff
где 2 и 1 являются SHA-хешами.
Ответ 4
Эта команда (как уже было предложено @Naftuli Tzvi Kay):
git format-patch -1 HEAD
Замените HEAD
специальным хешем или диапазоном.
создаст файл исправления для последней фиксации, отформатированной так, чтобы она напоминала формат почтового ящика UNIX.
-<n>
- Подготовьте исправления от самых верхних коммитов.
Затем вы можете повторно применить файл исправления в формате почтового ящика:
git am -3k 001*.patch
Смотрите: man git-format-patch
.
Ответ 5
git format-patch commit_Id~1..commit_Id
git apply patch-file-name
Быстрое и простое решение.
Ответ 6
Если вы хотите быть уверенным, что исправление (одиночная фиксация) будет применено поверх определенной фиксации, вы можете использовать новую опцию git format-patch --base
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 г.) от Xiaolong Ye ('').
(Объединено Junio C Hamano - gitster
- в коммите 72ce3ff, 23 мая 2016 г.)
format-patch
: добавить --base
" --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
" git patch-id --stable
".
Смотрите коммит a8f6855, коммит 6f93d26 (26 апреля 2019) Стивена Бойда (akshayka
).
(Объединено Junio C Hamano - gitster
- в коммите 8202d12, 13 июня 2019 г.)
format-patch
: сделать --base patch-id
format-patch
--base patch-id
стабильным
Мы не очищали контекст каждый раз, когда обрабатывали diff.c
в коде генерации patch-id
в diff.c
, но мы делали это, когда генерировали "стабильные" идентификаторы заплат с помощью инструмента " patch-id
".
Позвольте перенести эту похожую логику из patch-id.c
в diff.c
чтобы мы могли получить тот же хэш, когда генерируем patch-id для типов командных вызовов format-patch --base=
.
Ответ 7
Чтобы создать путь из определенного коммита (а не последнего коммита):
git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
Ответ 8
если вы просто хотите изменить указанный файл, вы можете:
git diff master 766eceb - connections/> 000-mysql-connector.patch
Ответ 9
Каков способ создания патча только для конкретного SHA1?
Это довольно просто:
Вариант 1. git show commitID > myFile.patch
Вариант 2. git commitID~1..commitID > myFile.patch
Примечание. Замените commitID
на фактический идентификатор фиксации (код фиксации SHA1).