SVN – 搭建 SVN 服务器 && 多项目分别建立版本库 && 同步至生产环境

1、安装Subversion

 

[root@VM_centos /]# yum install subversion

 

2、找一下安装位置

 

[root@VM_centos /]# rpm -ql subversion
/etc/bash_completion.d
/etc/bash_completion.d/subversion
/etc/rc.d/init.d/svnserve
/etc/subversion
/usr/bin/svn
/usr/bin/svnadmin
/usr/bin/svndumpfilter
/usr/bin/svnlook
/usr/bin/svnserve
/usr/bin/svnsync
/usr/bin/svnversion
...
...
...

 

然后可以稍微看一下帮助

 

[root@VM_centos /]# svn --help
usage: svn <subcommand> [options] [args]
Subversion command-line client, version 1.6.11.
Type 'svn help <subcommand>' for help on a specific subcommand.
Type 'svn --version' to see the program version and RA modules
  or 'svn --version --quiet' to see just the version number.
 
Most subcommands take file and/or directory arguments, recursing
on the directories.  If no arguments are supplied to such a
command, it recurses on the current directory (inclusive) by default.
 
Available subcommands:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)

 

3、创建SVN版本库目录

 

[root@VM_centos /]# mkdir -p /home/svn/test

 

 

checkout时,提示:URL svn://192.168.1.99/svntest doesn't exist...

 

奇怪,怎么会提示库不存在呢?肯定是哪里配置问题。后来尝试了半天,也在网上搜索了很久,终于发现问题所在。

如果你的svn库的路径为:/home/svn/svntest

那么你启动时,不能用命令:

svnserve -d -r /home/svn/svntest

而要用命令:

svnserve -d -r /home/svn/

 

4、创建版本库

 

 

[root@VM_centos test]# svnadmin create /home/svn/test

 

那么在/home/svn/test下面出现了这几个东西

 

[root@VM_centos /]# ll
total 24
-rw-r--r-- 1 root root  229 Oct 27 18:21 README.txt
drwxr-xr-x 2 root root 4096 Oct 27 18:21 conf
drwxr-sr-x 6 root root 4096 Oct 27 18:21 db
-r--r--r-- 1 root root    2 Oct 27 18:21 format
drwxr-xr-x 2 root root 4096 Oct 27 18:21 hooks
drwxr-xr-x 2 root root 4096 Oct 27 18:21 locks

 

5、接下来进行一些配置

首先让我们看一下conf目录下都是些什么货

 

[root@VM_centos test]# ll conf/
total 12
-rw-r--r-- 1 root root 1080 Oct 27 18:21 authz // 权限控制
-rw-r--r-- 1 root root  309 Oct 27 18:21 passwd // 账号密码
-rw-r--r-- 1 root root 2279 Oct 27 18:21 svnserve.conf // SVN服务配置

 

然后设置下账号密码

vim

 

[root@VM_centos conf]# vim 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.
<p>[users]</p><p># harry = harryssecret</p><p># sally = sallyssecret</p>

在“[users]”中添加用户名密码,格式:用户名=密码,如下:

Vim

### 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
test    = 709fyfHWPb5A
 

 

设置权限

Vim

 

[root@VM_centos 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.
###
### A match can be inverted by prefixing the rule with '~'. Rules can
### grant read ('r') access, read-write ('rw') access, or no access
### ('').
 
[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

 

在文件末尾增加下面的东西:

vim

 

[/]
test=rw
otheruser=r
# ...
# 意思就是
# [/] 在版本库的根目录下

 

修改svnserve.conf文件

Vim

 

[root@VM_centos conf]# vim svnserve.conf
### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)
 
### Visit http://subversion.tigris.org/ for more information.
 
[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
# anon-access = read
# auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
# password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the the
### directory containing this file.  If you don't specify an
### authz-db, no path-based access control is done.
### Uncomment the line below to use the default authorization file.
# authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
# realm = My First Repository
 
[sasl]
### This option specifies whether you want to use the Cyrus SASL
### library for authentication. Default is false.
### This section will be ignored if svnserve is not built with Cyrus
### SASL support; to check, run 'svnserve --version' and look for a line
### reading 'Cyrus SASL authentication is available.'
# use-sasl = true
### These options specify the desired strength of the security layer
### that you want SASL to provide. 0 means no encryption, 1 means
### integrity-checking only, values larger than 1 are correlated
### to the effective key length for encryption (e.g. 128 means 128-bit
### encryption). The values below are the defaults.
# min-encryption = 0
# max-encryption = 256

 

需要打开其中的几行注释并做好配置,如下

Vim

anon-access = read # 匿名用户可读

auth-access = write # 授权用户可写

password-db = passwd # 指定账号文件

authz-db = authz # 指定授权文件

realm = /home/svn/test # 指定版本库所在目录

6、启动SVN版本库

 

[root@VM_centos test]# svnserve -d -r /home/svn/test

 

关闭所有svn    killall svnserve

7、测试

比如,我就在我本地测试

把SVN中的文件checkout到本地

 

1

 

 

输入账号密码
2

3

3

然后在本地的SVN文件夹里新建个文件然后commit

5

6

那么,这就算完成了。

END。


 

 

还没完!

在按照上面做完之后,在服务器上checkout的时候发现了一个小问题

比如在服务器的某个目录下:

 

[root@VM_centos wwwsvn]# svn checkout svn://111.111.111.111 --username test --password xxx

 

之后就会在“wwwsvn”目录下建立名为“111.111.111.111”的目录,目录中是按照上面设置的版本库的文件。而且只能有这一个版本库,没有其他的。

这显然不是我想要的结果,于是又稍微琢磨了一下,目的是为多个项目分别建立版本库。(这里参考了:这个这个这个,呃…还有,这个。其实都大同小异,或许有两个文章的内容都差不多,不过不要在意这些细节。)

那么首先要重复执行建立版本库:

 

[root@VM_centos /]# svnadmin create /home/svn/project_1
[root@VM_centos /]# svnadmin create /home/svn/project_2
[root@VM_centos /]# svnadmin create /home/svn/project_3

 

这之后在/home/svn/下就会有project_1、project_2、project_3这三个目录

然后随便进一个、比如进project_1,修改conf里的三个配置文件

Vim

 

###svnserve.com###
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
Vim
###authz###
[groups]
bigmaster = test1,test2
 
[/]
@bigmaster = rw
test3 = r
* = 
 
###说明###
[groups]
# 定义群组 bigmaster 包含两个用户 test1、test2
bigmaster = test1,test2
 
[/]
# 定义 bigmaster 群组的所有用户对版本库根目录及根目录下所有目录有读写权限
@bigmaster = rw
# 定义 test3 用户对版本库根目录及根目录下所有目录只有读权限
test3 = r
# 定义"以上没有定义"的用户没有任何权限

 

Vim

 

###passwd###
[users]
test1 = 5BYuu11CbNy7
test2 = 88AhI8q2QaGe
test3 = 9h1s3hQpLB4I

 

然后再去修改另外两个项目的配置文件(如不修改,则可以checkout,但是无法commit,应该是只读不可写。具体哪个配置造成的这个局面,暂没有详细琢磨。)

然后启动版本库

 

[root@VM_centos test]# svnserve -d -r /home/svn

 

这样之后,/home/svn/目录下的三个版本库就都可以用了。

END。

 

 

还!没!完!

在第一次“END。”之前就在琢磨,比如我是一个web系统,用户在本地commit之后,能否直接更新到web目录中从而不用什么操作直接访问服务器就能看到最新的改动。

那么就涉及到了一些触发同步的东西。

如上面所述,在每一个svn版本库中都有这么几个东西:

 

[root@VM_centos project_1]# ll
total 24
-rw-r--r-- 1 root root  229 Oct 30 14:35 README.txt
drwxr-xr-x 2 root root 4096 Oct 30 14:42 conf
drwxr-sr-x 6 root root 4096 Oct 30 15:16 db
-r--r--r-- 1 root root    2 Oct 30 14:35 format
drwxr-xr-x 2 root root 4096 Oct 30 14:35 hooks
drwxr-xr-x 2 root root 4096 Oct 30 14:35 locks

 

其中在hooks/目录下,有一些奇怪的东西:

 

[root@VM_centos hooks]# ll
total 36
-rw-r--r-- 1 root root 1977 Oct 30 14:35 post-commit.tmpl
-rw-r--r-- 1 root root 1638 Oct 30 14:35 post-lock.tmpl
-rw-r--r-- 1 root root 2289 Oct 30 14:35 post-revprop-change.tmpl
-rw-r--r-- 1 root root 1567 Oct 30 14:35 post-unlock.tmpl
-rw-r--r-- 1 root root 3426 Oct 30 14:35 pre-commit.tmpl
-rw-r--r-- 1 root root 2410 Oct 30 14:35 pre-lock.tmpl
-rw-r--r-- 1 root root 2786 Oct 30 14:35 pre-revprop-change.tmpl
-rw-r--r-- 1 root root 2100 Oct 30 14:35 pre-unlock.tmpl
-rw-r--r-- 1 root root 2780 Oct 30 14:35 start-commit.tmpl

 

从这几个货的扩展名来看应该是一些模板示例,那么从网上翻来得知,这里就是用来被触发然后做一些事情的东西。

符合我的需求的,应该是“post-commit”这个,也就是当用户commit到版本库之后便触发这个脚本执行脚本内容,比如把版本库文件更新到指定的目录下。

(那么,照旧,本文仍是网上各种文章的总结性发言,抄袭的来源有:这里这里这里,呃…还有这里。)

那么,假定,网站的域名是:http://abc.com(后面的配置好像和域名并没有什么关系…),网站存放在:/home/www/abc/,需要在本地commit之后、服务器的网站代码直接也随之更改。

自己建立post-commit,或者复制post-commit.tmpl为post-commit,然后把原内容注释掉,先修改下权限:

 

[root@VM_centos hooks]# chown www:www post-commit
[root@VM_centos hooks]# chmod a+x post-commit

 

然后修改内容:

Vim

 

#!/bin/sh
export LANG=zh_CN.UTF-8  
SVN_PATH=/usr/bin/svn    #不用修改
WEB_PATH=/home/www/abc   #指向要同步到的目录
$SVN_PATH update svn://111.111.111.111/project_1 $WEB_PATH --username test1 --password 5BYuu11CbNy7 --no-auth-cache

 

保存退出,然后很重要的一步,在同步的目标目录(也就是/home/www/abc下,首先进行checkout,否则在post-commit的时候会提示跳过[skip]了这个目录),然后在本地commit之后,文件就会自动更新至/home/www/abc中了。

如果需要对其他版本库进行类似的自动更新,则需要修改对应版本库中hooks的post-commit。

但是还有个问题,我这里的web server是用www用户执行的,而自动同步到/home/www/abc中的文件,用户组都是root的,即使手动改为www,然后在本地commit、同步之后,文件还是变为root。此问题待琢磨。(2014-10-30)

凡事都有凑合的方法的,鉴于目前没找到高bigger的解决方案,故在post-commit里直接加了句改用户组的话,如下-,-(2014-10-31)

Vim

 

#!/bin/sh
export LANG=zh_CN.UTF-8
SVN_PATH=/usr/bin/svn
WEB_PATH=/home/www/abc
$SVN_PATH update svn://111.111.111.111/project_1 $WEB_PATH --username test1 --password 5BYuu11CbNy7 --no-auth-cache
chown www:www $WEB_PATH/*

 

END。

补充:

如果一个目录之前已经在版本库中,但是现在要加入到另一个版本库,那么首先要把这个目录下的SVN信息删掉,其实就是删掉目录下所有名为“.svn”的文件:

find . -type d -name ".svn"|xargs rm -rf

再补充:下面这图是我自己看的,外人用不到的。

 

如果其他pc不能checkout,可能是防火墙没有开启svn的3690端口号

vim /etc/sysconfig/iptables

不能在规则最下面添加,建议22端口下面一行

iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

重启防火墙让配置生效 service iptables restart

[root@VM_centos wwwsvn]# svn checkout svn://111.111.111.111 --username test --password xxx

 

配置SVN流程

 

 

转载自:http://tech.mclarian.com/a/973

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值