Subversion 不是单单为程序编写员而设的……我知道,因为我就不是。最近我开始用它来做后多事情,例如:备份 Nagios 的设置、文件、及任何以文字为基础的东西。我不知道因何我没有更早使用它,但无论如何,事情就是这样了。这份文件简捷地解释安装及设置 subversion,及如何在本地和在联网上通过 Apache 使用它。请参阅它所提供的文档关於完整、复杂的设置及安装。其实坊间有很多关於这个题材的优秀文档,所教授的远超过我对这个工具的认识。假如你像我一样喜欢尝试新的事物,这份文档可以帮助你快速入门。
1. 系统
CentOS 4.x/RHEL 4
CentOS 5.1/RHEL 5
2. 参考
Subversion:http://subversion.tigris.org/Version Control with Subversion:http://svnbook.red-bean.com/
3. 安装
[root@lucifer ~]# yum install mod_dav_svn subversion
你首先要做的事情就是安装我在上面所提及的两个组件。如果你未安装 Apache,这样做亦会为你把它拉进来。
当你用 yum 安装时,它会列出上面两个组件以外的组件。其它东西亦会自动被安装。视乎你已有的组件,你的经历也许会不同。
4. 设置
4.1. Apache
在你进一步学习之先,你需要确定 Apache 已经被设置好。我假设你在做一个全新的安装,因此如果你的 Apache 已经在运作中……请小心你所做的改动。我亦会解释如何设置基本的口令保护。然而,假若你想容许任何人访问版本库,你可轻易地省略这部份。你首先要做的事情就是打开/etc/httpd/conf/httpd.conf,而且最低限度更改ServerName这个指引。如果你需要协助或拥有更复杂的设置,请参详 Apache 的文件。
[root@lucifer ~] vim /etc/httpd/conf/httpd.conf —— 作所需修改并存档 [root@lucifer ~] service httpd start [root@lucifer ~] chkconfig httpd on在网络上浏览你的机器,http://yourmachine,看看你能否取得测试页。做得到吗?好了,让我们进到更有趣的事情。
4.2. Subversion 给 Apache 的设置
下一步就是在 Apache 内设置某些设置,好让 Subversion 与 Apache 能够融洽相处。现在让我们看看 Subversion 为你安装的样例配置文件。
[root@lucifer ~] cd /etc/httpd/conf.d/ [root@lucifer ~] vim subversion.conf # 有需要的话,请确定你删除这两行的注释 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so # 加入下列内容来支持基本验证,并将 Apache 指向实际放置版本库的地方。 <Location /repos> DAV svn SVNPath /var/www/svn/repos AuthType Basic AuthName "Subversion repos" AuthUserFile /etc/svn-auth-conf Require valid-user </Location>上面的位置是 Apache 在 URL 列上使用的。举个例说:http://yourmachine/repos指向你所指定的 SVNPath。上面只是一个样例,因此请按你的首选放置东西。请确定你在完成编辑后存储文件。
然后我们须要创建你在上一部所指定的口令档。开始时你要利用 -cm 这个选项。它会创建文件并用 MD5 将口令加密。如果你需要加用户,请确定你只使用 -m 选项,而不包含初次创建时的 -c。
[root@lucifer ~] htpasswd -cm /etc/svn-auth-conf yourusername New password: Re-type new password: Adding password for user yourusername [root@lucifer ~] htpasswd -m /etc/svn-auth-conf anotherusername New password: Re-type new password: Adding password for user anotherusername
4.3. 设置你的版本库
你接著要做的事情就是创建你用来提交及取出文件的版本库。利用 svn 所包含的工具,这是很容易的。
[root@lucifer ~] cd /var/www/ —— 或者你在上面所指定的路径 [root@lucifer ~] mkdir svn [root@lucifer ~] cd svn [root@lucifer ~] svnadmin create repos [root@lucifer ~] chown -R apache.apache repos [root@lucifer ~] service httpd restart现在去测试你能否通过网页浏览器访问你的版本库:http://yourmahcine/repos。你应该取得一个对话框询问用户名称及口令。若然是这样,请输入你的凭证,然后你应该看见一版Revision 0:/的页面。这样的话,版本库的设置便大工告成了。如果你须要多个版本库,请参考上面连结内的文档。这里只示范如何设置一个版本库及开始应用它。话说回来,让我们就这样做。
5. 运用 subversion
5.1. 分配你的版本库
如果一切顺列,你现在应该已准备好使用你所创建的版本库。subversion 的 svn 工具是你将要用来与数据库沟通的命令行客户端。若要看这个工具的用法:
[root@lucifer ~] svn --help你最有机会使用的选项是:svn import、svn commit(ci)、svn checkout(co)。开始时你会用 import 将文件输入你的版本库;你会用 checkout 取出它们作修改;你会用 commit 将改动提交到数据库内。一旦你见过它们被应用数次,这便颇为简单。
在我继续之先,我希望解释关於目录结构的分配。几乎所有文件都谈及用某个分配方法创建你的目录。他们会提及要确定你在根目录下设有 branches、tags 及 trunk 目录,当中 trunk 会包含你的所有文件。就例如:
. |-- project1 | |-- branches | |-- tags | `-- trunk `-- project2 |-- branches |-- tags `-- trunk参考书会较详细解释这样做的原因,但我基本上不会采用这种分配……这是因为我不算是写程序或维护「项目」。我主要用它来存储相对简单的配置文件及文件。请用适合你的方式来设置。
作为一个样例,我会创建一些示范用的目录及放置一些文件在其中。这是在 SVN 服务器上做的。请照样做。
[root@lucifer ~] cd /tmp [root@lucifer ~] mkdir mytestproj [root@lucifer ~] cd mytestproj [root@lucifer ~] mkdir configurations options main [root@lucifer ~] vim configurations/testconf1.cfg —— 放你喜欢的东西在这些文件内。 [root@lucifer ~] vim options/testopts1.cfg [root@lucifer ~] vim main/mainfile1.cfg请记得你可以随你的自己的意思进行分配。当你完成了你所须的首个分配后,让我们向前进并将它输入 subversion 内。
5.2. 输入
[root@lucifer ~] svn import /tmp/mytestproj/ file:///var/www/svn/repos/mytestproj -m "Initial repository layout for mytestproj" Adding /tmp/mytestproj/main Adding /tmp/mytestproj/main/mainfile1.cfg Adding /tmp/mytestproj/configurations Adding /tmp/mytestproj/configurations/testconf1.cfg Adding /tmp/mytestproj/options Adding /tmp/mytestproj/options/testopts1.cfg
5.3. 取出
现在利用网页浏览器取出文件:http://yourmachine/repos。你应该能够取出你所输入的东西。一旦你在本地的 SVN 服务器上载了你最初的分配,你只需用先前所创建的户口连接到 subversion 服务器,便可以在另一台远程的机器上使用它。让我们测试一下。
[me@mylappy ~] cd /tmp [me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj Authentication realm: <http://yoursvnserver:80> Subversion repos Password for 'youruser': A mytestproj/main A mytestproj/main/mainfile1.cfg A mytestproj/configurations A mytestproj/configurations/testconf1.cfg A mytestproj/options A mytestproj/options/testopts1.cfg Checked out revision 1.
5.4. 编辑及提交
正如你所见,你已经从 subversion 服务器取出了第 1 版。现在你可以编辑一些东西,然后将改动提交给 subversion 服务器。
[me@mylappy ~] cd mytestproj @H_754_502@[me@mylappy ~] vim configurations/testconf1.cfg —— 加入或删除某些东西并存档。 [me@mylappy ~] svn commit -m "Added a line to testconf1.cfg." Sending configurations/testconf1.cfg Transmitting file data . Committed revision 2. 这样做的一个好处,就是你可以删除刚才在你的机器上所取出的所有目录。你取出它们的唯一目的,就是要编辑它们,然后将它们送返主机。请浏览你的服务器来取出不同文件。
5.5. 新增/删除对象
这一切都很好,但你如何在现存的版本库内加入更多文件?很简单,就是利用 add 这个引数。请你现在就取出你最新的版本,复制一个文件到目录内,加入这个文件,然后提交你的改动。
[me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj A mytestproj/main A mytestproj/main/mainfile1.cfg A mytestproj/configurations A mytestproj/configurations/testconf1.cfg A mytestproj/options A mytestproj/options/testopts1.cfg Checked out revision 2. [me@mylappy ~] cd mytestproj [me@mylappy ~] cp /etc/yum.repos.d/CentOS-Base.repo configurations/ [me@mylappy ~] svn add configurations/CentOS-Base.repo A configurations/CentOS-Base.repo [me@mylappy ~] svn commit -m "Added the CentOS Yum repo file." Adding configurations/CentOS-Base.repo Transmitting file data . Committed revision 3.要删除对象,你只须以 delete 代替 add。提交你的改动,然后便成了。就是这么简单。再次返回你的浏览器,你会发现版本号码是 3。你应该可以点击文件并找出你所做的改动。
5.6. 撤消
这些都非常好,但我如何撤消到旧的版本……这不是 subversion 的用意吗?对,这很容易。好果你不清楚你现有的版本……看看 log 这个指令。这解释了你为何每次提交时要放入信息。它们要简洁,但含足够数据来提醒你或许忘掉了的事情。
[me@mylappy ~] svn log http://yoursvnserver/repos —— 这针对整个版本库 [me@mylappy ~] svn log http://yoursvnserver/repos/mytestproj —— 这针对个别项目你会取得一个完整的版本列表连同注解,正如我上面所讲。这样你便能选择你现在想取回哪个版本。
[me@mylappy ~] svn co -r 1 http://yoursvnserver/repos/mytestproj这个指令会取回第 1 个版本。
6. 访问控制清单
一般来说,你不会想将所有版本库的访问权给予所有用户。你可以利用 ACL 来限制每位用户访问版本库的权限。ACL 可以通过AuthzSVNAccessFile这个文件选项来启用,它以一个文件名作为参数。例如:
AuthzSVNAccessFile /etc/svn-acl-conf你可以在相关的Location部份加入它:
<Location /repos> DAV svn SVNParentPath /var/www/svn/repos AuthzSVNAccessFile /etc/svn-acl-conf AuthType Basic AuthName "Subversion repos" AuthUserFile /etc/svn-auth-conf Require valid-user </Location>然后你可以创建/etc/svn-acl-config。这个文件内藏有这个格式的分段:
[版本库名称:版本库路径] 用户 = 访问权当中访问权可以是r(只读)、rw(读写)、或空白(禁止访问)。缺省的 ACL 是禁止用户访问版本载。假设你有一个名叫framework的版本库,而你想给john只读的权限,及joe读写的权限。你可以加入下面这个分段:
[framework:/] john = r joe = rw你亦可以在名叫groups的分段内置立群组,然后在访问控制清单内将@符号放在群组前面。例如:
[groups] staff = joe,george [framework:/] john = r @staff = rw如果你想令所有用户能阅读每个版本库,你可以为每个版本库的根目录加入以下一个分段:
[/] * = r