Unix Toolbox

 主页   资讯   文章   代码   电子书 

服务器设置

CVS 环境初始化

决定主 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,除了要登录到操作系统,没有进一步的验证。然而这仅对本地 repository 才有用。
  • 使用 ext 协议通过 ssh 来远程访问。任何有 ssh shell 账户和在 CVS 服务器上可读写权限的都可直接使用 ext 协议通过 ssh 来访问 CVS,而不需要任何额外的隧道。没有服务器来处理运行在 CVS 上的验证工作。ssh 登录会去验证。
  • 用 pserver 来远程访问。这是对于有较大用户量的首选方法,用户由 CVS 的 pserver 通过一个专门的密码数据库来验证,因此不需要本地用户帐户。这种设置在下面会有说明。

用 inetd 设置网络

如果不需要网络访问,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:

CVSROOT 变量

这是个环境变量用来指定 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

通过 SSH 隧道访问 CVS

我们需要两个 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

CVS 命令及其使用

导入

该 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"            # 提交所有更改并为这个更改添加日志消息

创建一个 patch

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

应用一个 patch

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