一.安装subversion
首先安装subversion1.2.3和图形化客户端TortoiseSVN-1.2.4.4479(该版本的TortoiseSVN针对 subversion1.2.3)。subversion在服务器端和客户端都需要安装,TortoiseSVN只要在客户端安装就行。

二.建立Repository(保存文档各个版本的数据库)
在服务器端建立一个空目录,比如“C:\SVNProjects\Project1”。建立Repository的具体方式是:在 subversion安装目录下的\bin子目录下有一个svnadmin.exe文件,在DOS窗口下进入该\bin目录,并执行“svnadmin create --fs-type bdb C:\SVNProjects\Project1”。之后你会发现原本是空目录的“C:\SVNProjects\Project1”下多出了几个目录和几个文件。这些目录和文件就是用来存储文档各个版本的数据库。
***除了用命令行方式建立Repository外,还可以用TortoiseSVN建立,不过这要求在服务器端也安装 TortoiseSVN。建立Repository的具体方式是:在“C:\SVNProjects\Project1”目录上右击鼠标, TortoiseSVN->Create Repository here....,然后弹出一个对话框选择Berkeley Database(BDB),然后点OK按钮。

三.配置Repository建立Repository后,还应该对 Repository进行配置,主要的目的是控制访问权限和添加Repository的用户。“C:\SVNProjects\Project1\ conf\svnserve.conf”文件就是该Repository的配置文件。它是一个典型的INI文件,虽然该文件并不是以INI作为扩展名。用文本编辑器打开它后,可以看见一些文本,该文件以“#”开始的行都是注释行。将“#[general]”行的“#”删掉,“#anon-access = none”“#auth-access = write”“#password-db = passwd”行也删掉“#”,注意,只是删掉“#”字符,不要把整行都删了。“anon-access = none”是指不允许匿名访问Repository,不管是读操作还是写操作。“auth-access = write”表示认证的访问允许写操作,当然读操作就更允许了。“password-db = passwd”表示用户名及用户密码存在一个叫passwd的文件里,这个文件也在“C:\SVNProjects\Project1\conf”目录下,用文本编辑器打开后,将“# [users]”的“#”字符删掉,然后在文件的最后添加一个新行,在该行写上用户名和密码,格式为“xxxx = yyyy”其中“xxxx”表示用户名,“yyyy”表示密码,一行只能设定一个用户,要设定多个用户,请再起新行。

四.启动subversion服务器
进入DOS命令,在DOS下面进行windows服务的安装
安装服务
sc create subversion_service binpath= "c:\subversion\bin\svnserve.exe --service -r c:\svn_test\repos" displayname= "Subversion Repository" depend= Tcpip
删除服务
sc delete subversion_service

服务安装完成后,到Windows服务中找到名为"Subversion Repository"启动它

到这里安装和配置就完成了.

五.客户端的使用
1.Checkout Repository
首先要Checkout服务器端的Repository,所谓的Checkout就是指获得服务器端指定的Repository存储的所有文件。这个Checkout和Visual Source Safe的Checkout意义完全不一样,VSS的Checkout指的是锁定某个文件,如果你以前使用过VSS,在学习Subversion时这个问题一定要注意。Checkout的具体方式是:在客户端新建一个空目录,比如:F:\Project1
在该目录上单击右键,在弹出式菜单中选中SVN Checkout...,之后在“URL of Repository”文本框中填入你想要连接的Repository的地址,对于在本教程第二节建立的Repository,URL应该是“svn: //xxx/project1” (xxx可以是服务器端主机名,也可以是服务器端的ip地址)。
然后点OK,会弹出一个认证对话框,输入在教程第三节设置的用户名和密码。点OK后就完成了对Repository的Checkout。比如:在服务器端Repository中有一个a.txt文件,那么Checkout之后F:\Project1目录下也会出现一个a.txt文件。在本例中由于服务器端的Repository还未添加任何文件,所以在客户端的F:\Project1下没有文件被Checkout。执行Checkout除了会在 F:\Project1产生Repository存储的文件及目录外,还会产生了一个“.svn”的隐含目录,该目录是由subversion管理的,不要删除或者手工改动其中的文件和目录。现在F:\Project1中的文件和目录就叫做Repository的“Working Copy”简写“WC”(这个简写...汗)。以后对Repository中文件和目录的修改,添加,删除的操作,都是通过对这个“Working Copy”的操作实现的。Checkout执行完后,会发现F:\Project1目录的图标的左下角附着了一个小的状态图标(当F:\Project1 目录中的文件改变时,这个状态图标也会随之变化),它表示F:\Project1是一个Repository的“Working Copy”,F:\Project1内的所有文件和目录也会有类似的状态图标。

2.添加文件
将要添加的文件或者目录拷贝到F:\Project1下,然后在该文件或目录上单击右键,TortoiseSVN->Add,点OK。如果添加了不止一个文件或目录,则鼠标不要在F:\Project1中点中任何文件,然后单击右键,TortoiseSVN->Add,就可以添加多个文件或目录。这时文件的状态图标会发生变化。Add命令只是告诉本地的“Working Copy”将该文件纳入版本管理,并没有将这个改变提交到服务器端,如果想要别人也看见你对Repository的修改,你需要
在F:\Project1下单击右键,SVN Commit...,将你所做的修改提交到Repository。文件的状态图标也会更新。不管你在“Working Copy”内添加、修改、删除文件后,要想其他人也看见你的修改,都必须用Commit命令将所做修改递交到服务器端的Repository。

3.修改文件
用文本编辑器或IDE对文件修改后,文件的状态图标会变化,然后单击右键,SVN Commit...
提交修改,只有当执行Commit提交修改后,你所作的修改才会反映到服务器端的Repository中。

4.删除文件
删除文件时,选中要删除的文件或目录,单击右键,TortoiseSVN->Delete,提交修改。注意千万不要用“Delete”键来删除文件,否则将无法提交你的修改。这一点对目录的删除来说尤为重要。

5.放弃修改
当你添加、修改、删除文件后,决定放弃修改,你可以单击右键,TortoiseSVN->Revert,本地的“Working Copy”中的文件和目录会恢复到你修改前的状态。

6.获取Repository的最新版本
当一个团队合作开发项目时,每一个人都在不断的对Repository进行更新,你需要不断的更新自己的“Working Copy”,以获取项目最新的文件。当第一次获得最新Repository的文件时,我们用Checkout命令,前面已经介绍了,以后再获取最新文件时就不用Checkout了。而改用Update命令。接着前面的例子,这时F:\Project1已经成为一个“Working Copy”了(通过执行Checkout命令),现在其他人已经对Repository进行了修改,我想将别人的修改反映到我的“Working Copy”中,具体的方法是:在F:\Project1目录上单击右键,SVN Update。这时F:\Project1中的文件就是最新的版本了。注意,如果当你的“Working Copy”中有被修改的文件,或者有被删除的文件,并且还未提交这些修改时,这些文件在执行Update过程中是不会被更新的。比如你修改了F:\ Project1下a.txt文件,还未提交修改,那么,当你对F:\Project1进行Update时,a.txt文件是不会更新为 Repository上的a.txt文件的。所以如果想放弃当前的所有修改,并将F:\Project1下所有文件及目录更新到最新版本应该先对F:\ Project1执行Revert命令再执行Update命令。

7.subversion的版本控制模型
当你用subversion进行版本控制时,Subversion会记录你对Repository进行的每一次修改(包括添加,修改,删除等等),每修改一次Repository都会产生一个新的Revision(修订版本号),不同的Revision代表了不同时刻Repository的状态,因此我们可以用这个Revision回朔任意时刻Repository的状态,就像时间机器一样,也就是说某一Revision 就是Repository 在某一时刻的一个“快照”。注意:Revision 不是针对某一个文件或者目录,而是针对整个Repository而言的。每修改一次Repository,Revision 都会增加1。
Subversion的版本控制模型是一种叫做Copy-Modify-Merge(拷贝-修改-合并)的模型。考虑这种情况:张三和李四是公司同一个部门的同事,他们共同维护一个文本文件a.txt,并且对该文件进行版本控制,因此他们把这个文件放到一个Repository上共同维护该文件。周一上午9点,张三和李四同时想对a.txt文件进行修改,于是他们同时从Repository上取得该文件的最新版本(Revision 10),然后进行修改。过了三分钟,张三首先完成了修改,他在该文件的第五行修改了一个单词的拼写(将Typo改为Type),于是张三对修改后的文件执行Commit 命令,将修改提交到服务器端的Repository 中。这时Repository 的Revision 变为11。六分钟过后,李四也完成了他的修改,他修改了该文件第十行上的一个单词拼写(将He改为She),于是他也对修改后的文件执行Commit 命令,这时Subversion 在提交修改时会发现,李四修改的文件是Revision 10的a.txt文件,而不是最新的Revision 11的a.txt文件。于是,Subversion 提示李四在提交修改前,应该先将Working Copy更新到最新版本,李四执行Update命令将Working Copy更新到Revision 11,这时Subversion会提示已经完成合并,李四的a.txt文件的第五行的“Typo”已经变为了“Type”,第十行还是“She”,就是说 Subversion 已经将张三的修改“合并”到李四的a.txt文件中了。之后,李四再执行Commit命令,就能将他对第十行的修改(将He改为She)提交到服务器端的 Repository中了(生成Revision 12)。但是这种合并在某些情况下会变得复杂一些,比如:李四对a.txt文件的修改并不是第十行,而是与张三同样修改第五行的单词,李四将“Typo” 改为“Typr”,并且提交修改,这时Subversion会提示李四在提交修改前,应该先将Working Copy更新到最新版本,李四执行Update命令将Working Copy更新到Revision 11,这时Subversion将Revision11的a.txt文件与李四修改的a.txt文件进行合并时发现李四修改的同样是第五行,于是 Subversion就无法判断是李四的修改(“Tpyr”)正确还是张三的修改(“Type”)正确,因为他们都是在Revision10的a.txt 基础上作的修改。这种情况叫做Conflict(冲突),a.txt文件的图标会变成一个黄色三角。这时,只能依靠李四自己去判断到底第三行应该修改为 “Typr”还是“Type”。当李四确定修改之后,在a.txt文件上单击右键,TortoiseSVN->Resolved
告诉Subversion已经解决了Conflict。这时再执行Commit命令就能提交修改(生成Revision 12)。Subversion 这种控制方式保证了你对文件所作的修改都是基于文件的最新版本。

8.“.svn”目录
在客户端Working Copy的每一层目录中都会有一个“.svn”目录,该目录是Subversion进行管理用的目录。不要手动修改其中的文件。该目录存储了 Working Copy的一个副本(实际存储副本的地方是F:\project1\.svn\text-base目录),比如:F:\Project1是一个 Working Copy,该目录下有两个文件a.txt和b.txt还有一个子目录ccc,子目录ccc中还有一个d.txt文件。“.svn”目录中存储的是你最近一次执行完Update或者Commit命令之后当前目录中文件的副本,比如:F:\project1\.svn\text-base中存储的a.txt和 b.txt是最近一次执行完Update或者Commit命令之后F:\project1下的a.txt和b.txt的拷贝。也就是说你所作的修改都是基于“.svn”目录存储的那些文件。这种机制可以让我们在不连接网络的情况下,将Working Copy中的文件恢复到修改之前的状态。Subversion的Revert命令就是利用了这种机制来实现的。比如你修改了F:\project1\ a.txt文件,这时你又改变了主意想放弃对该文件的修改,你可以单击右键,TortoiseSVN->Revert,修改过的F:\ project1\a.txt文件就会被F:\project1\.svn\text-base中a.txt文件的副本所替代,使得a.txt恢复到修改前的状态。
Working Copy中每一个子目录下都会有一个“.svn”目录,并不是只有最上层目录才有“.svn”目录。所以,F:\project1\ccc下也有一个 “.svn”目录,该目录存储的是F:\project1\ccc\d.txt的副本(d.txt的副本位于F:\project1\ccc\.svn\ text-base)。也就是说每个“.svn”目录只存储同级目录中的“文件”副本,而不存储“目录”副本。“.svn”目录存有许多重要的内容,所以前面说在删除文件或目录时,必须用TortoiseSVN->Delete,而不能用“Delete”键来删除文件或目录,尤其是对于目录的删除。

posted on 2007-09-19 13:25  我爱写sql  阅读(712)  评论(0编辑  收藏  举报