Как применить патч `git diff` без установленного Git?


280

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


4
Кто-нибудь знает, как это сделать, если патч включает переименования? Патч поддерживает это изначально?
— Пол Кроули

3
Вопрос должен быть: есть ли способ применить git diff без установленного git? Как отмечено ниже , patchне полностью поддерживает этот формат.
— Арье Лейб Таурог

Ответы:


425
git diff > patchfile

и

patch -p1 < patchfile

работает, но, как многие заметили в комментариях и других ответах, патч не понимает, добавляет, удаляет и переименовывает. Варианта нет, но git apply patchfileесли вам нужно обрабатывать файлы, добавляет, удаляет и переименовывает.


РЕДАКТИРОВАТЬ декабрь 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 в ответе Сьюпи, в начале он лишился слэша.
— Андрей Кузнецов

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)
— spyle

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

8

я использую

patch -p1 --merge < patchfile

Таким образом, конфликты могут быть разрешены как обычно.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.