从svn迁移到git

时间:2015-03-28 13:58:29

标签: git svn

我想从svn服务器迁移到git并完全转移到git。

我的svn存储库包含多个文件夹,每个文件夹都包含差异项目。

我使用git svn将svn存储库克隆到git然后我尝试使用此命令将每个文件夹拆分为差异分支: git subtree split -P name-of-folder -b name-of-new-branch。

问题在于,在历史的某些部分,我将其中一个文件夹转移到其他位置,而git存储库中的历史记录只保留在此位置。

在运行git svn clone

后,我甚至无法立即看到历史记录

我的svn布局是这样的:

svnrepo/
  folderA/
      projectA files(.sln,.cpp)
  folderB/
      projectB files(.java)
  folder/
      folderC/
          folderC files(.cs)
      folderD/
          folderD files(.cs)

我希望这将是文件夹A分支,分支用于folderB分支,用于folderC,分支用于folderD。

修改的 在我的项目的某些方面,我像这样移动了folderC和folderD:

   folder/
       web/
          folderC/
              folderC files(.cs)
          folderD/
              folderD files(.cs)

然后,当我尝试从folderC的url克隆时,我只从我将folderC移动到web的那一点获得历史记录,尽管之前有很多历史记录。

有没有办法保存以前位置的历史记录?

1 个答案:

答案 0 :(得分:0)

git-svn已经有了处理SVN分支和标记的选项,但它们已记录在init而不是clone中。 git svn clone基本上是git svn initgit svn fetch并且可以选择。

对于典型的SVN布局......

svnrepo/
    trunk/
    branches/
        branch1/
        branch2/
    tags/
        tag1/
        tag2/

您可以使用--trunk--tags--branches告诉git-svn您的布局。 git svn clone --trunk=trunk/ --tags=tags/ --branches=branches/ <svnurl>。此标准布局有一个快捷方式--stdlayout

对于OP的非标准布局......

svnrepo/
  folderA/
      projectA files(.sln,.cpp)
  folderB/
      projectB files(.java)
  folder/
      folderC/
          folderC files(.cs)
      folderD/
          folderD files(.cs)

这将是git svn --branch=folderA --branch=folderB --branch=folder/folderC --branch=folder/folderD。但是从OP的描述来看,这些听起来更像是单独的项目,而不是单个项目的分支。它们应该是单独的Git存储库。

SVN存储库的设置和维护成本很高,因此SVN鼓励您将不相关的项目推送到一个存储库中。 Git存储库非常便宜,当每个项目都是自己的存储库时,Git效果最好。因此,当您进行转换时,最好将每个项目拆分为自己的Git存储库。然后稍后如果您发现需要,可以与git subtree一起缝合相关项目。

对于要将多个项目转换为多个Git存储库的SVN存储库,只需在每个SVN目录上多次运行git svn clone,就像从SVN中检出它们一样。

git svn clone https://svn.example.com/folderA/
git svn clone https://svn.example.com/folderB/
git svn clone https://svn.example.com/folder/folderC/
git svn clone https://svn.example.com/folder/folderD/

Pro Git有一章关于从SVN转换为Git,这将有助于更多。