我正在尝试将稍微凌乱的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存储库)合并为一个,同时保留每个文件夹的分支,标记和历史记录的最佳方法是什么?使用this approach,我似乎失去了提交历史记录和来自合并来自存储库的分支......或许我只是错过了一些重要的步骤或做错了什么?
否则,分别在每个文件夹上使用svn2git
不是从svn迁移到git的最佳方法吗?
答案 0 :(得分:1)
我最终选择了this answer上的方法。
基本上:
将每个项目(包括所有分支)添加为远程:
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元数据之外,转储文件还包含原始二进制数据(存储库中的二进制文件)。