2004年09月23日

CVS使用手册

作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com

写于:2002/07/10 最后更新: 09/02/2004 16:00:58 Feed Back >> 
Creative Commons License

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/cvs_card.html

关键词:CVS CVSWeb CVSTrac WinCVS CVSROOT

内容摘要:

CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。工作模式如下:

 CVS服务器(文件版本库) / | \ (版 本 同 步) / | \开发者1 开发者2 开发者3

作为一般开发人员挑选2,6看就可以了,CVS的管理员则更需要懂的更多一些,最后还简单介绍了一些Windows下的cvs客户端使用,CVS远程用户认证的选择及与BUG跟踪系统等开发环境的集成问题。

  1. CVS环境初始化:CVS环境的搭建 管理员
  2. CVS的日常使用:日常开发中最常用的CVS命令, 开发人员 管理员
  3. CVS的分支开发:项目按照不同进度和目标并发进行 管理员
  4. CVS的用户认证:通过SSH的远程用户认证,安全,简单 管理员
  5. CVSWEB:CVS的WEB访问界面大大提高代码版本比较的效率 管理员
  6. CVS TAG:将$Id$ 加入代码注释中,方便开发过程的跟踪开发人员
  7. CVS vs VSS: CVS和Virsual SourceSafe的比较 开发人员 管理员
  8. WinCVS: 通过SSH认证的WinCVS认证设置
  9. 基于CVSTrac的小组开发环境搭建:通过CVSTrac实现web界面的CVS用户管理,集成的BUG跟踪和WIKI交流
  10. CVS中的用户权限管理:基于系统用户的CVS权限管理和基于CVSROOT/passwd的虚拟用户管理

一个系统20%的功能往往能够满足80%的需求,CVS也不例外,以下是CVS最常用的功能,可能还不到它全部命令选项的20%,作为一般开发人员平时会用cvs update和cvs commit就够了,更多的需求在实际应用过程中自然会出现,不时回头看看相关文档经常有意外的收获。

CVS环境初始化

环境设置:指定CVS库的路径CVSROOT

tcsh
setenv CVSROOT /path/to/cvsroot
bash
CVSROOT=/path/to/cvsroot ; export CVSROOT

后面还提到远程CVS服务器的设置:
CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH

初始化:CVS版本库的初始化。
cvs init

一个项目的首次导入
cvs import -m “write some comments here” project_name vendor_tag release_tag
执行后:会将所有源文件及目录导入到/path/to/cvsroot/project_name目录下
vender_tag: 开发商标记
release_tag: 版本发布标记

项目导出:将代码从CVS库里导出
cvs checkout project_name
cvs 将创建project_name目录,并将最新版本的源代码导出到相应目录中。这个checkout和Virvual SourceSafe中的check out不是一个概念,相对于Virvual SourceSafe的check out是cvs update, check in是cvs commit。

CVS的日常使用

注意:第一次导出以后,就不是通过cvs checkout来同步文件了,而是要进入刚才cvs checkout project_name导出的project_name目录下进行具体文件的版本同步(添加,修改,删除)操作。

将文件同步到最新的版本
cvs update
不制定文件名,cvs将同步所有子目录下的文件,也可以制定某个文件名/目录进行同步
cvs update file_name
最好每天开始工作前或将自己的工作导入到CVS库里前都要做一次,并养成“先同步 后修改”的习惯,和Virvual SourceSafe不同,CVS里没有文件锁定的概念,所有的冲突是在commit之前解决,如果你修改过程中,有其他人修改并commit到了CVS 库中,CVS会通知你文件冲突,并自动将冲突部分用
>>>>>>
content on cvs server
<<<<<<
content in your file
>>>>>>
标记出来,由你确认冲突内容的取舍。
版本冲突一般是在多个人修改一个文件造成的,但这种项目管理上的问题不应该指望由CVS来解决。

确认修改写入到CVS库里
cvs commit -m “write some comments here” file_name

注意:CVS的很多动作都是通过cvs commit进行最后确认并修改的,最好每次只修改一个文件。在确认的前,还需要用户填写修改注释,以帮助其他开发人员了解修改的原因。如果不用写-m “comments”而直接确认`cvs commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。
注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解
不好的注释,很难让其他的开发人员快速的理解:比如: -m “bug fixed” 甚至 -m “”
好的注释,甚至可以用中文: -m “在用户注册过程中加入了Email地址校验”

修改某个版本注释:每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:
cvs admin -m 1.3:”write some comments here” file_name

添加文件
创建好新文件后,比如:touch new_file
cvs add new_file
注意:对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项按2进制文件方式导入(k表示扩展选项,b表示binary),否则有可能出现文件被破坏的情况
比如:
cvs add -kb new_file.gif
cvs add -kb readme.doc

如果关键词替换属性在首次导入时设置错了怎么办?
cvs admin -kkv new_file.css

然后确认修改并注释
cvs ci -m “write some comments here”

删除文件
将某个源文件物理删除后,比如:rm file_name
cvs rm file_name
然后确认修改并注释
cvs ci -m “write some comments here”
以上面前2步合并的方法为:
cvs rm -f file_name
cvs ci -m “why delete file”
注意:很多cvs命令都有缩写形式:commit=>ci; update=>up; checkout=>co/get; remove=>rm;

添加目录
cvs add dir_name

查看修改历史
cvs log file_name
cvs history file_name

查看当前文件不同版本的区别
cvs diff -r1.3 -r1.5 file_name
查看当前文件(可能已经修改了)和库中相应文件的区别
cvs diff file_name
cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法,具体安装设置请看后面的cvsweb使用

正确的通过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里没有cvs move或cvs rename,因为这两个操作是可以由先cvs remove old_file_name,然后cvs add new_file_name实现的。

删除/移动目录
最方便的方法是让管理员直接移动,删除CVSROOT里相应目录(因为CVS一个项目下的子目录都是独立的,移动到$CVSROOT目录下都可以作为新的独立项目:好比一颗树,其实砍下任意一枝都能独立存活),对目录进行了修改后,要求其开发人员重新导出项目cvs checkout project_name 或者用cvs update -dP同步。

项目发布导出不带CVS目录的源文件
做开发的时候你可能注意到了,每个开发目录下,CVS都创建了一个CVS/目录。里面有文件用于记录当前目录和CVS库之间的对应信息。但项目发布的时候你一般不希望把文件目录还带着含有CVS信息的CVS目录吧,这个一次性的导出过程使用cvs export命令,不过export只能针对一个TAG或者日期导出,比如:
cvs export -r release1 project_name
cvs export -D 20021023 project_name
cvs export -D now project_name

CVS Branch:项目多分支同步开发

确认版本里程碑:多个文件各自版本号不一样,项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,方便以后按照这个阶段里程碑版本号导出项目,同时也是项目的多个分支开发的基础。

cvs tag release_1_0

开始一个新的里程碑
cvs commit -r 2 标记所有文件开始进入2.x的开发

注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。

版本分支的建立
在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支 release_1_0_patch
cvs rtag -b -r release_1_0 release_1_0_patch proj_dir

一些人先在另外一个目录下导出release_1_0_patch这个分支:解决1.0中的紧急问题,
cvs checkout -r release_1_0_patch
而其他人员仍旧在项目的主干分支2.x上开发

在release_1_0_patch上修正错误后,标记一个1.0的错误修正版本号
cvs tag release_1_0_patch_1

如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中:
cvs update -j release_1_0_patch_1

CVS的远程认证通过SSH远程访问CVS

使用cvs本身基于pserver的远程认证很麻烦,需要定义服务器和用户组,用户名,设置密码等,

常见的登陆格式如下:
cvs -d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot login
例子:
cvs -d :pserver:cvs@samba.org:/cvsroot login

不是很安全,因此一般是作为匿名只读CVS访问的方式。从安全考虑,通过系统本地帐号认证并通过SSH传输是比较好的办法,通过在客户机的 /etc/profile里设置一下内容:
CVSROOT=:ext:$USER@cvs.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSH
所有客户机所有本地用户都可以映射到CVS服务器相应同名帐号了。

比如:

CVS服务器是192.168.0.3,上面CVSROOT路径是/home/cvsroot,另外一台开发客户机是192.168.0.4,如果 tom在2台机器上都有同名的帐号,那么从192.168.0.4上设置了:
export CVSROOT=:ext:tom@192.168.0.3:/home/cvsroot
export CVS_RSH=ssh
tom就可以直接在192.168.0.4上对192.168.0.3的cvsroot进行访问了(如果有权限的话)
cvs checkout project_name
cd project_name
cvs update

cvs commit

如果CVS所在服务器的SSH端口不在缺省的22,或者和客户端与CVS服务器端SSH缺省端口不一致,有时候设置了:
:ext:$USER@test.server.address#port:/path/to/cvsroot

仍然不行,比如有以下错误信息:
ssh: test.server.address#port: Name or service not known
cvs [checkout aborted]: end of file from server (consult above messages if any)

解决的方法是做一个脚本指定端口转向(不能使用alias,会出找不到文件错误):
创建一个/usr/bin/ssh_cvs文件,假设远程服务器的SSH端口是非缺省端口:34567
#!/bin/sh
/usr/bin/ssh -p 34567 “$@”
然后:chmod +x /usr/bin/ssh_cvs
并CVS_RSH=ssh_cvs; export CVS_RSH

注意:port是指相应服务器SSH的端口,不是指cvs专用的pserver的端口

CVSWEB:提高文件浏览效率

CVSWEB就是CVS的WEB界面,可以大大提高程序员定位修改的效率:

使用的样例可以看:http://www.freebsd.org/cgi/cvsweb.cgi

CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,这个是我个人感觉安装设置比较方便的:
原先在:http://www.spaghetti-code.de/software/linux/cvsweb/,但目前已经删除,目前仍可以在本站下载CVSWEB,其实最近2年FreeBSD的CVSWeb项目已经有了更好的发展吧,而当初没有用FreeBSD那个版本主要就是因为没有彩色的文件Diff功能。
下载解包:
tar zxf cvsweb.tgz
把配置文件cvsweb.conf放到安全的地方(比如和apache的配置放在同一个目录下),
修改:cvsweb.cgi让CGI找到配置文件:
$config = $ENV{‘CVSWEB_CONFIG’} || ‘/path/to/apache/conf/cvsweb.conf’;

转到/path/to/apache/conf下并修改cvsweb.conf:

  1. 修改CVSROOT路径设置:
    %CVSROOT = (
    ‘Development’ => ‘/path/to/cvsroot’, #<==修改指向本地的CVSROOT
    );
  2. 缺省不显示已经删除的文档:
    “hideattic” => “1″,#<==缺省不显示已经删除的文档
  3. 在配置文件cvsweb.conf中还可以定制页头的描述信息,你可以修改$long_intro成你需要的文字

CVSWEB可不能随便开放给所有用户,因此需要使用WEB用户认证:
先生成 passwd:
/path/to/apache/bin/htpasswd -c cvsweb.passwd user

修改httpd.conf: 增加
<Directory “/path/to/apache/cgi-bin/cvsweb/”>
AuthName “CVS Authorization”
AuthType Basic
AuthUserFile /path/to/cvsweb.passwd
require valid-user
</Directory>

CVS TAGS: $Id: cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $

将$Id: cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $ 加在程序文件开头的注释里是一个很好的习惯,cvs能够自动解释更新其中的内容成:file_name version time user_name 的格式,比如:cvs_card.txt,v 1.1 2002/04/05 04:24:12 chedong Exp,可以这些信息了解文件的最后修改人和修改时间

几个常用的缺省文件:default.php<?php/* * Copyright (c) 2002 Company Name. * $Header: /home/cvsroot/tech/cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $ */

?>====================================Default.java: 注意文件头一般注释用 /* 开始 JAVADOC注释用 /** 开始的区别/* * Copyright (c) 2002 MyCompany Name. * $Header: /home/cvsroot/tech/cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $ */

package com.mycompany;

import java.;

/** * comments here */public class Default { /** * Comments here * @param * @return */ public toString() {

 }}====================================default.pl:#!/usr/bin/perl -w# Copyright (c) 2002 Company Name.# $Header: /home/cvsroot/tech/cvs_card.html,v 1.9 2003/11/09 07:57:11 chedong Exp $

# file comments here

use strict;

CVS vs VSS

CVS没有文件锁定模式,VSS在check out同时,同时记录了文件被导出者锁定。

CVS的update和commit, VSS是get_lastest_version和check in

对应VSS的check out/undo check out的CVS里是edit和unedit

在CVS中,标记自动更新功能缺省是打开的,这样也带来一个潜在的问题,就是不用-kb方式添加binary文件的话在cvs自动更新时可能会导致文件失效。

$Header: /home/cvsroot/tech/cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $ $Date: 2003/11/09 07:57:11 $这样的标记在Virsual SourceSafe中称之为Keyword Explaination,缺省是关闭的,需要通过OPITION打开,并指定需要进行源文件关键词扫描的文件类型:*.txt,*.java, *.html…

对于Virsual SourceSafe和CVS都通用的TAG有:
$Header: /home/cvsroot/tech/cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $
$Author: chedong $
$Date: 2003/11/09 07:57:11 $
$Revision: 1.9 $

我建议尽量使用通用的关键词保证代码在CVS和VSS都能方便的跟踪。

WinCVS

下载:

cvs Windows客户端:目前稳定版本为1.2
http://cvsgui.sourceforge.net
ssh Windows客户端
http://www.networksimplicity.com/openssh/

安装好以上2个软件以后:
WinCVS客户端的admin==>preference设置
1 在general选单里
设置CVSROOT: username@192.168.0.123:/home/cvsroot
设置Authorization: 选择SSH server

2 Port选单里
钩上:check for alternate rsh name
并设置ssh.exe的路径,缺省是装在 C:\Program Files\NetworkSimplicity\ssh\ssh.exe

然后就可以使用WinCVS进行cvs操作了,所有操作都会跳出命令行窗口要求你输入服务器端的认证密码。

当然,如果你觉得这样很烦的话,还有一个办法就是生成一个没有密码的公钥/私钥对,并设置CVS使用基于公钥/私钥的SSH认证(在general 选单里)。

可以选择的diff工具:examdiff
下载:
http://www.prestosoft.com/examdiff/examdiff.htm
还是在WinCVS菜单admin==>preference的WinCVS选单里
选上:Externel diff program
并设置diff工具的路径,比如:C:\Program Files\ed16i\ExamDiff.exe
在对文件进行版本diff时,第一次需要将窗口右下角的use externel diff选上。

基于CVSTrac的小组开发环境搭建

作为一个小组级的开发环境,版本控制系统和BUG跟踪系统等都涉及到用户认证部分。如何方便的将这些系统集成起来是一个非常困难的事情,毕竟我们不能指望 Linux下有像Source Offsite那样集成度很高的版本控制/BUG跟踪集成系统。

我个人是很反对使用pserver模式的远程用户认证的,但如果大部分组员使用WINDOWS客户端进行开发的话,总体来说使用 CVSROOT/passwd认证还是很难避免的,但CVS本身用户的管理比较麻烦。本来我打算自己用perl写一个管理界面的,直到我发现了 CVSTrac:一个基于WEB界面的BUG跟踪系统,它外挂在CVS系统上的BUG跟踪系统,其中就包括了WEB界面的CVSROOT/passwd文件的管理,甚至还集成了WIKIWIKI讨论组功能。

这里首先说一下CVS的pserver模式下的用户认证,CVS的用户认证服务是基于inetd中的:
cvspserver stream tcp nowait apache /usr/bin/cvs cvs –allow-root=/home/cvsroot pserver
一般在2401端口(这个端口号很好记:49的平方)

CVS用户数据库是基于CVSROOT/passwd文件,文件格式:
[username]:[crypt_password]:[mapping_system_user]
由于密码都用的是UNIX标准的CRYPT加密,这个passwd文件的格式基本上是apache的htpasswd格式的扩展(比APACHE的 PASSWD文件多一个系统用户映射字段),所以这个文件最简单的方法可以用
apache/bin/htpasswd -b myname mypassword
创建。注意:通过htpasswd创建出来的文件会没有映射系统用户的字段
例如:
new:geBvosup/zKl2
setup:aISQuNAAoY3qw
test:hwEpz/BX.rEDU

映射系统用户的目的在于:你可以创建一个专门的CVS服务帐号,比如用apache的运行用户apache,并将/home/cvsroot目录下的所有权限赋予这个用户,然后在passwd文件里创建不同的开发用户帐号,但开发用户帐号最后的文件读写权限都映射为apache用户,在SSH模式下多个系统开发用户需要在同一个组中才可以相互读写CVS库中的文件。

进一步的,你可以将用户分别映射到apache这个系统用户上。
new:geBvosup/zKl2:apache
setup:aISQuNAAoY3qw:apache
test:hwEpz/BX.rEDU:apache

CVSTrac很好的解决了CVSROOT/passwd的管理问题,而且包含了BUG跟踪报告系统和集成WIKIWIKI交流功能等,使用的 CGI方式的安装,并且基于GNU Public License

在inetd里加入cvspserver服务:
cvspserver stream tcp nowait apache /usr/bin/cvs cvs –allow-root=/home/cvsroot pserver

xietd的配置文件:%cat cvspserver
service cvspserver
{
disable = no
socket_type = stream
wait = no
user = apache
server = /usr/bin/cvs
server_args = -f –allow-root=/home/cvsroot pserver
log_on_failure += USERID
}

注意:这里的用户设置成apache目的是和/home/cvsroot的所有用户一致,并且必须让这个这个用户对/home/cvsroot/下的 CVSROOT/passwd和cvstrac初始化生成的myproj.db有读取权限。

安装过程

  1. 下载:可以从http://www.cvstrac.org 下载
    我用的是已经在Linux上编译好的应用程序包:cvstrac-1.1.2.bin.gz,
    %gzip -d cvstrac-1.1.2.bin.gz
    %chmod +x cvstrac-1.1.2.bin
    #mv cvstarc-1.1.1.bin /usr/bin/cvstrac
    如果是从源代码编译:
    从 http://www.sqlite.org/download.html 下载SQLITE的rpm包:
    rpm -i sqlite-devel-2.8.6-1.i386.rpm
    从 ftp://ftp.cvstrac.org/cvstrac/ 下载软件包
    解包,假设解包到/home/chedong/cvstrac-1.1.2下,并规划将cvstrac安装到/usr/local/bin目录下, cd /home/chedong/cvstrac-1.1.2 编辑linux-gcc.mk:
    修改:
    SRCDIR = /home/chedong/cvstrac-1.1.2
    INSTALLDIR = /usr/local/bin
    然后
    mv linux-gcc.mk Makefile
    make
    #make install

  2. 初始化cvstrac数据库:假设数据库名是 myproj
    在已经装好的CVS服务器上(CVS库这时候应该已经是初始化好了,比如:cvs init初始化在/home/cvsroot里),运行一下
    %cvstrac init /home/cvsroot myproj
    运行后,/home/cvsroot里会有一个的myproj.db库,使用CVSTRAC服务,/home/cvsroot/myproj.db /home/cvsroot/CVSROOT/readers /home/cvsroot/CVSROOT/writers /home/cvsroot/CVSROOT/passwd这几个文件对于web服务的运行用户应该是可写的,在RedHat8上,缺省就有一个叫 apache用户和一个apache组,所以在httpd.conf文件中设置了用apache用户运行web服务:
    User apache
    Group apache,
    然后设置属于apache用户和apache组
    #chown -R apache:apache /home/cvsroot
    -rw-r–r– 1 apache apache 55296 Jan 5 19:40 myproj.db
    drwxrwxr-x 3 apache apache 4096 Oct 24 13:04 CVSROOT/
    drwxrwxr-x 2 apache apache 4096 Aug 30 19:47 some_proj/
    此外还在/home/cvsroot/CVSROOT中设置了:
    chmod 664 readers writers passwd
  3. 在apche/cgi-bin目录中创建脚本cvstrac:
    #!/bin/sh
    /usr/bin/cvstrac cgi /home/cvsroot
    设置脚本可执行:
    chmod +x /home/apache/cgi-bin/cvstrac
  4. 从 http://cvs.server.address/cgi-bin/cvstrac/myproj 进入管理界面
    缺省登录名:setup 密码 setup
    对于一般用户可以从:
    http://cvs.server.address/cgi-bin/cvstrac/myproj
  5. 在setup中重新设置了CVSROOT的路径后,/home/cvsroot
    如果是初次使用需要在/home/cvsroot/CVSROOT下创建passwd, readers, writers文件
    touch passwd readers writers
    然后设置属于apache用户,
    chown apache.apache passwd readers writers
    这样使用setup用户创建新用户后会同步更新CVSROOT/passwd下的帐号

修改登录密码,进行BUG报告等,
更多使用细节可以在使用中慢慢了解。

对于前面提到的WinCVS在perference里设置:
CVSROOT栏输入:username@ip.address.of.cvs:/home/cvsroot
Authenitication选择:use passwd file on server side
就可以了从服务器上进行CVS操作了。

CVS的用户权限管理

CVS的权限管理分2种策略:

  • 基于系统文件权限的系统用户管理:适合多个在Linux上使用系统帐号的开发人员进行开发。
  • 基于CVSROOT/passwd的虚拟用户管理:适合多个在Windows平台上的开发人员将帐号映射成系统帐号使用。

为什么使用apache/apache用户?首先RedHat8中缺省就有了,而且使用这个用户可以方便通过cvstrac进行WEB管理。
chown -R apache.apache /home/cvsroot
chmod 775 /home/cvsroot

Linux上通过ssh连接CVS服务器的多个开发人员:通过都属于apache组实现文件的共享读写
开发人员有开发服务器上的系统帐号:sysuser1 sysuser2,设置让他们都属于apache组,因为通过cvs新导入的项目都是对组开放的:664权限的,这样无论那个系统用户导入的项目文件,只要文件的组宿主是apache,所有其他同组系统开发用户就都可以读写;基于ssh远程认证的也是一样。

   apache(system group)
/            |           \
sysuser1   sysuser2     sysuser3

Windows上通过cvspserver连接CVS服务器的多个开发人员:通过在passwd文件种映射成 apache用户实现文件的共享读写
他们的帐号通过CVSROOT/passwd和readers writers这几个文件管理;通过cvstrac设置所有虚拟用户都映射到apache用户上即可。

   apache(system user)
/            |            \
windev1     windev2      windev3             

利用cvs + (WinCVS/cvsweb/cvstrac),构成了一个相对完善的跨平台工作组开发版本控制环境。

相关资源:

CVS HOME:
http://www.cvshome.org

CVS FAQ:
http://www.loria.fr/~molli/cvs-index.html

相关网站:
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 命令的速查卡片:
http://www.refcards.com/about/cvs.html

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++

原文出处:<a href=”http://www.chedong.com/tech/cvs_card.html”>http://www.chedong.com/tech/cvs_card.html</a>
<<返回

<<返回首页

2004年09月21日

Linux firewall進展過程

 Ipchains (Linux 2.2 Kernel)。
 Iptables (Linux 2.4 kernel)。

 

防火牆工具 iptables

防火牆基本上都是設定防火牆規則( RULES ) 來規範封包的處理。

iptables 將不同的規則集合起來﹐放進不同的鏈( CHAINS )。

iptables 的三個內建鏈 ( Built-in Chains ) 分別是﹕INPUT﹑OUTPUT﹑與 FORWARD。

iptables工具主要具備三個tables, table中包含chains, chains 裡面包含的就是 rules policies

Iptable結構示意圖

IP datagramKernel中處理的狀態圖

The IP datagram is received. (1)
 If the datagram is for this machine, it is processed locally. (2)
 Forward (3)
Datagrams from local processes are sent to the routing software for forwarding to the appropriate interface. (4)
 The IP datagram is transmitted. (5)
Input rule is applied at flow 2.
Output rule is applied at flow 4.

Iptableschine示意圖

OUTPUT 是 local process 產生的封包才會經過。
PREROUTING 就是在 ROUTING 之前﹐通常是封包從一個界面進入之後﹐尚未交給路由判斷之前的處理﹐在這裡進行 DNAT 的 socket 替換
POSTROUTING 則是在路由判斷之後﹐通常是當封包離開界面之前的處理,在這裡進行 SNAT 的 socket 替換。

User-defined Chins

Iptables is the ability for the user to create new chains.
test chain” is a User-defined chain.
User-defined chains can jump to other user-defined chains.
don’t make loops: your packets will be dropped if they’re found to be in loop.
   

iptables main Features

增強網路位址轉換(NAT)

SNAT (Source Network Address Translation) change source address of packet.

DNAT (Destination Network Address Translation) change destination address of packet.

增強的封包檢視 

IPTables可以檢查所有6個TCP旗標。

IPTables可以詳細的指定一連串的來源或目的端埠,而非只有單一埠或單一範圍的埠。

MAC位址過濾 

可以使用MAC Address做為過濾的條件。

一定比例的限制條件

抵擋拒絕服務的攻擊(像是大量syn)和埠的掃描,而且也限制重覆的程序上登入的次數。 

服務的優先順序類型(TOS)

傳輸可以依優先順序到不同的排列裡。效率儘可能在可靠度最大、花費最少及標準的服務。

如何開始使用iptables

  必須將 Firewall 功能編進核心裡面
Networking options ---> [*] Network packet filtering (replaces ipchains) [*] TCP/IP networking IP: Netfilter Configuration ---> <M> Connection tracking (required for masq/NAT) (NEW) <M> FTP protocol support (NEW) <M> IP tables support (required for filtering/masq/NAT) (NEW) <M> limit match support (NEW) <M> MAC address match support (NEW) <M> netfilter MARK match support (NEW) <M> Multiple port match support (NEW) <M> TOS match support (NEW) <M> tcpmss match support (NEW) <M> Connection state match support (NEW) <M> Packet filtering (NEW) <M> REJECT target support (NEW) <M> Full NAT (NEW) <M> MASQUERADE target support (NEW) <M> REDIRECT target support (NEW) <M> Packet mangling (NEW) <M> TOS target support (NEW) <M> MARK target support (NEW) <M> LOG target support (NEW) <M> TCPMSS target support (NEW) <M> ipchains (2.2-style) support (NEW) 

  Load iptables module
(1)   # modprobe ip_tables
(2)   # lsmod (確定 ip_tables 模組存在)

iptables指令格式:

      # iptables [-t table] command [match] [target / jump]

 
  [-t table]

the -t option specifies which table to use, Per default, the filter table is used.

nat table
the nat table is used mainly for Network Address Translation.
mangle table
this table is used mainly for mangling packets. Examples of this would be to change the TTL, TOS or MARK.
filter table
The filter table should be used for filtering packets generally.
 
  command (manage whole chains)
    建立一個新的(自定)鏈 ( -N )。

    刪除一個空的(自定)鏈 ( -X )。

    改變一個內建鏈的原則 ( -P )。

    列出一個鏈中的規則 ( -L )。

    清除一個(內建)鏈中的所有規則 ( -F )。

    在一個鏈的最後面新增( append ) 一條規則 ( -A )。

    在鏈內某個位置插入( insert ) 一條新規則( -I )。

    在鏈內某個位置替換( replace ) 一條規則 ( -R )。

    在鏈內某個位置刪除( delete ) 一條規則 ( -D )。

    刪除(delete) 鏈內第一條符合的規則 (-D)。

 
 
  [match]
Generic matches
  iptables -A INPUT -p tcp
  iptables -A INPUT -s 192.168.1.1
  iptables -A INPUT -d 192.168.1.1
  iptables -A INPUT -i eth0
  iptables -A FORWARD -o eth0
  iptables -A INPUT –fragment
TCP matches
  iptables -A INPUT -p tcp –sport 22
  iptables -A INPUT -p tcp –dport 22
  iptables -p tcp –tcp-flags SYN,ACK,FIN SYN
UDP matches
  iptables -A INPUT -p udp –sport 53
  iptables -A INPUT -p udp –dport 53
ICMP matches
  iptables -A INPUT -p icmp –icmp-type 8
MAC match
  iptables -A INPUT –mac-source 00:00:00:00:00:01
Limit match
iptables -A INPUT -m limit –limit 3/hour
iptables -A INPUT -m limit –limit-burst 5
Multiport match
  iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110
  iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110
  iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
TTL matches
  iptables -A OUTPUT -m ttl –ttl 60
  TOS matches
iptables -A INPUT -p tcp -m tos –tos 0×16
Minimize-Delay 16 (0×10)
Maximize-Throughput 8 (0×08)
Maximize-Reliability 4 (0×04)
Minimize-Cost 2 (0×02)
Normal-Service 0 (0×00)
 
  [target / jump]
  ACCEPT target

   接受這個封包﹐也就是可以通過規則檢驗而放行﹑順利通過這個鏈。

DROP  target
  丟棄這個封包﹐也就不能通過規則檢驗而被擋掉。
QUEUE target
   將封包重導至本機端的佇列 ( queue ) 程式。
  RETURN  target

    進入某一個Chine時,如果符合某種條件,使其回到原來的Chine中。

  TOS  target

iptables -t mangle -A PREROUTING -p TCP –dport 22 -j TOS –set-tos 0×10

  SNAT  target

iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 140.116.164.179

  DNAT  target

iptables -t nat -A PREROUTING -p tcp -d 140.116.164.179 –dport 80 -j DNAT –to-destination 1.2.3.0-1.2.3.9

    修改為特定的 Destination Socket

  MASQUERADE  target

   動態的根據路由判斷後的界面而修改 Source Socket

  REDIRECT  target

iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 \
-j REDIRECT –to-port 3128

  TTL  target

iptables -t mangle -A PREROUTING -o eth0 -j TTL –ttl-set 64

  

 

2004年09月20日

GPL协议及其对Linux的影响

  GPL是GNU Public License的缩写,最早是自由软件基金会为了促进开放源代码的发展,而搞出来的一种版权协议。

  GPL对软件产业的发展起到了巨大的促进作用,但是也带来了很多误解。在美国考察期间,我们和GNU的主要负责人进行了广泛交谈,精确地了解了GPL的本质,以及它对软件产业产生的影响。本文就是介绍这方面的情况。

一、GPL和软件版权

  首先需要明确的是,GPL协议只是无数种版权协议其中的一种,它和版权本身是不同的概念。具体的解释如下:

  软件的版权完全属于其作者所有,作者可以自由地选择采取哪一种版权协议来发布自己的软件。

  在传统的商业模式,作者一般采取商业版权协议来发布自己的软件。商业版权协议也有各种不同的方式。例如以前商业版权协议要求用户在每一台计算机上安装一份软件,而微软新的版权协议要求用户不但安装软件,还要同时购买升级资格。这些都是不同的商业版权协议。

  为了促进软件产业的发展,作者也可以选择GPL协议。这样作者将他的源代码开放,供其他人修改,而其他人能够修改的前提是接受作者指定的GPL协议。

  自由软件基金会主持开发了无数的自由软件,特别是C++编译器Gcc,由于采用了GPL协议,无数人的思想可以共享,因此GPL和自由软件迅速地发展起来。

  由于GNU的软件全部采用GPL协议,而GNU的软件影响力又非常之大,因此很多人错误地将自由软件和GPL完全联系在一起,认为所有的自由软件都是采用GPL协议的,这是完全错误的。

  虽然GPL和自由软件的发展紧密地联系在一起,但是这两者并不等同。自由软件的作者并不一定选择GPL来发布他的软件,如果愿意的话,软件的作者甚至可以自己编写一个版权协议。

  这里一定要搞清下面的概念:

1. 软件的版权归其作者所有,其作者有权选择采用哪种版权协议
2. GPL只是众多版权协议中的一种
3. 自由软件不一定要采用GPL协议
4. GNU不拥有所有开放源代码软件的版权,GNU只拥有那些由自由软件基金会开发的软件的版权,以及那些作者自愿交给GNU的版权。

二、GPL的发展

  随着技术的发展,越来越多的公司开始关注开放源代码软件和Linux,这些公司显然不愿意完全开放源代码。

  同时GNU也注意到GPL不利于商业运作。为了促进Linux下商业软件的发展,GNU又公布了LGPL协议。

LGPL协议的核心思想是:

1.用户可以使用开放源代码的“程序库”开发自己的商业软件,而无需开放源代码。(“程序库”指可以完成特定功能的现成的软件代码)

2.如果对“程序库”本身进行了修改,则必须公开修改“程序库”的源代码。

3. 用户如果自己开发“程序库”,如果该程序库是专门针对某个特定的开放源代码软件开发的,则必须公布源代码。如果该程序库具有一定的通用性,则可以不开放源代码。

  第一条的意思是允许在Linux上开发商业软件。因为Linux下的所有软件都必须用到glibc库,所以如果要求遵守GPL协议,那么就不可能存在Linux下的商业软件了。而采取LGPL,则允许商业软件的发展。

  第二条的意思是为了保护程序库的唯一性和一致性。如果用户随意修改程序库而不必开放源代码,则很快程序库就有很多个版本,这样就不能保证其他软件的兼容性。

  第三条的意思是允许用户开发商业用途的程序库。

  LGPL协议大大促进了Linux下商业软件大发展,一些优秀的软件,例如IBM的WebSphere,Borland的Kylix,AW的Maya,都是在LGPL的前提下发展起来的。

  但是,仍然有很多公司认为LGPL协议的规定还是太死板,不能满足其需要,所以又提出了各种各样的“第三方协议”,比较典型的是Sun为OpenOffice提出的SISSL协议。

  SISSL协议规定,在开放源代码项目OpenOffice基础上开发的商业软件,可以不公布源代码。这样,就有一个比LGPL更好支持商业软件的版权协议。

  注意,前面提到过,软件的作者拥有版权,能够决定采取何种版权协议发布自己的软件。而最近一些比较大的开放源代码项目都是由一些大公司公布的源代码,因此他们可以决定对自己的开放源代码项目采取何种版权协议,而不必理会GNU的意见。

  现在一些比较大的开放源代码项目,都是由大公司主持的,因此都支持各种各样的第三方协议。这些协议的目的只有一个,就是保护这些大公司自己的版权,允许他们开发商业软件。

  GNU最近也在考虑制定新的版权协议,进一步增加对商业软件的支持,可见GPL协议也在不断地更新之中。

三、GPL的功与过

  GPL对软件产业的发展到底是好还是坏,这是大家讨论的焦点。

  在1998年以前,GPL对Linux的促进是很显然地,可以说没有GPL就没有Linux。大家都知道,与Linux竞争的,还有FreeBSD项目,这个项目的版权协议允许封闭源代码,并且实际上FreeBSD的某些软件也相当不错。但是现在来看,Linux的到蓬勃发展,FreeBSD却在逐渐消亡。

  原因很简单,基于FreeBSD开发的软件,很快就变得不开放源代码了,因而得不到整个社区的支持,所以也没有可持续发展。一旦其创始人由于某种原因终止了开发,整个项目就不会延续了。

  而基于GPL的项目,由于种种原因,总会有人不断研究,因此有很强的可持续发展能力。

  1998年以后,公司大量介入Linux,因此LGPL又起到了很大的促进作用。由于LGPL的推广,很多公司把自己的商用软件移植到Linux上。在Linux World大会上,我们可以看到,除了微软以外,几乎所有的大型软件公司都把自己的产品移植到了Linux上或者正在移植。

  现在,由于桌面Linux系统的要求,以及对Linux软件商业化的压力,大家开始让Linux真正被普通人接受,而不只限于爱好者。此时,“第三方协议”又起到了很大的作用。Linux下的主要应用软件,例如办公套件、浏览器、电子邮件、IDE编程环境等,都是基于SISSL这样的第三方协议发展起来的。

  在未来的岁月里,显然Linux的发展需要各种协议的综合运用,使得Linux既拥有开放源代码软件的优点,也拥有商业软件的优点。偏重于任何一种版权协议都是片面地,对整个软件产业发展是有害的。

四、国际大公司的做法

  根据在Linux World大会上的考察,目前主要的软件和硬件公司,例如IBM、Sun、RedHat、Borland、Oracle等,都是采用多种软件协议并行的方式。

  最典型的是Sun负责的OpenOffice项目,这个项目就是GPL、LGPL、SISSL三种协议并存,开发者可以根据自己的情况,选择自己最合适的版权协议。

  等到GPL的最新版本出来之后,也许就不会有各种各样的第三方协议,而同一在GPL的某个新的、完全支持商业软件发展的协议之下。

小结:

  我们可以将GPL协议对开放源代码社区的影响情况总结如下:

1. 要历史性地看待GPL 技术发展日新月异,我们对GPL的看法不能停留在1998年。现在单纯采用GPL协议的软件已经不多,大部分是GPL、LGPL和商业版权协议同时采用。开发者可以根据自己的需要自由地选择自己希望遵守的版权协议。这样既保证开放源代码的发展,又保证各公司的利益。

2.不是开放源代码软件必然采用GPL GPL不代表版权,也和Linux没有必然联系,它只是软件作者可以选择的版权协议之一。

3. GPL协议自身也在不断发展之中 必须看到,GPL是相当古老的东西,已经不太适合于现代软件产业的发展。所以国际上很多人正在修订GPL协议,以最大限度地促进软件产业的发展。

4. GPL对商业化的阻碍没有宣传得那么大 在国际社会的共同努力下,GPL协议已经不再成为开放源代码进入商业的阻碍。过分强调GPL的缺点有夸大事实之嫌。必须看到,现在的开放源代码体系是多种版权协议的混合体系,如果我们认为某些项目不适合于GPL,那么选择其他协议就可以了,没有任何问题的。

2004年09月15日

Quarrel, fight. 又一次争吵,上次是在8月份,一个多月没有吵架了,是不是很不容易了?不知道,黑霉日,还有这样的说法~是很准。

 

总结一下,是因为晚上说太多了,伤了她的自尊心。

2004年09月09日

按照vqadmin里面写的INSTALL来做,怎么也无法登录vqadmin来管理。直到修改了/usr/local/httpd/conf/vqpasswd的所有者,所有组以及权限之后才可以登录。

使用sh备份qmail+mysql数据到指定的ftp地址的方法!

转载自http://www.chinaunix.net 作者:peijun.jiang  发表于:2003-10-13 13:46:57

备份vpopmail的domains目录、qmail的control目录和mysql的var数据存放目录,使用crontab定时进行操作。下面是脚本文件,具体的目录视自己的系统更改:

mkdir /var/qmailbakup
cd /var/qmailbakup
touch qmailbakup.sh
chmod 755 qmailbakup .sh

vi qmailbakup.sh
[code:1:d480555598]
#!/bin/sh

DATE=`date +%Y-%m-%d-%H`

cd /var/qmailbakup/

tar cvzf domains.$DATE.tar.gz /home/vpopmail/domains
tar cvzf control.$DATE.tar.gz /var/qmail/control
tar cvzf mysql.$DATE.tar.gz /usr/local/mysql/var

ftp -n 192.168.0.21 << ! //你的ftp服务器的地址
user qmail qmailbakup //ftp用户名和密码,注意要有put权限
binary
put domains.$DATE.tar.gz
put control.$DATE.tar.gz
put mysql.$DATE.tar.gz
bye
!

rm -f domains.$DATE.tar.gz control.$DATE.tar.gz mysql.$DATE.tar.gz //删除本机产生的文件,如果你想在本服务器也保存一份备份,去掉该项即可。
[/code:1:d480555598]

使用crontab定时执行:
vi /etc/crontab
00 20 * * 0-6 /var/qmailbakup/qmailbakup.sh

这样每天晚上8:00执行改备份程序。

2004年09月08日

其实原来就用过,只是发现自己不熟悉,不像source insight这么简单,而且还不支持中文(看中文注释就郁闷了,等于什么都没有)。今天随便玩了一会儿,发现还不错,source insight能实现的,这个应该都没有问题。只是在操作上可能有差异,不如source insight这么便利吧。

如果在linux下面看代码,用这个结合eclipse,想来够用了,恩~明天就这样看代码吧。不想在windows泡了,换个方式。