我正在尝试将一个稍微混乱的svn存储库转换为git。我尝试阅读一些指南和其他SO问题,但对于遵循的最佳方式有点迷茫。
SVN存储库具有包含文件夹的顶级文件夹结构,如下所示:
|- client
|- server
|- website
|- misc
这些文件夹中的大多数都具有"标准"svn结构:即 trunk
,branches
和tags
。但是,有些只是平面文件夹。
|- 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 元数据之外,转储文件还包含原始二进制数据(存储库中的二进制文件(。