ubuntu下SVN服务器安装配置和钩子

1、SVN安装
1.安装包
1.$ sudo apt-get install subversion
php

2.建立项目目录
html

sudo mkdir /home/xiaozhe/svn前端

cd /home/xiaozhe/svn/python

sudo mkdir myproapache


3.建立svn文件仓库编程

sudo svnadmin create /home/xiaozhe/svn/myproubuntu

 

4.导入项目到svn文件仓库 (无关紧要)vim

sudo svn import -m "" 你的文件夹路径 file:///home/xiaozhe/svn/mypro浏览器

 

5.访问权限设置
修改 /home/xiaozhe/svn/mypro/conf目录下:
svnserve.conf passwd 个文件,行最前端不容许有空格

编辑svnserve.conf文件,把以下行取消注释,并须要顶格缓存

anon-access = read

auth-access = write


password-db = passwd


编辑passwd  以下:
[users]
andy andy


6. 开启svnserve,SVN根目录开启
svnserve -d -r /home/xiaozhe/svn

 

7.检查是否正常启动

$ netstat -ntlp

能够看到有一个端口为3690的地址,表示启动成功

(若是使用Apache链接,则跳过下步

8.局域网访问checkout出来SVN库的文件

svn checkout svn://SvnIp地址/mypro
或者简写为:
svn co svn://SvnIp地址/mypro

2、Ubuntu下使用Apache配置Subversion

1.安装必要软件

sudo apt-get install subversion libapache2-svn apache2

2.修改apache配置文件/etc/apache2/mods-available/dav_svn.conf

<Location /svn/mypro>

DAV svn

SVNPath /home/xiaozhe/svn/mypro

AuthType Basic

AuthName "myproject subversion repository"

AuthUserFile /etc/subversion/passwd

#<LimitExcept GET PROPFIND OPTIONS REPORT>

Require valid-user

#</LimitExcept>

</Location>

 

若是须要用户每次登陆时都进行用户密码验证,请将<LimitExcept GET PROPFIND OPTIONS REPORT></LimitExcept>两行注释掉。

当您添加了上面的内容,您必须从新起动 Apache 2 Web 服务器,请输入下面的命令:

sudo /etc/init.d/apache2 restart

 

3.建立 /etc/subversion/passwd 文件,该文件包含了用户受权的详细信息

sudo htpasswd -c /etc/subversion/passwd user_name

它会提示您输入密码,当您输入了密码,该用户就创建了。“-c”选项表示建立新的/etc/subversion/passwd文件,因此user_name所指的用户将是文件中惟一的用户。若是要添加其余用户,则去掉“-c”选项便可:$ sudo htpasswd /etc/subversion/passwd other_user_name

4.您能够经过下面的命令来访问文件仓库:

$ svn co http://hostname/svn/myproject myproject --username user_name

或者经过浏览器:http://hostname/svn/myproject

 

 

3、ubuntu SVN命令大全

一、将文件checkout到本地目录 svn checkout pathpath 是服务器上的目录)
 例如:svn checkout svn://192.168.1.1/pro

 简写:svn co svn://192.168.1.1/pro

 

2、往版本库中添加新的文件

 $ svnadd file
 $ svn add test.php(添加test.php)
 svn add *.php(添加当前目录下全部的php文件

 

三、将改动的文件提交到版本库

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 update -rm path
 例如:$ svn update若是后面没有目录,默认将当前目录以及子目录下的全部文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
$ svn update test.php(更新,于版本库同步。若是在提交的时候提示过时的话,是由于冲突,须要先update,修改文 件,而后清除svn resolved,最后再提交commit) 简写:svn up

 

5、删除文件

svn delete path -m 'delete test fle'

 例如:svn delete test.php 而后再svn ci -m 'delete test file'

 简写:svn (del, remove, rm)  

 

6、比较差别

 $ svn diff path(将修改的文件与基础版本比较)
 例如:svn diff test.php
 $ svn diff -r m:n path(对版本m和版本n比较差别)
 例如:svn diff -r 200:201 test.php
 简写:svn di 

 

7、查看文件或者目录状态

1svn status path(目录下的文件和子目录的状态,正常状态不显示)
 【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预约加入到版本库;K:被锁定】
 2svn status -v path(显示 文件和子目录状态)
 第一列保持相同,第二列显示工做版本号,第三和第四列显示最后一次修改的版本号和修改人。
 注:svn statussvn diff和 svn revert这三条命令在没有网络的状况下也能够执行的,缘由是svn在本地的.svn中保留了本地版本的原始拷贝。
 简写:svn st 

 

8、解决冲突

svn resolved: 移除工做副本的目录或文件的冲突状态。
 用法resolved PATH…
 注意本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
 相关文件,而后让 PATH 能够再次提交。 

 

、同步更新 [勾子]

同步程序思路:用户提交程序到SVNSVN触发hooks,按不一样的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再经过rsync同步到远程的WEB服务器上。

知识点:
1SVNhooks
# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务
经过上面这些名称编写的脚本就就能够实现多种功能了,至关强大。


2、同步命令rsync的具体参数使用


3、具备基个语言的编程能力bash python perl均可以实现
post-commit脚本

编辑文件:sudo vim /home/xiaozhe/svn/mypro/hooks/post-commit

注意:编辑完成post-commit后,执行:sudo chmod 755 post-commit

内容:

#!/bin/sh
export LANG=zh_CN.UTF-8
sudo /usr/bin/svn update /var/www/myblog --username xiaozhe --password xiaozhe

 

更加复杂的同步更新

#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自动执行就会没法执行了。
2SVN update 以前必定要先手动checkout一份出来,还有这里必定要添加用户和密码若是只是手动同样会更新,但自动同样的不行。
3、加上了对前一个命令的判断,若是update的时候出了问题,程序没有退出的话还会继续同步代码到WEB服务器上,这样会形成代码有问题
4、记得要设置所属用户,由于rsync能够同步文件属性,并且咱们的WEB服务器通常都不是root用户,用户不正确会形成WEB程序没法正常工做。
5、建议最好记录日志,出错的时候能够很快的排错
6、最后最关键的数据同步,rsync的相关参数必定要清楚,这个就不说了。注意几个场景:
这里的环境是SVN服务器与WEB服务器是开的
SVN服务器定义为源服务器 WEB服务器为目的服务器
场景1、若是目的WEB服务器为综合的混杂的,像只有一个WEB静态资源,用户提交的,自动生成的都在WEB的一个目录下,建议不要用–delete这个参数
上面这个程序就是这样,实现的是源服务器到目的服务器的更新和添加,而没有删除操做,WEB服务器的内容会多于源SVN的服务器的
场景2、实现镜像,即目的WEB服务器与源SVN服务器同样的数据,SVN上任何变化WEB上同样的变化,就须要–delete参数
场景3、不须要同步某些子目录,可能有些目录是缓存的临时垃圾目录,或者是专用的图片目录(而不是样式或者排版的)要用exclude这个参数
注意:这个参数的使用不用写绝对路径,只要目录名称就行 aa表明文件 aa/ 表明目录 ,缺点就是若是有多个子目录都是同样的名称那么这些名称就都不会被同步
建议用–exclude-from=/home/svn/exclude.list 用文件的形式能够方便的添加和删除
exclude.list

.svn/
.DS_Store
images/

利用SVN的钩子还能够写出不少的程序来控制SVN 如代码提交前查看是否有写日志,是否有tab,有将换成空格,是否有不容许上传的文件,是否有超过限制大小的文件等等。