CVS是一个版本控制系统.在UNIX中,用它来对在源文件之上的改变进行记录,可以记录版本变换,谁在何时修改了什么.并且能够从它管理的源文件堆里提取出某次修改时的版本来.它不但能够在单机上使用,而且CVS能够许多人一起用协同工作,对同一个工程进行操作.CVS的机制是这样的:CVS保留一份最初源文件的拷贝,这个拷贝称作"repository",大概是"源"的意思,此后,所有源文件的操作都要在CVS的控制之下,不再对最初的源文件进行操作。也就是说,修改者要从CVS控制之下的源文件里checkout一份自己的拷贝,对源文件的修改再通过CVS进行记录下来.CVS的命令和参数很多,但常用的命令也就只有5个(cvs checkout,cvs update,cvs add,cvs rm,cvs commit).下面会一一介绍:
在CVS能够工作之前,首先要进行一些设置,建立一个叫做CVSROOT的环境变量,这个环境变量用来描述CVS的根目录,也就是数据源的根目录.CVS在使用时要先对这个目录进行初始化:
CVS init
在初始化时,可以专门建立一个叫做cvs的帐号,用它来初始化并管理CVS.
初始化之后,就可以引入一个工程,方法是进入工程所在的目录,如/myproject,用:
cd /myproject
cvs import -m "Imported by me!" project ME RELEASE1
来引入一个工程,在引入的时候会将/myproject及其子目录一起引入,"-m"代表messages,记录一些修改时的信息.参数project的作用是在$CVSROOT目录下建立的存放源文件的目录名,ME代表VENDOR-TAG,RELEASE1代表RELEASE-TAG,在此之后所有对此工程感兴趣的人就可以拷贝自己的一份来进行修改了,用:
cvs checkout project
来对此工程进行导出,可以导出不同的版本、不同日期修改的工程,这需要在cvs checkout project后面加入额外的参数来提供信息。简单的cvs checkout project能够将最新的工程版本导出到你现在所在的目录下。在有些情况下,导出文件会遇到一些困难,比如文件读写权限问题使得不能够导出文件。一般解决方法是将参与协同工作的所有用户放在同一个组中,并使$CVSROOT这个目录(包括目录下的所有文件)能够使这个组的成员都拥有读写权限即可。
当某一个用户对文件进行了修改,用下列命令来对工程源进行更新:
cvs commit files
当加入一个文件或目录,使用:
cvs add myfile 来更新
删除一个文件或目录,使用
cvs rm myfile 来更新
但上述的两个命令只有在紧接着进行cvs commit myfile才生效。
cvs update用来从工程源中导出最新的版本来替代现有的工程。
下面讲一个比较复杂的例子,假设在编辑源文件的过程中,觉得修改的没有必要,想要恢复原先的版本,可以这样:
%cvs init
%cvs import -m "Imported by me!" project ME RELEASE1"
引入源文件
%cd myhome
%cvs checkout project
%cd project
%cvs tag OLDVERSION *
上面给现有的源文件作了tag
%cvs add myfile
%cvs commit myfile
修改了一些东西
但现在不想要这个新文件或不想要这些改动,可以:
%cvs checkout -r OLDVERSION
就可以恢复原样了.
至于分散在多台机器上的各个用户进行协同工作时,需要修改一些配置文件,首先在/etc/services里确保存在这么一项服务:
cvspserver 2401/tcp
cvspserver 2401/udp
然后修改/etc/inetd.conf,加入一行:
cvspserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=CVSROOT_OF_YOURS pserver
假设从host1的用户想要从host0机器上获得一份拷贝,首先使用:
cvs -d :pserver:YOUR_USERNAME@host0:/CVSROOT_OF_HOST0 login
进行登陆,然后就可以象在本机一样使用cvs了.
在CVS能够工作之前,首先要进行一些设置,建立一个叫做CVSROOT的环境变量,这个环境变量用来描述CVS的根目录,也就是数据源的根目录.CVS在使用时要先对这个目录进行初始化:
CVS init
在初始化时,可以专门建立一个叫做cvs的帐号,用它来初始化并管理CVS.
初始化之后,就可以引入一个工程,方法是进入工程所在的目录,如/myproject,用:
cd /myproject
cvs import -m "Imported by me!" project ME RELEASE1
来引入一个工程,在引入的时候会将/myproject及其子目录一起引入,"-m"代表messages,记录一些修改时的信息.参数project的作用是在$CVSROOT目录下建立的存放源文件的目录名,ME代表VENDOR-TAG,RELEASE1代表RELEASE-TAG,在此之后所有对此工程感兴趣的人就可以拷贝自己的一份来进行修改了,用:
cvs checkout project
来对此工程进行导出,可以导出不同的版本、不同日期修改的工程,这需要在cvs checkout project后面加入额外的参数来提供信息。简单的cvs checkout project能够将最新的工程版本导出到你现在所在的目录下。在有些情况下,导出文件会遇到一些困难,比如文件读写权限问题使得不能够导出文件。一般解决方法是将参与协同工作的所有用户放在同一个组中,并使$CVSROOT这个目录(包括目录下的所有文件)能够使这个组的成员都拥有读写权限即可。
当某一个用户对文件进行了修改,用下列命令来对工程源进行更新:
cvs commit files
当加入一个文件或目录,使用:
cvs add myfile 来更新
删除一个文件或目录,使用
cvs rm myfile 来更新
但上述的两个命令只有在紧接着进行cvs commit myfile才生效。
cvs update用来从工程源中导出最新的版本来替代现有的工程。
下面讲一个比较复杂的例子,假设在编辑源文件的过程中,觉得修改的没有必要,想要恢复原先的版本,可以这样:
%cvs init
%cvs import -m "Imported by me!" project ME RELEASE1"
引入源文件
%cd myhome
%cvs checkout project
%cd project
%cvs tag OLDVERSION *
上面给现有的源文件作了tag
%cvs add myfile
%cvs commit myfile
修改了一些东西
但现在不想要这个新文件或不想要这些改动,可以:
%cvs checkout -r OLDVERSION
就可以恢复原样了.
至于分散在多台机器上的各个用户进行协同工作时,需要修改一些配置文件,首先在/etc/services里确保存在这么一项服务:
cvspserver 2401/tcp
cvspserver 2401/udp
然后修改/etc/inetd.conf,加入一行:
cvspserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=CVSROOT_OF_YOURS pserver
假设从host1的用户想要从host0机器上获得一份拷贝,首先使用:
cvs -d :pserver:YOUR_USERNAME@host0:/CVSROOT_OF_HOST0 login
进行登陆,然后就可以象在本机一样使用cvs了.
以上所介绍的最简单的一些基本使用方法,cvs其实是一个很杂的工具,根据它所提供的参数能够对工程进行细致入微的控制,包括文件上锁等等.完整的CVS命令如下:
cvs [cvs_options] cvs_command [command_options] [command_args]
可以用cvs -H command来看各个命令的详细用法。这篇文章写的很简略,详细的资料可参考 "/usr/doc/cvs../cvs.ps"这个文件.