2010-08-05 8 views
258

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

+4

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

+3

Вопрос должен быть действительно: * есть ли способ * применить git diff без установки git? [Как указано ниже] (http://stackoverflow.com/a/17958129/519015), 'patch' не полностью поддерживает этот формат. –

ответ

391
git diff > patchfile 

и

patch -p1 < patchfile 

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


EDIT декабря 2015

Последние версии patch команды (2.7, выпущенные в сентябре 2012 года) поддерживает большинство функций формата "дифф --git", в том числе переименований и копий, изменения прав доступа , и symlink diffs (но еще не бинарные различия) (release announcement).

При условии, что используется текущая/последняя версия patch, нет необходимости использовать git, чтобы иметь возможность применять ее diff как патч.

+96

Или используйте 'git diff> patchfile', но' patch -p1

+10

Если вы хотите создать файл паттерна подпути репозитория, вы можете использовать опцию 'relative', например:' git diff --no-prefix --relative = my/relative/path> patchfile' –

+0

Разве это не требует установки git? Вопрос в том, как это сделать без git? – UpTheCreek

-9

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

$ git apply file.diff 
+25

См. Вопрос: «без git installed» –

+1

Спасибо, это работает и для пользователей Windows. – motto

+3

Downvoted, так как OP говорит: «без git установлен» – scrapcodes

72

попробовать это:

patch -p1 < patchfile 
+4

Что делает аргумент -p1? – chrisjlee

+8

Полосы слэш в начале. См. [Man patch] (http://unixhelp.ed.ac.uk/CGI/man-cgi?patch+1) – egor83

+14

@chrisjlee 'git diff' будет помещать' a/'и' b/'префиксы в вывод , поэтому 'patch -p1' игнорирует те, которые применяются к файлу исправления. – wberry

47

Использование

git apply patchfile 

, если это возможно.

patch -p1 < patchfile 

имеет потенциальный побочный эффект.

также обрабатывает файл, который добавляет, удаляет и переименовывает, если они описаны в формате git diff, который patch не будет выполнять. Наконец, git apply - это модель «применить все или прервать все», где либо применяется, либо ничего, а патч может частично применять файлы исправлений, оставляя ваш рабочий каталог в странном состоянии.

+1

+1, Единственный разумный ответ. Кроме того, diff/patch не будет обрабатывать символические ссылки, что является проблемой, если (например) вы возвращаете исправление ядра ядра 3.10. – ignis

+8

Да, 'git apply '- лучший способ сделать это, но этот вопрос задает вопрос, как применять патч * без установки Git *. –

+0

Опции '--dry-run --verbose' полезны для определения того, какие будут побочные эффекты, если они есть. (используя patch v2.5.8) – spyle

5

Я использую

patch -p1 --merge < patchfile 

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

Смежные вопросы