Як створити git-патч для конкретного комітету?


1231

Мені потрібно написати сценарій, який створює патчі для списку номерів комісій SHA1.

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

Чи є спосіб генерувати виправлення лише для конкретного SHA1?

Відповіді:


1989

Спробуйте:

git format-patch -1 <sha>

або

git format-patch -1 HEAD

Згідно з посиланням на документацію вище, -1прапор повідомляє git, скільки комісій повинно бути включено в патч;

- <n>

     Підготуйте виправлення з верхніх комітів.


Застосуйте виправлення за допомогою команди:

git am < file.patch

210
Застосування виправлення: git apply --stat file.patch# show stats. git apply --check file.patch# перевірити на помилку перед застосуванням. git am < file.patch# застосувати патч нарешті.
Адріан

3
Здається, це не працює, якщо останній фільтр є об'єднанням з іншої галузі.
Лекс Лі

2
Щоб застосувати виправлення до файлів, використовуючи закінчення рядків CRLF:git am --keep-cr < mypatch.patch
Michael Schmeißer

40
Використовуйте git am -3 < file.patchдля застосування за допомогою тристороннього злиття, яке дозволить вам вирішити конфлікти, використовуючи git mergetoolзгодом (або редагуючи вручну), знайдені тут .
Метт

6
Ця команда також працює лише для певного файлу (файлів) з git format-patch -1 <sha> path/to/file.jsкоміту : Це створить лише патч, що містить розрізки для file.js
Крістоф Домбі

281

Для генерації виправлень з верхніх комітів із конкретного ша1 хеша:

git format-patch -<n> <SHA1>

Останні 10 патчів з голови в одному файлі патча:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

2
ви можете бути
ласкавими

1
git format-patch -1 HEADстворить патч для останнього
комітету

1
Вибачте мене за запитання про це, тож коли це -2генерує патчі для останніх 2 комітів, це ще одна річ, для уточнення - це команда got format-patch -2 HEADтака ж, як і рядокgit format-patch HEAD~2
Kasun Siyambalapitiya

85

Скажіть, у вас є ідентифікатор комісії 2 після здійснення 1, ви зможете запустити:

git diff 2 1 > mypatch.diff

де 2 і 1 - хеші SHA.


Дякую вам, докекестер за відповідь. Це означає, що мені потрібен сценарій, щоб знайти документи, які передували тим, що мене цікавлять. Я сподівався, що зможу цього уникнути.
elle

11
@elle, ні, ти не - git diff hash^ hash. "хеш ^" дають попередній коміт. (але, звичайно, відповідь manojlds краща)
J-16 SDiZ

2
git show HEAD > mypatch.diffв той час як ви перебуваєте на комісії, ви повинні зробити те саме.
andho

1
@dookehester це правильно чи це інакше,git diff 1 2
Kasun Siyambalapitiya

1
Це не зможе включити жодні бінарні файли в розл.
stuckj

55

Ця команда (як уже запропонував @ Naftuli Tvi Kay ):

git format-patch -1 HEAD

Замініть HEADпевний хеш або діапазон.

згенерує файл виправлення для останнього формату фіксації, який нагадує формат поштової скриньки UNIX.

-<n> - Підготуйте виправлення з верхніх комітів.

Потім ви можете повторно застосувати файл патча у форматі поштової скриньки:

git am -3k 001*.patch

Див: man git-format-patch.


Дякую! Я думаю, що варто зауважити, що застосування патча створить команду з повідомленням фіксації з префіксом [PATCH]. Це легко виправити, хоча
Майк Ш

2
Феноменальний. ОП, ви цього не прийняли, тому що ...? @MikeS Ні, це не більше, ніж будь-який інший gitформатизований патч, принаймні, якщо користувач застосовує його правильно.
підкреслюйте_d

2
@MikeS Я насправді не досліджував чому, але залишаючи поза увагою -k прапор ( git am -3) зафіксовано цю форму мене (немає PATCH[0/10]повідомлень про фіксацію). Версія Git 2.20.1.Windows.1
jannis

30
git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

Швидке і просте рішення.


5
Також не забудьте зателефонувати git apply --check patch-file-nameперед накладенням патча. Це допоможе уникнути проблем.
iamantony

16

Якщо ви хочете бути впевненим, що патч (одиночна фіксація) буде застосовано поверх певної комісії, ви можете використовувати новий варіант 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 р.) Від Xiaolong Ye (``) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 72ce3ff , 23 травня 2016 р.)

format-patch: Додати --baseопцію " " для запису інформації про базове дерево

Технічні працівники або сторонні тестери можуть захотіти знати саме базове дерево, до якого застосовується серія патчів. Навчити git format-patch a '--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".

Див. Комісію a8f6855 , виконайте 6f93d26 (26 квітня 2019 р.) Від Стивена Бойда ( akshayka) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 8202d12 , 13 червня 2019 р.)

format-patch: зробити --base patch-idвихід стабільним

Ми не розмивали контекст щоразу, коли обробляли парку patch-idкоду генерації diff.c, але ми це робили, коли генерували "стабільні" патчі-ідентифікатори patch-idінструментом " ".

Порт Давайте , що подібна логіка над з patch-id.cв diff.cтак що ми можемо отримати той же хеш , коли ми породжує патч-ідентифікатори для « format-patch --base=» типів командних викликів.


Перед Git 2.24 (Q4 2019) " git format-patch -o <outdir>" зробив еквівалент " mkdir <outdir>" не " mkdir -p <outdir>", що виправляється.

Див. Команду edefc31 (11 жовтня 2019 р.) Від Берта Везарга ( bertwesarg) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті f1afbb0 , 18 жовтня 2019 р.)

format-patch: створити провідні компоненти вихідного каталогу

Підписався: Берт Везарг

'git format-patch -o' зробив еквівалент 'mkdir' не 'mkdir -p', що виправляється.

Уникайте використання " adjust_shared_perm" у провідних каталогах, які можуть мати наслідки для безпеки. Досягається тимчасовим вимкненням config.sharedRepository"подібних" дій git init.


З Git 2.25 (Q1 2020), " git rebase" не працювало добре, коли format.useAutoBaseвстановлена ​​змінна конфігурація, яка була виправлена.

Див .: Зробити cae0bc0 , зробити 945dc55 , зробити 700e006 , зробити a749d01 , здійснити 0c47e06 (04 грудня 2019 р.) Від Дентона Лю ( Denton-L) .
(Об’єднав Хуніо С Хамано - gitster- у комітеті 71a7de7 , 16 грудня 2019 р.)

rebase: виправити format.useAutoBaseполомку

Повідомляє: Крістіан Бізінгер
Підписався: Дентон Лю

З format.useAutoBase = true, запущена база даних призвела до помилки:

fatal: failed to get upstream, if you want to record base commit automatically,
please use git branch --set-upstream-to to track a remote branch.
Or you could specify base commit by --base=<base-commit-id> manually
error:
git encountered an error while preparing the patches to replay
these revisions:

ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12

As a result, git cannot rebase them.

Виправте це, переходячи завжди --no-baseдо формату-патча з ребазу, щоб ефект format.useAutoBaseвідмінено.


8

Щоб генерувати шлях із конкретного комітету (не останнього комітету):

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

4

якщо ви просто хочете розрізняти вказаний файл, ви можете:

git diff master 766eceb - з'єднання /> 000-mysql-connector.patch


0

Зі своїм походженням я збирався використовувати:

git log --patch -1 $ID > $file

Але я зараз розглядаю можливість використання git format-patch -1 $ID.


-5

Який спосіб генерувати виправлення лише для конкретного SHA1?

Це досить просто:

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

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

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


3
Варіант 1 прямо неправильний і не пов'язаний з питанням.
Аншуман Манрал

3
Варіант 2 також є недійсною командою. Ви отримаєте повідомлення про помилку , як: мерзотник a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 ~ 1..a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 мерзотник: «a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 ~ 1..a5f4bcaeb7fa7de27ae79d9522332e872889bbf0» не є командою мерзотник. Див. "Git --help". Прохання перевірити перед публікацією відповідей
Аншуман Манрал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.