LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2752|回复: 2

Debian参考手册 第十二章 版本控制系统

[复制链接]
发表于 2003-4-9 17:41:08 | 显示全部楼层 |阅读模式
Debian参考手册

~~~~~~~~~~~
第十二章 版本控制系统
~~~~~~~~~~~



12.1 CVS
========
有关的详细信息可使用lynx查阅/usr/share/doc/cvs/html-cvsclient,/usr/share/doc/cvs/html-info,/usr/share/doc/cvsbook或执行info cvs及man cvs。

12.1.1 安装CVS服务器
--------------------
以下步骤配置的服务器,仅允许“src”用户组的成员访问CVS容器,并且仅“staff”用户组的成员才可管理CVS,这样做可以降低管理者不小心犯错的机率。

    # cd /var/lib; umask 002 ; sudo mkdir cvs # [Woody] FSH
    # apt-get install cvs cvs-doc cvsbook
    # export CVSROOT=/var/lib/cvs
    # cd $CVSROOT
    # chown root:src .  # 设置为"staff"可加强对新建项目行为的限制
    # chmod 3775 .             # 如果上面的赋值为"staff",则使用2775
    # cvs -d /var/lib/cvs init # 在此明确地指定-d更安全
    # cd CVSROOT
    # chown -R root:staff .
    # chmod 2775 .
    # touch val-tags
    # chmod 664 history val-tags
    # chown root:src history val-tags

12.1.2 CVS会话例子
------------------
下面我们来设置shell环境以便访问CVS容器。

12.1.2.1 匿名CVS(仅用于下载)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
只读远程访问:
   
    $ export CVSROOT=:pserver:anonymous@cvs.qref.sf.net:/cvsroot/qref
    $ cvs login
    $ cvs -z3 co qref

12.1.2.2 使用本地CVS服务器
^^^^^^^^^^^^^^^^^^^^^^^^^^
通过同一台机器上的shell进行本地访问:

    $ export CVSROOT=/var/lib/cvs

12.1.2.3 使用远程CVS pserver
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
非SSH(在cvs中使用RSH协议)远程访问

    $ export CVSROOT=:pserver:account@cvs.foobar.com:/var/lib/cvs
    $ cvs login

易受窍听攻击。

12.1.2.4 通过ssh使用远程CVS
^^^^^^^^^^^^^^^^^^^^^^^^^^^
通过SSH进行远程访问:

    $ export CVSROOT=:ext:account@cvs.foobar.com:/var/lib/cvs

或连接Sourceforge:

    $ export CVSROOT=:ext:account@cvs.qref.sf.net:/cvsroot/qref

亦可使用RSA认证(〖9.5.3 使用更少的密码建立连接〗),它不需要密码提示。

12.1.2.5 新建CVS档案
^^^^^^^^^^^^^^^^^^^^
要建立如下的档案,
   
    ITEM              VALUE                    MEANING
    source tree:      ~/project-x              All source codes
    Project name:     project-x                Name for this project
    Vendor Tag:       Main-branch              Tag for the entire branch
    Release Tag:      Release-original         Tag for a specific release

则,

    $ cd ~/project-x                 # 进源码目录
     ... 创建源码树 ...
    $ cvs import -m "Start project-x" project-x Main-branch Release-initial
    $ cd ..; rm -R ~/project-x

12.1.2.6 使用CVS
^^^^^^^^^^^^^^^^
使用本地CVS容器来为project-x工作:

    $ cd                            # 转到工作域
    $ cvs co project-x              # 从CVS下载源码到本地
    $ cd project-x
     ... 修改源码内容 ...
    $ cvs diff -u                   # 相当于diff -u repository/ local/
    $ cvs up -C modified_file       # 撤消对文件地修改
    $ cvs ci -m "Describe change"   # 保存本地源码到CVS
    $ vi newfile_added
    $ cvs add newfile_added
    $ cvs ci -m "Added newfile_added"
    $ cvs up                        # 从CVS合并最新版本
     ... watch out for lines starting with "C filename"
     ... unmodified code is moved to `.#filename.version'.
     ... Search "<<<<<<<" and ">>>>>>>" in filename.
    $ cvs tag Release-1             # 添加release tag
     ... edit further ...
    $ cvs tag -d Release-1          # 移除release tag
    $ cvs ci -m "more comments"
    $ cvs tag Release-1             # 重新添加release tag
    $ cd                            # 返回工作域
    $ cvs co -r Release-initial -d old project-x
     ... get original version to old directory
    $ cd old
    $ cvs tag -b Release-initial-bugfixes # 创建branch (-b) tag
     ... Now you can work on the old version (Tag=sticky)
    $ cvs update
     ... Source tree now has sticky tag "Release-initial-bugfixes"
     ... Work on this branch
    $ cvs up # sync with files modified by others on this branch
    $ cvs ci -m "check into this branch"
    $ cvs update -kk -A
     ... Remove sticky tag and forget contents
     ... Update from main trunk without keyword expansion
    $ cvs update -kk -j Release-initial-bugfixes
     ... Merge from Release-initial-bugfixes branch into the main
     ... trunk without keyword expansion.  Fix conflicts with editor.
    $ cvs ci -m "merge Release-initial-bugfixes"
    $ cd
    $ tar -cvzf old-project-x.tar.gz old     # make archive, -j for bz2
    $ cvs release -d old               # 删除本地源码(可选)

应该记住的几个选项(用作cvs命令行的第一个参数):

    -n      dry run, no effect
    -t      display messages showing steps of cvs activity

12.1.2.7 从CVS取文件
^^^^^^^^^^^^^^^^^^^^
要从CVS获得最新版本,用“tomorrow”:

    $ cvs ex -D tomorrow module_name

12.1.2.8 管理CVS
^^^^^^^^^^^^^^^^
为项目添加别名(本地服务器):

    $ su - admin           # staff用户组成员
    $ export CVSROOT=/var/lib/cvs
    $ cvs co CVSROOT/modules
    $ cd CVSROOT
    $ echo "px -a project-x" >>modules
    $ cvs ci -m "Now px is an alias for project-x"
    $ cvs release -d .
    $ exit                 # 按control-D从su返回
    $ cvs co -d project px
     ... check out project-x (alias:px) from CVS to directory project
    $ cd project
     ... make changes to the content ...

12.1.3 CVS常见问题及解决方法
----------------------------

12.1.3.1 容器中的文件权限
^^^^^^^^^^^^^^^^^^^^^^^^^
CVS不会覆盖当前容器中的文件,而是用另一个文件替换它。因此,对容器目录的写权限是很危险的权限。所以在新建容器时,请运行下面的命令,确保权限合适。

    # cd /var/lib/cvs
    # chown -R root:src repository
    # chmod -R ug+rwX   repository
    # chmod    2775     repository  # if needed, this and subdirectory

12.1.3.2 执行标记(execution bit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
当文件被别人取走后会保留执行标记,任何时候你遇到外出文件存在执行权限问题,可用下面的命令在CVS容器中修改文件权限。

    # chmod ugo-x filename

12.1.4 CVS命令
--------------
这儿是一些CVS命令的用法简介。

    {add|ad|new} [-k kflag] [-m 'message'] files...
    {admin|adm|rcs} [rcs-options] files...
    {annotate|ann} [options] [files...]
    {checkout|co|get} [options] modules...
    {commit|ci|com}   [-lnR]  [-m  'log_message'  |  -f  file] \
            [-r revision] [files...]
    {diff|di|dif} [-kl] [rcsdiff_options] [[-r rev1 | -D date1] \
            [-r rev2 |  -D date2]] [files...]
    {export|ex|exp} [-flNn] -r rev|-D date [-d dir] [-k kflag] module...
    {history|hi|his} [-report] [-flags] [-options args] [files...]
    {import|im|imp} [-options] repository vendortag releasetag...
    {login|logon|lgn}
    {log|lo|rlog} [-l] rlog-options [files...]
    {rdiff|patch|pa} [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules...
    {release|re|rel} [-d] directories...
    {remove|rm|delete} [-lR] [files...]
    {rtag|rt|rfreeze} [-falnR]  [-b]  [-d]  [-r  tag  |  -D  date] \
             symbolic_tag modules...
    {status|st|stat} [-lR] [-v] [files...]
    {tag|ta|freeze} [-lR] [-F] [-b] [-d] [-r tag | -D date]  [-f] \
             symbolic_tag [files...]
    {update|up|upd} [-AdflPpR] [-d] [-r tag|-D date] files...



12.2 Subversion
===============
Subversion是下一代版本控制系统,它将替代CVS。当前开发者称它还处于“alpha”阶段,但对大多数用户而言它已足够稳定了。到本文档写作之时,Subversion仅在Debian unstable版中可用。

12.2.1 安装Subversion服务器
---------------------------
subversion-server meta-package依赖一些关联包(libapache2-dav-svn和subversion-tools)来配置服务器。

12.2.2 将CVS仓库移入Subversion
------------------------------
当前,subversion软件包无法创建容器,所以用户需要手工创建它们。通常可在/var/local/repos下创建容器。

创建目录:

     # mkdir -p /var/local/repos

创建容器数据库:

    # svnadmin create /var/local/repos

将容器的写权限赋给www server:

    # chown -R www-data:www-data /var/local/repos

12.2.1.2 配置Apache2
通过用户认证授权访问容器,添加(或去掉注释符)下列内容到/etc/apache2/mods-available/dav_svn.conf:

    <Location /repos>
      DAV svn
      SVNPath /var/local/repos
      AuthType Basic
      AuthName "Subversion repository"
      AuthUserFile /etc/subversion/passwd
      <LimitExcept GET PROPFIND OPTIONS REPORT>
        Require valid-user
      <LimitExcept>
    </Location>

接着,使用下面的命令创建用户认证文件:

    htpasswd2 -c /etc/subversion/passwd some-username

重启Apache2,就可以使用URL http://hostname/repos来访问新的subversion容器了。

12.2.2 将CVS容器迁移到Subversion
--------------------------------

12.2.3 Subversion用法样例
-------------------------
下面的小节将教你如何在subversion下使用各种命令。

12.2.3.1 创建新的Subversion档案

创建新的subversion档案,输入下面的命令:

    $ cd ~/your-project         # 进你的源码目录
    $ svn import http://localhost/repos your-project \
      project-name -m "initial project import"

这将在你的subversion容器下创建一个名为project-name的目录,用来存放你的项目文件。查看http://localhost/repos/它是否在那儿?

12.2.3.2 使用subversion

用subversion来管理project-y:

    $ cd                            # 转到工作域
    $ svn co http://localhost/repos/project-y  # 提取源码
    $ cd project-y
     ... 完成一些工作 ...
    $ svn diff                      # 相当于diff -u repository/ local/  
    $ svn revert modified_file      # 撤消对文件所做的修改
    $ svn ci -m "Describe changes"  # 将你做的修改保存到容器中
    $ vi newfile_added
    $ svn add newfile_added
    $ svn add new_dir               # 将所有的文件嵌套式地加到new_dir
    $ svn add -N new_dir2           # 非嵌套式地添加目录
    $ svn ci -m "Added newfile_added, new_dir, new_dir2"
    $ svn up                        # 从容器中合并最新的版本
    $ svn log                       # 显示所有修改记录
    $ svn copy http://localhost/repos/project-y \
          http://localhost/repos/project-y-branch \
          -m "creating my branch of project-y"  # branching project-y
    $ svn copy http://localhost/repos/project-y \
          http://localhost/repos/proj-y_release1.0 \
          -m "project-y 1.0 release"    # added release tag
     ... note that branching and tagging are the same. The only difference
     ... is that branches get committed whereas tags do not.
   
     ... make changes to branch ...
   
    $ # merge branched copy back to main copy
    $ svn merge http://localhost/repos/project-y \
       http://localhost/repos/project-y-branch
    $ svn co -r 4 http://localhost/repos/project-y # get revision 4



=========================================
Debian Reference

CVS, 2003-01-31-07:53:52
Osamu Aoki osamu@debian.org
Editor: David Sewell dsewell@virginia.edu
中文翻译:LYOO iamlyoo@163.com
          2003/04/09
=========================================
发表于 2007-12-18 20:51:01 | 显示全部楼层
谢谢,收藏啦
回复 支持 反对

使用道具 举报

发表于 2007-12-18 21:00:03 | 显示全部楼层
又见挖坟的~~~
debian参考手册有中文的,何来收藏之,呵呵。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表