在某些企业或团队中,SVN(Subversion)仍然是主要的版本控制系统,但开发者希望利用 Git 的分布式特性进行本地开发。这种情况下,可以使用 git svn
,让 Git 与 SVN 版本库进行交互。
本章将介绍如何在 Git 中管理 SVN 代码,包括:
- 在 Git 中修改 SVN 代码并提交到 SVN
git svn
的常见命令- Git 和 SVN 的协同使用技巧
19.1 例子:对单一分支的浅克隆
在使用 Git 管理 SVN 代码时,通常需要克隆 SVN 仓库到本地 Git 仓库。由于 SVN 版本库可能非常大,可以使用 浅克隆 仅获取特定分支的数据。
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 仓库一样进行开发:
cd project
git checkout -b feature-branch
# 进行修改
git add .
git commit -m "修复 bug"
19.1.2 在提交前进行抓取操作
由于 SVN 可能有其他人的提交,建议在提交前同步 SVN 仓库:
git svn rebase
这类似于 git pull --rebase
,会将 SVN 的最新更改应用到本地。
19.1.3 通过 git svn rebase
提交
如果本地提交完成且 git svn rebase
没有冲突,可以推送修改回 SVN:
git svn dcommit
19.2 在 git svn
中使用推送、拉取、分支和合并
在 git svn
工作流中,Git 的 push
和 pull
命令不能直接用于 SVN,而是使用 git svn fetch
和 git svn dcommit
。
19.2.1 直接使用提交 ID
当需要在 SVN 和 Git 之间切换时,可以使用 git log
查找提交 ID:
git log --oneline --decorate
然后使用 git svn find-rev
查找 SVN 修订版本号:
git svn find-rev <commit-hash>
19.2.2 克隆所有分支
如果 SVN 仓库有多个分支,可以使用:
git svn clone --stdlayout https://svn.example.com/repo project
克隆完成后,查看所有 SVN 分支:
git branch -r
切换到 SVN 远程分支并创建本地 Git 分支:
git checkout -b feature-branch remotes/origin/feature
19.2.3 分享版本库
在多人协作时,每个人都可以克隆相同的 SVN 仓库,并使用 git svn rebase
保持同步。
示例工作流:
同步 SVN 远程代码:
git svn rebase
进行开发并提交:
git commit -am "添加新功能"
推送到 SVN:
git svn dcommit
19.2.4 合并回 SVN
如果需要合并 Git 中的分支并提交到 SVN,可以执行以下操作:
git checkout main
git merge feature-branch
git svn dcommit
19.3 在 Git 与 SVN 一起使用时的一些注意事项
Git 和 SVN 的版本管理方式不同,因此在混合使用时需要注意以下问题。
19.3.1 svn:ignore
与 .gitignore
在 SVN 中,使用 svn:ignore
忽略不需要提交的文件,而 Git 使用 .gitignore
。如果需要两者兼容,可以在 .gitignore
文件中手动添加 SVN 的忽略规则。
echo ".DS_Store" >> .gitignore
echo ".idea/" >> .gitignore
然后提交到 Git:
git add .gitignore
git commit -m "添加 .gitignore 规则"
19.3.2 重建 git-svn
的缓存
如果 git svn fetch
失败或 git svn rebase
发生冲突,可以尝试重建 git-svn
缓存:
rm -rf .git/svn
git svn fetch
如果问题仍然存在,可以使用 git svn rebase --skip
跳过问题提交。
结论
本章介绍了如何在 Git 中使用 SVN,包括:
git svn
基本用法:克隆 SVN 仓库、同步代码、提交更改。- 分支和合并策略:如何在 Git 内部管理 SVN 分支。
- 混合使用的注意事项:Git 与 SVN 在
.gitignore
和svn:ignore
方面的区别,以及如何重建git-svn
缓存。