Git: применить изменения, внесенные фиксацией в одном репо, в другое репо

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

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

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

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

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

Ответ 1

В качестве взлома вы можете попробовать изменить рецепт сравнения коммитов в двух разных репозиториях на странице 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 для применения исправлений.

Ответ 2

Возможно, вы захотите использовать 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

Ответ 3

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