SVN 代码库迁移到Git并保留提交记录

项目之前用SVN进行代码管理,因多分支管理不便需迁移到Git并保留提交记录。博客介绍了迁移步骤,包括导出SVN提交用户清单、用工具将SVN代码复制到本地仓库、添加git仓库、提交到git远程仓库master分支,还给出报错处理办法。

项目之前用的是SVN进行代码管理,但是SVN的多分支管理不方便,需要切到Git,同时希望保留之前的Git提交记录

1.导出SVN提交的用户清单,导出后可以手工编辑等号右侧的git用户名和邮箱:

在git bash执行

svn log https://172.0.0.1/svn/XXX/trunk/Integration -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2"="$2" <"$2"@email.com>"}' | sort -u > ./svn2git.txt

其中gituser1是迁移Git后显示的提交者(效果跟git config --global  user.name "gituser1"相同)

 第一行必须保留,否则会报错:Author: VisualSVN Server not defined in svn2git.txt

2.使用工具将SVN代码复制到本地仓库:

  git svn clone https://172.0.0.1/svn/ProjectName/trunk --no-metadata --authors-file=D:/code/svn2git.txt ProjectName

3.进入到 ProjectName目录, 添加git 仓库,执行命令:

git remote add origin ssh://xxx.xxx.xxx.xxx:root/projectname.git

4.提交到git远程仓库master分支 , 执行命令:    git push -u origin master

5.如果报错:fatal: Authentication failed for,执行git config --system --unset credential.helper;

再执行git push -u origin master,会弹出输入git账号密码的框。

 

 


 

将现有的 **SVN 仓库完整迁移Git 保留提交历史**(包括作者、时间戳、提交信息等)是企业从集中式版本控制转向分布式开发的常见需求。幸运的是,Git 提供了内置工具 `git svn` 来实现这一过程。 以下是 **详细步骤 + 示例代码 + 注意事项**,确保你能够成功迁移 SVNGit保持完整的提交历史。 --- ## ✅ 一、准备工作 ### 1. 安装必要工具 确保已安装: - Git(支持 `git-svn`) - Subversion(svn 命令行工具) ```bash # 检查是否支持 git svn git svn --help ``` > 在 Windows 上推荐使用 Git for Windows;Linux 用户可通过包管理器安装: > > ```bash > sudo apt install git-svn subversion # Ubuntu/Debian > ``` --- ## ✅ 二、获取 SVN 用户映射文件(关键!) SVN 的用户名通常是 `username`,而 Git 需要 `Name <email@domain.com>` 格式。必须提前建立映射表。 创建文件:`users.txt` ```txt john = John Doe <john.doe@company.com> alice = Alice Smith <alice.smith@company.com> bob = Bob Johnson <bob.johnson@company.com> ``` > ❗ 如果不提供映射,Git 会默认使用 `username@localhost`,导致邮件混乱。 你可以通过以下命令导出 SVN 所有提交者: ```bash svn log --xml | grep "<author" | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = $1 <\$1@company.com>/' > users.txt ``` 然后手动编辑为正确格式。 --- ## ✅ 三、克隆 SVN 仓库到 Git(完整历史迁移) 假设你的 SVN 仓库结构如下: ``` /trunk /branches /tags ``` 执行以下命令进行克隆: ```bash git svn clone \ --stdlayout \ --authors-file=users.txt \ --rewrite-root=/your-project-name \ http://svn.example.com/repo/project-name \ project-git ``` ### 参数解释: | 参数 | 说明 | |------|------| | `--stdlayout` | 表示标准布局:`/trunk`, `/branches`, `/tags` | | `--authors-file=users.txt` | 指定用户映射文件 | | `--rewrite-root` | 可选,设置新的根路径名称 | | `http://...` | SVN 仓库地址 | | `project-git` | 输出本地 Git 仓库目录 | > ⏳ 迁移时间取决于 SVN 历史长度和网络速度,可能需要几小时。 --- ## ✅ 四、处理非标准目录结构(可选) 如果 SVN 不是标准结构(如没有 `/trunk`),需指定主干和分支路径: ```bash git svn clone \ --trunk=/trunk \ --branches=/branches \ --tags=/tags \ --authors-file=users.txt \ http://svn.example.com/repo/project-name \ project-git ``` 或更灵活地只迁移主干: ```bash git svn init http://svn.example.com/repo/project-name --bare git config svn.authorsfile users.txt git svn fetch ``` --- ## ✅ 五、验证迁移结果 进入新生成的 Git 仓库: ```bash cd project-git git log --oneline -10 ``` 你应该能看到与 SVN 相同的提交历史,且作者信息已正确转换。 检查远程 SVN 关联(迁移完成后可以删除): ```bash git remote -v # 输出类似: # origin : nothing (git-svn uses refs/remotes/git-svn) ``` --- ## ✅ 六、清理推送到新的 Git 服务器 ### 1. 断开与 SVN 的连接(重要!) 迁移完成后,`git svn` 仍会尝试同步 SVN,应断开关联: ```bash # 删除 .git/svn 目录和相关配置 rm -rf .git/svn git config --remove-section svn-remote.svn git config --add gc.auto 1 ``` ### 2. 设置新的 Git 远程仓库 ```bash git remote add origin https://github.com/company/project-name.git # 或 GitLab/Gitee: # git remote add origin http://gitlab.company.com/group/project-name.git ``` ### 3. 推送所有内容到 Git 仓库 ```bash # 推送主干(原 trunk) git push origin master # 推送分支 git branch -r | grep -v '@' | grep 'origin/' | sed 's/origin\///' | xargs -I {} git push origin {}:refs/heads/{} # 推送标签 git tag -l | xargs -I {} git push origin {} ``` --- ## ✅ 七、高级技巧:加速迁移 & 处理大仓库 ### 1. 浅层克隆(仅最近 N 次提交) 适用于历史太久、迁移太慢的情况: ```bash git svn clone \ --stdlayout \ --authors-file=users.txt \ --revision HEAD~1000 \ # 从倒数第1000次开始 http://svn.example.com/repo/project-name \ project-git ``` 但这样会丢失早期历史。 ### 2. 分阶段迁移迁移主干,再单独处理重要分支: ```bash # 先迁移 trunk git svn clone ... --trunk=/trunk ... # 添加分支 git config svn-remote.svn.branches /branches/feature-xxx:refs/remotes/feature-xxx git svn fetch ``` --- ## ✅ 八、验证完整性 | 检查项 | 方法 | |--------|------| | ✅ 提交数量一致 | `svn log | grep "^r[0-9]" | wc -l` vs `git log --oneline | wc -l` | | ✅ 作者正确 | `git log --format="%an <%ae>" | sort -u` | | ✅ 时间戳正确 | `git log --format="%ai %s" -5` | | ✅ 分支存在 | `git branch -a` | | ✅ 标签存在 | `git tag -l` | --- ## ✅ 九、替代方案:使用 `SubGit`(商业工具) 如果你遇到复杂权限、大量分支、中文乱码等问题,可考虑使用 [SubGit](https://subgit.com/) —— 一款专业的 SVNGit 迁移工具。 特点: - 支持双向同步 - 自动处理换行符、编码、权限 - 更快更稳定 ```bash subgit configure http://svn.example.com/repo/project # 编辑 subgit.conf 设置映射 subgit install http://svn.example.com/repo/project ``` > 注:免费版仅限小团队使用,企业级需购买授权。 --- ## ✅ 十、总结流程图 ``` [SVN 仓库] ↓ 编写 users.txt 映射文件 ↓ git svn clone --stdlayout --authors-file=users.txt URL ↓ 进入项目目录 git log 验证历史 ↓ rm -rf .git/svn && 清理配置 ↓ git remote add origin 新Git地址 ↓ git push -u origin --all && --tags ↓ ✅ 成功迁移! ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值