将 svn 存储库与 git 存储库合并



我面临着在两个团队之间合并一个包含大量文件的站点的艰巨任务。 一个团队一直在研究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

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

我遇到了类似的事情来处理基于 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

假设最终存储库将是 Git。此解决方案保留了两者的历史记录

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

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

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

您将收到一条警告,指出没有基本提交,因此您将有两个孤立分支

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

最近有一篇关于该主题的文章,Microsoft包括使用 git-svn 实用程序的演练。它们提供有关使用和不使用 svn 更改历史记录进行合并的信息。

最新更新