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



我正在尝试将一个稍微混乱的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 存储库(合并为一个文件夹,同时维护每个文件夹的分支、标签和历史记录的最佳方法是什么?使用这种方法,我似乎丢失了合并自存储库中的提交历史记录和分支......或者也许我只是错过了一些重要的步骤或做错了什么?

否则,也许在每个文件夹上单独使用 svn2git 不是从 svn 迁移到 git 的最佳方法?

我最终选择了这个答案的方法。

本质上:

  • 为 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
    
  • 将合并存储库推送到远程存储库(从现在开始,这将是"官方"存储库(。

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

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

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

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

最新更新