将SVN仓库迁移到Git是一个常见的版本控制系统迁移需求,整个过程可以通过Git自带的git svn工具完成。以下是详细的迁移步骤:

准备工作

  1. 安装必要工具

    • 安装Git(包含git svn工具)
    • 确保能访问SVN仓库(知道SVN仓库URL、有读取权限)
  2. 收集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远程仓库

  1. 在Git服务(如GitHub、GitLab)创建一个新的空仓库
  2. 将本地Git仓库推送到远程:
    git remote add origin [Git仓库URL]  # 添加远程仓库
    git push -u origin --all  # 推送所有分支
    git push -u origin --tags  # 推送所有标签
    

注意事项

  1. 大型仓库:如果SVN仓库历史悠久、体积大,克隆过程可能很慢,可添加--revision参数指定起始版本(如-r 1000:从版本1000开始)。
  2. 提交历史:迁移后会保留完整的提交历史,但SVN的特定功能(如锁、属性)可能无法完全转换。
  3. 后续协作:迁移完成后,团队成员需重新克隆Git仓库,原SVN仓库可停止使用。

如果需要更复杂的迁移(如处理二进制文件、过滤历史),可以使用svn2git工具(基于git svn的封装,功能更强大)。