SVN安装
svn存储版本数据也有2种方式:
BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
1. 获取svn安装包:
http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz
http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz。
编译svn以root用户登录。
将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。
tar xfvz subversion-1.4.0.tar.gz
tar xfvz subversion-deps-1.4.0.tar.gz
cd subversion-1.4.0
./configure –prefix=/opt/svn –without-berkeley-db –with-zlib
(注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)
make clean
make
make install
vi /etc/profile,在/etc/profile最后加入:
PATH=$PATH:/opt/svn/bin
export PATH
svn测试svnserve –version
如果显示如下,svn安装成功:
svnserve, version 1.4.0 (r21228)
compiled Oct 12 2006, 10:18:56Copyright (C) 2000-2006 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository back-end (FS) modules are available:
* fs_fs : Module for working with a plain file (FSFS) repository.
安装最新版
下载subversion-1.8.9.tar.gz解压
安装前先安装cpr和apr-util
然后下载sqlite解压到subversion下面的sqlite-amalgamation
https://archive.apache.org/dist/apr/
./configure --prefix=/usr/local/webserver/apr
./configure --prefix=/usr/local/webserver/apr-util --with-apr=/usr/local/webserver/apr/
把sqlite下载解压拷贝到安装目录http://www.sqlite.org/download.html
./configure --prefix=/data/svn/ --with-apr=/usr/local/webserver/apr/bin/apr-1-config --with-apr-util=/usr/local/webserver/apr-util/bin/apr-1-config
make && make install
2.svn配置
建立svn版本库目录可建多个:
mkdir -p /opt/svndata/repos1
mkdir -p /opt/svndata/repos2
建立svn版本库svnadmin create /opt/svndata/repos1
svnadmin create /opt/svndata/repos2
修改svn版本库配置文件版本库1:
vi /opt/svndata/repos1/conf/svnserve.conf
内容修改为:
[general]
anon-access = none
auth-access = write
password-db = /opt/svn/conf/pwd.conf
authz-db = /opt/svn/conf/authz.conf
realm = repos1
版本库2:
vi /opt/svndata/repos2/conf/svnserve.conf
内容修改为:
[general]
anon-access = none
auth-access = write
password-db = /opt/svn/conf/pwd.conf
authz-db = /opt/svn/conf/authz.conf
realm = repos2
即除realm = repos2外,其他与版本库1配置文件完全相同。如果有更多的版本库,依此类推。
配置允许访问的svn用户vi /opt/svn/conf/pwd.conf
为了简化配置,2个版本库共用1个用户配置文件。如有必要,也可以分开。
注意:对用户配置文件的修改立即生效,不必重启svn。
文件格式如下:
[users]
<用户1> = <密码1>
<用户2> = <密码2>
其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
[users]
alan = password
king = hello
配置svn用户访问权限vi /opt/svn/conf/authz.conf
为了简化配置,3个版本库共用1个权限配置文件/opt/svn/conf/pwd.conf。如有必要,也可以分开。文件中定义用户组和版本库目录权限。
注意:
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。
* 对权限配置文件的修改立即生效,不必重启svn。
用户组格式:
[groups]
<用户组名> = <用户1>,<用户2>
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。
版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>
其中,方框号内部分可以有多种写法:
/,表示根目录及以下。根目录是svnserve启动时指定的,我们指定为/opt/svndata。这样,/就是表示对全部版本库设置权限。
repos1:/,表示对版本库1设置权限
repos2:/abc, ,表示对版本库2中的abc项目设置权限
repos2:/abc/aaa, ,表示对版本库2中的abc项目的aaa目录设置权限
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。
示例:
[groups]
admin = alan
[/]
@admin = rw
[repos1:/abc/aaa]
king = rw
[repos2:/pass]
king =
svn配置完毕,删除无用文件rm /opt/svndata/repos1/conf/authz
rm /opt/svndata/repos1/conf/passwd
rm /opt/svndata/repos2/conf/authz
rm /opt/svndata/repos2/conf/passwd
3.启动svn
建立启动svn的用户
useradd svn
passwd svn
根据提示为用户svn设置密码
允许用户svn访问版本库
chown -R svn:svn /opt/svndata
chown -R svn:svn /opt/data
启动svn
su - svn -c "svnserve -d --listen-port 9999 -r /opt/svndata"
其中:
su - svn表示以用户svn的身份启动svn
-d表示以daemon方式(后台运行)运行
–listen-port 9999表示使用9999端口,可以换成你需要的端口。但注意,使用1024以下的端口需要root权限
-r /opt/svndata指定根目录是/opt/svndata
检查:
ps -ef|grep svnserve
如果显示如下,即为启动成功:
svn 69411 0 15:07 ? 00:00:00 svnserve -d –listen-port 9999 -r /opt/svndata
通过web方式访问svn有很多方法,请参阅配置websvn或配置bsSvnBrowser的方法。
相关参考:
http://www.ibm.com/developerworks/cn/opensource/os-subversion/
启动SVN服务
svnserve -d -r /home/svn
描述说明:
-d 表示svnserver以“守护”进程模式运行
-r 指定文件系统的根位置(版本库的根目录),这样客户端不用输入全路径,就可以访问版本库
如: svn://192.168.12.118/fitness
这时SVN安装就完成了.
局域网访问方式:
例如:svn checkout svn://192.168.12.118/fitness --username mirze --password 123456 /var/www/fitness
linuxcheckout服务器里面ckeckout
svn checkout svn://192.168.1.1/pro/domain
简写svn co svn://192.168.1.1/pro/domain
自动post-cmmin
编辑hooks下面的post-commit
#!/bin/sh
export LANG=zh_CN.UTF-8
REPOS="$1"
REV="$2"
/data/svn/bin/svn update /data/html/test.yf/ --username yf --password redhat
参数说明:
1、 将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn: // 192.168.1.1 / pro / domain
简写:svn co
将test.e的svn检出到不同名字的项目
/data/svn/bin/svn co svn://192.168.1.1/test.e /data/html/test
将原有的项目建立一个不同名字的svn
bm_antuan365_com 项目在正常运行
建立antuan的svn
/data/svn/bin/svn add /data/html/test/*
/data/svn/bin/svn commit -m "第一次提交" /data/html/test/*
找到svn版本信息删除
find . -type d -name ".svn"|xargs rm -rf
2、 往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add * .php(添加当前目录下所有的php文件)
3、 将改动的文件提交到版本库
svn commit -m " LogMessage " [ -N ] [ --no-unlock ] PATH (如果选择了保持锁,就使用--no-unlock开关)
例如:svn commit -m " add test file for my test " test.php
简写:svn ci
4、 加锁/解锁
svn lock -m " LockMessage " [ --force ] PATH
例如:svn lock -m " lock test file " test.php
svn unlock PATH
5、 更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件 ,然后清除svn resolved ,最后再提交commit)
简写:svn up
6、 查看文件或者目录状态
1 )svn status path (目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2 )svn status -v path (显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、 删除文件
svn delete path -m " delete test fle "
例如:svn delete svn:// 192.168.1.1 /pro/domain/test.php -m " delete test file "
或者直接svn delete test.php 然后再svn ci -m 'delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、 查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、 查看文件详细信息
svn info path
例如:svn info test.php
10、 比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
11、 将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200 : 205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、 SVN 帮助
svn help
svn help ci
以上是常用命令,下面写几个不经常用的
13、 版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、 创建纳入版本控制下的新目录
svn mkdir : 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH...
2、mkdir URL...
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、 恢复本地修改
svn revert : 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH...
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
16、 代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch --relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
17、 解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH...
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
自动添加svn
#!/bin/sh
if [ $# -lt 1 ]; then
echo "error.. need directory"
exit 1
fi
mkdir /html/$1
chown -Rf www:www /html/$1
mkdir /svn/www/$1
/svn/bin/svnadmin create /svn/www/$1
echo "[general]" > /svn/www/$1/conf/svnserve.conf
echo "anon-access = none" >> /svn/www/$1/conf/svnserve.conf
echo "auth-access = write" >> /svn/www/$1/conf/svnserve.conf
echo "password-db = /svn/passwd" >> /svn/www/$1/conf/svnserve.conf
echo "authz-db = /svn/authz" >> /svn/www/$1/conf/svnserve.conf
echo "realm = $1" >> /svn/www/$1/conf/svnserve.conf
echo " " >> /svn/authz
echo "[$1:/]" >> /svn/authz
echo "@admin=rw" >> /svn/authz
echo "@wk=rw" >> /svn/authz
echo "*=" >> /svn/authz
echo "#!/bin/sh" > /svn/www/$1/hooks/post-commit
echo "export LANG=zh_CN.UTF-8" >> /svn/www/$1/hooks/post-commit
echo " REPOS=\"\$1\"" >> /svn/www/$1/hooks/post-commit
echo " REV=\"\$2\"" >> /svn/www/$1/hooks/post-commit
echo " /svn/bin/svn update /html/"$1"/ --username yufei --password yufei &&" >> /svn/www/$1/hooks/post-commit
chmod +x /svn/www/$1/hooks/post-commit
killall svnserve
/svn/bin/svnserve -d -r /svn/www
同步更新 [勾子]
同步程序思路:用户提交程序到SVN,SVN触发hooks, 按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过 rsync同步到远程的WEB服务器上。
知识点:
1、SVN的hooks
# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务
通过上面这些名称编写的脚本就就可以实现多种功能了,相当强大。
2、同步命令rsync的具体参数使用
3、具有基个语言的编程能力bash python perl都可以实现
post-commit具体实现细节
post-commit脚本
编辑文件:vim /home/svn/fitness/hooks/post-commit
注意:编辑完成post-commit后,执行:sudo chmod 755 post-commit
内容:
!/bin/sh
export LANG=zh_CN.UTF-8
/usr/bin/svn update /var/www/www --username mirze --password 123456
或
Set variable
SVN=/usr/bin/svn
WEB=/home/test_nokia/
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_test_nokia.log
WEBIP="192.168.0.23"
export LANG=en_US.UTF-8
update the code from the SVN
$SVN update $WEB --username user --password password
If the previous command completed successfully, to continue the following
if [ $? == 0 ]
then
echo "" >> LOG
echo `date` >> LOG
echo "##############################" >> LOG
chown -R nobody:nobody /home/test_nokia/
Synchronization code from the SVN server to the WEB server, notes:by the key
RSYNC -vaztpH --timeout=90 --exclude-from=/home/svn/exclude.list WEB root@$WEBIP:/www/ >> LOG
fi
以上是具体的post-commit程序
注意事项:
1、一定要定义变量,主要是用过的命令的路径。因为SVN的考虑的安全问题,没有调用系统变量,如果手动执行是没有问题,但SVN自动执行就会无法执行 了。
2、SVN update 之前一定要先手动checkout一份出来,还有这里一定要添加用户和密码 如果只是手动一样会更新,但自动一样的不行。
3、加上了对前一个命令的判断,如果update的时候出了问题,程序没有退出的话还会继续同步代码到WEB服务器上,这样会造成代码有问题
4、记得要设置所属用户,因为rsync可以同步文件属性,而且我们的WEB服务器一般都不是root用户,用户不正确会造成WEB程序无法正常工作。
5、建议最好记录日志,出错的时候可以很快的排错
6、最后最关键的数据同步,rsync的相关参数一定要清楚,这个就不说了。注意几个场景:
这里的环境是SVN服务器与WEB服务器是开的
把SVN服务器定义为源服务器 WEB服务器为目的服务器
场景一、如果目的WEB服务器为综合的混杂的,像只有一个WEB静态资源,用户提交的,自动生成的都在WEB的一个目录下,建议不要用–delete这个 参数
上面这个程序就是这样,实现的是源服务器到目的服务器的更新和添加,而没有删除操作,WEB服务器的内容会多于源SVN的服务器的
场景二、实现镜像,即目的WEB服务器与源SVN服务器一样的数据,SVN上任何变化WEB上一样的变化,就需要–delete参数
场景三、不需要同步某些子目录,可能有些目录是缓存的临时垃圾目录,或者是专用的图片目录(而不是样式或者排版的)要用exclude这个参数
注意:这个参数的使用不用写绝对路径,只要目录名称就行 aa代表文件 aa/ 代表目录 ,缺点就是如果有多个子目录都是一样的名称 那么这些名称就都不会被同步
建议用–exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和删除
exclude.list
.svn/
.DS_Store
images/
利用SVN的钩子还可以写出很多的程序来控制SVN 如代码提交前查看是否有写日志,是否有tab,有将换成空格,是否有不允许上传的文件,是否有超过限制大小的文件等等