Linux 学习笔记(十一S)版本控制

1 RCS: 版本控制系统

RCS (Revision Control System) 是现存的最古老的 UNIX 应用程序之一。如果您把文件 /etc/rsyslog.conf 置于 RCS 的控制之下,那么 RCS 会将它的各个版本保存在 /etc/rsyslog.conf,v 里。

为了减少混乱,RCS 在和原来文件相同的目录下寻找一个叫做 RCS 的目录。如果有这个目录,RCS 就把 ,v 文件放在那个目录里,这样一来,列出的目录内容就会变得清楚多了,因为许多文件都可以共享 RCS 目录。这是一种很棒的功能,而且也是我们极力推荐的一种做法。您确实需要知道的 RCS 命令只有几个: ci 用于检入, co 用于检出,而 rcs 执行各种维护工作。如果您使用的编辑器是 emacs, 那么就完全不必使用命令行工具了,因为 emacs 内置了对 RCS 的支持。

要让一个文件开始处于 RCS 的跟踪之下,可以像下面这样在这个文件上运行 ci:

$ ci -u filename
RCS/filename,v <-- filename
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> This is the orgmode file.
-u 标志让 ci 立即以一种未上锁(不可编辑)的状态检出 filename 文件。如果您省略了这个标记,那么 ci 就会梌这个文件,然后删除原来的副本,这或许并不是您想要的做法。

您每次想要改变一个受 RCS 控制的文件时,都必须检出它,并用 co -l 命令对它上锁:

$ co -l filename

如果您使用 emacs, 那么就更方便了,只需打开受 RCS 控制的文件,然后 C-x v v 就可以实现文件检出和上锁。当你对所做的修改感到满意时就可以使用 ci -u 命令将它签入,这时 RCS 会要求你提供一条注释,说明您刚才做的是什么。虽然人们倾向于路过这步,或者写些诸如“做了一次修改”这样的无用信息,但是应该坚持加注释这个习惯。在两年以后,当您要弄清楚为什么要做改动的时候,有帮助的注释会救您一命。在 emacs 里面,当您写完注释后就可以使用 C-c C-c 将 frame 关掉同时签入 RCS。

$ ci -u filename
RCS/filename,v <-- filename
new revision: 1.2; previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>> Started describe what I gonna do in this week
>> .
done
当您需要比较两个版本之间的差别的时候, rcsdiff 是一个非常好的帮手,它是一个能懂 RCS 的 diff 版本。
$ rcsdiff filename
但我会建议您使用 emacs 来做这件事,因为它的 Diff 模式相当地智能,能够将修改的地方高亮显示出来,利用 TAB, np 键能够在不相同处进行跳转, o 或者 RET 键能够轻松地打开源文件进行查看。

您可能还需要用 rlog 命令查看一下文件的版本历史信息:

$ rlog filename
如果您想要看看文件在换到新文件之前的样子,可以用 co-r 选项检出这个文件的 1.2 版,不过在做这事之前最好已经将最新的版本签入到 RCS 中,否则它会用老版本替换当前的 filename 文件:
$ co -r1.2 filename

2 CVS: 并发版本系统

CVS (Concurrent Version System, 并发版本系统) 是目前在 UNIX 和 Linux 系统上使用最为广泛的版本控制系统。

CVS 背后的主要思想之一是项目文件(及其历史版本)都保存在一个中心位置。和在 RCS 系统中一样,您要签出要开始在上面工作的文件,然后做完修改之后把这些文件再次签入到代码库里。CVS 的优势在于,它没有“上锁”和“解锁”检出的概念,基于人可以同时检出并修改文件(“并发”由此得名)。

下面从用户的角度快速列举一下最重要的 CVS 命令。修改一个项目的第一步是登录到服务器,检出想要改动的模块。我们在这里要修改的模块叫做 sort:

$ cvs -d : pserver: user@server:/path/to/repository login
CVS password: <password>
$ cvs -d : pserver: user@server:/path/to/repository co sort
其中 pserver 是联络代码库所用的访问方法,本例中的代码库是一个专用的 CVS 口令服务器. login 操作把口令与服务器的口令进行对照检查,并且保留口令的一个副本,供以后的交互使用. co 操作直接类似于 RCS 的同名命令。

现在可以进行 sort 目录在本地的副本,开始编辑文件。当您准备把文件再次签入 CVS 库的时候,不需要使用 -d 选项,因为 CVS 在子目录 sort/CVS 里留下了一份所有必须的本地信息。

$ cvs commit foo.c -m "Added more efficient sort routine"
如果您已经在模块的副本上工作了一段时间,想要用其他人自从您检出该文件后已经对它做的修改来刷新本地副本,可以使用 cvs update 命令. -d 选项的意思是要包括所有的子目录,而 -P 选项则要求 CVS 删除任何空目录。
$ cvs update -dP

3 Subversion: 做得好的 CVS

虽然 CVS 是当前占据主导的版本控制系统,但是我们建议系统管理员从 RCS 直接跳到 Subversion。这个软件包的官方网址是 http://subversion.tigris.org/,不过现在已经在使用新的网址 http://subversion.apache.org/ 了。因为 Subversion 所使用的 License 就是 Apache License。

接下来我将要在我的 ubuntu 12.04 系统上安装并配置 subversion,虽然我所选用的发行版本是 ubuntu 但是我相信其中的绝大部分内容和操作都应该同样适用于其他的发行版本,甚至同样是 ubuntu 的其他时期的发行版。

首先,安装所需要的软件包:

$ sudo apt-get install subversion
$ sudo apt-get install libapache2-svn
稍等片刻,安装好软件之后就开始对其进行配置。这时候需要先创建一个 SVN 仓库(Repository),许多位置都可以放置 Subversion 文件仓库,我选用的位置是 /home/svn, 因为这是我的一个空间非常大的硬盘,足足 1 TB 的说。:)
$ sudo mkdir /home/svn
$ cd /home/svn
$ sudo svnadmin create softplayer
$ sudo chown -R www-data:www-data softplayer
其中的 www-dataapache2 默认的用户和组,我将使用 http 的方式对 Subversion 文件仓库进行访问,所以我将 softplayer 这个 Subversion 仓库的属主和属组都修改成 www-data, 如果不修改的话,会出现提交不了文件的错误,没权限呀,你懂的!

接下来,创建 /etc/subversion/passwd 文件,该文件包含了能够使用 Subversion 文件仓库的用户的授权信息。

$ sudo htpasswd -c /etc/subversion/passwd user_name
上面的 user_name 需要根据您实际的情况来进行分配,比如是 david 或者 john 等用户. -c 选项表示创建新的 /etc/subversion/passwd 文件,所以 user_name 所指的用户将是文件中唯一的用户。如果要添加其他用户,则去掉 -c 选项即可,比如像下面的命令一样:
$ sudo htpasswd /etc/subversion/passwd another_name
Subversion 文件仓库的访问分为以下几种:

modeaccess
file://直接访问本地硬盘上文件仓库
http://通过 WebDAV 协议访问支持 Subversion 的 Apache2 Web 服务器
https://类似 http:// 支持 SSL 加密
svn://通过自带协议访问 svnserve 服务器
svn+ssh://类似 svn:// 支持通过 SSH 通道

要通过 WebDAV 协议访问 SVN 文件仓库,还必须配置一下 Apache2 Web 服务器。在 /etc/apache2/mods-available/dav_svn.conf 文件中写入以下代码:

<Location /svn>
DAV svn
SVNParentPath /home/svn
AuthType Basic
AuthName "subversion repository"
AuthUserFile /etc/subversion/passwd
  #<LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  #</LimitExcept> 
</Location>
如果需要用户每次登录时都进行用户密码验证,请将 <LimitExcept GET PROPFIND OPTIONS REPORT> 与 </LimitExcept> 两行注释掉。

当您添加了上面的内容,您必须重新起动 Apache 2 Web 服务器,请输入下面的命令:

$ sudo /etc/init.d/apache2 restart
好的,这时就可以尝试着使用浏览器打开 http://localhost/svn/softplayer 这个地址啦,能够正常打开,perfect. 里面是空的,当然啦,还没有导入数据进去嘛!

接着就是将数据 import 到 Subversion 仓库啦:

$ svn import /path/data http://localhost/svn/softplayer -m "Initial import."
导入成功之后,刷新浏览器,同时也可以在浏览器上看到所做的更新!

接下来的工作就是将 Subversion 仓库中的文件 checkout 出来,修改或删除,再 commit 回去:

$ svn co http://localhost/svn/softplayer SoftPlayerBeta --username david
我使用刚才 htpasswd 命令创建的 david 用户名 checkout softplayer 到 SoftPlayerBeta 文件夹中,此时会提示输入密码。如果遇到 Password for ‘(null)’ GNOME keyring: 问题的时候可以直接
$ rm ~/.gnome2/keyrings/login.keyring
原因是 svn 和 gnome 的一个 key 冲突了。

这时进入 SoftPlayerBeta 文件夹中,修改其中的文件,比如说 foo.c 文件,成功修改后,直接

$ svn ci foo.c -m "Making a testing comment."
就可以将修改提交到 Subverion 库里。也可以使用 svn add filename.ext 或者 svn del filename.ext 添加到库里或者从库中删除 filename.ext 文件,更多 svn 命令的使用可以在命令行中输出 svn help 进行查看。

但是说实在话,直接通过命令来操作 svn 的情况还是比较少见的,更多时候,是通过集成到开发环境中的版本控制管理插件来对文件的版本进行操作,如果您使用 emacs 那么在 Tools 菜单中就已经提供了 Version Control 的菜单项,方便对受版本控制器管理的文件进行操作;如果是使用 eclipse 来进行开发,那么在 eclipse 世界里就已经有非常方便实用的 subclipse 插件来对操作 Subverion,并且还是 GUI 界面的,非常地棒!

更多关于 Subversion 的信息可以参考以下的网址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iBlackAngel

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值