• 【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客户端同样提供了创建标签的图形化界面:



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

  • 相关阅读:
    UVALive 7509 Dome and Steles
    HDU 5884 Sort
    Gym 101194H Great Cells
    HDU 5451 Best Solver
    HDU 5883 The Best Path
    HDU 5875 Function
    卡特兰数
    UVa 11729 Commando War 突击战
    UVa 11292 The Dragon of Loowater 勇者斗恶龙
    Spark Scala Flink版本对应关系
  • 原文地址:https://www.cnblogs.com/HDK2016/p/7115502.html
Copyright © 2020-2023  润新知