Linux+Apache+SVN
一. 配置LINUX服务器
- Apache
http://mirror.bjtu.edu.cn/apache//httpd/httpd-2.2.22.tar.gz
cd /usr/local/
tar xfvz httpd-2.2.22.tar.gz
cd /usr/local/httpd-2.2.22
编译安装
configure –prefix=/usr/local/apache –enable-dav –enable-so && make && make install
- 下载subversion for linux
http://subversion.tigris.org/downloads/subversion-1.6.9.tar.gz
http://subversion.tigris.org/downloads/subversion-deps-1.6.9.tar.gz
cd /usr/local/
tar xfvz subversion-1.6.9.tar.gz
tar xfvz subversion-deps-1.6.9.tar.gz
cd /usr/local/subversion-1.6.9
删除svn自带apr和apr-util,使用apache的
rm –rf apr
rm –rf apr-util
编译安装
./configure --prefix=/usr/local/subversion --with-apxs=/usr/local/apache/bin/apxs --with-apr=/usr/local/apache/bin/apr-1-config --with-apr-util=/usr/local/apache/bin/apu-1-config&& make && make install
确认安装成功
/usr/local/subversion/bin/svnserve --version
- 建立SVN版本库
svnadmin create /svn/repository/proj_name 创建版本库
修改每个工程要配置conf目录下的svnserve.conf文件
svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = ../../../policy/passwd
authz-db = ../../../policy/authz
- 给APACHE授权管理SVN
vi /usr/local/apache/conf/httpd.conf
User apache
Group apache
chown -R apache:apache /svn/repository/proj_name
- 部署APACHE+SVN
·修改端口
vi /usr/local/apache/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 8089
末尾加上
<Location /svn>
DAV svn
SVNParentPath /svn/repository
SVNListParentPath on
AuthType Basic
AuthName "BestSoftware"
AuthuserFile /svn/policy/passwd
AuthzSVNAccessFile /svn/policy/authz
Require valid-user
</Location>
RedirectMatch ^(/svn)$ $1/
·生成SVN的用户权限文件
创建用户
/usr/local/apache/bin/htpasswd -cmb /svn/policy/passwd admin 111111
-cmb c:create m:md5 b:在命令行上输入密码
创建svn-auth-file文件,增加用户名为admin的用户,密码为MD5加密的111111
更新密码
/usr/local/apache/bin/htpasswd /svn/policy/passwd admin
添加用户
/usr/local/apache/bin/htpasswd -mb /svn/policy/passwd xuwei xuwei
删除用户
/usr/local/apache/bin/htpasswd -D /svn/policy/passwd lhy
让APACHE管理SVN
vi /usr/local/apache/conf/httpd.conf
·创建访问权限控制文件
vi /svn/policy/authz
[groups]
g_admin = admin
g_code = lhy,cf,xw
[/]
@g_ admin = rw
* = r
[cpm:/]
@g_ admin = rw
* = r
[cpm:/trunk]
@g_code = rw
[guide:/]
@g_admin = rw
* = r
- 启动SVN
重启APACHE
/usr/local/apache/bin/apachectl –k restart
重启SVN
netset –anp | grep 3690
kill pid
svnserve –d –r /snv/project
alias start_svn='svnserve -d -r /home/svn'
alias stop_svn='killall svnserve'
访问http://ip:8089/svn/proj_name
Unknown DAV provider: svn解决办法
1 安装 APR
apr 和 apr-util一般会在httpd的安装包内,subversion安装会使用到apr和par-util,如果当前系统没有,最好安装一下
2 安装 apache 源码安装
注意:安装附加参数 dav
./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --enable-modules=so--enable-dav --enable-maintainer-mode --enable-rewrite
3 安装 Subversion 源码安装
注意:安装附加参数
./configure --prefix=/usr/local/svn --with-apxs=/usr/local/apache2/bin/apxs --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-ssl --with-zlib --enable-maintainer-mode
4 配置 apache 与 Subversion 集成
vi /usr/local/apache/conf/httpd.conf
在末尾添加
<Location /svn>
DAV svn
SVNParentPath /svn/project
AuthType Basic
AuthName "Hello welcome to here"
AuthUserFile /svn/passwd
AuthzSVNAccessFile /svn/auth.conf
Require valid-user
</Location>
说明
<Location /svn>
DAV svn
SVNParentPath /svn/project (此处配置你的版本库根目录)
AuthType Basic (连接类型设置 基本验证)
AuthName "Hello welcome to here" (此处字符串内容修改为提示对话框标题)
AuthUserFile /svn/passwd (访问版本库用户的文件,用apache 的htpasswd命令生成)
AuthzSVNAccessFile /svn/auth.conf (此处修改为访问版本库权限的文件)
Require valid-user ("Require valid-user"告诉apache在authfile中所有的用户都可以访问)
</Location>
重启 apache
/usr/local/apache2/bin/apachectl –k restart
5 配置 Subversion
创建版本库
创建用户
给用户分配权限
6 常用的 SVN 服务端命令列表
FAQ
1 安装 Subversion 哪个版本?
安装 1.5.9 暂时不要安装 1.6。
1.5 使用
Berkeley DB here:
1.6 使用
Sqlite
Sqlite 会遇到一个纠结的问题。见文章
http://os.51cto.com/art/201003/191849.htm
2 可否使用 yum 或 wget 安装?
可以。
yum 安装 Subversion 1.6 没问题,但是不知道安装到哪里了?
SVN+Apache 套装
sudo apt-get install subversion libapache2-svn
3 启动Apache 服务器时报错
解决方法
httpd: Could not reliably determine theserver's fully qualified domain name, using 10.100.50.21 forServerName
在apache2/conf/httpd.conf
添加ServerName 10.100.50.21:80
4
与 SVN 协同工作
启动 Apache 报错:undefined symbol: dav_register_provider
解决方法
./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --enable-modules=so--enable-dav --enable-maintainer-mode --enable-rewrite
没有在 configure 时打开 dav 模块
5
与 SVN 协同工作
启动 Apache 报错:Unknown DAV provider: svn
解决方法
没有这个动态链接库
LoadModule dav_svn_module modules/mod_dav_svn.so
直接运行这个命令,Linux会报错说没有 LoadModule 这个命令。
将这两句话,添加到 vi /usr/local/apache2/conf/httpd.conf 的末尾
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
linux svn 卸载安装
1.下载好所有的相干包 wget -r -np -nd
http://the.earth.li/pub/subversion/summersoft.fay.ar.us/pub/subversion/latest/1.6.17/rhel5/x86_64/
(可回退目次按照实际景象变更地址)
可加参数 -p /home/soda.... (指定下载路径)
2. 卸载旧的
yum erase subversion
3. 进级/安装须要依附包
rpm -Uvh sqlite-3.5.9-2.i386.rpm
rpm -Uvh sqlite-devel-3.5.9-2.i386.rpm
rpm -ivh neon-0.28.4-1.i386.rpm
rpm -ivh neon-devel-0.28.4-1.i386.rpm
4. 安装svn 1.6.1
rpm -ivh subversion-1.6.3-1.i386.rpm
一、SVN安装
1.安装包
$ yum install subversion
2.添加svn管理用户及subversion组
$ sudo groupadd subversion
$ sudo useradd svnuser -g subversion
3.创建项目目录
$ sudo mkdir /home/svn
$ cd /home/svn
$ sudo mkdir fitness
$ sudo chown -R root:subversion fitness
$ sudo chmod -R g+rws fitness
4.创建SVN文件仓库
$ sudo svnadmin create /home/svn/fitness
5.访问方式及项目导入:
$ svn co file:///home/svn/fitness
或者
$ svn co file://localhost/home/svn/fitness
* 注意:
如果您并不确定主机的名称,您必须使用三个斜杠(///),而如果您指定了主机的名称,则您必须使用两个斜杠(//).
//--
下面的命令用于将项目导入到SVN 文件仓库:
$ svn import -m "New import" /home/svn/fitness file:///home/svnuser/src/fitness
一定要注明导入信息
//--------------------------//
6.访问权限设置
修改 /home/svn/fitness目录下:
svnserve.conf 、passwd 、authz三个文件,行最前端不允许有空格
//--
编辑svnserve.conf文件,把如下两行取消注释
password-db = password
authz-db = authz
//补充说明
# [general]
anon-access = read
auth-access = write
password-db = passwd
其中 anon-access 和 auth-access 分别为匿名和有权限用户的权限,默认给匿名用户只读的权限,但如果想拒绝匿
名用户的访问,只需把 read 改成 none 就能达到目的。
//--
编辑/home/svnuser/etc/passwd 如下:
[users]
mirze = 123456
test1 = 123456
test2 = 123456
//--
编辑/home/svnuser/etc/authz如下
[groups]
admin = mirze,test1
test = test2
[/]
@admin=rw
*=r
这里设置了三个用户mirze,test1,test2密码都是123456
其中mirze和test1属于admin组,有读和写的权限,test2属于test组只有读的权限
不同的用户分配不同的目录权限
[svn:/]
@g_vip = r
@g_admin = rw
* = r
[svn:/ezHMI1.0]
@g_pm = rw
@g_coder = rw
@g_tester = r
[svn:/ezHMI1.0/test]
@g_tester = rw
[svn:/ezHMI1.0/trunk]
@g_tester = rw
[svn:/document/development]
@g_pm = rw
@g_coder = rw
@g_tester = r
[svn:/document/test]
@g_pm = r
@g_coder = r
@g_tester = rw
[svn:/workfolder]
@g_pm = rw
@g_coder = r
@g_tester = r
7.启动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
-----------------------------------------------------------------------
二、HTTP:// [apache]
1.安装包 [已安装subversion]
$ sudo apt-get install libapache2-svn
创建版本仓库:
sudo svnadmin create /目录地址
目录地址必须存在,这个就是保存版本仓库的地方,不同的版本仓库创建不同的文件夹即可,比如:
sudo svnadmin create /home/svn/project
本来/home/svn/project这个目录下什么都没有,执行下面的命令之后再去看一下,多出一些文件和文件夹,我们需要操作的是conf这个文件 夹,这个文件夹下有一个文件,叫做passwd,用来存放用户名和密码。
然后把这个版本仓库目录授权给apache读写:
sudo chown -R www-data:www-data /目录地址
然后来到打开apache配置文件:
sudo gedit /etc/apache2/mods-available/dav_svn.conf
加入如下内容:
<Location /project>
DAV svn
SVNPath /home/svn/project
AuthType Basic
AuthName “myproject subversion repository”
AuthUserFile /home/svn/project/conf/passwd
#<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
#</LimitExcept>
</Location>
location说的是访问地址,比如上述地址,访问的时候就是
http://127.0.0.1/project
其中有两行被注释掉了,以保证每次都需要用户名密码。
最后一步就是创建访问用户了,建议将用户名密码文件存放在当前版本仓库下conf文件夹下,这样版本仓库多的时候无至于太乱。
因为conf文件夹下已经存在passwd文件了,所以直接添加用户:
sudo htpasswd -c /home/svn/project/conf/passwd test
然后输入两遍密码,laoyang这个用户就创建好了。
打开/home/svn/project/conf/passwd这个文件,会开到形如如下形式的文本:
test:WEd.83H.gealA //后面是加密后的密码。
创建以后,再次需要往别的版本仓库添加这个用户,直接把这一行复制过去就可以了。
重启apache就可以了。
sudo /etc/init.d/apache2 restart
-----------------------------------------------------------------------
三、同步更新 [勾子]
同步程序思路:用户提交程序到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脚本
编辑文件:sudo vim /home/svn/fitness/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/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,有将换成空格,是否有不允许上传的文件,是否有超过限制大小的文件等等。
附:svn使用方法
1、将文件checkout到本地目录
?svn checkout path(path是服务器上的目录)
例如:svn checkout http://svn.bds.nhncorp.com/xdbms/cubridqa/trunk/QATool/CQT
简写:svn co
2、往版本库中添加新的文件
svn add file
例如:svn addtest.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库
svn commit -m "checkin message"
例如:svn commit -m "[NOISSUE]add test file for xxx method" test.php --username=CN14772
简写:svn ci
4、更新到某个版本
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
5、加锁/解锁
svn lock -m "LockMessage" [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
[ ?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定 ]
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
3)一般情况下,我们会有一些.result文件生成,svn服务器上没有这部分问,因此我们比对的时候加上grep -v ?可以去掉不在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、export 和 import
export 导出不受svn控制的文件(不带.svn目录)
例如:svn export http://svn.bds.nhncorp.com/xdbms/cubridqa/trunk/QATool/CQT
import 递归提交一个路径到svn库,如将本地目录myproj导入到版本库的trunk/misc,trunk/misc在导入之前不需要存在—svn import会递归的为你创建目录
例如:svn import -m "New import" myproj http://svn.red-bean.com/repos/trunk/misc
13、SVN 帮助
svn help
svn help ci
14、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
15、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法:
1、mkdir PATH…
2、mkdir URL…
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。在这两个情况下,所有的中间目录都必须事先存在。
16、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录
17、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。
18、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
19、svn配置文件
~/.subversion/config文件,global-ignores属性
当运行svn status命令时,Subversion会和版本化的文件一样列出未版本化的文件和目录,并使用?字符(见see “svn status”一节)标记。global-ignores选项是一个空格分隔的列表,用来描述Subversion在它们版本化之前不想显示的文件和目录,缺省值是*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store。
svn status,svn add和svn import命令都会忽略匹配这个列表的文件,你可以用单个的--no-ignore命令行参数来覆盖这个选项,关于更加细致的控制忽略的项目