Как применить патч `git diff` без установленного Git?
280
Как мой клиент может применить патч, созданный git diffбез установленного git? Я пытался использовать patchкоманду, но она всегда запрашивает имя файла для исправления.
Кто-нибудь знает, как это сделать, если патч включает переименования? Патч поддерживает это изначально?
Пол Кроули
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 как патч.
Или использовать 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 в ответе Сьюпи, в начале он лишился слэша.
@chrisjlee git diffпоставит a/и b/префиксы на выходе, поэтому patch -p1пренебрегает тем , чтобы применить патч - файл.
Wberry
49
использование
git apply patchfile
если возможно.
patch -p1 < patchfile
имеет потенциальный побочный эффект.
git applyтакже обрабатывает добавления, удаления и переименования файлов, если они описаны в git diffформате, что patchне сработает. И, наконец, git applyмодель «применить все или отменить все», в которой либо применяется все, либо ничего нет, тогда как исправление может частично применять файлы исправлений, оставляя ваш рабочий каталог в странном состоянии.
+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
Таким образом, конфликты могут быть разрешены как обычно.
patch
не полностью поддерживает этот формат.Ответы:
и
работает, но, как многие заметили в комментариях и других ответах, патч не понимает, добавляет, удаляет и переименовывает. Варианта нет, но
git apply patchfile
если вам нужно обрабатывать файлы, добавляет, удаляет и переименовывает.РЕДАКТИРОВАТЬ декабрь 2015
Последние версии
patch
команды (2.7, выпущенные в сентябре 2012 года) поддерживают большинство функций формата diff - git, в том числе переименования и копии, изменения разрешений и различия в символьных ссылках (но еще не в двоичных версиях) ( объявление о выпуске ).Таким образом, при условии, что используется текущая / последняя версия
patch
, нет необходимости использовать его,git
чтобы иметь возможность применять его diff как патч.источник
git diff > patchfile
, ноpatch -p1 < patchfile
relative
опцию, например:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
не требует установленного git. Первая команда демонстрирует команду для генерации diff, а не для ее применения.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
илиgit diff from_branch to_branch > patchfile; ...
попробуй это:
источник
git diff
поставитa/
иb/
префиксы на выходе, поэтомуpatch -p1
пренебрегает тем , чтобы применить патч - файл.использование
если возможно.
имеет потенциальный побочный эффект.
git apply
также обрабатывает добавления, удаления и переименования файлов, если они описаны вgit diff
формате, чтоpatch
не сработает. И, наконец,git apply
модель «применить все или отменить все», в которой либо применяется все, либо ничего нет, тогда как исправление может частично применять файлы исправлений, оставляя ваш рабочий каталог в странном состоянии.источник
git apply
это лучший способ сделать это, но этот вопрос специально спрашивает, как применить патч без установленного Git .--dry-run --verbose
полезны для определения побочных эффектов, если они есть. (используя патч v2.5.8)git apply patchfile -
... единственный здравомыслящий ответ ..." - это почти смешно. Каждый раз, когда разработчики OpenSSL посылают мне патч для тестирования, Git не может его применить. Это каждый раз. Я еще не видел, чтобы этот тупой инструмент применил патч.я использую
Таким образом, конфликты могут быть разрешены как обычно.
источник
Попробуй это:
источник