Subversion是广泛使用的版本控制工具。它是CVS的进化,越来越多的开源社区在使用svn。
TortoiseSVN是windows shell程序,是Subversion的客户端,它给予GPL协议,完全免费使用。
svn支持“拷贝-修改-合并”模型,对非二进制的文件如源程序可采用这种模式,这种模式可加快team的效率。
svn也支持“锁定-修改-解锁”模型,你可以选择是否锁定文件,以防止别人修改,在不可合并的文件上加锁通常是有效的,如二进制文件。
svn commit 操作可以作为一个原子事务操作发布任意数量文件和目录的修改。在你的工作副本中,你可以改变文件内容,创建、删除、改名和复制文件和目录,然后作为一个整体提交。
在版本库中,每次提交被当作一次原子事务操作: 要么所有的改变发生,要么都不发生,Subversion 努力保持原子性以应对程序错误、系统错误、网络问题和其他用户行为。
当你提交一个过期的版本,或者删除一个过期的版本,svn服务器将拒绝执行,防止你覆盖你未知的属性。
svn推荐的目录结构:
/trunk
/branches
/tags
版本控制系统非常重要的一个特性就是它的信息从不丢失,即使当你删除了文件或目录,它也许从HEAD
版本消失了 ,但这个对象依然存在于历史的早期版本.
工作副本怎样跟踪版本库
对于工作副本的每一个文件,Subversion 在管理目录 .svn/
记录两项关键的信息:
-
工作文件的基准版本(叫做文件的工作版本)和
-
一个本地副本最后更新的时间戳。
给定这些信息,通过与版本库通讯,Subversion 可以告诉我们工作文件是处与如下四种状态的那一种:
- 未修改且是当前的
-
文件在工作目录里没有修改,在工作版本之后没有修改提交到版本库。svn commit 操作不做任何事情,svn update 不做任何事情。
- 本地已修改且是当前的
-
工作副本已经修改,从基准版本之后没有修改提交到版本库。本地修改没有提交,因此 commit 会成功的提交,update 不做任何事情。
- 本地未修改且过时
-
这个文件在工作副本没有修改,但在版本库中已经修改了。这个文件应当更新到最新公共版本。commit 不做任何事情,update 将会更新工作副本到最新的版本。
- 本地已修改且过时
-
The file has been changed both in the working directory, and in the repository. A commit of the file will fail with an out-of-date error. The file should be updated first; an update command will attempt to merge the public changes with the local changes. If Subversion can't complete the merge in a plausible way automatically, it leaves it to the user to resolve the conflict
传统配置
SVN的安装并不复杂,如果在Windows下,有专门的Windows安装包可以下载,不过SVN的配置就不那么简单了,所有的配置都要通过SVN的配置文件手工完成,比如用户、密码、权限等。
切换到Http
Svn可以通过Svn自己的服务程序或者Apache来访问,缺省安装的Svn是使用自己的服务程序svnserve来进行访问的。下表对比了两种访问方式的差别:
特性 | Apache | svnserve |
认证 | HTTP basic auth,LDAP,NTLM | 服务器上的密码设置 |
权限 | 可以对每个path设置读写权限 | 可以对每个path设置读写权限 |
加密 | 可以通过https | 通过可选的SASL |
日志 | 完整的Apache log | 无log |
Web访问 | 支持WebDAV | 不支持 |
访问速度 | 稍慢 | 快 |
配置 | 复杂 | 简单 |
可以看出使用Apache来访问Svn虽然慢一些,但提供了更好的访问安全性和功能。因此很多团队使用Apache来访问Svn。不过这需要额外安装Apache,并配置Apache和Svn的集成,这需要不小的配置工作量。并且在将来进行用户及权限调整时都需要手工编辑配置文件。
在eclipse3.2.1上安装subclipse时,提示Subversion Revision Graph(1.0.7)需要 插件“org.eclipse.draw2d(3.2.0)”或更高版本,可下载GEF解决。
未完待续...