CVS Quick Start
update
04/20/08 21:22 by manio
04/20/08 16:17 by manio
CVS是一个开源的软件开发版本控制软件
QUOTE:
CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管理.如果大家曾经参与过多人协作开发的项目,大家肯定有这样的痛苦经历:由于多个人同时修改同一个文件, 自己辛辛苦苦修改的程序被别人彻底删除了.另外,如果你的软件/程序已经发布了三个版本, 而这时候用户需要你修改第二个版本的东西,也许你会因为只保留了最新版本而痛哭流涕。还有就是你对程序做了一些修改,但是修改很少,你只想给远方的同事发一个两个版本之间的差别文件,这样可以免于邮箱不够大,网速太慢之类的问题.为了解决类似这样的问题,以及诸如生成补丁文件,历史版本修改等,一帮黑客(褒义)在原先 Unix 体系里很成熟的 SCCS 和 RCS 的基础上,开发了 CVS。(SCCS:Source Code Control System,RCS:Revision Control System)。 |
它的工作模式如下:
开始时将一个本地的工程import(类似于上传)到服务器,多个人协同编程时,每个人check out(类似于下载)一人工作版本到本地,在本地修改,改好之后,再commit(提交最新版本)到服务器.
也可以用CVS来管理一些未整合的单独的模块开发.
Tutorial:
1. 安装CVS
2. 安装gcvs(GUI版CVS客户端)—这东西暂时不用
3. 配置CVS
4. 初始CVS工作目录
5. import一个项目(将一个项目导出到服务器)
6. checkout (下载版本文件)
7. 代码写好了?那么快?
8. 增加文件
9. 删除文件
10. 更新文件
如果CVS已经配置好或在远程使用CVS,可以直接从第6步开始
1. 安装CVS
服务器和客户端都要这样安装
WINDOWS下同样可以使用,到http://www.cvsnt.org/下载WINDOWS版CVS
sudo apt-get install cvs |
2. 安装gcvs(GUI版CVS客户端)—这东西暂时不用
sudo apt-get install gcvs |
3. 配置CVS与登陆
编辑cvsd的配置文件,配置RootJail
RootJail是指CVS根目录,CVS中用到的目录都是相对于RootJail的相对路径
#sudo vim /etc/cvsd/cvsd.conf |
缺省的应该是:
RootJail /var/lib/cvsd
Repos /myrepos
改成
RootJail /home/manio
Repos cvsroot
注意此处的Repos的路径也是相对于RootJail的。
配置CVS工作目录
sudo vim ~/.profile |
如果是在本地使用在文件中加入
CVSROOT=~/cvsroot #也可以是其他目录名,最好是自己用户文件夹下 |
记住,不要自己进入此目录下修改文件,这会搞乱CVS配置
如果是远程使用,则在文件中加入
CVSROOT=:pserver:manio@10.62.78.159:/cvsroot #也可以是其他目录名,最好是自己用户文件夹下 |
pserver是CVS集成的一种SERVER的模式
manio是这个代码仓库下的一个用户名
10.62.78.159是远程服务器的IP
cvsroot是相对于RootJail的相对路径名(RootJail在服务器上设置)
此后,
logout login echo $CVSROOT |
可以看到输出/home/manio/cvsroot
如果是在远程登陆,则要以下命令登陆(如果是本地则不用,包括telnet)
cvs login |
4. 初始CVS工作目录
cvs init |
之后可以看到/home/manio/cvsroot目录下多了一个CVSROOT目录,里面有一些配置文件.
5. import一个项目(将一个项目导出到服务器)
比如我在/home/manio/manioTinyProgram上有一个工程的代码,使用下面的命令把他导出到服务器上,这样以后就可以从这个版本使用CVS做后面的软件工程的管理.
cvs import -m "here is any message to mark this project" manioTinyProgram vendortag releasetag |
-m指定一些这个版本的备忘信息
myproject是给这个项目在CVS中起的名字
vendortag是产家的标签,如MANIO
releasetag是发行版本标签,如version1
这之后就可以在/home/manio/cvsroot下看到原来是在/home/manio/manioTinyProgram里的文件了
现在,项目就已经交给CVS去管理了.
6. checkout (下载版本文件)
现在要从服务器上的版本开始,在此基础上编写新的代码!
开始前先在本地任意自己舒服的地方建一个文件夹,用于存放这次的工作版本
如:
mkdir /home/manio/tmp |
然后
cd /home/manio/tmp cvs checkout manioTinyProgram |
这时, manioTinyProgram是刚才在第5步里使用的项目名称
此后,就可以在tmp文件夹下看到manioTinyProgram文件夹,里面就是之前传到服务器上的那些文件,只是多出来一个文件夹CVS,里面是一些配置文件.
此时,就可以在这个文件夹下写代码...调试...WHATEVER YOU WANT EVEN......
7. 代码写好了?那么快?
代码写好了之后,本地也调试好没问题了,就可以commit到服务器了.就算是错误的版本,你也可以提交试试,不用怕,CVS能找回以前对的版本.这就是为什么使用CVS的原因.
cd /home/manio/tmp/manioTinyProgram cvs commit –m “Manio changed file 00Readme.txt” |
运行后会看到
cvs commit: Examining . cvs commit: Examining batRenameShell cvs commit: Examining creatFlatHmm cvs commit: Examining fromserver cvs commit: Examining include cvs commit: Examining lineSorter cvs commit: Examining taghandler cvs commit: Examining wordcounter /home/manio/cvsroot/myproject/00Readme.txt,v <-- 00Readme.txt new revision: 1.2; previous revision: 1.1 |
CVS帮我们把版本号做了修改.提示ooReadme.txt做了修改
8. 增加文件
比如现在,我做好了一个小模块(包含文件manioModule.c manioModule.h),要加入我们的大工程里面
将文件放到工作版本的合适目录下
cp manioModule.c manioModule.h /home/manio/tmp/manioTinyProgram cd /home/manio/tmp/manioTinyProgram |
使用
cvs add manioModule.c manioModule.h |
告诉本地CVS我增加了这两个文件
使用
cvs commit -m "manio add two file:manioModule.c manioModule.h" manioModule.c manioModule.h |
系统会输出:
/home/manio/cvsroot/manioTinyProgram/manioModule.c,v <-- manioModule.c initial revision: 1.1 /home/manio/cvsroot/manioTinyProgram/manioModule.h,v <-- manioModule.h initial revision: 1.1 |
9. 删除文件
刚才加上去文件不想要了,使用下面的命令
rm manioModule.h cvs remove manioModule.h |
系统输出:
cvs remove: scheduling `manioModule.h' for removal cvs remove: use `cvs commit' to remove this file permanently |
这时已经告诉本地CVS我已经删除了这个文件
使用下面的命令把本地的修改提交给远程服务器
manio@manio-desktop:~/tmp/manioTinyProgram$ cvs commit -m "manio deleted manioModule.h" manioModule.h |
系统输出提示信息
/home/manio/cvsroot/manioTinyProgram/manioModule.h,v <-- manioModule.h new revision: delete; previous revision: 1.1 |
上面提示了对远程服务器的更改
10. 更新文件
这里使用的命令为update,它将比较指定的在CVS源码库中的文件和当前目录下的文件,如果CVS源码库中有更高版本的源文件,则更新当前目录下的文件。
如果其他人在服务器上更新了文件,可以使用此命令来更新本地工作目录中的内容
cvs update filename |
Digest
l 增加用户:
#sudo cvsd-passwd /var/lib/cvsd/myrepos cvsusername |
/var/lib/cvsd/myrepos是服务器设定的代码仓库的路径,此命令给且只给此仓库增加一个名为cvsusername的用户.
l 设置目录权限。
#sudo chown cvsd:cvsd /var/lib/cvsd -R |
l 重新启动cvsd。
#sudo /etc/init.d/cvsd restart |
登陆windows的CVS服务器
manio@manio-desktop:~$ cvs -d :pserver:manio@10.62.78.108:/ForXP/KHRoot login manio@manio-desktop:~/manioTinyProgram$ cvs -d :pserver:manio@10.62.78.108:/ForXP/KHRoot import -m "testwincvsnt" manioTiny1 manio version |
查看状态
cvs status filename
状态报告,类似这样:
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: 表明你曾经修改该文件,但是偏偏有个不识相的也修改了这个文件,而且还提交了!
[编辑]
cvs log file_name
正确的通过CVS恢复旧版本的方法:
如果用cvs update -r1.2 file.name
这个命令是给file.name加一个STICK TAG: "1.2" ,虽然你的本意只是想将它恢复到1.2版本
正确的恢复版本的方法是:cvs update -p -r1.2 file_name >file_name
如果不小心已经加成STICK TAG的话:用cvs update -A 解决
尽信书则不如无书,还是得自己摸索啊。摸了好几天,感觉网上的帖子都是国画,写意为主,仔细品位,还是一头雾水,所以写一个详细一点的吧。很佩服国外的一些帖子,即使是发问,也会写清楚:我参考了哪些网站,如何操作的,出现什么问题~~扯远了。 |
开始一个新的里程碑
cvs commit -r 2
标记所有文件开始进入2.x的开发
注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。
修改文件名
移动文件:文件重命名
cvs里没有cvs move或cvs rename,因为这两个操作是先cvs remove old_file_name,然后cvs add
new_file_name实现的。
[编辑]
如果在你checkout后,有人添加了新的文件或目录,你需要把他们取出来
cvs update -d
[编辑]
如果修改来了本地文件,不想提交,想重新取新文件
cvs update -C filename
它会先把你的本地文件改名
建议:建议大家把checkout的文件缺省为readonly,把"cvs -r"添加到~/.cvsrc文件中
这样,你每次修改一个文件前,先cvs edit filename,提交后文件又变成readonly,
如果你想放弃本地的修改,则cvs unedit filename,它会undo,而且文件又变成readonly
恢复到旧版本
cvs update -j1.20 -j1.15 filenames
1.20时当前版本号,注意顺序不要反了,记住要commit,为了保证是但前版本号,最好先lock
注意:cvs update -r1.15 file.name,这里的-r不是版本号的意思,是给文件加了一个叫1.15的sticky tag
如果不小心已经加成STICK TAG的话:用cvs update -A 解决
更多信息请参考
用CVS来管理自己的程序http://www.uml.org.cn/pzgl/pzgl26.htm(本文主要出自此处,是此文的精简版,原文中有一些错误)
http://fedora.gro.clinux.org/docs/documentation-guide-zh_CN/ch-cvs.html
CVS使用手册http://www.chedong.com/tech/cvs_card.html
当然,CVS不止这样简单的功能,它还是使软件开发出现分支,下面是一个例子:
我们为湖大开发一个软件,当我们做到1.0版时,湖大拿去正式使用了,而我们还在做2.0,3.0……但是,当我们做到3.0时,湖大跟我们讲1.0版有一个BUG.这时,不能把3.0版给湖大用,因为这个版本在实际安装过程中可能什么出现更多的问题,这些问题的解决要大量时间.最好的方法是给1.0版本做一个patch,这里,1.0版就出现了一个分支,可能对1.0版做N个patch….
相关网站:
http://directory.google.com/Top/Computers/Software/Configuration_Management/Tools/Concurrent_Versions_System/
CVS--并行版本系统
http://www.soforge.com/cvsdoc/zh_CN/book1.html
CVS 免费书:
http://cvsbook.red-bean.com/
CVS命令的速查卡片 refcards.com/refcards/cvs/
WinCVS:
http://cvsgui.sourceforge.net/
CVSTrac: A Web-Based Bug And Patch-Set Tracking System For CVS
http://www.cvstrac.org
StatCVS:基于CVS的代码统计工具:按代码量,按开发者的统计表等
http://sourceforge.net/projects/statcvs
如何在WEB开发中规划CVS上:在Google上查 "cvs web development"
http://ccm.redhat.com/bboard-archive/cvs_for_web_development/index.html
一些集成了CVS的IDE环境:
Eclipse
Magic C++