git: применить изменения, внесенные коммитом в одном репо к другому репо - PullRequest
103 голосов
/ 28 сентября 2010

У меня есть repo1 и repo2 на локальной машине.Они очень похожи, но последняя - это какая-то другая ветка (repo1 больше не поддерживается).

/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X

Как применить изменения, сделанные коммитом <some_sha> в repo1 к repo2?

Нужно ли мне подготовить какой-нибудь патч или можно сделать cherry-pick между репо?

Как насчет того же, но для диапазона коммитов?

Ответы [ 4 ]

183 голосов
/ 28 сентября 2010

Возможно, вы захотите использовать git format-patch, а затем git am, чтобы применить этот патч к вашему хранилищу.

/path/to/1 $ git format-patch sha1^..sha1
/path/to/1 $ cd /path/to/2
/path/to/2 $ git am -3 /path/to/1/0001-…-….patch

Или в одну строку:

/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3
86 голосов
/ 28 сентября 2010

Вы можете сделать cherry-pick, если добавите второй репо в качестве удаленного к первому (а затем fetch).

29 голосов
/ 29 сентября 2010

Как хак, вы можете попробовать изменить рецепт для сравнения коммитов в двух разных репозиториях на странице GitTips , то есть:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \
git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify <commit>)

, где ../repo - это путь к другому репозиторию.,

С современным Git вы можете использовать несколько ревизий и диапазонов ревизий с cherry-pick .

$(git --git-dir=../repo/.git rev-parse --verify <commit>) здесь для перевода <commit> (например, HEAD, или v0.2, или master~2, которые являются значениями во втором хранилище, из которого вы копируете) в идентификатор SHA-1 коммита.Если вы знаете SHA-1 об изменениях, которые вы хотите выбрать, это необязательно.

ПРИМЕЧАНИЕ однако Git может пропускать копирование объектов из исходного репозитория, так как не знает, чтохранилище альтернативных объектов является временным для одной операции.Вам может потребоваться скопировать объекты из второго хранилища с помощью:

GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f

Это помещает объекты, заимствованные из второго хранилища, в исходное хранилище хранилища

Не проверено.


Не очень удачное решение - следовать knittl answer :

  • Перейти во второй репозиторий, из которого вы хотите копировать коммиты, и генерировать патчи из коммитов, которые выхотите с git format-patch
  • При желании скопируйте исправления (0001- * и т. д.) в свой репозиторий
  • Используйте git am --3way для применения исправлений
5 голосов
/ 17 февраля 2012

Я написал небольшой скрипт для применения diff к репо diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...