Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1265665
  • 博文数量: 264
  • 博客积分: 10772
  • 博客等级: 上将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-25 11:54
文章分类

全部博文(264)

文章存档

2012年(4)

2011年(51)

2010年(31)

2009年(57)

2008年(51)

2007年(70)

分类: LINUX

2008-01-30 18:13:14

CVS pserver服务器配置(RH9)

 

转载时请注明出处:http://blog.csdn.net/absurd

 

很长时间没有用CVS了,最近要装一个CVS服务器,找了一下配置CVS服务器的文章,找到很多,本来是没有必须再写一篇了,呵,只是为了加深印象而已。

 

1.       安装cvs包。

rpm -ivh /mnt/cdrom/RedHat/RPMS/cvs-1.11.2-10.i386.rpm

2.       检查/etc/service中是存在含下面两行内容,如果不存在,则加入进去。

cvspserver      2401/tcp                        # CVS client/server operations

cvspserver      2401/udp                        # CVS client/server operations

3.       创建一个目录作为cvsserver的根目录。

mkdir -p /cvs/cvsroot

4.       编辑文件/etc/xinetd.d/cvspserver,其内容如下:

service cvspserver

{

        disable = no

        flags = REUSE

        socket_type = stream

        wait = no

        user = root

        server = /usr/bin/cvs

        server_args = -f --allow-root=/cvs/cvsroot pserver

        log_on_failure += USERID

}

注:

a)       这里-allow-root参数的值应该和前面创建的cvsserver的根目录一致。否则后面login时会出现: no such repository的错误。

b)       flags的标志是用于setsockopt设置socket的一些属性,这里的REUSE表示socket关闭后可以立即重用,而不用等到超时后才能重用。

5.       重新起动xinetd服务:

service xinetd restart

6.       测试cvs 服务器是否正常起动了:

telnet localhost cvspserver

若连接成功,则表明正常起动了。

7.       初始化cvs 服务器。

cvs -d /cvs/cvsroot/ init

8.       进入cvs根目录,接下来做些基本设置,后面的步骤都在该目录中进行的。

cd /cvs/cvsroot/CVSROOT/

9.       创建passwdgen.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}\n";

10.    在系统中建立一个cvs用用户组。

groupadd cvs

11.    在系统中增加一个用户:

useradd -g cvs -G cvs cvsroot

 

并用passwd修改初始密码。

12.    创建一个名为passwd的文件,它是cvs用来作为登录验证用的,其格式如下:

cvs用户名:密码:对应系统中的用户名

密码是用前面创建的passwdgen.pl加密过的。如:

cvsroot:oBEprU5CtgrpU:cvsroot

jim:oBEprU5CtgrpU:cvsroot

mike:oBEprU5CtgrpU:cvsroot

这里有三个cvs用户: cvsroot、jim和mike,都对应于系统用户cvsroot。

 

13.    创建一个文件readers,可以在里面列出只读用户。如:

mike

14.    创建一个文件writers,可以在里面列出读写用户。如:

jim

15.    修改cvs根目录的所有者和权限。

chown cvsroot.cvs /cvs/cvsroot/ -R

chown 775 /cvs/cvsroot/ -R

16.    设置CVSROOT环境变量,登录cvs作为操作。

export CVSROOT=:pserver:jim@localhost:/cvs/cvsroot

cvs login

(输入jim的密码)

 

17.     OK了,我们import一个项目测试一下:

cd /root/lab/gui/glib-2.8.0

cvs import -m "for test purpose only" glib init start

 

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

 

CVS 速成班

結合文檔和一些網上資源,折騰了半天終搞定了CVS,我寫一點非常簡單的〝速成〝
的教材.希望對大家有用. 

下面是我的步驟和做法. 

1,要求: 

root 權限; 
CVS軟件,請找到相關的rpm,tgz,deb 等包裝上,或者到 

 
下載原程序編譯安裝,這裡我不準備介紹它的安裝,請參考CVS自身的文檔安裝.
我使用Slackware的tgz包,安裝的命令是 
#installpkg cvs*.tgz 
其他包請參考對應包管理工具的命令. 
一定的系統資源,要有一定內存(32M就能工作得很好),要一定的磁盤空間,看
你的項目的大小和多少而定. 
2,架設CVS服務器: 
建立CVSROOT目錄,因為這裡涉及到用戶對CVSROOT裡的文件讀寫的權限問題,
所以比較簡單的方法是建立一個組,然再建立一個屬該組的帳戶,而且以有
讀寫權限的用戶都要屬該組.假設我們建一個組cvs,用戶名cvsroot.建組和用
戶的命令如下 
#groupadd cvs 
#adduser cvsroot
生成的用戶家目錄在/home/cvsroot(根據自己的系統調整) 
用cvsroot用戶登陸,修改 /home/cvsroot (CVSROOT)的權限,賦與同組人有讀寫
的權限: 
$chmod 771 . (或者770應該也可以) 
注意:這一部分工作是按照文檔說明做的,是否一定需要這樣沒有試驗,我
會在做試驗在以版本的教程說得仔細一點.如果您有這方面的經驗請提
供給我,謝謝. 
 

建立CVS倉庫,(仍然是cvsroot用戶),用下面命令: 
$cvs    -d /home/cvsroot init
以root身份登陸,修改/etc/inetd.conf 和 /etc/services,分別加入下面一行: 
在 /etc/inetd.conf 裡加入: 
cvsserver    stream    tcp    nowait    root    /usr/bin/cvs    cvs --allow-root=/home/cvsroot pserver 
說明:上面的行是單獨一整行,/usr/bin/cvs 應該是你的cvs版本的命令路徑,
請根據自己的系統調整./home/cvsroot 是你建立的CVSROOT的路徑,也請
根據上面建立目錄的部分的內容做調整. 

在/etc/services裡加入: 
cvsserver    2401/tcp 

說明:cvsserver是任意的名稱,但是不能和已有的服務重名,也要和上面修
改/etc/inetd.conf那行的第一項一致.這裡我用的是CVS的口令認証方式,
CVS還有其他認証方式,我沒有做試驗,如果您有經驗,請補充,謝謝. 
 

添加可以使用CVS服務的用戶到cvs組: 
以root身份修改/etc/group,把需要使用CVS的用戶名加到cvs組裡,比如我想
讓用戶laser和gumpwu能夠使用CVS服務,那修改以的/etc/group應該有下
面這樣一行: 
cvs:x:105:laser,gumpwu 
在你的系統上GID可能不是105,沒有關系.主要是要把laser和gumpwu用逗號
分隔開寫在最一個冒號面.當然,象RedHat等分發版有類似linuxconf這樣
的工具的話,用工具做這件事會更簡單些.
重起inetd使修改生效: 
#killall -HUP inetd
這樣服務器就設置完成了.我們接著搞客戶端. 
3,設置客戶端,如果是Linux(或者其他*nix),客戶端和服務器端的軟件是一樣的,如果是
Win,MAC等平台,請到 找相應的客戶端軟件,
這裡我先說一下在Linux(*nix)裡怎做: 

設置環境變量CVSROOT: 
$export CVSROOT=:pserver:laser@the_server_name:/home/cvsroot 
注意:這裡的pserver是訪問方式,我在上面設置的是口令認証,所以這裡是
pserver,如果你的CVS服務器設置成別的訪問模式,那需要相應修改.
laser是可以使用 CVS服務器的用戶名,這裡可以根據你的設置修改,我在這
個版本設置的是直接使用系統用戶的口令文件,也就是說laser必須是CVS服
務器上的合法用戶,這裡當然有安全問題,CVS可以設置成為擁有自己的用戶,
我將在以的版本裡面增加這些內容,或者您也可以提供一些補充,或者直接
讀CVS的文檔.the_server_name是CVS服務器的名稱或者IP地址,根據你的情
況填寫,/home/cvsroot是你的CVS服務器的CVSROOT目錄,根據你的CVS服務
器設置做修改或者詢問管理員.你可以把這行放到你的shell的profile裡
(.bash_profile,.profile等)這樣就不用每次敲一長串命令了. 
 

登陸CVS服務器: 
$cvs login,這時候cvs會問你口令,請把你在CVS服務器上的口令敲進去,這裡
是laser在CVS服務器上的系統用戶的口令: 
 Passwd:xxxxxxxx 
成功登陸將在你的家目錄建立一個.cvspass文件,以就不用輸入口令了.
好,客戶端設置完成,簡單吧. 
現在服務器和客戶端都設置好了,那怎用呢,我在這裡寫一個最簡單的(估計也是最常用
的)命令介紹: 
首先,建立一個新的CVS項目,一般我們都已經有一些項目文件了,這樣我們可以用下面步驟
生成一個新的CVS項目: 

進入到你的已有項目的目錄,比如叫cvstest: 
$cd  cvstest
運行命令: 
$cvs import -m "this is a cvstest project" cvstest     v_0_0_1     start 
說明:import 是cvs的命令之一,表示向cvs倉庫輸入項目文件. 
              -m參數面的字串是描述文本,隨便寫些有意義的東西,如果不加 -m 參
數,那cvs會自動運行一個編輯器(一般是vi,但是可以通過修改環境變量
EDITOR來改成你喜歡用的編輯器.)讓你輸入信息, 
             cvstest 是項目名稱(實際上是倉庫名,在CVS服務器上會存儲在以這個名字
命名的倉庫裡.) 
             v_0_0_1是這個分支的總標記.沒啥用(或曰不常用.) 
             start 是每次 import 標識文件的輸入層次的標記,沒啥用.
這樣我們就建立了一個CVS倉庫了,然,我們可以把這個測試項目的文件刪除.試驗一下如何
從倉庫獲取文件.這裡我假設上面的所有客戶端工作你都已經做過了. 
運行下面的命令: 
   $cvs checkout cvstest
從倉庫中檢索出cvstest項目的源文件. 
如果你已經做過一次checkout了,那不需要重新checkout,只需要進入cvstest項目的目錄,更新
一把就行了: 
$cd cvstest 
$cvs update
一下即可.又或者你不想直接更新,只是想看看有沒有更新的東西,那: 
$cvs status
這時會打印出一長串狀態報告(你可能需要用類似less這樣的命令分頁顯示,或者定向到一個輸
出文件裡慢慢看.),對項目中的每個文件有一份狀態報告,類似這樣: 
=================================================================== 
File: foo.c             Status: Up-to-date 
   Working revision:    1.1.1.1 'Some Date' 
   Repository revision: 1.2     /home/cvsroot/cvstest/foo.c,v 
   Sticky Tag:          (none) 
   Sticky Date:         (none) 
   Sticky Options:      (none) 

這裡最重要的就是 Status 欄,這裡總共可能有四種狀態: 
Up-to-date:表明你要到的文件是最新的. 
Locally Modified:表明你曾經修改過該文件,但還沒有提交,你的版本比倉庫裡的新. 
Needing Patch:表明有個哥們已經修改過該文件並且已經提交了!你的版本比倉庫裡的舊. 
Needs Merge:表明你曾經修改國該文件,但是偏偏有個不識相的也修改了這個文件,而且還提交
給倉庫了! 

如果你只是想保持軟件的同步的話(象我),那上面的東西就足夠用了.可是如果多人協作開發
項目的話,可就不是了這簡單了.當你參加項目,維護文件時,就需要更多命令,比如說你我都
是某nasdaq項目的開發人員: 

1,你對某個文件做了修改,比如說改了ceo.c,加了一行程序:printf("where can I find VC to cheat!"); 
改完之你要把修改提交給倉庫,用命令: 
$cvs commit -m "add a complain" ceo.c 
或者就是: 
$cvs commit -m "worry about money" 
讓cvs幫你檢查哪個文件需要提交. 

2,當我開始幹活的時候,可能我先: 
$cvs status 
一把,這時候我會看到: 

================================================================== 
File: ceo.c             Status: Needing Patch 

   Working revision:    1.1.1.1 'Some Date' 
   Repository revision: 1.2     /home/cvsroot/nastaq/ceo.c,v 
   Sticky Tag:          (none) 
   Sticky Date:         (none) 
   Sticky Options:      (none) 

是我知道有人改了ceo.c,是我就: 
$cvs update ceo.c 
或者幹脆: 
$cvs update 
把ceo.c這個文件更新為最新版本,然再幹活.然提交. 

如果這天你修改了coo.c,加了一行 puts("how about another kind of bragging?"); 
並且提交了,但是這時候我已經 $cvs status 過了,就是說我不知道你的修改. 
而我加了一行printf("You must shamelessly and seems knowingness to act as a coo"); 
並且傻乎乎地提交: 
$cvs commit coo.c 
這時候,CVS會告訴我 
cvs commit: Examing . 
cvs server: Up-to-date check failed for 'coo.c' 
cvs [server aborted]: correct above error first! 

是我知道有個狗屎在我修改文件的當口做了提交,是我 
$cvs update 
這時cvs會報告: 
RCS file: /home/cvsroot/nasdaq/coo.c,v 
retrieving revision 1.1.1.1 
retrieving revision 1.2 
Merging differences between 1.1.1.1 and 1.2 into coo.c 
rcsmerge: warning: conflicts during merge 
cvs update: conflicts found in coo.c 
C coo.c 
告訴你coo.c有版本沖突,是我編輯coo.c,這時一般文件裡看起來象這樣: 
  ... 
printf("You must shamelessly and seems knowingness to act as a coo"); 
<<<<<<< foo.c 
======= 
... 
  puts("how about another kind of bragging?"); 
>>>>>>> 1.2 
... 

是我把上面改成: 
printf("You must shamelessly and seems knowingness to act as a coo"); 
puts("how about another kind of bragging?"); 
然 
$cvs commit -m "merged" coo.c 
是下回你再更新的時候就有新的補釘要打...如此往復,直到完成所有修改. 
不過這裡有一些要注意的地方就是刪除程序,如果你刪掉一行對你可能沒有用的程序 
puts("to be honest"); 而我不想刪除(因為我有用),而我不知情地直接: 
$cvs update 
了,那我的這行程序也完蛋了,所以這裡我們要注意所有開發人員的協調,千萬不要 
亂刪東西,大不了用 
#if    0 
#endif 
宏定義對括起來.實在要刪東西,那最好先標記一個版本: 
$cvs tag v_0_0_1 

然你可以發布並刪除你自己的工作目錄裡這個版本的文件(注意:不是刪除倉庫裡的.): 

$cvs release -d nasdaq 

然你再生成一個新分支: 

$cvs rtag -b -r v_0_0_1 v_0_0_1_1 nasdaq 

然再建立v_0_0_1_1的分支 

$cvs checkout -r v_0_0_1_1 nasdaq 

編輯並修改這個分支的文件,這樣的做法比較好. 

還有一些命令,比如要增加一個文件 garbage_china_concept_stocks_list: 

$cvs add garbage_china_concept_stocks_list 

然還要: 

$cvs commit  garbage_china_concert_stocks_list 

看起來有點象數據庫裡的事務?的確是這樣.CVS維護著一個本地的參考文件(在CVS/Entries裡),
這樣提交的時候就可以一次地把所有改變放到服務器端,這樣也更安全. 
同樣,如果想刪除文件 bankrupted_web_site: 

$rm bankrupted_web_site 
$cvs remove bankrupted_web_site 
$cvs commit bankrupted_web_site 
  

好了,上面所有的東西,估計就是我們用cvs時80%情況下用的命令和內容,包括文件的更新,提
交,沖突的解決,分支的派生,增刪文件等.實際上cvs的功能之強大,遠遠超出我在這裡描述的
內容,我這個〝速成〝也就管不了太多了,希望隨著時間的推移,我們能夠更加有效地使用CVS.
也希望大家能夠不斷補充這篇文章,最能夠成為手冊,而不僅僅是速成.當然,還要更多地參考
別的文檔. 

參考資料: 
 
~molli/cvs/doc/cvs_toc.html

 

 

 

阅读(987) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~