使用subversion进行版本控制
Subversion是一个“集中式”的信息共享系统。任意数量的客户端连接到Subversion版本库,读取、修改这些文件。客户端通过写数据将信息分享给其他人,通过读取数据获取别人共享的信息。事实上,Subversion的版本库是一种文件服务器,但不是“一般”的文件服务器。Subversion版本库的特别之处在于,它会记录每一次改变:每个文件的改变,甚至是目录树本身的改变,例如文件和目录的添加、删除和重新组合。版本控制系统的核心问题是:设计用来记录和跟踪数据变化的系统。
版本控制系统的核心任务是实现协作编辑和数据共享,但是不同的系统使用不同的策略实现这个目的。
文件共享的问题:怎i样让系统允许用户共享信息,而不会让他们因意外而互相干扰?版本库里意外覆盖别人的更改非常的容易。
许多版本控制系统使用锁定-修改-解锁机制来解决这种问题。而这种方法带来的限制太多,给用户带来障碍:锁定可能导致管理问题,导致不必要的耽搁和时间浪费;锁定可能导致不必要的线性化开发;锁定可能导致错误的安全状态,这种情况出现在两个文件相互依赖的情况下。
Subversion,CVS和一些版本控制系统使用拷贝-修改-合并模型,在合并操作中系统通常扮演的是辅助合并操作,最终要靠人工去确定正误。需要注意的是软件不能自动的解决冲突,只用人可以理解并作出智能的选择。
Subversion使用URL来识别Subversion版本库中的版本化资源,通常情况下,这些URL使用标准的语法,允许服务器名称和端口作为URL的一部分。
导入数据到你的版本库:
有两种方法可以将新文件引入Subversion版本库 svn import和svn add。svn import是将未版本化文件导入版本库的最快方法,会根据需要创建中介目录。svn import不需要一个工作拷贝,你的文件会直接提交到版本库。在导入之后,原有的目录树并没有转化成工作拷贝,为了开始工作,你还是需要运行svn checkout导出一个工作拷贝。
推荐的版本库布局:
创建一个trunk目录来保存开发的“主线”,一个branches目录存放分支拷贝,tags目录来保存标签拷贝。
初始化检出:
大多数时候,你会用checkout从版本库取出一个新拷贝开始使用Subversion,这样会在本机创建一个项目的“本地拷贝”,这个拷贝包括了指定版本库的最新版本。注意:因为你的“工作拷贝”同你系统上的文件和目录没有任何区别,你可以随意修改文件,但是你必须告诉Subversion 你做的其他任何事。比如,你希望拷贝或移动工作拷贝的一个文件,你应该使用svn cope或者svn move而不是使用操作系统的拷贝移动命令。此外,除非你准备好了提交一个新文件或目录,或者改变了已经存在的,否则没有必要通知Subversion 你做了什么。
禁用密码缓存:
当你执行的Subversion命令需要认证时,缺省情况下Subversion会在磁盘缓存认证信息,这样做处于便利,在接下来的操作中你就可以不必要输入密码,但如果你很在乎密码缓存,你可以永久关闭缓存或每次执行命令时说明。
基本的工作周期:
更新你的工作拷贝:svn update;
做出修改:svn add,svn delete,svn cope,svn move
检验修改:svn status,svn diff
可能会取消一些修改:svn revert
解决冲突(合并别人的修改):svn update,svn resolved
提交你的修改:svn commit
以上主要简单介绍了svn的指令,下面来简单说明如何来操作与你所建立项目的svn。当你在自己电脑上安转了ToroiseSVN这个软件后,你点击右键后会发现有svn的功能键出现。下面操作的前提是你已经在Openhw上新建了一个项目。
在你的电脑上,你创建一个文件夹并命名为你的项目名,这样有利于你区分不同的项目。当然你也可以命名为你可以区分的名字,一切以你可以区分为准,但是命名请勿用中文字符,以免出现错误。命名完后,打开这个文件夹,右击空白处,选择SVN checkout。然后会出现一个Checkout的对话框,你在URL of repository下输入
http://账号@服务器名称/ repository所在目录/子目录; 这个URL就是你所建立的项目的svn库的地址。 在这个操作的过程中还要你输入用户名以及密码,这里的用户名和密码就是你在Openhw上建立项目所使用的 用户名和密码。它们是一致的,如果你不是项目的建立者,但是你想要Checkout这个库,你可以去先申请参与这个 项目,由项目的管理者给你读/写的权限。
接下来,你要在你本机上编写你的代码,并放到一个文件夹下,你会发现你新创建的文件和你checkout后的文件的标示不一样,这是因为你还没有将你新的文件加入到你的拷贝中。选中你要添加的文件,右击,选择ToroiseSVN,Add。它会变成一个加号。
然后你将所要更新的内容添加完后,选中项目右击,选择Commit,将你的档案添加到库中。操作完成后,你若发现你所有的文件都打上了对号,那标示操作成功了。我在看文档的时候,发现有这么个情况,但是我没有遇到过:通过以上操作后,你发现有些文件没有打上绿色的对号,这可能是windows本身的问题,你多按几下F5 就好了。这样还是不行的话,你就要好好检查一下之前的Commit操作是否正确。
现在你的项目不是你一个人在做,那么在你每次要进行工作前,请务必进行一次Update,下载最新的版本,来查看最新的更新。但是有的时候需要回溯到特定的日期或者版本,这时候你就会用到这个SVN的Update to revision的功能。如果你不记得是那个版本或者日期了,你可以通过Show log按钮来回溯历史。所以大家一定要在commit时注意填写你这次操作的内容的概述,以便你日后查看。
很多时候你会希望有另外一个复制的目录来进行新的修改,等到确定这个分支的修改已经完成后,在合并到原来的主要开发版本上。你可以在Branch文件夹下,右击选择ToroiseSVN,选中Branch/tag,之后会弹出一个对话框。你要确认URL下的路径是你要复制的来源目录。在TO URL中输入你要复制到的路径。并在Log message中输入你此次操作的目的。
有分支就会有合并,当你的目的达到后,你就会用到这个操作。点击要合并的文件右击,选择ToroiseSVN,选中Merge。会弹出一个对话框,From与To是要问你打算从Branch中的那个版本到那个版本,merge回原来的trunk目录中。因此,From根To的URL字段应该是指原来branch的目录下。剩下的就是指定要merge的revision范围。Dry run按钮是试作一次Merge,这个merge只会显示一些信息,不会真正的更新到trunk的目录中。只有按下Merge按钮后,才会真正的将branch的档案与trunk的档案合并起来。如果你确认这次的merge没有问题,你可以直接使用commit来将这两个被修改的档案commit到svn repository上。如果有问题,你可以直接修改这两个档案。直到确认ok了,再行commit。
制作Tag或者Release
所谓的Tag或者Release就是一个特别的版本,因为这个版本可能有特别的意义。其实Tag和Release的制作方法和Branch完全相同。只是Branch可能会需要merge回原来的trunk中,而tag以及release大部分都不需要merge回trunk中。在制作后,要到Tag目录下update一下,才能看到。
这里再说一下:branch:是要产生一个分支,以区别trunk不同的开发;tag:是要形成一个标记,表示重要的milesstone;release:表示一个已经正式的release的纪录。