将凌乱的svn存储库转换为git

时间:2012-05-05 10:54:53

标签: git svn merge

我正在尝试将稍微凌乱的svn存储库转换为git。我尝试阅读一些指南和其他SO问题,但是对于什么是最好的方法有点迷失。

SVN存储库具有带文件夹的顶级文件夹结构,如:

 |- client
 |- server
 |- website
 |- misc

这些文件夹中的大多数都具有“标准”svn结构:即trunkbranchestags。但有些只是平面文件夹。

 |- client
    |- trunk
    |- branches
    |- tags
 |- server
    |- trunk
    |- branches
    |- tags
 |- website
 |- misc

不同文件夹之间的分支和标签名称可能相同。例如,客户端和服务器文件夹可能都有一个名为1.0的分支。

我设法使用svn2git转换单个文件夹,它似乎获得了历史记录,以及分支机构。我可以设法为每个文件夹创建一个单独的git存储库。但是,我想最终将所有内容保存在一个存储库中。

将这些文件夹(现在是git存储库)合并为一个,同时保留每个文件夹的分支,标记和历史记录的最佳方法是什么?使用this approach,我似乎失去了提交历史记录和来自合并来自存储库的分支......或许我只是错过了一些重要的步骤或做错了什么?

否则,分别在每个文件夹上使用svn2git不是从svn迁移到git的最佳方法吗?

2 个答案:

答案 0 :(得分:1)

我最终选择了this answer上的方法。

基本上:

  • 为svn存储库中的每个子文件夹创建一个git项目(使用svn2git)
  • 创建一个新的git存储库,将所有存储库合并到
  • 将每个项目(包括所有分支)添加为远程:

    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
      git config remote.$r.fetch \
      "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')"
      git config --add remote.$r.fetch \
      "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')"
      git config remote.$r.tagopt --no-tags
    done
    git remote update
    
  • 将merged-repository推送到远程存储库(从现在开始,这将是'官方'存储库)。

答案 1 :(得分:0)

我会在转换为Git之前将svn存储库重写为以下结构

- trunk
  |-client
  |-server
  |-website
  `-misc
- branches
  |-client
  |-server
  |-website
  `-misc
- tags
  |-client
  |-server
  |-website
  `-misc

要重构svn存储库,您必须svnadmin dump存储库到文件,更新该文件中的所有路径,然后svnadmin load更新的转储文件到新的存储库。

查看转储文件的结构 - 可以使用支持搜索/替换的编辑器轻松完成实际重组。它需要是二进制安全的,因为除了ascii元数据之外,转储文件还包含原始二进制数据(存储库中的二进制文件)。