Как применить патч `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
suppie
источник
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

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

denis.peplin
источник
-16

Попробуй это:

$ git apply file.diff
Шаши
источник
29
Смотрите вопрос: «без установленного git»
CB Bailey