一、安装配置SVN服务

1.1准备操作系统环境并查看操作系统。

[root@lab-2-C6 ~]# cat /etc/redhat-release CentOS release 6.5 (Final)
[root@lab-2-C6 ~]# uname -mx86_64
[root@lab-2-C6 ~]# uname -r2.6.32-431.el6.x86_64

1.2安装SVN
功能性的东西,没有特殊需求,就直接yum安装,不要去编译。
①检查subversion是否安装了,如果没有安装的话那么就yum安装一下

[root@lab-2-C6 ~]# rpm -qa subversion
[root@lab-2-C6 ~]# yum install -y subversion


1.3配置并启动SVN
建立SVN数据存储根目录(svndata)及用户、密码权限目录(svnpasswd)
当然创建这个目录并不是必须的

[root@lab-2-C6 ~]# ll /svn
总用量 8
drwxr-xr-x. 2 root root 4096 5月  27 08:27 svndata
drwxr-xr-x. 2 root root 4096 5月  27 08:27 svnpasswd


启动SVN服务并制定服务的SVN根目录

[root@lab-2-C6 ~]# svn          //如果是yum安装的话,打上svn再按两下tab就能查到
svn            svndumpfilter  svnserve       svnversion     
svnadmin       svnlook        svnsync        
[root@lab-2-C6 ~]# svnserve --help
usage: svnserve [-d | -i | -t | -X] [options]
Valid options:                     //这里把常用的列出来了,如果有需要你们可以去查看
  -d [--daemon]            : daemon mode    //守护进程模式
  -r [--root] ARG          : root of directory to serve    //指定存储根目录
                             [mode: daemon]
  --log-file ARG           : svnserve log file
  --pid-file ARG           : write server process ID to file ARG    //指定存放进程号的位置
[root@lab-2-C6 ~]# svnserve -d -r /svn/svndata/
[root@lab-2-C6 ~]# ps aux | grep svn | grep -v grep
root        941  0.0  0.0 152856   736 ?        Ss   08:38   0:00 svnserve -d -r /svn/svndata/
[root@lab-2-C6 ~]# netstat -tnlup | grep svn
tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      941/svnserve

二、配置SVN

1.建立项目版本库
       创建一个新的Svn项目,名字叫做sadoc。其实类似sadoc这样的项目可以创建多个,每隔一项目对应不同的代码,这里知识创建一个项目作为演示
       首先我们可以通过help来查看svn命令的用法,比如:

[root@lab-2-C6 ~]# svnadmin help
一般用法: svnadmin SUBCOMMAND REPOS_PATH  [ARGS & OPTIONS ...]
使用“svnadmin help <subcommand>” 得到子命令的帮助信息。
使用“svnadmin --version”查看程序的版本号和文件系统模块。

可用的子命令: 
   crashtest
   create
   deltify
   dump
   help (?, h)
   hotcopy
   list-dblogs
   list-unused-dblogs
   load
   lslocks
   lstxns
   pack
   recover
   rmlocks
   rmtxns
   setlog
   setrevprop
   setuuid
   upgrade
   verify

那么,现在我要创建目录,那么我就看看svnadmin create怎么用的

[root@lab-2-C6 ~]# svnadmin help create
create: 用法: svnadmin create REPOS_PATH
在 REPOS_PATH 创建一个新的空版本库。
有效选项: 
  --bdb-txn-nosync         : 在提交事务时禁用fsync [BDB]
  --bdb-log-keep           : 禁用自动删除日志文件 [BDB]
  --config-dir ARG         : 从目录 ARG 读取用户配置文件
  --fs-type ARG            : 版本库类型: “fsfs”(默认)或“bdb”
  --pre-1.4-compatible     : 使用与1.4之前版本兼容的格式
  --pre-1.5-compatible     : 使用 Subversion 1.5 之前版本的格式
  --pre-1.6-compatible     : 使用与 1.6 之前版本兼容的格式

查看完用法以后我们就可以开始创建新的版本库了

[root@lab-2-C6 ~]# svnadmin create /svn/svndata/sadoc  #//注意:这里的这个目录是不可以使用mkdir来创建的,因为这是svn的版本库,svn要进行初始化会生成很多文件
[root@lab-2-C6 ~]# ll /svn/svndata/
总用量 4
drwxr-xr-x. 6 root root 4096 5月  27 08:48 sadoc

接下来,看一下树状图,conf(配置文件),db,hook(钩子),lock锁。

[root@lab-2-C6 ~]# tree /svn/svndata/
/svn/svndata/
└── sadoc
    ├── conf
    │   ├── authz
    │   ├── passwd
    │   └── svnserve.conf
    ├── db
    │   ├── current
    │   ├── format
    │   ├── fsfs.conf
    │   ├── fs-type
    │   ├── min-unpacked-rev
    │   ├── rep-cache.db
    │   ├── revprops
    │   │   └── 0
    │   │       └── 0
    │   ├── revs
    │   │   └── 0
    │   │       └── 0
    │   ├── transactions
    │   ├── txn-current
    │   ├── txn-current-lock
    │   ├── txn-protorevs
    │   ├── uuid
    │   └── write-lock
    ├── format
    ├── hooks
    │   ├── post-commit.tmpl
    │   ├── post-lock.tmpl
    │   ├── post-revprop-change.tmpl
    │   ├── post-unlock.tmpl
    │   ├── pre-commit.tmpl
    │   ├── pre-lock.tmpl
    │   ├── pre-revprop-change.tmpl
    │   ├── pre-unlock.tmpl
    │   └── start-commit.tmpl
    ├── locks
    │   ├── db.lock
    │   └── db-logs.lock
    └── README.txt
11 directories, 28 files


2. 调整SVN配置文件及权限文件
进入配置文件目录查看

[root@lab-2-C6 ~]# cd /svn/svndata/sadoc/conf/
[root@lab-2-C6 conf]# ll
总用量 12
-rw-r--r--. 1 root root 1080 5月  27 08:48 authz
-rw-r--r--. 1 root root  309 5月  27 08:48 passwd
-rw-r--r--. 1 root root 2279 5月  27 08:48 svnserve.conf

 主要有三个文件,svnserver.conf这个是主配置文件,passwd是用户和密码文件,authz这个是权限的管理文件。svnserve.conf包含passwd和authz。

[root@lab-2-C6 conf]# cp svnserve.conf svnserve.conf.bak
[root@lab-2-C6 conf]# vim svnserve.conf
 12 anon-access = none 
 13 auth-access = write 
 20 password-db = /svn/svnpasswd/passwd  //默认是passwd 
 27 authz-db = /svn/svnpasswd/authz      //默认是authz

使用vim打开svnserve.conf这个配置文件,使用set nu查看行号,然后把对应上面的几行改成一样的配制,之前说过svndata和svnpasswd这两个目录的创建并不是必须的,之所以去创建这两个目录 是为了方便统一管理。(注意去掉注释以后,配置命令必须顶格写,不然可能会出现一些奇葩的问题,所以还是按照规范来比较好)

上面的操作也可以使用sed来替换。

sed -i 's/# auth-access = write/auth-access = write' svnserver.conf
sed -i 's/# aono-access =read/anon-access = none/' svnserver.conf
sed -i 's%# password-db = passwd%password-db = /svn/svnpasswd/passwd%' svnserve.conf
sed -i 's%# authz-db = authz%authz-db = /svn/svnpasswd/authz%g' svnserver.conf

虽然我们在配置文件中把目录指定过去了,但是实际上在我们指定的目录中是没有任何文件的,因此我们要把文件模版拷过去一份。

[root@lab-2-C6 conf]# cp passwd  authz  /svn/svnpasswd/
[root@lab-2-C6 conf]# ll /svn/svnpasswd/
总用量 8
-rw-r--r--. 1 root root 1080 5月  27 10:57 authz
-rw-r--r--. 1 root root  309 5月  27 10:57 passwd

现在我们发现现在文件的权限是644,谁都能看,所以首先修改一下权限

[root@lab-2-C6 conf]# chmod 700 /svn/svnpasswd/*
[root@lab-2-C6 conf]# ll /svn/svnpasswd/
总用量 8
-rwx------. 1 root root 1080 5月  27 10:57 authz
-rwx------. 1 root root  309 5月  27 10:57 passwd

3.为SVN版本库创建用户并授权访问指定项目版本库

[root@lab-2-C6 conf]# vim /svn/svnpasswd/passwd 
### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.
[users]
# harry = harryssecret
# sally = sallyssecret
chenhaiyin = 12345678
chenrongrong = 12345678

这里我添加了两个用户,添加用户的话按照它的模版来就可以了。
提示:①等号前为SVN帐号,等号后为SVN密码,密码是明文的,注意密码权限
           ②更改svnserver.conf时,需要重启SVN,更改authz,passwd文件时则不需要

版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名>=<权限>
<用户名>=<权限>
其中,方框号内部分可以有多种写法:
[/],表示根目录及以下,根目录是svnserve启动时指定的,我们指定为/svn/svndata,[/]就是表示对全部版本库设置权限
[repos:/],表示对版本库repos设置权限;
[repos:/sadoc],表示对版本库repos中的sadoc项目设置权限;
[repos:/sadoc/lamber],表示对版本库repos中的sadoc项目的lamber目录设置权限;
权限主体可以是用户组、用户或者是*,用户组在前面添加@,*表示全部用户。
权限可以是w、r、wr和空,空表示没有任何权限。
authz中的每个参数都要顶格写,开头不能有空格。对于组,要以@开头,用户则不需要

[root@lab-2-C6 conf]# vim authz 
### This file is an example authorization file for svnserve.
### Its format is identical to that of mod_authz_svn authorization
### files.
### As shown below each section defines authorizations for the path and
### (optional) repository specified by the section name.
### The authorizations follow. An authorization line can refer to:
###  - a single user,
###  - a group of users defined in a special [groups] section,
###  - an alias defined in a special [aliases] section,
###  - all authenticated users, using the '$authenticated' token,
###  - only anonymous users, using the '$anonymous' token,
###  - anyone, using the '*' wildcard.
###
[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
ziyuanzu = chenhaiyin,chenrongrong
[sadoc:/]
@ziyuanzu = rw
chenhaiyin = rw
chenrongrong =r

 这里我起了一个组叫做ziyuanzu,然后把用户扔进来,不同用户之间用逗号隔开,然后再[sadoc:/]下直接给用户组授权,这样可以进行统一管 理,那么我们也可以在库下直接给单个用户授权,就像我注释掉chenhaiyin和chenrongrong,都可以给予单独的权限。
有几个需要注意的地方:

①权限配置文件中出现的用户必须在配置文件中已经定义过
②权限配置文件的修改立即生效没不必要重启SVN

[root@lab-2-C6 conf]# ps aux | grep svn | grep -v grep
root        941  0.0  0.0 152856   872 ?        Ss   08:38   0:00 svnserve -d -r /svn/svndata/
[root@lab-2-C6 conf]# pkill svnserve
[root@lab-2-C6 conf]# ps aux | grep svn | grep -v grep
[root@lab-2-C6 conf]# svnserve -d -r /svn/svndata/
[root@lab-2-C6 conf]# ps aux | grep svn | grep -v grep
root       1062  0.0  0.0 152856   740 ?        Ss   11:34   0:00 svnserve -d -r /svn/svndata/


三、客户端安装

1.windows客户端安装

我这里使用的是TortoiseSVN,可以自己下载汉化包打补丁。默认是英文
下面就以Tortoise为例说明一下

①首先安装好以后,先创建一个文件夹,这时你去在文件夹下右键直接点击check out,之后他会要求你去输入相关的地址,我们这里使用的就是:svn://我的服务器IP/sadoc(这里是库名)
②输入完成以后会要求你输入用户名密码,这里就把咱们之前在配置文件中定义的用户名和密码输入进去吧。

SVN配置_svn

③这样就算是操作成功了,那么我向这个同步文件夹里放一点东西,然后再文件夹图标上右键点击SVN commit,会看到文件在刷刷的同步!

SVN配置_Linux_02

④同步完成以后,我们可以直接再本地查看是否已经正常同步到服务器,本地同步文件夹右击,选择TortoiseSVN→Repo Browser即可查看!


每回使用的时候先SVN Update一下。确保你的内容是最新的

在windows里面,SVN有一个缺省目录:%APPDATA%\Subversion\auth的三个子目录内保存认证信息:

①svn.simple:包含基本认证方式所需要的认证信息,密码通过Wincrypt API加密。不是文本的形式。

②svn.ssl.server:包含SSL服务器证书

③svn.username:包含用户名认证的认证信息(不需要提供密码)


进度会话框使用颜色来高亮显示标识不同的提交行为:

蓝色→提交一个修改

紫色→提交一个新增项

深红→提交一个删除或是替换

黑色→所有其他项

这些都是默认设置,我们都可以自定义


删除文件:直接再本地删除然后commit就ok
查看历史版本:右击同步文件夹→show log
并且我们可以通过某一次历史版本查看文档发生了什么变化,如下图所示

SVN配置_svn_03

那么如果版本库地址发生了变化该怎么更换地址呢?


右击同步文件夹→TortoiseSVN→Relocate,修改地址确认提交即可!


错误:

svnserve.conf:12: Option expected

解决:

因为subversion读取配置文件svnserve.conf时,无法识别有前置空格的配置文件,所以删除空格即可


2.linux客户端安装

把linux做为SVN客户端,所以你操作的并不一定是SVN的服务器那台,以后如果说我要定时自动发布代码等等,这时候就要用到脚本了,所以接下来的也是很重要的
首先安装SVN,步骤同上,在此就不在赘述。


 同步文件,checkout

[root@lab-2-C6 conf]#svn co svn://192.168.1.202/sadoc /data/svndata/ --username=我的用户名 --password=我的密码
-----------------------------------------------------------------------
注意!  你的密码,对于认证域:   <svn://23.110.85.249:3690> 68cfb7eb-c123-4643-8825-8a067020e3f4只能明文保存在磁盘上!
  如果可能的话,请考虑配置你的系统,让 Subversion可以保存加密后的密码。请参阅文档以获得详细信息。
 你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”,来避免再次出现此警告。
 -----------------------------------------------------------------------
 保存未加密的密码(yes/no)?yes
/data/svndata/LinuxA    
/data/svndata/Linux/4.Linux企业问题集.docxA    
/data/svndata/Linux/~$Linux基础整合.docxA   
/data/svndata/Linux/2.Linux简单服务搭建.docx取出版本 9。

如果checkout过程中遇到如下报错!
svn:Can't convert string from 'UTF-8' to native encoding:
造成这种情况的原因就是字符集不对,可以查看如下帖子解决字符集问题:
http://www.cnblogs.com/xuxm2007/archive/2010/10/26/1861223.html
或者:
export LC_CTYPE="en_US.UTF-8"
export LC_ALL=
打上这两条命令

假如说版本库内容更新了,现在我要Update我的SVN目录

[root@lab-2-C6 conf]# [root@lamber svndata]# svn update svn://192.168.1.202/sadoc /data/svndata/ --username=我的用户名 --password=我的密码
跳过“svn://23.110.85.249/sadoc”
A    /data/svndata/资源清单.txt
U    /data/svndata/华为IE资料/1.网络基础.docx
更新到版本 10。
冲突概要:
  跳过的路径:1

查看svn中的数据

[root@lab-2-C6 conf]# svn ls svn://192.168.1.202/sadoc --username=我的用户名 --password=我的密码
Linux/
下载链接文档.txt
代理软件/
华为IE资料/
资源清单.txt

从本地的提交数据到SVN

[root@lab-2-C6 svndata]# touch linux_client
[root@lab-2-C6 svndata]# svn add linux_client 
A         linux_client
[root@lab-2-C6 svndata]# svn ci -m "commit data"
增加           linux_client
传输文件数据.
提交后的版本为 11。
其中:
 -m [--message] ARG       : 指定日志信息ARG   //不添加这个-m参数是会报错的!

3.SVN目录树

一般比较规范的SVN它会有三个目录,分别为:
/svn/trunk:主干
/svn/branch:个人或者团队开发的分支
/svn/tag:标记版本,比如某一个版本开发ok了。
那么好,现在我要创建三个这样的目录,然后我要导入到版本库中去,这里会用到的是import命令
import:将未纳入版本控制的文件或目录树提交到版本库。要分清楚它和commit的区别,commit指的是把工作副本的修改提交到版本库。
再来看看add:把文件和目录纳入版本控制,通过调度加到版本库。它们会在下一次提交时加入

[root@lab-2-C6 svndata]# mkdir -p svn/{trunk,branch,tag}
[root@lab-2-C6 svndata]# svn import ./svn  svn://192.168.1.202/sadoc  --username=我的用户名 --password=我的密码 -m "import"
增加           svn/trunk
增加           svn/tag
增加           svn/branch
提交后的版本为 12。

现在我把主干的东西拷贝到一个分支(这个命令并不常用。。如果在windows上的话这个其实就是点点点的操作)

[root@lamber svndata]# svn copy svn://192.168.1.202/sadoc/trunk svn://192.168.1.202/sadoc/branch/branch1 -m "create a branch" --username=我的用户名 --password=我的密码
提交后的版本为 13。

更新后去查看这个分支:

 [root@lamber svndata]# ll branch/
总用量 4
drwxr-xr-x. 3 root root 4096 7月  24 22:15 branch1

还记得之前在配置文件中我们怎么写的么?
[sadoc:/]
这里指的意思是直接把根的权限给了,我们为了便于管理和权限把控可以把权限细化到版本库中的相应目录