2023-01-06 更新
Subversion (Svn) 是另一个被广泛使用的开源版本控制系统。
1 历史
在 Svn 出现之前,版本控制系统的事实标准是 CVS ,即使它不够好,也没有更好的选择。天天使用 CVS 的程序员 Karl Fogel 无法忍受,决定与朋友 Jim Blandy 设计一个新的版本控制系统。 2002 年 2 月, CollabNet Inc. 邀请 Karl 和 Ben Collins Sussman 加入开发新版本控制系统,与此同时 Jim 也被雇主 RedHat 推荐到该项目,他们和独立开发者 Greg Stein 一道完成了 Svn 的最初设计,开创性地实现了一个文件和目录都有版本的虚拟文件系统,并最终于 2001 年 8 月正式启用。
2 概况
每个版本都有自己独一无二的修订号。不同修订版本下同名文件的内容可能相同。
3 方案
面对这个问题, Svn 提供了两种方案。
“锁定-修改-解锁”方案。该方案可能导致管理混乱。比如,人溜了,锁没开。
“复制-修改-合并”方案。该方案可能导致代码冲突。好在冲突只要人工干预就能轻松解决。
4 使用
一般来说,我们都是从使用一个已经创建且配置完整的版本库起步的。
svn checkout file:///xxxxxx
svn checkout http://xxxxxx
svn checkout https://xxxxxx
svn checkout svn://xxxxxx
svn checkout svn+ssh://xxxxxx
术语 checkout 听起来像锁定或者保存资源,实际上只是将项目复制了一份。我们也可以只 checkout 一份历史版本:
svn checkout -r r1024 svn://xxxxxx
与 Git 类似, .svn
保存着 Svn 所需要的其它信息。
经常更新本地版本库没有坏处。
svn update
status 可以告诉你当前的文件状态, diff 可以详细显示当前的文件的修改内容,有助于我们准确提交。
svn status
svn diff
svn diff filename
svn diff dirname
svn commit
svn commit filename
svn commit dirname
log 用于查看修订历史,可以指定时间区间或修订区间。
svn log -r {2018-01-01}:{2018-01-20}
svn log -r 1023:1025
Svn 新建分支的方式就是复制一份。不过不是简单地复制所有数据,而是创建了特殊的链接,不用担心版本库体积爆炸。 Svn 标签的本质是不允许继续提交的分支。
svn copy http://svn.example.com/repos/calc/trunk http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
分支在使用上与 Git 几乎没有区别,比如切换分支 svn switch
。删除 Svn 分支只会让它从最新修订号版本消失,回溯历史它仍然存在。对 Svn 来说 svn merge
仅仅是一次普通的修订,它常常被用来回滚指定文件。
人们通常在顶级目录创建这些目录:
/trunk
/branches
/tags
最好不要随意创建目录,那样会让其他用户感到茫然。
5 服务
官方一直建议在本地能访问的服务器上创建版本库。
svnadmin create /path/to/repos
ls repos
conf/ dav/ db/ format hooks/ locks/ README.txt
钩子待补。
svnlook 用于查看各种各样的信息。
svnshell.py
可以像浏览文件系统一样浏览版本库。
6 共治
尽管已有了更好的开源版本控制系统 GIT ,但在日常工作中,我们仍然不得不和 Svn 打交道。比起双开目录分别管理,项目共治的方式更佳。
共治的项目目录下既有
.git
又有.svn
。
参照 GIT ,我把两者互通的操作分为三步: pull 、 commit 、 push 。
pull.sh
:
git stash
svn update
svn status
git gui
此时将代码从 Svn 同步到 GIT 。
commit.sh
:
git stash pop
# do sth
git gui
此时将代码提交到 GIT 。 GIT 可以多次提交,但只有最后一次提交的信息会被 Svn 引用。
push.sh
:
git stash
svn status
svn commit -m "$(git log -1 --pretty=format:%s)"
git stash pop
7 迁移
略。