Создайте файл патча или diff из репозитория git и примените его к другому другому репозиторию git

155

Я работаю над проектом на основе WordPress и хочу исправлять свой проект в каждой новой версии WP. Для этого я хочу создать патч между двумя коммитами или тегами.

Например, в моем репо /www/WPя делаю это:

$git patch-format com1..com2 --stdout > ~/patchs/mypatch.patch

Или

$git patch-format tag1..tag2 --stdout > ~/patchs/mypatch.patch

/www/WP git natif WordPress

/www/myproject Мой git проект на основе WordPress

git applyКомандная строка не работает, я думаю , потому что мы находимся в разных хранилищах.

Могу ли я сгенерировать файл патча без коммита, просто дифференциал и применить его к другому git-репозиторию?

Спасибо заранее.

zatamine
источник

Ответы:

244

Вы можете просто использовать git diffдля создания унифицированного diff, подходящего для git apply:

git diff tag1..tag2 > mypatch.patch

Затем вы можете применить полученный патч с помощью:

git apply mypatch.patch
Энрико Кампидоглио
источник
1
Спасибо Энрико, я использовал, $git diff -u tag1..tag2 > mypatch.patchи $git apply --stat > mypatch.patchответ, 0 files changedпожалуйста, есть еще какие-нибудь предложения? :)
затамине
Вам необходимо указать путь к файлу исправления в качестве аргумента git apply. Я обновил свой ответ с примером.
Энрико Кампидоглио
1
Я использовал, git diff -p tag1 tag2 > my.patchкоторый работал хорошо.
Барклай
Как сделать патчи в унифицированном формате diff? sourceware.org/glibc/wiki/… говорит, Only unified diff (-uNr) format is acceptable.но когда я пытаюсь, git diff -uNr tag1..tag2 > mypatch.patchя получаю сообщениеusage: git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
Аарон Франке
2
Будьте осторожны git diff ...+ git apply ...не обрабатывайте удаленные / перемещенные файлы должным образом ... когда git format-patch ...+ git am ...сделайте.
Вринс
51

Чтобы создать патч для нескольких коммитов, вы должны использовать format-patchкоманду git, например

git format-patch -k --stdout R1..R2

Это экспортирует ваши коммиты в файл патча в формате почтового ящика.

Чтобы сгенерировать патч для последнего коммита, запустите:

git format-patch -k --stdout HEAD^

Затем в другом репозитории примените патч командой amgit, например

git am -3 -k file.patch

Смотрите: man git-format-patchа git-am.

kenorb
источник
1
Как насчет патча, который может быть применен patch -p1? sourceware.org/glibc/wiki/…
Аарон Франке
Я переносил патч с linux на winodws, поэтому пришлось использовать --ignore-whitespace, как упомянуто здесь stackoverflow.com/questions/13190679/…
Mahesh
2
@AaronFranke, вы можете попробовать опцию '-p': git format-patch -p HEAD ^ 1
Piroxiljin
Следует отметить, что это имеет преимущество в том, что сохраняет сообщения о коммитах, авторах и датах коммитов оригинальных коммитов.
М. Джастин
0

В качестве дополнения, чтобы создать патч только для одного конкретного коммита, используйте:

git format-patch -1 <sha>

Когда файл патча сгенерирован, убедитесь, что ваш другой репозиторий знает, где он находится, когда вы используете git am ${patch-name}

Перед добавлением патча, используйте, git apply --check ${patch-name}чтобы убедиться, что нет конфликта.

Евгений
источник