Синхронизация существующего Git с существующим хранилищем SVN - PullRequest
2 голосов
/ 29 апреля 2011

Хорошо, я сделал беспорядок.У меня есть SVN-репозиторий с моим кодом, и у меня есть локальный git-репозиторий, в котором я обычно работаю, разветвляюсь и т. Д. Я использовал время от времени для фиксации вещей из git в SVN с помощью git-svn.Теперь я получил новый компьютер и клонировал свой git-репозиторий от одного к другому.Потом я попытался использовать git-svn, но из-за новой версии и из-за того, что я был недостаточно осторожен, конфигурация была как-то потеряна.Поэтому я использовал git svn init и clone, чтобы вернуть свою историю в SVN, но теперь ситуация выглядит следующим образом:

o--Z--o--....--X--o--o....--o  (master)
   |
   o--o--o--....--X (remotes/git-svn)

X отмечает состояние, в котором оба репозитория находятся в одном и том жесостояние (как master и git-svn где синхронизируются на моей старой машине).Теперь я хотел бы передать все от X до HEAD из master в мой SVN-репозиторий, но когда я использую git svn dcommit -n, он показывает diffs обратно в Z. Как я могу синхронизировать git-svn и git и svn снова (так что я могу просто использовать dcommit для коммитов снова)?

Можно ли вернуться к X и использовать git svn set-tree X (поскольку текущий SVN содержит именно эту версию), а затем вернуться к HEAD, чтобы выполнить git svn dcommit?Я не хочу (вслепую) пробовать что-то в SVN, так как в нем есть много других вещей (от многих других людей), которые я не хочу испортить.

1 Ответ

2 голосов
/ 29 апреля 2011

git svn dcommit просматривает историю вашей ветви, пока не найдет сообщение фиксации, содержащее строку git-svn-id:, поэтому в вашем случае, как вы заметили, оно вернется к Z. Я бы попробовал перебазировать вашу ветку master на remotes/git-svn. Я не проверял это, но я бы попробовал следующее:

 # Make sure that you're on master
 git checkout master

 # Create a new branch here to save the old branch
 git branch old-master

 # Rebase everything after the X on master up to the tip of master
 # onto remotes/git-svn
 git rebase --onto remotes/git-svn <commit-ID-of-X-in-master> master

После этого ваша история должна выглядеть так:

o--Z--o--....--X--o--o....--o  (old-master)
   |
   o--o--o--....--X (remotes/git-svn) --o--o....-o (master)

... и git svn dcommit должны работать как положено - однако я бы попробовал сначала с --dry-run, просто чтобы быть уверенным.

...