简介Â
CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管ç†ï¼Žå¦‚果大家曾ç»å‚与过多人å作开å‘çš„é¡¹ç›®ï¼Œå¤§å®¶è‚¯å®šæœ‰è¿™æ ·çš„ç—›è‹¦ç»åŽ†ï¼šç”±äºŽå¤šä¸ªäººåŒæ—¶ä¿®æ”¹åŒä¸€ä¸ªæ–‡ä»¶ï¼ŒÂ 自己辛辛苦苦修改的程åºè¢«åˆ«äººå½»åº•åˆ é™¤äº†ï¼Žå¦å¤–ï¼Œå¦‚æžœä½ çš„è½¯ä»¶/程åºå·²ç»å‘布了三个版本, 而这时候用户需è¦ä½ ä¿®æ”¹ç¬¬äºŒä¸ªç‰ˆæœ¬çš„ä¸œè¥¿ï¼Œä¹Ÿè®¸ä½ ä¼šå› ä¸ºåªä¿ç•™äº†æœ€æ–°ç‰ˆæœ¬è€Œç—›å“æµæ¶•ã€‚è¿˜æœ‰å°±æ˜¯ä½ å¯¹ç¨‹åºåšäº†ä¸€äº›ä¿®æ”¹ï¼Œä½†æ˜¯ä¿®æ”¹å¾ˆå°‘ï¼Œä½ åªæƒ³ç»™è¿œæ–¹çš„åŒäº‹å‘ä¸€ä¸ªä¸¤ä¸ªç‰ˆæœ¬ä¹‹é—´çš„å·®åˆ«æ–‡ä»¶ï¼Œè¿™æ ·å¯ä»¥å…于邮箱ä¸å¤Ÿå¤§ï¼Œç½‘é€Ÿå¤ªæ…¢ä¹‹ç±»çš„é—®é¢˜ï¼Žä¸ºäº†è§£å†³ç±»ä¼¼è¿™æ ·çš„é—®é¢˜ï¼Œä»¥åŠè¯¸å¦‚生æˆè¡¥ä¸æ–‡ä»¶ï¼Œåކå²ç‰ˆæœ¬ä¿®æ”¹ç‰ï¼Œä¸€å¸®é»‘客(褒义)在原先 Unix 体系里很æˆç†Ÿçš„ SCCS 和 RCS 的基础上,开å‘了 CVS。(SCCS: Source Code Control System,RCS:Revision Control System)。Â
CVS 的基本工作æ€è·¯æ˜¯è¿™æ ·çš„ï¼šåœ¨ä¸€å°æœåŠ¡å™¨ä¸Šå»ºç«‹ä¸€ä¸ªä»“åº“ï¼Œä»“åº“é‡Œå¯ä»¥å˜æ”¾è®¸å¤šä¸åŒé¡¹ç›®çš„æºç¨‹åºã€‚由仓库管ç†å‘˜ç»Ÿä¸€ç®¡ç†è¿™äº›æºç¨‹åºï¼Žè¿™æ ·ï¼Œå°±å¥½è±¡åªæœ‰ä¸€ä¸ªäººåœ¨ä¿®æ”¹æ–‡ä»¶ä¸€æ ·ï¼Žé¿å…了冲çªï¼Žæ¯ä¸ªç”¨æˆ·åœ¨ä½¿ç”¨ä»“库之å‰ï¼Œé¦–å…ˆè¦æŠŠä»“åº“é‡Œçš„é¡¹ç›®æ–‡ä»¶ä¸‹è½½åˆ°æœ¬åœ°ã€‚ç”¨æˆ·åšçš„任何修改首先都是在本地进行,然åŽç”¨Â cvs 命令进行æäº¤ï¼Œç”±Â cvs 仓库管ç†å‘˜ç»Ÿä¸€Â ä¿®æ”¹ï¼Žè¿™æ ·å°±å¯ä»¥åšåˆ°è·Ÿè¸ªæ–‡ä»¶å˜åŒ–ï¼Œå†²çªæŽ§åˆ¶ç‰ç‰ï¼ŽÂ
由于 CVS 是典型的 C/SÂ ç»“æž„çš„è½¯ä»¶ï¼Œå› æ¤å®ƒä¹Ÿåˆ†æˆæœåŠ¡å™¨ç«¯å’Œå®¢æˆ·ç«¯ä¸¤éƒ¨åˆ†ã€‚ä¸è¿‡å¤§å¤šæ•°CVS 软件都把它们åˆäºŒä¸ºä¸€äº†ã€‚我们这里就分别从æœåŠ¡å™¨å’Œå®¢æˆ·ç«¯çš„è§’åº¦è®¨è®ºcvs的使用。Â
CvsæœåŠ¡å™¨å®‰è£…Â
首先确ä¿ç³»ç»Ÿå®‰è£…有cvs:Â
[root@mail xinetd.d]# rpm -qa|grep cvsÂ
cvs-1.11.1p1-3Â
如果命令输出类似于上é¢çš„输出则说明系统已ç»å®‰è£…有cvs,å¦åˆ™å°±éœ€è¦ä»Žå®‰è£…光盘ä¸å®‰è£…cvsçš„rpm包。Â
一 创建CVS属主用户:Â
# useradd -d /cvsroot cvsÂ
# chmod 771 /cv srootÂ
二ã€å»ºç«‹CVS仓库(åˆå§‹åŒ–cvs)Â
# su cvsÂ
$ cvs -d /cvsroot initÂ
$exitÂ
#Â
å››ã€å¯åЍcvsæœåС噍Â
在/etc/xinetd.d/目录下创建文件cvspserver,内容如下:Â
#Â default:Â onÂ
# description: The cvs server sessions;Â
service cvspserverÂ
{Â
socket_type = streamÂ
wait = noÂ
user = rootÂ
server = /usr/bin/cvsÂ
server_args = -f –allow-root=/cvsroot pserverÂ
log_on_failure += USERIDÂ
only_from = 192.168.0.0/24Â
}Â
å…¶ä¸only_from是用æ¥é™åˆ¶è®¿é—®çš„,å¯ä»¥æ ¹æ®å®žé™…情况ä¸è¦æˆ–者修改。Â
修改该文件æƒé™ï¼šÂ
# chmod 644 cvspserverÂ
ç„¶åŽé‡æ–°å¯åЍxinetd:Â
# /etc/rc.d/init.d/xined restartÂ
ç„¶åŽå¯Ÿçœ‹cvsæœåŠ¡å™¨æ˜¯å¦å·²ç»è¿è¡Œï¼šÂ
[root@mail xinetd.d]# netstat -lnp|grep 2401Â
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 7866/xinetdÂ
则说明cvsæœåС噍已ç»è¿è¡Œã€‚Â
五ã€åˆ›å»ºç”¨æ¥è®¿é—®cvs的用户Â
å‰é¢åˆ›å»ºçš„cvs用户是cvs仓库管ç†ç”¨æˆ·ï¼Œè€Œä¸ºäº†è®©ç”¨æˆ·è®¿é—®åˆ™è¿˜éœ€è¦ä¸€ä¸ªè®¿é—®ç”¨æˆ·ï¼šÂ
# useradd cvspubÂ
# usemod -G cvs cvspubÂ
è¿™é‡Œæ·»åŠ äº†ä¸€ä¸ªç”¨æˆ·cvspubï¼Œå¹¶ä¸”å°†è¯¥ç”¨æˆ·æ·»åŠ åˆ°cvs组ä¸ã€‚Â
å…ã€ç®¡ç†cvsæœåС噍Â
管ç†Â cvs æœåŠ¡å™¨ï¼ŽæœåС噍å¯ä»¥ç”¨äº†ï¼ŒçŽ°åœ¨å¤§å®¶æœ€å…³å¿ƒçš„å°±æ˜¯å¦‚ä½•ç®¡ç†æœåŠ¡å™¨ï¼Œæ¯”å¦‚ï¼Œæˆ‘æƒ³è®©ä¸€äº›äººæœ‰è¯»å’Œ/或写 CVS 仓库的æƒé™ï¼Œä½†æ˜¯ä¸æƒ³ç»™å®ƒç³»ç»Ÿæƒé™æ€Žä¹ˆåŠžå‘¢ï¼Ÿä¸éš¾ï¼Œcvsåˆå§‹åŒ–结æŸä»¥åŽï¼Œåœ¨ç®¡ç†å‘˜ç”¨æˆ·(这里是cvs用户)的主目录里有一个 CVSROOT 目录,这个目录里有三个é…置文件: passwd, readers, writers。我们å¯ä»¥é€šè¿‡è®¾ç½®è¿™ä¸‰ä¸ªæ–‡ä»¶æ¥é…置 CVS æœåŠ¡å™¨ï¼Œä¸‹é¢åˆ†åˆ«ä»‹ç»è¿™å‡ 个文件的作用:Â
passwd:cvsÂ ç”¨æˆ·çš„ç”¨æˆ·åˆ—è¡¨æ–‡ä»¶ï¼Œå®ƒçš„æ ¼å¼å¾ˆè±¡Â shadow 文件:Â
{cvs 用户å}:[åŠ å¯†çš„å£ä»¤]:[ç‰æ•ˆç³»ç»Ÿç”¨æˆ·å]Â
å¦‚æžœä½ å¸Œæœ›ä¸€ä¸ªç”¨æˆ·åªæ˜¯Â cvsÂ ç”¨æˆ·ï¼Œè€Œä¸æ˜¯ç³»ç»Ÿç”¨æˆ·ï¼Œé‚£ä¹ˆä½ å°±è¦è®¾ç½®è¿™ä¸ªæ–‡ä»¶ï¼Œåˆšåˆšå®‰è£…完之åŽè¿™ä¸ªæ–‡ä»¶å¯èƒ½ä¸å˜åœ¨ï¼Œä½ 需è¦ä»¥cvs管ç†å‘˜èº«ä»½(su cvs)ç”¨æˆ·æ‰‹å·¥åˆ›å»ºï¼Œå½“ç„¶è¦æŒ‰ç…§ä¸Šé¢æ ¼å¼ï¼›Â
ç¬¬äºŒä¸ªå—æ®µæ˜¯è¯¥ç”¨æˆ·çš„åŠ å¯†å£ä»¤ï¼Œå°±æ˜¯ç”¨Â crypt (3)Â åŠ å¯†çš„ï¼Œä½ å¯ä»¥è‡ªå·±å†™ä¸€ä¸ªç¨‹åºæ¥åšåŠ å¯†ï¼Œä¹Ÿå¯ä»¥ç”¨ä¸¤ä¸ªå·æ‡’的方法:先创建一个系统用户,åå—å’Œ  cvsÂ ç”¨æˆ·ä¸€æ ·ï¼Œå£ä»¤å°±æ˜¯å‡†å¤‡ç»™å®ƒçš„ cvs 用户å£ä»¤ï¼Œåˆ›å»ºå®Œä¹‹åŽä»ŽÂ /etc/shadowÂ æŠŠè¯¥ç”¨æˆ·ç¬¬äºŒä¸ªå—æ®µæ‹·è´è¿‡æ¥ï¼Œç„¶åŽÂ å†æŠŠè¿™ä¸ªç”¨æˆ·åˆ é™¤ï¼Žè¿™ä¸ªæ–¹æ³•å¯¹ä»˜æ•°é‡å°‘的用户比较方便,人一多就ä¸åˆé€‚äº†ï¼Œè€Œä¸”è¿˜æœ‰å†²çªæ¡ä»¶(race condition)çš„å®‰å…¨éšæ‚£ï¼Œè¿˜è¦Â root æƒé™ï¼Œå®žåœ¨ä¸æ€Žä¹ˆæ ·ï¼Œä¸è¿‡æƒç›Šä¹‹è®¡è€Œå·²ï¼›å¦å¤–一个方法就是利用apcheçš„htpasswd命令创建passwdç”¨æˆ·ï¼Œæ·»åŠ ç”¨æˆ·åªéœ€è¦ htpasswd passwd usernameå³å¯æ·»åŠ ç”¨æˆ·åˆ°passwd文件ä¸ï¼Œä¸è¿‡éœ€è¦åœ¨æ–‡ä»¶ä¸å¯¹åº”è¡Œçš„æœ€åŽæ·»åŠ ä¸€ä¸ª":"冒å·å’Œå¯¹åº”çš„ç‰æ•ˆç³»ç»Ÿç”¨æˆ·å;最好的就是自己编写一个程åºäº†æ¥ç”Ÿæˆè¿™ä¸ªpasswd文件了。Â
ç¬¬ä¸‰ä¸ªå—æ®µå°±æ˜¯ç‰æ•ˆç³»ç»Ÿç”¨æˆ·å,实际上就是赋与一个 cvsÂ ç”¨æˆ·ä¸€ä¸ªç‰æ•ˆçš„系统用户的æƒé™ï¼Œçœ‹ä¸‹é¢çš„例åä½ å°±æ˜Žç™½å®ƒçš„åŠŸèƒ½äº†ã€‚Â
readers:有 cvs 读æƒé™çš„用户列表文件,就是一个一维列表。在这个文件ä¸çš„用户对 cvsÂ
åªæœ‰è¯»æƒé™ã€‚Â
writers:有 cvs 写æƒé™çš„用户的列表文件,和 readersÂ ä¸€æ ·ï¼Œæ˜¯ä¸€ä¸ªä¸€ç»´åˆ—è¡¨ã€‚åœ¨è¿™ä¸ªæ–‡ä»¶ä¸çš„用户对 cvs 有写æƒé™ã€‚Â
上é¢ä¸‰ä¸ªæ–‡ä»¶åœ¨ç¼ºçœå®‰è£…的时候å¯èƒ½éƒ½ä¸å˜åœ¨ï¼Œéœ€è¦æˆ‘们自己创建,好å§ï¼ŒçŽ°åœ¨è¿˜æ˜¯è®©æˆ‘ä»¬ç”¨ä¸€ä¸ªä¾‹åæ¥æ•™å¦å§ï¼Žå‡è®¾æˆ‘们有下é¢å‡ 个用户需è¦ä½¿ç”¨Â cvs:Â
cvsuser1, cvsuser2, henry, betty, anonymousÂ
å…¶ä¸Â laser 和 gumpwu 是系统用户,而henry, betty, anonymousÂ æˆ‘ä»¬éƒ½ä¸æƒ³ç»™ç³»ç»Ÿç”¨æˆ·æƒé™ï¼Œå¹¶ä¸” betty 和 anonymous 都是åªè¯»ç”¨æˆ·ï¼Œè€Œä¸” anonymous 更是连å£ä»¤éƒ½æ²¡æœ‰ã€‚Â
ç„¶åŽç¼–辑 cvs 管ç†å‘˜å®¶ç›®å½•里 CVSROOT/passwdÂ æ–‡ä»¶ï¼ŒåŠ å…¥ä¸‹é¢å‡ 行:Â
laser:$xxefajfka;faffa33:cvspubÂ
gumpwu:$ajfaal;323r0ofeeanv:cvspubÂ
henry:$fajkdpaieje:cvspubÂ
betty:fjkal;ffjieinfn/:cvspubÂ
anonymous::cvspubÂ
注æ„:上é¢çš„ç¬¬äºŒä¸ªå—æ®µï¼ˆåˆ†éš”符为 :)是密文å£ä»¤ï¼Œä½ è¦ç”¨ç¨‹åºæˆ–者用我的土办法生æˆã€‚Â
编辑 readersÂ æ–‡ä»¶ï¼ŒåŠ å…¥ä¸‹é¢å‡ 行:Â
anonymousÂ
bettyÂ
编辑 writerÂ æ–‡ä»¶ï¼ŒåŠ å…¥ä¸‹é¢å‡ 行:Â
laserÂ
gumpwuÂ
henryÂ
è¿™æ ·å°±Â okÂ äº†ï¼Œä½ å†ç”¨å‡ 个用户分别登陆测试,就会å‘现一切都 ok 了。这里é¢çš„原ç†å’Œè¯´æ˜Žæˆ‘想就ä¸å¤šè¯´äº†ï¼Œå…¶å®žå¾ˆç®€å•,和系统管ç†ç”¨æˆ·çš„æ¦‚å¿µæ˜¯ä¸€æ ·çš„ã€‚Â
七ã€å»ºç«‹æ–°çš„CVS项目Â
ä¸€èˆ¬æˆ‘ä»¬éƒ½å·²ç»æœ‰ä¸€ä¸ªæˆ–å¤šä¸ªé¡¹ç›®äº†ï¼Œè¿™æ ·æˆ‘ä»¬å¯ä»¥ç”¨ä¸‹é¢æ¥éª¤ç”Ÿæˆä¸€ä¸ªæ–°çš„CVS项目。Â
将一个工程文件置于CVsä¸è¿›è¡Œç‰ˆæœ¬æŽ§åˆ¶ï¼Œåœ¨CVS 术è¯ä¸ç§°ä½œå¯¼å…¥(import)。从åå—上就å¯ä»¥çœ‹å‡ºï¼Œåœ¨å¯¼å…¥å‰éœ€è¦ä¸ºæ¤ä½œäº›å‡†å¤‡å·¥ä½œã€‚Â
输入æ“ä½œçš„åŸºæœ¬è¦æ±‚是有个"干净"的目录结构。"干净"çš„æ„æ€æ˜¯ä¸éœ€è¦ç‰ˆæœ¬æŽ§åˆ¶çš„æ–‡ä»¶éƒ½è¢«ç§»èµ°äº†ï¼ˆå¦‚编译生æˆçš„æ–‡ä»¶ï¼Œå¤‡ä»½æ–‡ä»¶ç‰ç‰ï¼‰ã€‚如果工程已ç»å¼€å§‹ä¸€æ®µæ—¶é—´äº†ï¼Œè¿™å°±æ˜¾å¾—很é‡è¦ã€‚在目录ä¸ä¹Ÿè®¸æœ‰äº›æ˜¯ä¸æ‰“ç®—å°†å…¶ç½®äºŽç‰ˆæœ¬æŽ§åˆ¶ä¸‹çš„æ–‡ä»¶ï¼Œä½†æ˜¯åˆæƒ³å°†ä»–ä»¬æ”¾åœ¨è¿™é‡Œï¼Œè¿™ç§æƒ…å†µä¸‹ï¼Œä½ è¦åœ¨è¾“入之å‰å°†å®ƒä»¬ç§»èµ°ï¼Œç„¶åŽå†ç§»å›žæ¥ã€‚Â
注æ„的是CVS 认为空目录是ä¸å˜åœ¨çš„ã€‚å¦‚æžœæƒ³å¢žåŠ ä¸€ä¸ªæ—¢ä¸åŒ…嫿–‡ä»¶åˆä¸åŒ…å«å目录的目录,需è¦åœ¨å…¶ä¸‹åˆ›å»ºä¸€ä¸ªå“‘æ–‡ä»¶ã€‚å»ºè®®ä½ åˆ›å»ºä¸€ä¸ªå为 README.txt 的文件,其内容为对目录的简è¦è¯´æ˜Žã€‚Â
进入到已有项目的目录,比如å«Â cvstest:Â
$cd cvstestÂ
è¿è¡Œå‘½ä»¤å°†é¡¹ç›®æ–‡ä»¶å¯¼å…¥åˆ°cvs仓库ä¸ï¼šÂ
$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仓库了,然åŽï¼Œæˆ‘们å¯ä»¥æŠŠè¿™ä¸ªæµ‹è¯•é¡¹ç›®çš„æ–‡ä»¶åˆ é™¤ï¼Œè¯•éªŒå¦‚ä½•ä»Žä»“åº“èŽ·å–æ–‡ä»¶è¿™ä¼šåœ¨åŽé¢çš„å®¢æˆ·ç«¯æ–‡ç« è¿›è¡Œè¯´æ˜Žã€‚Â