基本上用了一年的svn了,但是因为自己不是队长,所以一直没有去自己搭建和研究一下,这里花了几天的时间研究了一下,下面是我的总结,我会尽量详细,因为我以前写博客也是乱来,只记录的让自己看的懂就可以,但是这次想认真写一下,尽量清晰一点。到时候我会把这些包的打包好放到我自己的百度网盘里面,给大家下载。
我们先来了解一下svn的架构,看了架构图对我们的配置是很有帮助的。
![svn架构图](https://img-blog.csdn.net/20151007170552579)
1.安装subversion包的一些依赖包
sudo tar -zxvf apr-1.4.5.tar.gz
cd apr-1.4.5/
sudo ./configure --prefix=/usr/local/apr
sudo make -j 2
sudo make install
就这样apr包安装好了,接下来安装apr-util,scons,serf,sqlite-amalgamation-3071501
sudo tar -zxvf apr-util-1.3.8.tar.gz
cd apr-util-1.3.8/
sudo ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
sudo make && make install
这样apr-util包就安装好了
接下来我们安装scons这个包,这个包是python的自动化构建工具,因为接下来的serf这个包需要用到,所以要安装scons这个包,这是是在svn+apache的时候才需要安装这两个包。
sudo tar -zxvf scons-2.3.6.tar.gz
cd scons-2.3.6
sudo python setup.py install
这样scons自动化构建工具就安装好了,现在我们可以利用这个工具去安装serf了
sudo tar -zxvf serf-1.3.8.tar.gz
cd serf-1.3.8
sudo scons PREFIX=/usr/local/serf APR=/usr/local/apr APU=/usr/local/
sudo scons install
准备工作就做好了,当然如果还有一些其他的依赖没有安装,那就安装上吧。下面开始安装subversion包了
./autogen.sh #先运行这个shell脚本,来检测必要的软件包
sudo ./configure --prefix=/usr/local/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-sqlite=/usr/local/sqlite-amalgamation
如果是用svnserve服务运行,这样就可以了,svnversion就安装好了,下面就进入配置阶段了。
1.创建名称为project1的版本库
sudo mkdir -p /var/svn_repo
cd /var/svn_repo
svnadmin create project1
2.启动服务
svnserve -d -r /var/svn_repo#记住这里的路径是版本库的根目录如果我们要访问
#的话svn://127.0.0.1/project1,和网站根目录是一样的。
sudo mkdir svn_client
cd svn_client
svn checkout svn://127.0.0.1/project1#这样就把这个项目checkout出来了,此时是一个空项目,我们可以建立我们的目录了
trunck是开发的主分支,我们每个人在branches分支上开发,最后都合并到trunck分支上来,tags是为了发布一些特定版本用的。这样一下就明了这样的布局了,也许我们工作当中并不会接触到这些类似规范的东西,但是如果你是架构师,你是项目主管,这些必须了如指掌。
下面介绍这三个目录在我们实际工作当中是怎样的,又是怎样来合并分支到主干分支的:
假如我们建立了这三个目录trunk,branches,tags
我们在trunck中建立了一个文件i.php
svn add i.php
svn commit i.php -m 'this is i.php'
这样就把i.php提交到了svn的版本库中,假设现在项目已经开发到一定的阶段了,需要增加一个功能,我们就需要开一个分支来开发了,然后把这个分支合并会trunk中
svn copy svn://127.0.0.1/trunk svn://127.0.0.1/branches/branche_1 -m 'create a branche'#这样便创建了一个分支,我们到branches文件夹checkout出来
cd branches
svn checkout svn://127.0.0.1/branches/branche_1
分支出来后,我们就在分支下面开发了,假如我在分支下面添加了一个hello.php文件
svn add hello.php
svn commit hello.php -m 'add a php file'
分支的功能开发好了,接下来我们就需要合并回trunck中。在svn合并的原则就是diff+apply 意思是,先把分支的开发中产生的差异找出来,再应用到trunk分支上,下面看看操作
cd trunck
获取branche_1最初copy的版本号
svn log –stop-on-copy svn://127.0.0.1/project1/branches/branche_1#来获取branche_1分支最初copy时的版本,和当前进行到的版本diff再应用到.当前文件夹也就是trunk中,这样就达到了合并的目的
svn merge svn://127.0.0.1/project1/branches/branche_1@101 svn://127.0.0.1/project1/branches/branche_1 .
#千万看清楚后面是有一个点号,表示当前目录,也就是trunk目录
这时我想我们可以让svn给我们为所欲为的工作了
6.配置权限,我们把目录切换到版本库中project1中
svnserve.conf passwd authz 这三个文件,
svnserve.conf文件中将下面两行注释去掉
anon-access = read
auth-access = write
password-db = passwd
passwd文件
testsvn=123456
具体的权限配置可以配置authz,在这里不详细讲述了
这种方式和上面的区别就是提供服务端变了,之前是svnserve现在时apache的mod-dav-svn模块提供版本管理服务了
1.编译subversion时
sudo ./configure --prefix=/usr/local/subversion --with-apxs=/usr/local/apache/bin/apxs --with-serf=/usr/local/serf --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-sqlite=/usr/local/sqlite-amalgamation --enable-mod-activation#serf这个主要指为了解决用http协议访问的
注意:编译apache的编译参数后面要多加几个模块了
./configure --prefix=/usr/local/apache --enable-modules=most --enable-mods-shared=most --enable-so --enable-dav --enable-dav-fs --enable-dav-lock
2.配置httpd.conf来访问版本库
<Location /repo>
DAV svn
SVNParentPath /var/svn_repo
Location>
这样我们就可以通过http://127.0.0.1/repo/project1来访问project1这个版本库了,但是现在我们没有任何的权限控制,下面就利用apache的mod-dav-auth模块来配置权限
1.生成密码文件;利用apache的htpasswd命令,创建一个 testsvn用户
htpasswd -cm /usr/local/apache/svn_auth_file testsvn
接下来就可以配置权限了
DAV svn
SVNParentPath /var/svn_repo
AuthType Basic #验证类型
AuthName "title name"
AuthUserFile /usr/local/apache/svn_auth_file
Require valid-user
通过上面的配置我们可以用http协议访问了,http://127.0.0.1/repo/project1这样就会提示输入用户和密码了
讲到这里便要告一段落了,下面要介绍使用svn的hook实现自动的svn update来达到备份的目的
最后要将的无非就是钩子了,钩子的含义相信大家应该明白,就是在程序中嵌入一些自定义的小程序。下面举一个例子:
我们需要提交的时候自动的将版本库中的修改同步到测试环境,下面我们可以修改post-commit.tmpl文件
mv post-commit.tmpl post-commit
REPOS="$1"
REV="$2"
TXN="$3"
svn update /home/baixs/svn_client/project1 --username=testsvn --password=a
1. svn log -v -r 版本号#查看特定版本的文件修改列表
2. 用svn命令行做回滚操作
svn update #确保当前文件目录是最新的版本号
svn log #查看某个文件的修改日志
svn merge -r 28:25 #从版本好28回滚到25版本号
3. 本地编辑的撤销操作 svn revert 这个命令要慎用
svn switch –relocate svn://172.16.1.27/solution/sc8810/branches/GC
如果svn是s状态,可能是因为网络终端导致的,我们可以先切换到别的分支,然后再切换回来