объединение двух репозиториев git, одного клона git-cvs, одного клона git-svn - PullRequest
2 голосов
/ 29 октября 2010

Я использую код из CVS-контролируемого репозитория (@sourceforge). Вместо того, чтобы использовать его напрямую, я использовал клон git, сделанный кем-то другим. В моем клоне у меня есть несколько модификаций.

Тем временем вышестоящий проект переключился на SVN (@googlecode). Я был в состоянии создать автоматически обновляемый клон git этого самого.

Теперь я хотел бы применить мои предыдущие модификации CVS / git в SVN / git. К сожалению, SHA отличаются для тех же коммитов.

Ответы [ 2 ]

1 голос
/ 31 октября 2010

Предполагая, что ваши патчи находятся в одной линейной последовательности, вы можете сделать это довольно легко, используя "git format-patch" и "git am" .Сначала переключите новый репозиторий на ревизию, из которой ваши изменения должны прорасти, и создайте новую ветвь для хранения ваших изменений:

cd $NEWREPO
git checkout -b my-changes $SPROUT_POINT

Затем используйте «git format-patch» для экспорта диапазона R1..R2 изфиксирует, что вы хотите перенести, и «git am» примените их в новом хранилище:

(cd $OLDREPO; git format-patch -k --stdout R1..R2) | (cd $NEWREPO; git am -k)

Я рекомендую сначала применить исправления к ревизии, соответствующей ревизии CVS, из которой они изначально выросли, так какдолжно быть успешным без каких-либо конфликтов.Затем, если необходимо, используйте «git rebase» в новом хранилище, чтобы переместить коммиты на кончик соответствующей ветви Subversion.

0 голосов
/ 01 ноября 2010

Другим вариантом является получение изменений из вашего репозитория CVS и их перебазирование в репозитории SVN.Вот так (все сделано в репозитории svn)

git remote add cvs-repo /path/to/you/cvs/clone
git fetch cvs-repo
git checkout -b my-branch-with-changes cvs-repo/my-branch-with-changes
git rebase --onto ${SVN_UPSTREAM} ${CVS_UPSTREAM}

Последний git rebase должен взять все ваши коммиты на основе cvs-upstream и «соединить их» с вашими последними SVN.* В графике:

cvs-repo: A -- B -- C -- D (last_cvs_commit) -- E -- F (your changes)

svn-repo: G -- H -- I -- J (last_svn_commit)

(где A - B - C - D идентичны G - H - I - J и просто имеют разные хэши

вы проверяете ветку с вашими изменениями и запускаете:

git rebase --onto J D

, которая меняет ситуацию на:

svn-repo: G -- H -- I -- J (last_svn_commit) -- E' -- F' (your changes, rebased)
...