从 SVN 迁移到 Git 后分支管理策略需要怎么调整?

文章导读
从 SVN 迁移到 Git 后,分支管理应从“目录拷贝”模式转变为“指针引用”模式,推荐采用 Git Flow 或简化版主干开发流,重点在于保护主分支并规范功能分支的生命周期。
📋 目录
  1. 核心策略调整
  2. 分支模型定义
  3. 平台分支保护配置
  4. 迁移历史与作者映射
  5. 常用命令速查
  6. 怎么验证是否生效
  7. 常见坑
  8. 参考文档
A A

从 SVN 迁移到 Git 后,分支管理应从“目录拷贝”模式转变为“指针引用”模式,推荐采用 Git Flow 或简化版主干开发流,重点在于保护主分支并规范功能分支的生命周期。

先说结论:迁移不仅是工具替换,更是协作流程的重构,需重新定义分支角色并配置权限保护。

  • 适合:团队规模超过 5 人且并行开发任务较多的场景
  • 先准备:梳理现有 SVN 目录结构并建立作者映射表
  • 建议:禁止直接推送代码到主分支,强制通过合并请求审核

核心策略调整

SVN 的分支本质是服务器上的目录拷贝,切换和合并开销大,导致团队倾向于少建分支。Git 的分支是轻量级指针,创建和切换几乎瞬时完成,这使得频繁创建短期功能分支成为可能。

迁移后如果继续沿用 SVN 的“主干 + 少量分支”模式,无法发挥 Git 分布式协作的优势,也无法满足代码审查和灰度发布的需求。

分支模型定义

参考常见实践,至少区分以下分支类型:

  • master/main:生产环境代码,仅允许通过 release 分支合并
  • develop:日常开发集成分支,开发人员基于此创建功能分支
  • feature:功能开发分支,完成后合并回 develop
  • release:发布准备分支,用于测试和灰度
  • hotfix:紧急修复分支,基于 master 创建

平台分支保护配置

在 Git 服务器端设置保护规则,禁止开发人员直接 push 到 master 或 develop 分支,强制使用 Merge Request 或 Pull Request 流程。

从 SVN 迁移到 Git 后分支管理策略需要怎么调整?

GitLab 配置步骤:

  1. 进入项目 Settings -> Repository -> Protected Branches。
  2. 选择 Branch 为 master 或 develop。
  3. Allowed to merge 设置为 Maintainers。
  4. Allowed to push 设置为 No one 或 Maintainers。
  5. 勾选 Allow force push 为未选中状态。

GitHub 配置步骤:

  1. 进入项目 Settings -> Branches -> Add branch protection rule。
  2. Branch name pattern 填写 master 或 develop。
  3. 勾选 Require pull request reviews before merging。
  4. 勾选 Require status checks to pass before merging。
  5. 勾选 Include administrators 以强制所有人员遵守。

迁移历史与作者映射

迁移时必须保留作者信息,否则提交记录将显示为 SVN 用户名而非真实身份。需提前准备 users.txt 映射文件:

zhangsan = 张三 <zhangsan@company.com>
lisi = 李四 <lisi@company.com>

使用 svn2git 进行迁移,确保 trunk 对应 master,branches 对应本地分支。示例命令:

svn2git http://svn.example.com/repo `--authors-file`=users.txt `--metadata`

常用命令速查

# 创建功能分支
git checkout -b feat/new-feature develop

# 合并分支并删除
git merge `--no-ff` feat/new-feature
git branch -d feat/new-feature

# 推送远程分支
git push origin feat/new-feature

怎么验证是否生效

1. 检查分支结构:使用 git branch -a 确认远程分支已正确映射,tags 不再是目录而是标签对象。

2. 检查提交历史:使用 git log 查看作者信息是否已转换为标准 Git 格式(姓名 + 邮箱)。

从 SVN 迁移到 Git 后分支管理策略需要怎么调整?

3. 测试权限控制:尝试直接向受保护分支推送代码,确认是否被服务器拒绝。

4. 分支清理检查:使用以下命令检查是否存在残留的 SVN 风格分支:

git branch -a | grep -E 'tags|trunk'

常见坑

1. 标签与分支混淆
SVN 的 tags 也是目录,迁移后容易变成远程分支。需手动或脚本将其转换为 Git 标签对象。

2. 忽略作者映射
若未配置 authors-file,Git 历史中的提交者将显示为 SVN 账号和主机名,导致责任追溯困难。

3. 权限体系差异
SVN 支持路径级权限,Git 通常是仓库级或分支级。迁移后需重新规划权限粒度,避免过度授权。

参考文档

  • GitLab Protected Branches Documentation
  • GitHub Branch Protection Rules Documentation
  • Official Git SVN Migration Guide