在某些企业或团队中,SVN(Subversion)仍然是主要的版本控制系统,但开发者希望利用 Git 的分布式特性进行本地开发。这种情况下,可以使用 git svn,让 Git 与 SVN 版本库进行交互。

本章将介绍如何在 Git 中管理 SVN 代码,包括:

  • 在 Git 中修改 SVN 代码并提交到 SVN
  • git svn 的常见命令
  • Git 和 SVN 的协同使用技巧

19.1 例子:对单一分支的浅克隆

在使用 Git 管理 SVN 代码时,通常需要克隆 SVN 仓库到本地 Git 仓库。由于 SVN 版本库可能非常大,可以使用 浅克隆 仅获取特定分支的数据。

  1. git svn clone --stdlayout --no-minimize-url -r HEAD https://svn.example.com/repo project

参数说明

  • --stdlayout:适用于标准 SVN 目录结构(trunk/branches/tags/)。
  • --no-minimize-url:防止 Git 省略 SVN 远程地址的部分路径。
  • -r HEAD:仅克隆最新版本,而不是整个历史记录。

19.1.1 在 Git 中进行修改

克隆完成后,可以像普通 Git 仓库一样进行开发:

  1. cd project
  2. git checkout -b feature-branch
  3. # 进行修改
  4. git add .
  5. git commit -m "修复 bug"

19.1.2 在提交前进行抓取操作

由于 SVN 可能有其他人的提交,建议在提交前同步 SVN 仓库:

  1. git svn rebase

这类似于 git pull --rebase,会将 SVN 的最新更改应用到本地。

19.1.3 通过 git svn rebase 提交

如果本地提交完成且 git svn rebase 没有冲突,可以推送修改回 SVN:

  1. git svn dcommit

19.2 在 git svn 中使用推送、拉取、分支和合并

git svn 工作流中,Git 的 pushpull 命令不能直接用于 SVN,而是使用 git svn fetchgit svn dcommit

19.2.1 直接使用提交 ID

当需要在 SVN 和 Git 之间切换时,可以使用 git log 查找提交 ID:

  1. git log --oneline --decorate

然后使用 git svn find-rev 查找 SVN 修订版本号:

  1. git svn find-rev <commit-hash>

19.2.2 克隆所有分支

如果 SVN 仓库有多个分支,可以使用:

  1. git svn clone --stdlayout https://svn.example.com/repo project

克隆完成后,查看所有 SVN 分支:

  1. git branch -r

切换到 SVN 远程分支并创建本地 Git 分支:

  1. git checkout -b feature-branch remotes/origin/feature

19.2.3 分享版本库

在多人协作时,每个人都可以克隆相同的 SVN 仓库,并使用 git svn rebase 保持同步。

示例工作流:

  1. 同步 SVN 远程代码

    1. git svn rebase
  2. 进行开发并提交

    1. git commit -am "添加新功能"
  3. 推送到 SVN

    1. git svn dcommit

19.2.4 合并回 SVN

如果需要合并 Git 中的分支并提交到 SVN,可以执行以下操作:

  1. git checkout main
  2. git merge feature-branch
  3. git svn dcommit

19.3 在 Git 与 SVN 一起使用时的一些注意事项

Git 和 SVN 的版本管理方式不同,因此在混合使用时需要注意以下问题。

19.3.1 svn:ignore.gitignore

在 SVN 中,使用 svn:ignore 忽略不需要提交的文件,而 Git 使用 .gitignore。如果需要两者兼容,可以在 .gitignore 文件中手动添加 SVN 的忽略规则。

  1. echo ".DS_Store" >> .gitignore
  2. echo ".idea/" >> .gitignore

然后提交到 Git:

  1. git add .gitignore
  2. git commit -m "添加 .gitignore 规则"

19.3.2 重建 git-svn 的缓存

如果 git svn fetch 失败或 git svn rebase 发生冲突,可以尝试重建 git-svn 缓存:

  1. rm -rf .git/svn
  2. git svn fetch

如果问题仍然存在,可以使用 git svn rebase --skip 跳过问题提交。


结论

本章介绍了如何在 Git 中使用 SVN,包括:

  • git svn 基本用法:克隆 SVN 仓库、同步代码、提交更改。
  • 分支和合并策略:如何在 Git 内部管理 SVN 分支。
  • 混合使用的注意事项:Git 与 SVN 在 .gitignoresvn:ignore 方面的区别,以及如何重建 git-svn 缓存。