用git repo合并svn repo

时间:2012-04-24 22:54:28

标签: git svn

我有一项艰巨的任务,就是将一个网站与两个团队之间的大量文件合并。一个团队一直在git工作,另一个团队正在使用svn。我能帮助你找到最好的解决方法吗?我在想的是我将创建一个新的裸仓库

git clone --bare ~/dir gitversion.git

然后从那里创建一个分支

git checkout -b import-svn

然后在那个分支上我将从svn

中拉出来
svn checkout svn://svnversion/trunk

现在在这个分支上我会改变吗?

git rebase origin/master

然后切换回主分支

git merge import-svn

我尝试过这样的事情,但似乎无处可去。从来没有任何合并冲突或任何没有意义的事情。有人可以告诉我一个体面的工作流程来完成这个吗?

3 个答案:

答案 0 :(得分:8)

我遇到了类似处理来自基于SVN的开发的多个版本的问题。这是我如何处理它的草图:

# checkout the SVN source
$ svn checkout svn://svnversion/trunk
$ cd /into/svn/checkout

$ git init
$ echo ".svn/" > .gitignore
$ git add .gitignore; git commit -m 'Initial .gitignore'

# Now you have a master branch; create your import-svn branch
$ git checkout -b import-svn

# Add *everything* from the SVN checkout
$ git add -A
$ git commit -m 'Initial SVN'

# Now get the GIT developed stuff
$ git checkout -b import-git master
$ git remote add original-git /path/to/git-developed-repository
$ git pull original-git master         # or whatever branch your git developers used.

# Now you've got two branches 'import-svn' and 'import-git'; DIFF and MERGE as you please

# You don't need the remote anymore.
$ git remote rm original-git

我认为这是正确的。

现在你可以考虑合并了。如果您将'import-git'视为首选基线,则可能会出现以下情况。

$ git checkout -b git-merge-svn import-git
$ git diff --name-status import-svn
$ git merge import-svn

你也可以尝试像下面那样的rebase然后决定你喜欢哪个:

$ git checkout -b git-rebase-svn import-git
$ git rebase import-svn

比较合并和基础(应该是相同的,但你永远不知道......)

$ git diff git-rebase-svn..git-merge-svn

答案 1 :(得分:1)

假设最终回购将是Git。该解决方案保留了两者的历史记录

首先在非裸存储库上工作,您想要做的事情更容易。克隆git repo,并使用svn2git从SVN创建另一个git repo。

所以你有两个回购。将一个repo添加为另一个repo,并将历史记录导入单独的分支:

git remote add ../other-repo
git fetch other-repo
git branch other-repo other-repo/master

您将收到一条警告,表示没有基本提交,因此您将拥有两个孤儿分支

现在您可以合并分支。这应该是可怕的,可怕的,因为它们是相关但完全不同的历史,但是你没有别的选择。 Rebase在这里是无稽之谈,因为提交是不相关的。

答案 2 :(得分:1)

最近有article on the topic by Microsoft,其中包括使用git-svn实用程序的演练。它们提供有关合并和不合并svn更改历史记录的信息。