svnversion(Centos)部署和代码管理经验
svn:subversion
代码版本管理软件,使用svn可以很好的谐调一个团队共同开发同一个项目,
而不会出现代码冲突、覆盖等情况。
安装svn server
安装svnversion
·yum install -y subversion apr apr-util
创建两个仓库文件夹
·mkdir /wangluo/svn/project1
·mkdir /wangluo/svn/project2
创建两个仓库配置文件
·svnadmin create /wangluo/svn/project1
·svnadmin create /wangluo/svn/project1
查看两个仓库项目的conf目录
·ls /wangluo/svn/project1/conf
修改配置文件
·vim /wangluo/svn/project1/conf
[root@server conf]# cat svnserve.conf
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
realm = My First Repository
创建svn验证的用户名和密码
·vim /wangluo/svn/project1/passwd
[users]
eason = passwd123
andy = passwd123
创建用户组并且授权项目的登录修改权限
root@server conf]# cat authz
[groups]
admin = eason
project1 = eason
project2 = andy
[/]
@admin = rw
[/project1]
@admin = rw
@project1 = rw
@project2 = rw
配置防火墙,放行svn的默认端口3690
·vim /etc/sysconfig/iptables;添加如下行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT
启动svn server服务
·svnserve -d -r /wangluo/svn/project1
·svnserve -d -r /wangluo/svn/project2
检查是否启动成功
·ss -tln 看到3690端口在线即可
测试svn server是否可以正常连接使用
windows环境:
我们在windows下创建一个项目的目录test
然后在test目录中鼠标右键 选择 SVN检出:
输入svn://172.18.119.102:/project1
输入对应的帐号和密码即可
linux环境:
·分别创建两个网站的目录
mkdir /var/www/htdocs/project1
mkdir /var/www/htdocs/project2
·创建关联服务器仓库的项目目录到相应的网站目录
svn checkkout file:///wangluo/svn/project1
svn checkkout file:///wangluo/svn/project2
测试在对应的副本目录创建的代码文件是否可以更新到服务器
·进入副本目录,执行svn -ci -m "修改了代码的head部分"
eg:
root@server project1]# svn ci -m "version"
正在发送 index.php
传输文件数据.
提交后的版本为 3。
hooks的使用方式:
(使用场景)
架设我有个网站,目录位置是/var/html/htdocs/project1,我想实现的是windows端的开发人员的项目文件在修改后
可以通过TortoiseSVN软件右击commit后,自动同步到vnserver的仓库中,同时关联的网站的目录文件自动更新到最新的版本代码。
实现步骤如下:
1、修改其配置
·进入hooks钩子目录中
cd /wangluo/svn/project1/hooks
·复制一份post-commit.tmpl并且重新命名
cp post-commit.tmpl post-commit
·授权777
chmod 777 post-commit
2、实现自动update到网站的目录,需修改配置文件
·vim /wangluo/svn/project1/hooks/post-commit,尾部添加如下行
cd /var/www/htdocs/project1 && /usr/bin/svn update --username zhangsan --password zhangsan
/|\
网站的目录位置
eg:
[root@server hooks]# grep "^\w" post-commit
REPOS="$1"
REV="$2"
cd /opt/svn_backup/ && /usr/bin/svn update --username zhangsan --password zhangsan
linux端 svn常用的命令
cat:显示特定版本的某文件的内容
log:显示svn的版本log
diff:显示特定修改行的行级详细信息
eg: svn list -v svn.test.com/svn
[root@server svn_backup]# svn list -v ./
6 eason 1月 01 11:44 ./
6 eason 35 1月 01 11:44 index.php
eg: cat -r 4 index.php// #查看版本4中的文件test.c的内容,不进行比较。
[root@server svn_backup]# svn cat -r 4 index.php
<?php
phpinfo();
?>
version 3
[root@server svn_backup]# svn cat -r 3 index.php
<?php
phpinfo();
?>
version 2
eg:比较版本5和6之间index.php的文件的变化
[root@server svn_backup]# svn diff -r 5:6
Index: index.php
===================================================================
--- index.php (版本 5)
+++ index.php (版本 6)
@@ -1,4 +1,4 @@
<?php
phpinfo();
?>
-version 4
+version 3
[root@server svn_backup]#
[root@server svn_backup]# svn diff -r 5:6
Index: index.php
===================================================================
--- index.php (版本 5)
+++ index.php (版本 6)
@@ -1,4 +1,4 @@
<?php
phpinfo();
?>
-version 4
+version 3
案例:Linux 下svn恢复到某一版本
方法1: 用svn merge
1) 先 svn up,保证更新到最新的版本,如20;
2) 然后用 svn log ,查看历史修改,找出要恢复的版本,如10 。如果想要更详细的了解情况,可以使用svn diff -r 10:20 [文件或目录];
3) 回滚到版本号10:svn merge -r 20:10 [文件或目录],注意版本号之间的顺序,这个叫反向合并;
4) 查看当前工作版本中的文件,如test.cpp和版本号10中文件的差别:svn diff -r 10 test.cpp, 有差别则手动改之;
5) 若无差别,则提交:svn ci -m“back to r 10,xxxxx” [文件或目录]。这时svn库中会生成新的版本,如21。
方法2: 用svn up
前2步如方法1,然后直接 svn up -r 10。当前的工作版本就是版本10了。但是注意,这时svn库中会并不会生成新的版本,下次在本地svn up之后,还是会回到之前的版本。
svn diff个性化定制
svn配置文件: ~/.subversion/config
修改~/.subversion/config,找到如下配置行:
# diff-cmd = diff_program (diff, gdiff, etc.)
将上面那个脚本的路径添加进去就行,修改为
diff-cmd = /usr/local/bin/diffwrap.sh #绝对路径
这样svn diff命令就会默认使用vimdiff比较文件。
diffwrap.sh文件
复制代码
#! /bin/bash
# for svn diff: 修改~/.subversion/config,找到如下配置行:
# diff-cmd = diff_program (diff, gdiff, etc.)
# diff-cmd = ~/bin/diffwrap.sh
# 参数大于5时,去掉前5个参数;参数小于5,失败,什么也不做
shift 5
# 使用vimdiff比较
vimdiff "$@"
------------------------技巧:利用SVN的POST-COMMIT钩子自动部署代码------------------
我们在开发的过程将代码提交到SVN后使用SVN的hook,通过post-commit脚本,在目
标文件夹根下执行svn update操作,将更新内容同步到测试环境,这样开发调试非常方便。
post-commit内容:
--------------------------------------------
#!/bin/sh
#修改为服务编码
export LANG=zh_CN.gb2312
#Set variable
REPOS="$1"
REV="$2"
SVN=/usr/bin/svn
WEB=/data/home/htdocs
LOG=/data/home/auto_svn.log
#update the code from the SVN
$SVN update $WEB --username username --password password --non-interactive
#......................
if [ $? == 0 ]
then
echo "$REPOS" "$REV" >> $LOG
echo `date` >> $LOG
echo "##############################" >> $LOG
fi
-----------------------------------------------
需要注意:
1、需要用export指定编码。
2、需要指定svn全路径。
3、代码CO出来之后,可以进行post-commit脚本的测试了。因为svn的hooks执行的时候不带有任何的环境变量,所以我们不能通过简单的 ./post-commit 进行代码的测试。必须要使用sudo su 等命令切换到svn或者apache服务器运行用户下,用下面的方法进行测试
Python代码
env – ./post-commit
==================================================================================
#!/bin/bash
export LANG=en_US.UTF-8
src=/data/webroot/ask.j1.com ##local checkout directory###
deswebroot=/data/wwwroot/ask
remoteip=210.14.70.4
/usr/local/svn/bin/svn update $src --username webapp --password 969470900eb90baef8b62483a2111a9b | grep -v -i update|awk '{print $2}'| while read chfile
do
if [ -e $chfile ];then
if [ -f $chfile ];then
#chown ftp.ftp $chfile
dfile=$(echo $chfile |sed "s:$src\/::") ###only file name###
rsync -avz -e ssh --exclude-from=/data/svndata/ask.j1.com/exclude-file $src/$dfile root@$remoteip:$deswebroot/$dfile
else
#chown ftp.ftp $chfile
dfile=$(echo $chfile |sed "s:$src\/::")
rsync -auvz -e ssh --exclude-from=/data/svndata/ask.j1.com/exclude-file $src/$dfile/ root@$remoteip:$deswebroot/$dfile/
fi
fi
done
浙公网安备 33010602011771号