2

我正在尝试将一个稍微凌乱的 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 的最佳方法?

4

2 回答 2

1

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

本质上:

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

于 2012-05-12T18:45:04.200 回答
0

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

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

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

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

于 2012-05-05T11:14:46.147 回答