Як застосувати патч `git diff` без встановлення Git?


280

Як мій клієнт може застосувати патч, створений git diffбез встановленого git? Я намагався використовувати patchкоманду, але вона завжди просить ім'я файлу для виправлення.


4
Хтось знає, як це зробити, якщо патч включає перейменування? Чи підтримує патч, що зараз живе?
Пол Кроулі

3
Справді має бути питання: чи існує спосіб застосувати git diff без встановленого git? Як зазначалося нижче , patchцей формат не повністю підтримує.
Aryeh Leib Taurog

Відповіді:


425
git diff > patchfile

і

patch -p1 < patchfile

робота, але як багато людей помітили в коментарях та інших відповідях, патч не розуміє додавання, видалення та перейменування. Немає жодної опції, але git apply patchfileякщо вам потрібна обробка файлів, додає, видаляє та перейменовує файли.


EDIT грудень 2015 року

Останні версії patchкоманди (2.7, випущені у вересні 2012 року) підтримують більшість функцій формату "diff --git", включаючи перейменування та копії, зміни дозволів та розширення символьного посилання (але ще не є бінарним розходженням) ( оголошення про випуск ).

Таким чином, за умови використання поточної / останньої версії patchнемає необхідності використовувати, gitщоб мати можливість застосовувати його diff як виправлення.


97
Або використовувати git diff > patchfile, алеpatch -p1 < patchfile
Якуб Нарбський

11
Якщо ви хочете створити патч-файл підпутника репозиторію, ви можете скористатися такою relativeопцією, як:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfileне вимагає встановлення git. Перша команда демонструє команду для генерації diff, не застосовуючи її.
Андрій Кузнєцов

1
Створений патч призначений для змін від гілки / refspec, зазначених у команді, до поточної чи активної гілки. Іншими словами, ви хочете git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileабоgit diff from_branch to_branch > patchfile; ...
варити

1
@PaulChechetin Як відповів egor83 у відповіді suppie, він на початку знімає косу рису.
Андрій Кузнєцов

75

спробуйте це:

patch -p1 < patchfile

4
Що робить аргумент -p1?
chrisjlee

8
Смуги нахилу на початку. Дивіться man patch
egor83

16
@chrisjlee git diffпоставить a/і b/префікси у висновку, тому patch -p1нехтує тими, хто застосовує патч-файл.
wberry

49

Використовуйте

git apply patchfile

якщо можливо.

patch -p1 < patchfile 

має потенційний побічний ефект.

git applyтакож обробляє додавання, видалення та перейменування файлів, якщо вони описані у git diffформаті, що patchне буде робити. Нарешті, git applyце модель "застосувати всіх або перервати все", де застосовується або все, або нічого немає, тоді як патч може частково застосовувати файли патчів, залишаючи ваш робочий каталог у дивному стані.


1
+1, Єдина розумна відповідь. Більше того, diff / patch не обробляє символьні посилання, що є проблемою, якщо (наприклад) ви повертаєте патч ядра 3.10 Linux.
ignis

10
Так, git applyце найкращий спосіб зробити це, але це питання спеціально задає питання, як застосувати патч без встановлення Git .
Колін Д Беннетт

1
Варіанти --dry-run --verboseкорисні для визначення того, які побічні ефекти будуть, якщо такі є. (використовуючи патч v2.5.8)
шпиль

@ignis - " git apply patchfile -... єдина відповідна відповідь ..." - це майже смішно. Кожен раз, коли розробники OpenSSL надсилають мені патч для тестування, Git не вдається застосувати його. Це щоразу . Я ще не бачив, як цей дурний інструмент застосовує виправлення.
jww

8

я використовую

patch -p1 --merge < patchfile

Таким чином конфлікти можуть бути вирішені як завжди.


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