SubVersion

有一个开源版的控制系统,或者说是修订版的控制系统,名为Subversion (简称为svn),正在快速受到开发者的喜爱。它口碑极佳,可在线下载,完全免费,有大量文字称赞它的高效和实用。它稳定,灵活,能干,安全,免费,开源,并且能够用于任何规模的项目。

   以前的控制系统明星软件是CVS, 全称为并行版本系统(Concurrent Versioning System)。 Subversion出现之初只是为了给尊敬的CVS打造一个坚实可敬的基础,并根据多年以来CVS用户总结的经验来加以改进。它在很多方面如此成功,它 的普及就是证据。

Subversion 几近通明的使用方法,跨多操作系统平台上大量可用的客户应用,以及Subversion的低成本,和易于管理等因素,使得它不再仅仅被用来管理源代码。对 于内容可以被描述为“项目”或者“项目集”的目录结构来说,Subversion提供了一个近乎实时的备份系统。越来越多的BSD, Linux, 和 OpenSolaris用户在传统用途之外,还用Subversion的版本控制功能来保存文件目录。

安装

当 Windows提供了一步安装方式时,Subversion在开源社区的迅速走红绝对与它在BSD和Linux软件档案中的易于使用不无关系。例如,在 Debian GNU/Linux中安装Subversion,只需用到管理界面和命令语句和命令行客户端就能完成,只要以根用户身份登录,输入apt就可完成 subversion的安装。

类似情况下,在标准的Fedora Core Linux的YUM软件包管理器中安装Subversion,也只需要命令yum。对于FreeBSD, 无论使用pkg还是-C /usr/ports/devel/subversion进行安装都可以,使用哪种方法取决于您想从二元软件安装还是从源代码进行安装。即使MacOS X 也提供了能够安装Subversion的软件档案。

在某些情况下,subversion的版本控制功能要比很多普通备份工具出色很 多。最突出的当然是软件开发项目中的源代码控制。另外一个就是文档管理。由于用户的活动,文档和目录的内容会经常发生变化,迫使开发者采用一种方法撤消一 些删改,看看过去的版本。一般是通过changelog来实现,在版本控制系统中专业的称呼为 “修订记录”。

一种自动修订记录管理机制对于非专业编程人员来说可能非常熟悉,因为最著名的wiki软件就采用这样的技术来跟踪内容的变化过程,并能够通过返回去掉不好的修改。

做为修订记录机制的一部分,Subversion这样的版本控制系统不仅仅维护复制当前版本文件的中央数据库,还要一路维护从文件进入版本控制以后 直到 当前所进行的修订日志。任何从事软件开发工作时间够长的人都能告诉你能够返回到已知良好状态的功能有多么重要。这正是任何版本控制软件的中心任务:也是它 们得以存在的最主要原因。

Subversion还有更多的功能。例如,当两个人同时编辑同一文件时,它能解决版本冲突的问题。在真实世 界里,那些实践经验丰富,经常在版本控制文件中提交工作,在提交变化前先更新本地文件的用户,很少与他人的工作发生冲突。这种少见的情况 Subversion也能通过内置的冲突解决方案进行解决。它还支持将主开发线上经过修改的分支与其他开发分支的接合,对不同程度用户的不同程度的校验和 升级许可,以及一些其他一些项目经理们会觉得非常有用的性能。

个人文件管理

版本控制系统的另外一个用处就是他们允许您在不同地点,使用多台计算机共同开发同一项目,而无需使用任何USB存储设备或者CD-RW介质。只要你在工作用电脑上安装了版本控制代理软件,并登录版本控制魔法发挥作用的服务器,您就可以找到项目的最新版本并开始工作。

由于同一数据的不同副本在校验副本更新到不同的客户端计算机时自动同步,因此Subversion 这样的控制系统也可用做一套收集在一起的文档的备份系统。这包括您每天的个人文档,以及源代码等;也就是说,如果您将任何小到不需要占用带宽来进行每周的 备份的相关数据集合看做是“项目”,就可以利用Subversion来节省复制数据的时间。个人文档目录一般都非常符合这一特点,特别是当您所保存的文件 大部分都是几兆大的音乐、视频及高清晰度图片等文件时,绝对适用。

如果你是那种了解日常备份在预防硬件及文件系统故障中的重要意义的用 户,你会发现您所进行的不过是日常备份,因为操作Sebversion所要进行也就传统的备份系统配置和向CD-R中复制数据。Subversion所进 行的如此简单的个人文件备份能够节省大量时间,或者至少能将你从延迟备份的负担中解放出来,你所需要的只是另外一台运行着Subversion服务器软件 的计算机。

由于Subversion并不象Visual SourceSafe和ClearCase这样专属软件的图形化界面那样,指定单一用途,因此它能够很容易的被用于一些非标准的使用场合,如标准文档控制 等。你依然有自己的GUI环境,但是由于有很多专为Subversion使用的GUI客户端软件,而Subversion也被集成进了很多其他的GUI工 具,如Eclipse,甚至通过TortoiseSVN客户端进入了微软公司的资源管理器。

配置和安装

使用 Subversion进行文档管理最可能的情况是在微软的 Windows系统中使用TortoiseSVN 或者在免费的类UNIX操作系统的软件管理工具中使用Subversion客户端软件。如果要安装基本Subversion,你可以在BSD或者 Linux软件的档案库中找到服务器软件,命令行客户端以及管理工具,因此如果你不需要图形化用户界面的话,你根本无需另外安装任何软件。

在微软的Windows服务器中安装Subversion,你可能会用到Subversion项目的维护者Tigris.org网站上提供的SVN 1-Click Setup 安装程序。许多使用Subversion的微软Windows用户选用BSD服务器代替Windows服务器,而且这样还不用分别安装。

在服务器上安装了服务器软件以后,您需要创建一个版本控制知识库。下面的例子假设了一个类UNIX的shell command 环境。括弧中的语句可根据您的需求进行更改。不要在操作中输入括弧。“#”标志表示您以根用户身份登录,或者使用sudo进行了管理员访问。在 [nnnn]中填入你要访问的subversion知识库的userid 值。

列 A

# addgroup [svn-users]

# usermod -u [nnnn] -G [svn-users]

# mkdir -m 770 [/home/svn-repos]

# chgrp [svn-users] [/home/svn-repos]

# svnadmin create –fs-type fsfs [/home/svn-repos]

请注意一定要在fs-type选项中明确“fsfs”。因为默认情况下,Subversion知识库文件系统的数据库的最初名称为“bdb”,已被 证实 有些不稳定。新版本中默认名称已经更改为fsfs,但是有些老版本及非标准版的Subversion依然使用bdb。出于安全起见,还是要在创建新知识库 时明确一下fsfs数据库格式,保证系统能够更稳定。

在服务器上建完知识库目录以后,就可以在这个目录下创建实际的项目知识库。也许是出于直觉,你不应该直接在知识库内进行。列B告诉你如何通过单独目录在知识库目录中创建包含有被丢弃的文件的知识库,然后再通过“check in”登记来创建项目知识库。

最后以前面命令中指明的用户帐号登录。从所用用户帐号的根目录开始按步骤进行。使用非根用户身份登录,前面显示“$”符号。同样的,[ ]括弧中的内容可根据你的需要进行修改。记得在输入时不要输入括弧。

列B

$ mkdir [project]

$ cd [project]

$ touch [file.txt]

$ svn import -m “[importing file to create project]” . file:///[home/username/svn-repos/project]

在服务器上创建项目知识库以后,就完成了。 在将项目知识库导入知识库之前需要删除刚才创建的项目目录,因为目录中的数据现在已经安全的保存在了服务器上。既然知识库是通过一个空文件使用touch command创建完成饿,所以删除也不会造成任何损失。

在客户端电脑上你可能需要编写项目或者访问文档,所以你还需要查看知识库中的内容并创建一个本地副本。范例如下。同样的也是假设您使用免费的类UNIX操作系统,如BSD,或者OpenSolaris这样的Linux版本。.

列 C

$ cd [/home/username]

$ mkdir [svn-local]

$ cd [svn-local]

$ svn co svn+ssh://[hostname/home/username/svn-repos/project project]

这时,一般都需要三次输入保存知识库的系统的密码。在本例中,除了你选择的操作系统,您还需要在客户端系统上安装功能完全的SSH客户端和SSH服 务 器。 Svn命令知道如何通过SSH传达网络需求,为客户端和服务器系统之间提供安全的加密连接,保护您的用户名、密码和数据不受可能注意您的网络的恶意安全破 坏者侵害。

Svn-local目录不是必需的。如果你愿意的话,你可以就把最新校验过的项目或者文档目录直接保存到您的用户帐号主目录 下。一般最好将由 Subversion知识库维护的目录与备份方式不同的目录分别保存,以免弄混。在以前的例子中,你都无需为重要数据“项目”的目录命名,所以也不需要为 最初的空文件“file.txt”命名。

对项目的本地副本核完毕,就可以删除客户设备上的项目目录。然后就需要在目录内添加其他在Subversion中保存的文件,并在服务器上的Subversion知识库中进行核对。列D就为操作范例。

列 D

$ cd [/home/username/svn-local/project]

$ svn rm file.txt

$ cp -R [/home/username/project/*] .

$ svn add `ls -R`

$ svn ci -m “[added all base files to the project directory]”

cp –R命令能将目录中重要数据目录中的全部内容(在这里为/home/username/project) 复制到当前目录中 (由单独的句子指定)。svn add `ls -R` 命令将这个目录下全部内容以及所有的子目录添加到本地项目目录副本中的版本控制中。svn ci 命令将当前副本提交到服务器上的主目录中。在添加命令以后,svn客户端工具会显示添加文件列表。Ci命令会要求密码以确保你有权限进行提交。

Subversion的使用

不同的图形化用户界面的使用方法也不同,各个用户的使用方式也不同。对于使用命令行的客户,最重要也是最基本的升级、管理和提交项目文件的命令是以下这些:

svn up – 通过主知识库更新本地副本。在开始对任何文件的工作前都要进行更新。如果别人访问过知识库,也要在提交之前进行再次更新,是个好习惯。

svn status – 告诉你哪些文件被修改过,哪些经过增改但还未被提交,哪些创建以后还未添加到版本控制,哪些文件神秘消失而没有从版本控制中删除(最大的可能是因为你忘记 使用svn rm 替代 simply rm),以及哪些文件已经从版本控制中完全删除。

svn add – 我们刚才演示过,用来在版本控制中添加文件。

svn rm – 从版本控制中删除文件。这样也会从本地文件系统中将相关文件删除。

svn mv – 将知识库中本地副本中的某个文件移动到另一个地方,而不会造成Subversion数据库的混乱。它的工作原理有些类似标准的mv 命令,但是它只用于版本控制下的本地项目副本。

svn mkdir – 创建目录,与普通的mkdir 命令很类似,但是它同时能够将目录自动加入版本控制。

svn ci – 能将知识库中本地副本当前目录下以及其内部所有子目录内发生的全部变化提交给主知识库。在这一命令生效之前,必须首先解决svn状态命令报告的标有问号的 部分(未知的文件状态)。在没有疑问以后,svn ci 会打开默认文本编辑器输入提交信息。如果你需要查找项目中较早版本中的文件就会用到这些文本。-m 选项能够被用来明确命令行中的提交信息,如上面创建和使用Subversion知识库中所演示的那样。这样做的目的在于给已提交的变化做出标记,以防以后 什么时候可能会对之前做的修改进行分类。

svn help – 为你提供大量关于Subversion命令行客户端的使用信息,例如对每个svn命令深入的解释和举例,以及除这些以外更多命令的使用方法。您可以通过输 入svn help add(这里假设你需要获得关于“add”命令的信息)获得更多关于特定svn命令的信息。

本文并非神化Subversion,只是对Subversion版本控制软件进行了有益的介绍,版本控制软件的使用是任何敬业的程序员都要使用的技巧。本文中的这些例子能够为您提供真切的帮助,即使您不是程序员也会感觉有益。

make -DWITH_SVNSERVE_WRAPPER -DWITH_MOD_DAV_SVN -DWITH_APACHE2_APR install clean