2010-10-29 2 views
2

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

В то же время проект восходящего потока переключился на SVN (@googlecode). Мне удалось создать автоматически обновленный git-клон.

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

ответ

1

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

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

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

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

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

+0

должен быть «git checkout -b my-changes $ SPROUT_POINT» вместо «git co ...» – mab

+0

Спасибо; изменилось. Думаю, не все используют те же псевдонимы, что и я :-) – mhagger

0

Другой вариант - вытащить изменения из вашего репозитория 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 должны принять все ваши коммиты на основе резюме, вверх по течению, и «соединить их» свою последнюю SVN.

В графике:

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

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

(где А - В - С - D идентичны G - H - I - J, и просто иметь различные хешей

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

git rebase --onto J D 

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

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

Спасибо. Это может сработать, не проверял его, поскольку более ранний метод работал на меня. – mab

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