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/目录下与特定版本库相关的文件。
1、svn架设、基本命令的更多相关文章
- 我的TDD实践---SVN架设篇
我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭 ...
- svn 架设
1.yum install subversion openssl-devel -y 2. cd /data/svn 3. svnadmin create remote 4. 编辑conf 下 aut ...
- SVN在eclipse的整合应用
目前很多的Java.Flex.Android开发人员是用eclipse作为开发工具的,本文主要介绍SVN在eclipse平台中的整合应用. 我的eclipse版本是Version: 3.4.2.本身没 ...
- 版本管理工具SVN学习(一):简单的SVN命令,兼对比Git
新公司用SVN来管理代码,而且公司自己搭建了SVN服务器,所以要学习下SVN的相关命令.服务器搭建等技能知识.上家公司是用Git管理代码,而且代码托管在git@oschina上,自然不用操心Git服务 ...
- linux svn配置与使用
svn错误码对照表: http://docs.sharpsvn.net/current/html/T_SharpSvn_SvnErrorCode.htm https://www.cnblogs ...
- 版本控制工具 svn 一
一.svn 概述 1).svn的作用 1.多人协作开发:2.远程控制:3.版本控制 2).软件控制管理工具发展之路 SCM:软件配置管理,所谓的软件配置管理实际就是软件源代码的 控制与管理. CVS: ...
- 基于阿里云server搭建SVNserver
基于阿里云server搭建SVNserver 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/8577 ...
- 我的TDD实践---UnitTest单元测试
我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...
- CI持续集成
CI持续集成 “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先 ...
随机推荐
- libudev-dev : Depends: libudev0 (= 175-0ubuntu9) but 175-0ubuntu9.3 is to be installed 错误解决方案
libudev-dev : Depends: libudev0 (= -0ubuntu9) but -0ubuntu9. is to be installed 错误解决方案 参考文章: 1. ubun ...
- “App Store加载失败,使已购页面再试一次”解决方案
问题描述: 用A账户登陆App Store,下载了Xcode.还没有下载完就需要更换账户 更换账户 找到App Store界面上部的商店,选择注销,然后再登陆. 账户更换完毕,讲道理来说应该是可以下载 ...
- scala学习笔记(9): 语法续
1 不定长参数 def sum(args: Int*) = { var result = 0 for ( arg <- args) result += arg result } 2 数组初始化 ...
- HDU2161
解题思路:判断素数模板题. #include<cstdio> #include<cstring> #include<algorithm> using namespa ...
- Android:BroadcastReceiver
参考:<第一行代码:Android> 郭霖(著) Broadcast分类 注册方式: 动态广播 在代码中注册receiver 一定要手动在onDestroy()时调用unregiste ...
- for循环使用append问题
append添加到元素的时候,已存在的元素是移动而不是复制,使用了遍历,所以第一次是新增,后面都是移动前面新增的,最后当然就出现了只有最后一项有东西.解决办法:1.不要遍历,使用jQuery的类选择器 ...
- sssp-springmvc+spring+spring-data-jpa问题总结
问题:Caused by: java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to re ...
- HTTP请求报头及其处理
ps:详细说明http://www.cnblogs.com/kkgreen/archive/2011/04/11/2012829.html
- POJ3422 Kaka's Matrix Travels 【费用流】*
POJ3422 Kaka's Matrix Travels Description On an N × N chessboard with a non-negative number in each ...
- 20179223《Linux内核原理与解析》第六周学习笔记
视频知识学习 给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.再main()函数中增加MenuConfig 3.增加对应的Time函数和TimeAsm函数(这里的函 ...