轨迹鼠的BLOG

人生就像一场旅行,不必在乎目的地,在乎的只是沿途的风景和看风景的心情。

东行记提醒您:您请求的网页正在载入中,请稍后......

公告

东行记提醒您:您请求的网页正在载入中,请稍后......

文章

评论

留言

连接

信息

登陆

搜索

2007-4-17 12:56:18
CVS(Concurrent Versions System)

 

这些天参与Moodle翻译工作,第一次接触到了CVS,感受到了它的确和厉害。所以这里找了一些好的文章和大家分享。

一、什么是CVS?

CVS――Concurrent Versions System并行版本系统;
是一个标准的版本控制系统;
对代码进行集中管理;
记录代码所有的更改历史;
提供协作开发的功能;
支持多人同时CheckOut与合并。
以客户端/服务器模式工作,所有的用户都在客户端进行CVS操作,而所有命令的执行都在CVS服务器端进行。

二、CVS基本概念

  1. CVS仓库:又称主拷贝,是CVS系统保存软件资源的地方。所有项目的所有文件的所有版本都保存在这个仓库中。
  2. 版本:开发人员每次向CVS提交所做的修改就形成了一个新版本。
  3. 工作拷贝:从CVS服务器端取出的,保存在我们正在使用的客户端计算机上的代码拷贝。每个人员都有一个属于自己的工作拷贝。
  4. 检出代码(创建工作拷贝check out):从服务器取出代码,就是创建工作拷贝的过程。
  5. 提交代码(commit):将代码送到服务器保存,commit又叫作check in。
  6. 导入代码(import):将未被CVS进行版本管理的代码引入CVS系统中,由CVS开始对它进行版本管理。
  7. CVS日志:CVS用来记录每次操作的内容的信息。日志信息可以用cvs log命令来查看。
  8. 更新(update):在协同开发环境下,将其他人所作的最新修改从CVS仓库中取到你的工作拷贝中,从而使得你得工作拷贝与仓库中得最新版本保持一致。使用update是同步各个工作拷贝的手段。
  9. 冲突(conflict):在协同开发的环境下,当两个开发人员对同一个文件进行修改,并且依次提交CVS仓库时就发生了冲突。这种冲突需要开发人员手工消除,并提交到CVS仓库中形成解除冲突之后的新版本。

三、CVS命令:

1.设置环境变量。

set CVSROOT=:pserver:xxx@192.168.0.226:e:/cvsroot

set CVSROOT=:pserver:xxx@ansi.3322.org:e:/cvsroot

2.签出工作版本到工作目录。
$cd

$cvs   co   account/src/common
该命令只将account/src/common目录结构签出到本地。若使用
$cvs co account
则将account下所有目录结构签出来。

3.提交修改的文件到CVS版本库中:

$cvs   ci   <filename>
注意若提交多个文件可以输入多个文件名,并以空格分开。若将该目录下所有文件都提交,那么只需
$cvs   ci <回车>
即可。

4.提交新增加的目录或文件到CVS版本库中:

$cvs   add   <dirname>

$cvs   ci   <dirname>

$cvs   add   <filename>

$cvs   ci   <filename>

5.删除目录及文件,需先删除目录下的文件

$rm   <filename>

$cvs   remove   <filename>

$cvs   ci   <filename>

再执行
$cd ..
$cvs up –P

则将该空目录删除(只是删除本地工作拷贝的空目录)。

6.查看文件状态

$cvs status <filename>

例如:
$ cvs st ffun.c

=================================================================

File: ffun.c             Status: Up-to-date

    Working revision:     1.1      Wed Nov   6 11:29:04 2002

    Repository revision: 1.1      /szunicom/dev/billing/src/preproc/CDMA/ffun.c,v

    Sticky Tag:           (none)

    Sticky Date:          (none)

    Sticky Options:       (none)

注意:最重要的是Status栏,可以有以下几种状态:

Up-to-date

:表明你的工作拷贝是最新的.
Locally Modified:表明你曾经修改过该文件,但还没有提交,你的版本比仓库里的新.
Needing Patch:表明有人已经修改过该文件并且已经提交了!你没有修改但你的工作拷贝的版本比仓库里的旧.
Needs Merge:表明你修改了该文件但没有提交,而有人也修改了这个文件,并且提交给仓库了。

Locally added

:表明使用了"add"命令增加了该文件,但还没有"commit"

Locally Removed

:表明你使用了"remove"命令,但还没有"commit"

Unkown

:CVS不知道关于这个文件的情况.例如,你创建了一个新文件,而没有使用"add"命令
解决办法:
若状态为Locally Modified,则需执行$cvs ci <filename>
若状态为Needing Patch或Needing Merge,则需执行$cvs up <filename>
将版本库里的文件与工作拷贝合并后,再提交给版本库,使用命令:

$cvs ci <filename>


若状态为:Locallyadded,则需执行$cvs ci <filename>
若状态为:Removed,则需执行$cvs ci <filename>
若状态为:Unkown,则需执行$cvs add <filename>,$cvs ci <filename>。

7.查看工作拷贝和仓库中最后版本之间的修改

$ cvs diff src.c

8.查看指定的两个版本之间的修改

$ cvs diff -r 1.1 -r 1.2 <filename>

9.版本回退(取出以前的某个版本)
有两种方式:
一是只把某一版本的文件输出到标准输出上:

$cvs up –p –r <版本号> <filename>

“-p”选项让CVS命令的结果只输出到标准输出,而不写入到结果文件中。

另一种是将输出到标准输出的结果重定向到文件中:
$cvs up –p –r <版本号> <filename> > <filename>

如:目前abc.c文件的版本号为1.5,要取出1.2的版本,那么执行
$cvs up –p –r 1.2 abc.c > abc.c

若没有使用“-p”选项进行回退,而是使用了$cvs up –r 1.2 abc.c命令,之后若对1.2版本进行修改后再提交到CVS时,会出现如下提示信息:
cvs ci

cvs commit: Examining .

cvs commit: sticky tag `1.2' for file `abc.c' is not a branch

cvs [commit aborted]: correct above errors first!

解决办法两种方式:

1、修改CVS/Entries文件,将以下黄色标记部分删除即可。

$cd CVS

$ vi E*

/abc.c/1.2/Tue Dec 17 13:33:06 2002//T1.2


2、使用$cvs up –A abc.c命令来消除附着标签,但是该命令是将1.2版本与最新版本进行了合并,还需对abc.c进行修改再重新提交。

10.如何恢复已经删除的文件或目录:
1. 在执行了【Remove】命令之后恢复文件。 ◇ 【Ctrl+L】直接输入命令cvs add xxxxx,或执行【Add Selection】界面操作。 ◇ 这样就可以直接恢复还未提交的删除文件。
2. 在执行了【Commit】命令之后恢复文件。 ◇ 只能用【Ctrl+L】直接输入命令cvs add xxxxx,这时会得到一个空的文件。 ◇ 选中这个空文件,执行【Update】操作,得到这个文件的实体。 ◇ 再次选中这个文件,执行【Commit】操作,得到这个文件最新版本。
3. 由于CVS系统中本质上不会删除任何目录,因此,谈不上对目录的恢复,但是CVS系统默认情况下是要在用户本机上(如:YCW2000)要删除空目录,因此,可以用如下方法得到已被删除的空目录:cvs checkout -p xxx,也可以在Admin=>Preference的【Globals】页面进行设置。

四、CVS使用速成配置

(一) CVS服务器的安装:
1。查看你的操作系统上是否安装了CVS:
#> rpm -qa|grep cvs

如果没有安装你可以在Redhat 第2张光盘上找到,另外你也可以在网上下载到最新的rpm包。很容易找,其实不存在什么linux版本。

2。建立cvs用户组:

#> groupadd cvs

3。建立cvs组的cvsroot用户和所属的目录:

#> useradd -g cvs -G cvs –d /cvsroot cvsroot

4。为cvsroot用户添加密码:

#> passwd cvsroot

5。改变 /cvsroot/ 的目录属性:

#> chmod –R 770 /cvsroot

6。改变用户登陆身份:

#> su cvsroot

7。开始创建单个项目:

#> cd /cvsroot
#> mkdir project1
#>mkdir project2
8。开始建立仓库:

#> cvs –d /cvsroot/project1 init
#> cvs –d /cvsroot/project2 init
#> chmod –R 770 ./project1/ ./project2/

9。建立CVS服务启动文件,我们使用xinetd方式:

#> [Crtl]+[d] 切换到root用户身份
#> cd /etc/xinetd.d
#> vi cvspserver

service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server= /usr/bin/cvs
server_args= -f --allow-root=/home2/cvsroot/project1 --allow-root=/home2/cvsroot/project2 pserver log_on_failure += USERID
}

注:由于xinetd的server_args长度限制,当你想运行很多的单个仓库的时候,可以这么做:

#> vi cvspserver

service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /cvsroot/cvs.run
log_on_failure += USERID
}

编写cvs.run脚本

#> vi /cvsroot/cvs.run

#!/bin/bash
/usr/bin/cvs -f
--allow-root=/cvsroot/project1
--allow-root=/cvsroot/project2
pserver

#>chmod +x /cvsroot/cvs.run

10。加入cvs服务:

#>vi /etc/services

cvspserver 2401/tcp #pserver cvs service
cvspserver 2401/udp #pserver cvs service
11。启动cvs服务:

#> /etc/init.d/xinetd restart

12。检查cvspserver服务是否已经启动:

#> netstat -l |grep cvspserver
应该有如下结果:

tcp 0 0 *:cvspserver *:* LISTEN

(二)CVS服务的用户管理:

上面我们已经建立了project1和project2两个CVS仓库,下面我们分别给两个仓库建立cvs用户。

13。创建可以登陆cvs服务器的用户名和密码:

#> su cvsroot
#> vi /cvsroot/project1/CVSROOT/passwd

trotter:*****:cvsroot
mimi:*****:cvsroot

#>vi /cvsroot/project2/CVSROOT/passwd

trotter:*****:cvsroot
gary:*****:cvsroot

这两个文件的意思是有trotter,mimi,gary三个cvs用户,mimi拥有project1的使用权限,gary拥有project2的使用权限,trotter拥有project1和project2的使用权限。登陆后的权限是cvsroot权限。
注意:这里的cvs用户和系统用户是不同的。

14。*****为密码,由以下文件生成:

#> vi /cvsroot/passwd.pl

#!/usr/bin/perl
srand (time());
my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))";
my $salt = sprintf ("%c%c", eval $randletter, eval $randletter);
my $plaintext = shift;
my $crypttext = crypt ($plaintext, $salt);
print "${crypttext}
";

#>chmod a+x /cvsroot/passwd.pl

15。如果你想生成一个密码是“123456”,则:

#> /cvsroot/passwd.pl “123456”

回车即可得到加密密码,用其替换passwd文件中的*****

16。Ok,cvs现在已经全部安装完成了,如果你想让一个用户拥有project1的权限,你就在/cvsroot/project1/CVSROOT/passwd中给他加入一个用户;如果你想让一个用户同时具有project1和project2的权限,你就给/cvsroot/project1/CVSROOT/passwd和/cvsroot/project2/CVSROOT/passwd里给他加一个用户名和密码相同的用户即可。最后,我们试用一下:

#> cvs -d :pserver:trotter@192.168.1.200:/cvsroot/project1 login

敲入命令回车后提示输入trotter的密码,你按照自己设置的密码输入,如果没有什么错误信息出现就是成功了(我的机器IP地址是192.168.1.200)

引用地址:http://www.linuxaid.com.cn/articles/1/7/172079447.shtml

http://hi.baidu.com/iceliushuai/blog/item/156b4b3443bbc94e241f1443.html



2008-2-1 14:27:40
link

Fendi Handbag wow gold gucci handbag auto vessel parts WOW Leveling Chanel Handbag Chloe Handbag seo lineage2 adena Silkroad online gold isk TOEFL lineage 2 adena Tactical flashlight golf tee


发表评论:

    昵称:
    密码:
    主页:
    标题:
    东行记提醒您:您请求的网页正在载入中,请稍后......
Powered by Oblog.