zoukankan      html  css  js  c++  java
  • 【svn】解析subversion的使用

    目录结构:

    contents structure [-]

     

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。

    先列出笔者的环境:

    SVN服务端(VisualSVN-Server)版本:3.6.0

    SVN客户端(TortoiseSVN)版本:1.8.10

    运行环境:Window7 X64

     

    TortoiseSVN1.8.10 集成了客户端和服务端的功能,如果是在本机测试的话,就只需要装这个软件就可以了。如果需要单独搭建SVN服务器的话,那么建议在服务器上装VisualSVN-Server版本。

    1,安装客户端

    将资源下载好以后,点击TortoiseSVN进入安装页面,这里笔者将客户端安装到了: D:workSoftwareexeinstallTortoiseSVNlocalSVNinstallPacakage 

    2,安装服务端

    客户端安装好了以后,我们就来安装服务端,双击打开:Subversion,这里笔者将地址安装到了 D:workSoftwareexeinstallTortoiseSVNserverSVNInstallPackage 

    3,创建仓库

    这个仓库是服务端存放数据的地方,笔者在 D:workSoftwareexeinstallTortoiseSVNserverSVNdata 的目录下建立了仓库 projectManage ,方法为在dos窗口中输入svnadmin create 仓库地址,笔者就需要打开dos窗口,输入 svnadmin create D:workSoftwareexeinstallTortoiseSVNserverSVNdataprojectManage 

    ,仓库创建好后,在该目录下会生成一些文件。

    4,启动仓库

    创建好仓库后,就需要启动仓库,方法为在dos窗口中输入svnserve -d -r 仓库地址,比如笔者的 svnserve -d -r D:workSoftwareexeinstallTortoiseSVNserverSVNdataprojectManage 

    这个窗口不要关闭。如果下一次,需要传输文件,也需要把这个再次这样启动,或者也可以配置成为自动启动。

     

    5,创建客户端与仓库取得联系

    在本地新建两个文件夹,user1和user2,分别代表本地两个不同的用户。

    进入这两个文件夹,分别右击 检出 -> svn://IP ,这个时候在这个文件夹里面会有一个隐藏的.svn文件夹。

     

    6,使用svn服务

    在上面建立的user1文件夹下面,建立新文件,比如HelloWorld.java.

    然后选中该文件,右击-> add -> add(表示本地.svn对该文件形成管理)

    然后再 右击->commit,这里需要注意,如果是首次提交会因为没有权限而错误。进入到仓库的文件夹下面,笔者的就是projectManage文件夹,找到conf文件夹里面的svnserve.conf文件,把里面的anon-access改为write.

    7,SVN密码管理

    在上面第6点中,我们把anon-access取消了注释,并且把的值改为了write。这样的话所有的非验证用户都拥用读写仓库的权限,在团队管理中,这显然是不安全的。接下来笔者将会讲解一下,仓库(respository)下文件夹conf下的每个文件的作用。以及如何给每个用户分配权限。

    在创建完成仓库后,conf文件夹下有4个文件,分别是authz、hooks-env.tmpl、passwd和svnserve.conf文件。

    svnserve.conf文件的部分内容在第6点中,已经贴出了部分。下面来完整的讲解一下这些文件:

    svnserve.conf控制着svnserve进程的配置信息。svnserve.conf大致包含如下信息:

    [general]
    #anon-access = read
    #auth-access = write
    #password-db = passwd
    #authz-db = authz
    #groups-db = groups
    #realm = My First Repository
    #force-username-case = none
    #hooks-env = hooks-env
    
    [sasl]
    #use-sasl = true
    #min-encryption = 0
    #max-encryption = 256

    这些值默认都是被注释的,下面笔者列举其中几项:
    anon-access 控制非鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。即"write"为可读可写,"read"为只读,"none"表示无访问权限。缺省值:read。
    auth-access 控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。即"write"为可读可写,"read"为只读,"none"表示无访问权限。缺省值:write。
    password-db 指定用户名口令文件名。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。在有些版本该缺省值是"passwd",但在笔者的版本中,并没有提及。
    authz-db 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。在有些版本该缺省值是"authz",但在笔者的版本中,并没有提及。
    realm 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件。缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)。
    force-username-case 指定是否进行强制大小写字符转化,"upper"、"lower"和"none"。缺省值是"none"。
    hooks-env 指定环境配置文件

    这里讲解一下realm作用,在使用svn客户端访问svnserve服务器时,若需要用户登录,则提示信息如下:

    Authentication realm: <svn://192.168.0.141:3690> 8c147aa4-598e-d649-a1e9-e7e8f4edf2c3
    Password for 'harry':

    在上述第1行"Authentication realm: <svn://192.168.0.141:3690>"之后显示的字符串为认证域名称。如果在配置文件中为设定认证域,就会提示一个UUID,如上述所示。
    如果在配置文件配置如下信息:
    realm = test
    那么svn客户端在访问svnserve服务器时,需要登录的提示信息如下:

    Authentication realm: <svn://192.168.0.141:3690> test
    Password for 'harry':

    realm信息就替换成了test,如上所示。

    passwd是svnserve的一个密码文件示例。笔者的passwd文件默认内容如下:

    [users]
    #harry = harryssecret
    #sally = sallyssecret

    authz是svnserve的一个授权文件示例。笔者的authz文件默认内容如下:

    [aliases]
    # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average
    
    [groups]
    # harry_and_sally = harry,sally
    # harry_sally_and_joe = harry,sally,&joe
    
    # [/foo/bar]
    # harry = rw
    # &joe = r
    # * =
    
    # [repository:/baz/fuz]
    # @harry_and_sally = rw
    # * = r

    下面的配置可以帮助理解这些节点的含义:

    [group]
    admin = aaa,bbb,ccc
    vip = a1
    man = b1
    custom = c1   //这里先设定有这么多个角色和用户
            //假设库的名字叫cp
            //下面在cp下建立2个平行的目录vip和main
    [/]
    @admin=rw     //表示根目录下只有admin才有读写权限  
    [cp:/]
    *=r         //在cp库下,除了admin下,所有人都有读的权限
    @admin=rw    //在cp库下,admin具有读写的权限
    [cp:/vip] 
    *=        //除了vip和admin之外,所有人没有任何权限
    @vip=rw       //
    @admin=rw        //
    [cp:/main]
    *=         //除了以下角色外,其他人没有任何权限
    @admin=rw    //
    @vip=rw    //
    @man=r        //

    实际的案例文件中还生成了许多注释信息,读取可以详细许多你们仓库中conf文件夹下的各个文件的的注释信息。

    接下来贴一下,能够进行密码控制的配置文件,和演示:

    svnserve.conf文件中[general]节点:

    [general]
    anon-access = read
    auth-access = write
    password-db = passwd
    authz-db = authz

    passwd文件中[user]节点:

    [users]
    harry = harryssecret

    authz文件末尾加上:

    [/]
    harry = rw

    这样配置的话,harry用户就对仓库根目录([/])有读写权限了。

    下面笔者通过dos命名来展示一下:

    svn checkout svn://192.168.0.141
    echo null > a.txt
    svn add *
    svn commit * -m testfile --username harry --password harryssecret

    有什么问题,可以通过svn help ...查看帮助信息。

    除了可以通过DOS命令输入密码,还可以在客户端通过右键在SVN连接中提供的工具进行连接,在必要的阶段也会提示你输入密码,在弹出的命令框中输入svn地址进行连接。如果没有弹出密码提示框,那么可以删除 C:UsersAdministratorAppDataRoamingSubversionauth 目录下的所有文件。

    在上面的配置文件中,我们配置了anon-access = read,这就是说所有人都可以查看仓库的内容(无需验证),如果只想要有授权的人才可以读取和修改仓库的内容的话,可以改为anon-access = none。

    8.SVN的仓库布局和常规命令

    每一个仓库的布局方式都应该按照
    项目 ->
            branches
            tags
            trunk
    如果只有一个项目的话,那么就可以省略项目文件夹。

    例如:
    $ svn list file:///var/svn/single-project-repo
    trunk/
    branches/
    tags/

    $ svn list file:///var/svn/multi-project-repo
    project-A/
    project-B/

    $ svn list file:///var/svn/multi-project-repo/project-A
    trunk/
    branches/
    tags/

    可以结合第7点中权限分配那一节,对不同的文件夹赋予不同的用户权限。

    下面是一些关于SVN服务的常见操作
    svn mkdir 地址/文件夹名称 #在目标地址下创建指定文件夹
    svn list 地址 #显示地址下的文件信息
    svn copy 地址1 地址2
    svn checkout 地址 #检出
    svn add 文件 #添加到本地
    svn update 文件 #更新
    svn commit -m 描述信息 #提交
    ...
    输入svn help查看更多信息

    解释一下update和commit的区别:
    提交(commit):是用本地文件覆盖服务器的文件,只有提交会导致服务器上发生变化
    更新(update):只是把服务器上最新版本下载到客户端,规则如下:
    1、如果你本地的某个文件没有修改过,而服务器上的这个文件别人已经提交过新版本,那么会用服务器上最新的文件覆盖你本地的文件;
    2、如果你本地的某个文件你修改过了还没有提交,服务器端的这个文件还没被别人改过,那么对你本地的这个文件没有任何影响;
    3、如果你本地的某个文件你修改过了还没有提交,服务器端的这个文件已经被别人改过,那么会提示你发生冲突,会将服务器上最新版文件、你新修改的文件、发生分歧前的那个版本的文件都存放到你的本地

    建议:在commit之前,先进行update操作。

    9.分支、合并和标签

    接下笔者要讲解一下SVN中的分支(branch)、合并(merge)和标签(tag)。在上面的第8节中,我们讨论过一个标准的项目目录下,应该要有branches、trunk和tags三个文件夹。这三个目录就对应了这一节要讲的知识。

    在项目开发中,不同的项目组需要进行分工开发,最后将所有的代码合并起来,组成一个完整的项目。
    如图:

    所有的这些分支(branch)最开始都是从主干(trunk)拷贝而来的,当这些分支完成某一个阶段的任务后,就可以向主干进行合并。(注:svn几乎所有的操作都是联网的,这与Git不同)

    如何创建分支(branch)?
    分支最开始就是主干的拷贝体,所以可以通过svn copy命令创建分支:

    svn copy 地址1 地址2 -m 注释

    其中地址1就是拷贝的源地址,地址2就是拷贝的目标地址。
    SVN客户端提供图形化界面的操作方式:


    在To path一栏,选择要创建的路径,该路径之前是不应该存在的。

    在创建好分支后,就可以通过分支仓库来开发代码,等主干需要合并分支代码时(或相反),就可以通过merge来完成。
    SVN客户端同样提供了图形化界面的操作方式:
    在主干的仓库下,合并我们刚才创建好的分支


    选择需要合并的分支。

    如果主干需要创建当前文档的备份信息,那么可以创建一个标签(tag)。标签同样也是文档的拷贝体,所以也可以通过svn copy来创建其标签,svn copy的具体语法笔者就不再赘述了。
    SVN客户端同样提供了创建标签的图形化界面:



    分支和主干的概念是相对的,父分支也是子分支的主干,合并同理。标签不是只能用于主干,而且可以用于任何有权限能够创建备份的地方。

  • 相关阅读:
    C. Uncle Bogdan and Country Happiness solution
    B
    A
    Problem of Precision solution
    hdu-2255 D
    hdu1325 Is It A Tree? solution
    一体化办公系统
    dx:ASPxGridView 批量删除
    linq 多表查询出现‘查询包含对不同数据上下文上所定义项的引用。’
    DevExpress学习笔记之ASPxMenu
  • 原文地址:https://www.cnblogs.com/HDK2016/p/7115502.html
Copyright © 2011-2022 走看看