1、安装Subversion
1
|
[
root
@
VM_centos
/
]
# yum install subversion
|
2、找一下安装位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[
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
.
.
.
.
.
.
.
.
.
|
然后可以稍微看一下帮助
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
[
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
)
import
info
list
(
ls
)
lock
log
merge
mergeinfo
mkdir
move
(
mv
,
rename
,
ren
)
propdel
(
pdel
,
pd
)
propedit
(
pedit
,
pe
)
propget
(
pget
,
pg
)
proplist
(
plist
,
pl
)
propset
(
pset
,
ps
)
resolve
resolved
revert
status
(
stat
,
st
)
switch
(
sw
)
unlock
update
(
up
)
Subversion
is
a
tool
for
version
control
.
For
additional
information
,
see
http
:
/
/
subversion
.tigris
.org
/
|
3、创建SVN版本库目录
1
|
[
root
@
VM_centos
/
]
# mkdir -p /home/svn/test
|
4、创建版本库
1
|
[
root
@
VM_centos
test
]
# svnadmin create /home/svn/test
|
那么在/home/svn/test下面出现了这几个东西
1
2
3
4
5
6
7
8
|
[
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目录下都是些什么货
1
2
3
4
5
|
[
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服务配置
|
然后设置下账号密码
1
2
3
4
5
6
7
8
9
|
[
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
.
[
users
]
#
harry
=
harryssecret
#
sally
=
sallyssecret
|
在“[users]”中添加用户名密码,格式:用户名=密码,如下:
1
2
3
4
5
6
7
8
9
|
#
#
#
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
|
设置权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
[
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
|
在文件末尾增加下面的东西:
1
2
3
4
5
6
7
8
|
[
/
]
test
=
rw
otheruser
=
r
#
.
.
.
#
意思就是
#
[
/
]
在版本库的根目录下
#
test
=
rw
test用户对其有读写权限
#
otheruser
=
r
otheruser用户对其只有读权限
|
修改svnserve.conf文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
[
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
|
需要打开其中的几行注释并做好配置,如下
1
2
3
4
5
|
anon
-
access
=
read
#
匿名用户可读
auth
-
access
=
write
#
授权用户可写
password
-
db
=
passwd
#
指定账号文件
authz
-
db
=
authz
#
指定授权文件
realm
=
/
home
/
svn
/
test
#
指定版本库所在目录
|
6、启动SVN版本库
1
|
[
root
@
VM_centos
test
]
# svnserve -d -r /home/svn/test
|
7、测试
比如,我就在我本地测试
把SVN中的文件checkout到本地
然后在本地的SVN文件夹里新建个文件然后commit
那么,这就算完成了。
END。
还没完!
在按照上面做完之后,在服务器上checkout的时候发现了一个小问题
比如在服务器的某个目录下:
1
|
[
root
@
VM_centos
wwwsvn
]
# svn checkout svn://111.111.111.111 --username test --password xxx
|
之后就会在“wwwsvn”目录下建立名为“111.111.111.111”的目录,目录中是按照上面设置的版本库的文件。而且只能有这一个版本库,没有其他的。
这显然不是我想要的结果,于是又稍微琢磨了一下,目的是为多个项目分别建立版本库。(这里参考了:这个、这个、这个,呃…还有,这个。其实都大同小异,或许有两个文章的内容都差不多,不过不要在意这些细节。)
那么首先要重复执行建立版本库:
1
2
3
|
[
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里的三个配置文件
1
2
3
4
5
|
#
#
#
svnserve
.
com
#
#
#
anon
-
access
=
read
auth
-
access
=
write
password
-
db
=
passwd
authz
-
db
=
authz
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#
#
#
authz
#
#
#
[
groups
]
bigmaster
=
test1
,
test2
[
/
]
@bigmaster
=
rw
test3
=
r
*
=
#
#
#说明
#
#
#
[
groups
]
#
定义群组
bigmaster
包含两个用户
test1、
test2
bigmaster
=
test1
,
test2
[
/
]
#
定义
bigmaster
群组的所有用户对版本库根目录及根目录下所有目录有读写权限
@bigmaster
=
rw
#
定义
test3
用户对版本库根目录及根目录下所有目录只有读权限
test3
=
r
#
定义
"以上没有定义"的用户没有任何权限
*
=
|
1
2
3
4
5
|
#
#
#
passwd
#
#
#
[
users
]
test1
=
5BYuu11CbNy7
test2
=
88AhI8q2QaGe
test3
=
9h1s3hQpLB4I
|
然后再去修改另外两个项目的配置文件(如不修改,则可以checkout,但是无法commit,应该是只读不可写。具体哪个配置造成的这个局面,暂没有详细琢磨。)
然后启动版本库
1
|
[
root
@
VM_centos
test
]
# svnserve -d -r /home/svn
|
这样之后,/home/svn/目录下的三个版本库就都可以用了。
END。
还!没!完!
在第一次“END。”之前就在琢磨,比如我是一个web系统,用户在本地commit之后,能否直接更新到web目录中从而不用什么操作直接访问服务器就能看到最新的改动。
那么就涉及到了一些触发同步的东西。
如上面所述,在每一个svn版本库中都有这么几个东西:
1
2
3
4
5
6
7
8
|
[
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/目录下,有一些奇怪的东西:
1
2
3
4
5
6
7
8
9
10
11
|
[
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,然后把原内容注释掉,先修改下权限:
1
2
|
[
root
@
VM_centos
hooks
]
# chown www:www post-commit
[
root
@
VM_centos
hooks
]
# chmod a+x post-commit
|
然后修改内容:
1
2
3
4
5
|
#
!
/
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)
1
2
3
4
5
6
|
#
!
/
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”的文件:
1
|
find
.
-
type
d
-
name
".svn"
|
xargs
rm
-
rf
|
再补充:下面这图是我自己看的,外人用不到的。