决定主 repository 将要创建和重置的 cvs 根目录。比如 /usr/local/cvs (根):
# mkdir -p /usr/local/cvs
# setenv CVSROOT /usr/local/cvs # 设置 CVSROOT 环境变量(本地)
# cvs init # 创建所有初始化 CVS 配置文件
# cd /root
# cvs checkout CVSROOT # 签出配置文件来修改他们
# cd CVSROOT
edit config ( fine as it is)
# cvs commit config
cat >> writers # 创建 writers 文件 (也可为 readers)
colin
^D # 使用 [Control][D] 退出编辑
# cvs add writers # 添加文件 writers 进 repository
# cvs edit checkoutlist
# cat >> checkoutlist
writers
^D # 使用 [Control][D] 退出编辑
# cvs commit # 提交所有配置更改
添加一个 readers 文件,如果你要区分读写权限的话。注意: 不要在主 cvs 中直接编辑文件,而应该签出要编辑的文件,修改完成后再签入。我们所做的文件 writers 用来定义可写权限。
下面有三种流行的方式去访问 CVS。前两个不需要任何进一步的配置。看 CVSROOT 部分的实例了解如何使用它们:
如果不需要网络访问,CVS 可以运行于本地。对于远程访问,在 /etc/inetd.conf (Suse 为 /etc/xinetd.d/cvs)中配置如下行,可让守护进程 inetd 启动 pserver:
cvspserver stream tcp nowait cvs /usr/bin/cvs cvs \
--allow-root=/usr/local/cvs pserver
这是个用来阻断从 internet 访问 cvs 端口的好方法,可使用 ssh 隧道来远程的访问 repository。
CVS 用户可能不是操作系统的一部分(即不是本地用户)。这其实可从安全的角度去看。简单的添加一个叫 passwd (in the CVSROOT directory) 的文件,其包含 crypt 格式的用户登录名和密码。这也可以使用 apache 的 htpasswd 工具来完成。
注意: 这个 passwd 文件仅仅是文件,可以在 CVSROOT 中直接编辑。它不能被签出。更多信息请用 htpasswd --help
# htpasswd -cb passwd user1 password1 # -c 创建文件
# htpasswd -b passwd user2 password2
现在添加 :cvs
到每行的结尾处,用来告诉 cvs 服务器更改用户到 cvs (或任何你正在运行的 cvs 服务器下)。它看起来像这样:
# cat passwd
user1:xsFjhU22u8Fuo:cvs
user2:vnefJOsnnvToM:cvs
测试作为一般用户登录(比如我)
# cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs login
Logging in to :pserver:colin@192.168.50.254:2401/usr/local/cvs
CVS password:
这是个环境变量用来指定 repository 的位置。对于本地使用,该变量只需设置成 repository 的目录。对于通过网络使用,传输协议必须指定。使用 setenv CVSROOT string
(csh, tcsh shell) 或者 export CVSROOT=string
( sh, bash shell) 设置 CVSROOT 环境变量。
# setenv CVSROOT :pserver:<username>@<host>:/cvsdirectory For example: # setenv CVSROOT /usr/local/cvs # 仅限本的使用 # setenv CVSROOT :local:/usr/local/cvs # 同上 # setenv CVSROOT :ext:user@cvsserver:/usr/local/cvs # 通过 SSH 直接访问 # setenv CVS_RSH ssh # ext 协议访问 # setenv CVSROOT :pserver:user@cvsserver.254:/usr/local/cvs # 通过 pserver 网络访问一旦登录成功就可导入一个新项目进 repository: **cd 进入** 你的项目根目录
cvs import <module name> <vendor tag> <initial tag> cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs import MyProject MyCompany START在 repository 中有个名叫 MyProject 新项目(之后用来签出)。CVS 会导入当前目录的内容进新项目。
# cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs checkout MyProject
或者
# setenv CVSROOT :pserver:colin@192.168.50.254:/usr/local/cvs
# cvs checkout MyProject
我们需要两个 shell 来做这个。在第一个 shell 中,我们连接到 cvs 服务器并对 cvs 连接进行端口转发(port-forward)。在第二个 shell 中,我们就像在本地一样使用 cvs。
在 shell 1:
# ssh -L2401:localhost:2401 colin@cvs_server # 直接连接到 cvs 服务器。或:
# ssh -L2401:cvs_server:2401 colin@gateway # 使用一个网关间接连接到 cvs 服务器
在 shell 2:
# setenv CVSROOT :pserver:colin@localhost:/usr/local/cvs
# cvs login
Logging in to :pserver:colin@localhost:2401/usr/local/cvs
CVS password:
# cvs checkout MyProject/src
该 import 命令用来添加整个目录,它必须运行于要导入的目录中。比如,目录 /devel/ 包含的所有文件和子目录要导入。该目录名在 CVS 中(模块)将会称为 "myapp"。
# cvs import [options] directory-name vendor-tag release-tag
# cd /devel # 必须在该目录中来导入
# cvs import myapp Company R1_0 # 修订(release)标签可以为任何单个单词
在添加了一个新目录 "/devel/tools/" 后,也可这么导入。
# cd /devel/tools
# cvs import myapp/tools Company R1_0
# cvs co myapp/tools # 仅会签出 tools 目录
# cvs co -r R1_1 myapp # 签出修订版本为 R1_1 的 myapp (sticky)
# cvs -q -d update -P # 典型的 CVS 更新
# cvs update -A # 重置所有 sticky 标签(或日期、选项)
# cvs add newfile # 添加一个新文件
# cvs add -kb newfile # 添加一个二进制文件
# cvs commit file1 file2 # 仅提交这两个文件
# cvs commit -m "message" # 提交所有更改并为这个更改添加日志消息
It is best to create and apply a patch from the working development directory related to the project, or from within the source directory.
# cd /devel/project
# diff -Naur olddir newdir > patchfile # Create a patch from a directory or a file
# diff -Naur oldfile newfile > patchfile
Sometimes it is necessary to strip a directory level from the patch, depending how it was created. In case of difficulties, simply look at the first lines of the patch and try -p0, -p1 or -p2.
# cd /devel/project
# patch --dry-run -p0 < patchfile # Test the path without applying it
# patch -p0 < patchfile
# patch -p1 < patchfile # strip off the 1st level from the path