将svn仓库与git仓库合并

10

我面临一个艰巨的任务,需要合并两个团队之间拥有大量文件的网站。其中一个团队使用git,另一个团队使用svn。请问如何最好地处理这个问题?我的想法是创建一个新的裸仓库。

git clone --bare ~/dir gitversion.git

然后从那里创建一个分支

git checkout -b import-svn

然后我将从svn中拉取那个分支。

svn checkout svn://svnversion/trunk

现在我应该在这个分支上进行变基操作吗?

git rebase origin/master

然后切换回主分支(master branch)

git merge import-svn

我尝试过类似这样的东西,但似乎毫无进展。从未出现过合并冲突或其它任何不合理的情况。能否有人向我展示一个体面的工作流来完成这个任务?


它们是完全无关的,还是分享一些内容? - CharlesB
最终仓库会是 SVN 还是 Git? - CharlesB
它们几乎是相同的网站,只是有两个团队在处理不同的事情。@Ryan和Charles,我希望我知道那个其他问题的答案。我认为我们正在转向Git,但现在还没有确定。我基本上只需要将这个合并整合在一起,然后就可以继续假设我们正在使用Git。 - Zac
几乎相同/不同的东西??你在这里说了两件不同的事情… - CharlesB
1
哈!别问了,这是一个非常混乱的项目。欢迎来到我的地狱。 - Zac
显示剩余3条评论
3个回答

9

我曾经遇到过类似的情况,需要处理基于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

您也可以尝试像下面这样进行变基,然后决定哪种方法更适合您:
$ git checkout -b git-rebase-svn import-git
$ git rebase import-svn

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

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

酷,谢谢!这似乎是一个不错的策略。我会试一试。 - Zac
1
请注意,这不会保留来自SVN存储库的历史记录,这可能是需要的。 - CharlesB
实际上,无论是原始的 SVN 还是 GIT,在保留历史记录方面都没有进行。 - GoZoner
没问题,关于历史记录,不用担心……我只是想把它们合并到一个仓库里。感谢您的帮助,我会告诉您进展如何的。 - Zac
哇..那真是太痛苦了。不过我想我搞定了。再次感谢你的帮助,你的指导非常有帮助。 - Zac

1

假设最终的存储库将是Git。这个解决方案在两个历史记录上都保留了历史记录。

首先在非裸存储库上工作,这样做起来更容易。克隆git存储库,并使用svn2git从SVN存储库创建另一个git存储库。

因此,您有两个存储库。将一个存储库添加为另一个存储库的远程,并将历史记录导入到单独的分支中:

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

你会收到一个警告,说没有基础提交,所以你将有两个孤立的分支

现在你可以合并这些分支。这应该是可怕的、糟糕的,因为它们虽然相关但历史完全不同,但你别无选择。在这里重新设置基础将是无意义的,因为提交是不相关的。


1
最近有一篇关于此主题的微软文章, 其中介绍了使用git-svn实用工具的步骤。他们提供了合并与不合并svn更改历史记录的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接