Створіть патч або diff файл із сховища git та застосуйте його до іншого іншого сховища git


155

Я працюю над проектом, заснованим на WordPress, і хочу виправити свій проект у кожній новій версії WP. Для цього я хочу створити патч між двома комітами або тегами.

Наприклад, в репортажі /www/WPя роблю це:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Або

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Мій git-проект на базі WordPress

git applyКомандний рядок не працює, я думаю , тому що ми знаходимося в різних сховищах.

Чи можу я генерувати патч-файл без комісії, просто диференціюючи і застосувати його до іншого сховища git?

Дякую заздалегідь

Відповіді:


243

Ви можете просто використовувати git diffдля створення уніфікованої різниці, яка підходить для git apply:

git diff tag1..tag2 > mypatch.patch

Потім ви можете застосувати отриманий пластир за допомогою:

git apply mypatch.patch

1
Дякую, Енріко, я використав, $git diff -u tag1..tag2 > mypatch.patchі $git apply --stat > mypatch.patchвідповідь - 0 files changedбудь-яка інша пропозиція, будь ласка? :)
затамін

Вам потрібно вказати шлях до файлу патча як аргумент git apply. Я оновив свою відповідь прикладом.
Енріко Кампіддогліо

1
Я використовував, git diff -p tag1 tag2 > my.patchякий добре працював.
barclay

Як зробити патчі в уніфікованому форматі diff? sourceware.org/glibc/wiki/… каже, Only unified diff (-uNr) format is acceptable.але коли я намагаюся git diff -uNr tag1..tag2 > mypatch.patchотримати повідомленняusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Аарон Франке

2
Будьте уважні git diff ...+ git apply ...не обробляйте видалені / переміщені файли належним чином ... коли git format-patch ...+ git am ...робити.
vrince

50

Щоб створити патч для декількох комітетів, слід використовувати format-patchкоманду git, наприклад

git format-patch -k --stdout R1..R2

Це експортує ваші зобов’язання у патч-файл у форматі поштової скриньки.

Щоб генерувати патч для останньої комісії, запустіть:

git format-patch -k --stdout HEAD^

Потім в іншому сховищі застосуйте патч за допомогою amкоманди git, наприклад

git am -3 -k file.patch

Див .: man git-format-patchі git-am.


1
Що з патчем, який можна застосувати patch -p1? sourceware.org/glibc/wiki/…
Аарон Франке

Я переміщав патч з Linux на winodws, тому довелося використовувати --ignore-whitespace, як згадується тут stackoverflow.com/questions/13190679/…
Mahesh

2
@AaronFranke, ви можете спробувати "-p" варіант: git format-patch -p HEAD ^ 1
Piroxiljin

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

0

В якості доповнення, щоб створити патч лише для одного конкретного комітету, використовуйте:

git format-patch -1 <sha>

Коли генерується файл виправлення, переконайтеся, що інше репо знає, де воно знаходиться під час використання git am ${patch-name}

Перш ніж додавати виправлення, git apply --check ${patch-name}переконайтесь, що немає конфлікту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.