Як створити 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.