SVN 仓库迁移到 Git
将SVN仓库迁移到Git是一个常见的版本控制系统迁移需求,整个过程可以通过Git自带的git svn工具完成。以下是详细的迁移步骤:
准备工作
-
安装必要工具
- 安装Git(包含
git svn工具) - 确保能访问SVN仓库(知道SVN仓库URL、有读取权限)
- 安装Git(包含
-
收集SVN用户信息
SVN使用用户名,而Git使用邮箱格式的身份标识,需要创建用户映射文件(如users.txt):svn_username = Git Name <git_email@example.com>可以通过以下命令导出所有SVN提交者,再手动补充邮箱:
svn log --quiet https://svn.example.com/project | grep -E "r[0-9]+ \| .+ \|" | awk '{print $3}' | sort | uniq
迁移步骤
1. 克隆SVN仓库到本地Git仓库
使用git svn clone命令将SVN仓库转换为Git仓库,同时关联用户信息:
git svn clone [SVN仓库URL] --no-metadata --authors-file=users.txt [本地目录名]
--no-metadata:忽略SVN特有的元数据--authors-file:指定用户映射文件- 示例:
git svn clone http://svn.example.com/svn/project --no-metadata --authors-file=users.txt my-git-repo
2. 处理分支和标签
SVN的分支和标签结构与Git不同,需要手动转换:
-
转换标签(SVN的tags通常在
tags/目录):cd my-git-repo # 列出所有SVN标签 git branch -r # 将SVN标签转换为Git标签 for tag in `git branch -r | grep "tags/" | sed 's/tags\///'`; do git tag $tag refs/remotes/tags/$tag git branch -r -d tags/$tag done -
转换分支(SVN的分支通常在
branches/目录):# 将SVN分支转换为Git本地分支 for branch in `git branch -r | grep "branches/" | sed 's/branches\///'`; do git checkout -b $branch refs/remotes/branches/$branch done
3. 清理SVN残留信息
移除与SVN相关的配置,彻底转为纯Git仓库:
git config --remove-section svn-remote.svn # 移除SVN远程配置
4. 推送到Git远程仓库
- 在Git服务(如GitHub、GitLab)创建一个新的空仓库
- 将本地Git仓库推送到远程:
git remote add origin [Git仓库URL] # 添加远程仓库 git push -u origin --all # 推送所有分支 git push -u origin --tags # 推送所有标签
注意事项
- 大型仓库:如果SVN仓库历史悠久、体积大,克隆过程可能很慢,可添加
--revision参数指定起始版本(如-r 1000:从版本1000开始)。 - 提交历史:迁移后会保留完整的提交历史,但SVN的特定功能(如锁、属性)可能无法完全转换。
- 后续协作:迁移完成后,团队成员需重新克隆Git仓库,原SVN仓库可停止使用。
如果需要更复杂的迁移(如处理二进制文件、过滤历史),可以使用svn2git工具(基于git svn的封装,功能更强大)。