1、svn架设、基本命令

SVN是Subversion的简称,是一个开放源代码的版本控制系统。是一项十分基础,必须能够熟练使用的工具。Apache网站:https://subversion.apache.org/

采用C/S模式,在svn服务器中构建版本库(一个或者是多个),各个用户通过“用户名/密码”登陆指定的版本库,然后“检出”(checkout)特定版本库中的文件/文件夹,在本地修改以后可以“提交”(commit)到服务器版本库中保存,在修改之前可以先从服务器端“更新”(update)数据。

一、解释几个概论分别对应于svn的几个基本命令/操作)

检出:从svn服务器中下载版本库中的资源文件到本地svn客户端。比如,新员工加入项目组就需要将项目文件checkout到本地。

提交:将本地修改后的资源文件提交到svn服务器版本库中,服务器为每个资源文件维护了一个版本号,修改提交以后其版本号会增加。比如,下班之前将一天的修改commit到服务器中。

更新:在修改之前需要将服务器中高版本的文件同步到本地(同时存在多个人修改和提交同一个资源文件)。比如,上班前需要将别人昨天提交的修改update到自己电脑上,然后再开始一天的工作。

二、安装服务器端以及客户端程序

服务器配置环境:阿里云服务器,操作系统CentOS7,IP(假定) 127.0.0.1

软件安装:https://subversion.apache.org/ 网站左侧有一个 Binary Packages 的超链接,进入,选择版本为CentOS Linux,页面会告诉你安装svn的server/client的具体方法:

$ yum install subversion     #安装server
$ yum install mod_dav_svn    #安装client

测试是否安装成功(打印出版本号,说明环境变量等没有问题):

$ svnserve --version         #查看server版本号
$ svn --version        #查看client版本号

三、创建svn版本库

现在假设有三个项目,分别是ProjA,ProjB和ProjC。启动一个svn服务可以同时管理多个版本库,因此我们不需要为每一个项目都启动一个svn服务。

1、创建一个版本库根目录,使linux命令(此时的 ~/.svnrepos还没有归svn管理):

$ mkdir .svnrepos                #当前所在路径为用户home目录

2、在版本库根目录下创建各个项目自己的版本库,使用 svnadmin create ... 命令

$ svnadmin create ~/.svnrepos/ProjA
$ svnadmin create ~/.svnrepos/ProjB
$ svnadmin create ~/.svnrepos/ProjC

此时svn自动为我们在~/.svnrepos目录下面创建了ProjA、ProjB和ProjC三个文件夹,每个文件夹对应一个特定的版本库

进入到其中任何一个,我们发现其下都包含了conf  db  format  hooks  locks  README.txt这几个文件/文件夹。

此时,~/.svnrepos目录下面的ProjA、ProjB和ProjC三个文件夹都归svn所管理了。下面说说各个文件/文件夹的功能:

conf文件夹:存放具体版本库相关的配置文件,包含有authz  passwd  svnserve.conf三个配置,其具体功能后面详细介绍。

db文件夹:存放版本资源文件。

hooks文件夹:存放版本库的钩子程序(很灵活),比如:要求每次更新都向指定的邮箱发送一封邮件。

locks文件夹:存储库锁目录,用来跟踪库的访问者。

format文件:存储一个整数的文件,此整数代表库层次结构版本。

四、配置各个版本库的权限(以ProjA版本库为例)

~/.svnrepos/ProjA/conf目录下有authz  passwd  svnserve.conf三个文件。下面分别介绍每个文件的功能及配置方法:

①、passwd文件用于配置登陆该版本库的用户名和密码,配置方式为“用户名=密码”。现在为ProjA添加3个用户tom、jerry和lilei

②、authz文件与用户权限配置相关。此文件主要有如下一些与权限相关的配置:

[aliases]

[groups]

# [/foo/bar]

# [repository:/baz/fuz]

用中括号括起来的内容表示一个标记。

[aliases]是别名标记,相当于编程语言中的变量,后面的标记可以通过&来引用它的值。如:

[aliases]
t=tom            #后面可以通过&t来引用到tom

[groups]是用户组标记,所谓用户组,顾名思义,就是一个成员组,一般情况下,在同一个成员组的人员享有同样的权力,比如读,写权。前面在passwd中添加了3个用户,现在将其分为两组:开发组dev_group、测试组test_group。开发组有“读、写”权限,测试组只有“读”权限,如下:

[groups]
dev_group=jerry,&t        #通过&t来引用[aliases]下面定义的别名
test_group=lilei

接下来为特定版本库分配权限,此时的conf是位于ProjA中,我们就写[/]。

等号右边:r表示读权限,w表示写权限,空白表示既没有读权限也没有写权限

等号左边:&引用别名值,@引用用户组,也可以直接写用户名,*表示除了上面定义之外。如:tom

[/]              #表示下面是对ProjA版本库做的权限规定
@dev_group=rw         #开发组赋予读写权限
@test_group=r         #测试组赋予读权限
*=                    #其它用户没有访问权

③、svnserve.conf文件是真正的配置文件,[general]标签下面有如下的一些被注释掉的配置项:

# anon-access = read  ,  规定匿名用户的权限“read”表示只读,“write”可读可写,“none”表示没有访问权限

# auth-access = write  ,  登陆用户的访问权限,一般来讲不会配置为none,登陆了以后什么也干不了就么有意思了

# password-db = passwd  ,  指定用户名和密码的配置文件,直接写passwd就可以

# authz-db = authz  ,  指定权限配置文件,直接写authz就可以

# realm = My First Repository  ,  给该版本库指定一个名字,如果不指定,则默认为repository's uuid号

配置svnserve.conf文件的时候有一个特别需要注意的地方等号左侧必须顶格写,不能留空格等号两边必须有一个空格等号右侧末尾不能有注释等其它内容。配置如下:

anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

五、启动svn服务

启动svn服务,为了能够同时管理多个版本库,svn服务器启动时只需要指定版本库的根目录

$ svnserve -d -r ~/.svnrepos        #-d表示后台执行,-r指定目录。这里的~/.svnrepos是版本库的根目录(也可以指定到具体的版本库目录上)。

 查看服务是否启动成功

$ ps aux | grep svn

六、命令行客户端的简单操作(解释客户端与服务器之间的联系)

①、检出checkout

#将ProjA版本库检出到~/workspace/ProjA文件夹下,svn是协议,类似于http协议。默认会连接3690端口
$ svn checkout svn://127.0.0.1/ProjA ~/workspace/ProjA   

到目前为止我们并没有向svn服务器中的ProjA版本库中添加任何文件,但是通过检出操作我们可以看见~/workspace/ProjA 目录下面多了一个隐藏文件夹.svn,这个文件夹及其重要,不能删除,后续的操作就是通过这个隐藏文件中记录的信息来将客户端与服务器端的特定版本库联系在一起的。也就是说,~/workspace/ProjA是靠其目录下的.svn来与127.0.0.1(当然也可以是远程服务器IP)中的ProjA版本库建立联系的。

②、在~/workspace/ProjA文件夹中新创建一个文件hello.txt,并将其纳入到svn版本控制中

$ touch hello.txt         #linux命令创建一个hello.txt文件,可以vi写入内容
$ svn add hello.txt       #将hello.txt文件纳入到版本控制系统中

③、提交commit

$ svn commit -m "第一次提交" hello.txt    #-m参数指定提交注解

④、更新update

$ svn update hello.txt 

我们发现,②~④命令中都没有携带IP和版本库相关信息,却能够默认的对远程ProjA版本库进行操作,其原因就是在检出操作的时候建立了一种特定联系,并将联系信息保存在了.svn文件夹中

七、路径问题(重要,需要理解)

在这么多命令中,只有检出命令需要指明版本库路径。那么,指定路径有什么讲究吗?

$ svn checkout svn://IP/子目录 本地路径

“svn://IP/子目录”需要指定到具体的版本库上面,也就是说其指定的文件夹必须包含有“conf  db  format  hooks locks  README.txt”这些内容。

我们先回忆一下前面创建版本库的过程:svnadmin create ~/.svnrepos/ProjA

启动svnserve的过程:svnserve -d -r ~/.svnrepos

再来看看svn checkout命令中远程路径问题

“svn://IP”   等价于  “svnserve命令中-r参数指定的路径”

也就是说,

①如果用 “svnserve -d -r ~/.svnrepos” 来启动,则 “svn://IP” 等价于 “~/.svnrepos”;

②如果用 “svnserve -d -r ~/.svnrepos/ProjA” 来启动,则 “svn://IP” 等价于 “~/.svnrepos/ProjA”;

“svn://IP/子目录”必须指定到包含有“conf  db  format  hooks locks  README.txt”的文件夹上面,则

①如果用 “svnserve -d -r ~/.svnrepos/ProjA” 来启动,检出操作不需要指定“子目录”,即“svn checkout svn://IP 本地路径”即可;

②如果用 “svnserve -d -r ~/.svnrepos” 来启动,检出操作需要指定某个“子目录”,如,ProjA或ProjB,即“svn checkout svn://IP/ProjA 本地路径”或者是“svn checkout svn://IP/ProjB 本地路径”

八、保存了错误密码导致检出失败,同时也不会再次让你输入用户名和密码

的确存在这样一个怪异的问题。解决办法:

删除~/.subversion/auth/svn.simple/目录下与特定版本库相关的文件。

原文地址:https://www.cnblogs.com/lj95801/p/5481408.html