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/目录下与特定版本库相关的文件。

1、svn架设、基本命令的更多相关文章

  1. 我的TDD实践---SVN架设篇

    我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭 ...

  2. svn 架设

    1.yum install subversion  openssl-devel -y 2. cd /data/svn 3. svnadmin create remote 4. 编辑conf 下 aut ...

  3. SVN在eclipse的整合应用

    目前很多的Java.Flex.Android开发人员是用eclipse作为开发工具的,本文主要介绍SVN在eclipse平台中的整合应用. 我的eclipse版本是Version: 3.4.2.本身没 ...

  4. 版本管理工具SVN学习(一):简单的SVN命令,兼对比Git

    新公司用SVN来管理代码,而且公司自己搭建了SVN服务器,所以要学习下SVN的相关命令.服务器搭建等技能知识.上家公司是用Git管理代码,而且代码托管在git@oschina上,自然不用操心Git服务 ...

  5. linux svn配置与使用

      svn错误码对照表: http://docs.sharpsvn.net/current/html/T_SharpSvn_SvnErrorCode.htm   https://www.cnblogs ...

  6. 版本控制工具 svn 一

    一.svn 概述 1).svn的作用 1.多人协作开发:2.远程控制:3.版本控制 2).软件控制管理工具发展之路 SCM:软件配置管理,所谓的软件配置管理实际就是软件源代码的 控制与管理. CVS: ...

  7. 基于阿里云server搭建SVNserver

    基于阿里云server搭建SVNserver 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/8577 ...

  8. 我的TDD实践---UnitTest单元测试

    我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...

  9. CI持续集成

    CI持续集成 “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先 ...

随机推荐

  1. kubeadm搭建kubernetes集群之二:创建master节点

    在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...

  2. [转载][QT][SQL]sql学习记录5_sqlite视图(View)

    转载自:http://www.runoob.com/sqlite/sqlite-view.html SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLi ...

  3. SVM处理多分类问题(one-versus-rest和one-versus-one的不同)

    SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器. 目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一 ...

  4. BZOJ3963: [WF2011]MachineWorks 【CDQ+斜率优化DP】*

    BZOJ3963: [WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...

  5. 使用 Visual Studio Code(VSCode)搭建简单的 Python + Django 开发环境

    写在前面的话 作为有个 Python 菜逼,之前一直用的 Pycharm,但是在主题这一块怎么调整都感觉要么太骚,看起来不舒服,要么就是简直不能看.似乎用大 JB 公司 IDE 的人似乎都不怎么重视主 ...

  6. 【数据库】sql连表查询

    SQL总结 连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两 ...

  7. web.xml中配置classpath:和classpath*:的区别和意思

    首先 classpath是指 WEB-INF文件夹下的classes目录 解释classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties s ...

  8. python模块--os模块、sys模块

    一.os模块 1 os.getcwd() 获取当前工作的目录,即当前python脚本工作的目录路径 2 3 os.chdir("dirname") 改变当前脚本的工作目录:相当于s ...

  9. wordpress上传文件,插件无法建立目录(根本原因解决)

    刚建立的wp网站经常遇到上传图片或者下载插件“无法建立目录”的问题,肯定是权限的问题,网上大部分解决方案都是把uploads或者 plugins权限手动改成777, 有一部分人成功了,有一部分没成功, ...

  10. C#String地址、拼接性能学习

    String类型不可变.定义string变量时会在堆上分配存储空间,而对该变量进行值变更时会重新分配一个存储空间,且保留原存储空间. 测试思路:获取string类型变量值变更前后的存储空间地址,判断地 ...