最近需要调研一下svn怎么和我们已有的软件进行集成,必须先得有个svn环境实验一下,google一看好多部署文档,大部分都是源码安装apr、apache、subversion,对于我这种懒汉能用包管理器解决的绝对不去源码编译,所以我们就用懒办法来。
部署环境:ubuntu14.04
安装apache2和subversion,因为要通过http协议来访问版本库,所以需要apache的mod_svn模块
apt-get install apache2 libapache2-mod-svn subversion
查看安装好的svnserve的版本号
svnserve --version
ubuntu14.04的svnserver的版本号是1.8.8
假设我们的svn版本仓库在/opt/svn目录下,我们建立两个仓库test1,test2
svnadmin create /opt/svn/test1
svnadmin create /opt/svn/test2
修改apache2的配置文件
<VirtualHost 192.168.1.100:80>
ServerAdmin webmaster@localhost
DocumentRoot /opt/svn/
<Location /opt/svn/>
DAV svn
#svn仓库的根目录
SVNParentPath /opt/svn/
SVNListParentPath on
#svn的验证文件
AuthzSVNAccessFile /opt/svn/authz
#采用那种验证类型
AuthType Basic
#验证提示语
AuthName "Subversion repository"
#svn验证文件,里面是用户名和密码
AuthUserFile /opt/svn/passwd
#告诉apache只有在验证文件中的用户才可以访问
Require valid-user
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
我们看看版本库test1的目录结构
test1
├── conf
├── db
├── format
├── hooks
├── locks
└── README.txt
conf里面是版本库的配置文件,hooks里面是一些脚本,用户提交程序到svn,svn触发hooks,不同的行为按照不同的hooks处理, 你可以根据自己的需求做调整,hooks脚本主要用到以下几个:
start-commit 提交前触发事务
pre-commit 提交完成前触发事务
post-commit 提交完成时触发事务
pre-revprop-change 版本属性修改前触发事务
post-revprop-change 版本属性修改后触发事务
我们来配置版本库test1,在/opt/svn/test1/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = ../passwd
authz-db = ../authz
可以看到我定义了两个文件,authz和passwd,它们都在/opt/svn的顶级目录下
svn
├── authz
├── passwd
├── test1
└── test2
authz中对用户可以访问的版本库做权限管控,passwd则是记录用户名和密码,authz的配置如下:
[groups]
dba = guol
dbb = xu
[test1:/]
guol = rw
xu = r
[test2:/]
guol = rw
groups设置群组,dba群组有guol,dbb群组有xu。[test1:/]表示版本库test1的访问权限,guol=rw表示guol有读写权限,xu=r表示xu有读权限。如果要给整个组赋权,则可以使用@dba=rw这种格式。
htpasswd -c /opt/svn/passwd guol
htpasswd /opt/svn/passwd xu
因为通过http访问svn,所以需要apache对仓库有操作权限
chown www-data.www-data /opt/svn -R
重启apache服务,通过http访问svn版本库
如果你不想通过http来访问版本库,也可以通过svn协议来访问版本库,首先需要启动svn版本库
svn -d -r /opt/svn
-d表示以daemon后台方式运行,-r指定仓库的根目录
可以通过 svn://192.168.1.100/test1来访问test1版本库,不用指定版本库的全路径。
部署完了,了解一些svn的知识
subversion使用URL识别subversion版本库中的版本资源,URL使用标准语法,允许以域名和端口作为URL的一部分。
访问本地版本库:svn checkout file:///repo 或者 svn checkout file://localhost/repo
subversion支持以下几种访问方式:
file:/// 直接访问本地磁盘
http:// 通过apache的webdav协议访问
https:// 通过SSL访问
svn:// 通过svnserver服务自定义的协议访问
svn+ssh:// 通过ssh封装的svn来访问
一个工作拷贝是本地机器上的一个普通目录,保存着一些文件。而工作副本也包含一些由subversion创建并维护的额外文件,用来协助执行命令,通常工作副本的每个文件夹都有一个.svn命名的文件夹,被叫做副本的管理目录。
每当版本库接受了一个提交,文件系统进入了一个新的状态,叫做一次修订(revision),每一个修订都被赋予一个独一无二的自然数,一个比一个大,初始号是0.。ubversion的修订号是针对整个目录树的,而不是单个文件。
一般的工作流像下面这样
1 更新工作拷贝 svn update 得到其他人这段时间的修改,让你的工作拷贝与最新版同步
2 做出修改 svn add test 将预定的test文件或者目录添加到版本库,当你下次提交后,test会成为其父目录下的一个子对象,如果test是目录,其下面的内容也会被添加进去,如果只想添加test目录,而不添加内容,则使用-N参数
svn delete test 将预定的test文件或者目录从版本库中删除,如果是文件,则立刻从工作目录中删除,如果是目录,则不会立即删除,但是当你提交你的修改的时候,会在你的工作目录和版本库中删除
svn copy test test2 建立一个新的项目test2为test的复制品。下次提交时会将test2添加到版本库中
svn move test test2 这个与执行svn copy test test2,svn delete test相同
svn mkdir test 这个与运行mkdir test,svn add test相同
如果你只是修改版本库中已经存在的文件,在你提交之前,不必使用上面的任何一个命令。你可以对工作拷贝做出两种修改:文件修改和目录修改
3 检查修改 svn status 浏览所做的修改
svn diff 检查修改的详细信息
4 取消一些修改 svn revert test 取消对test文件的修改,包括误删除一个文件,也可以通过revert来恢复
5 解决冲突 svn update 当运行update时,如果提示符为C,表示你和服务器上的改动冲突了,需要手动解决冲突,
svn resolved file 冲突解决后需要运行resolved让subversion知道。
6 提交修改 svn commit 发送所有的修改到版本库,-m选项可以输入一些修改的信息
svn log 展示给你主要信息,每个版本附加在版本上的作者与日期信息和修改路径
svn diff 显示特定修改的行级信息
svn cat 取得某一版本的某个文件在当前屏幕显示
svn list 显示一个目录在某一版本存在的文件