基于RHEL7的SVN版本控制系统搭建(结合HTTP服务)
0、前言
svn(subversion)是一个开源代码管理的控制系统,用来管理和存储开发的源代码,基于C/S模式。
subversion官网:http://subversion.apache.org/
SVN可以单独提供服务,也可以结合http服务来实现。
运行方式 | 运行端口 | 访问方法 |
svn单独服务 | 3690 | svn:// |
http结合服务 | 80 | http:// |
1、SVN版本控制服务器搭建
1) 安装svn 和 apache 服务,其中mod_dav_svn是用来衔接svn和apache的.
yum install subversion httpd mod_dav_svn
2) 查看是否注册端口
cat /etc/services | grep svn
[root@localhost~]# cat /etc/services | grep svn
svn 3690/tcp # Subversion
svn 3690/udp # Subversion
svnetworks 2973/tcp # SV Networks
svnetworks 2973/udp # SV Networks
svnet 3413/tcp # SpecView Networking
svnet 3413/udp # SpecView Networking
ml-svnet 4171/tcp # Maxlogic SupervisorCommunication
可以看出,当前svn访问已经注册了3690号端口
3)创建源仓库,以“home/svn”为例
mkdir /home/svn
svnadmin create /home/svn
执行完上述操作后,/home/svn目录下会生成如下文件:
各个文件的作用如下表所述:
目录 | 作用 |
dav | 提供apache和mod_dav_svn使用的目录,这个要自己手动创建 |
db | 存放版本控制的数据库文件 |
hooks | 存放hook脚本文件 |
locks | 存放svn监控锁定数据的目录,用来追踪存取文件库的客户端 |
conf | 存放配置文件(用户访问账号和权限等) |
format 文件 | 存放一个整数表示当前的文件库配置的版本 |
其中conf文件夹是我们需要重点关注的,其包含的文件如下
[root@localhostsvn]# cd conf/
[root@localhostconf]# ls
authz passwd svnserve.conf
文件 | 作用 |
authz | 认证权限的配置 |
passwd | 用户密码的配置 |
svnserve | 服务器相关配置 |
5)配置修改
a、修改svnserve服务配置
vim /home/svn/conf/svnserve.conf
下面几个字段默认都是注释的,需要把注释去掉
anao-access = none #表示匿名用户可读 值有:read write none
auth-access =write #表示认证用户可写,值同上
password-db =passwd #表示指定密码库的配置文件
authz-db =authz #表示指定认证权限配置文件
realm = /home/svn #登录提示信息
注意上面字段必须顶格,即前面不能留空格,否则会报错
b、修改passwd用户密码配置
vim /home/svn/conf/passwd
添加baiqishi和guest用户,密码均为123456
c、修改authz权限配置
vim /home/svn/conf/authz
在groups域 里定义一个superuser组,组员有baiqishi;定义了一个guest组,组员为guest
在 根域([/]需要自己添加)里定义权限,superuser和guest组有读写权限,其他人无权限(此处最后的* = r必须要加上)
6)启动服务
svnserve -d -r /home/svn #-d 以守护运行 -r 以root用户运行 /home/svn就是自己创建的软件版本库
查看端口
至此就完成了svn服务器的安装。
2、Windows 客户端使用
在windows下安装TortoiseSVN ,TortoiseSVN 下载地址:http://tortoisesvn.net/downloads.html
安装TortoiseSVN后,移动到一个工作文件夹,点击右键,选择“TortoiseSVN” ->Repo-browser,指定存储库的URL,然后单击“确定”
如果在存储库上设置访问控制,则需要进行身份验证,如下所示,继续使用有效的用户和密码。完成结帐后,单击确定按钮
就可以查看到当前的SVN库的文件信息。
我们可以在linux下去使用svn命令,向svn库中添加/删除文件。可以参考附录中的svn命令说明。也可以在上面通过windows成功连接到svn服务器后,在windows下去操作svn库。
此处简单介绍在windows下的操作:
1)在windows下创建一个工作文件夹SVN;
2)右键点击新建的SVN文件夹,选择SVN Checkout;
3)指定URL
4)进行身份验证后点击确认,就可以将当前的SVN库的文件检出到windows下;
5)检出完成后,相应的检出文件夹会有一个绿色的勾
6)在此文件夹中,新加入相关的文件后,同样的右键点击此文件夹,选择”SVN Commit…”,在弹出的版本提交窗口中确定待上传的文件并填写相关的日志信息后就可以进行版本的提交。
3、搭建http + svn 服务
a、查看apache是否引入svn模块
vim/etc/httpd/conf/httpd.conf
如果看到两个字段则表示引入成功
LoadModuledav_svn_module modules/mod_dav_svn.so
LoadModuleauthz_svn_module modules/mod_authz_svn.so
两个模块的物理路径
/etc/httpd/modules/mod_authz_svn.so
/etc/httpd/modules/mod_dav_svn.so
在当前的RHEL 7中,httpd.conf文件没有直接的将LoadModule下如,而是采用了Include的方式将其内容包含进来:
我们接着查看../conf.modules.d下的.conf文件
在10-subversion.conf文件中有上述的LoadModule的实现,也就是说当前apache成功引入了svn模块。
b.编辑subversion模块配置文件
(subversion.conf文件默认情况下没有,此处需自己创建)
vim /etc/httpd/conf.d/subversion.conf
#create new
<Location/svn>
DAV svn
AuthType Basic #Basic认证方式
AuthName "DAV SVN" #认证显示提示信息
AuthUserFile /home/svn/.svnpasswd #用户密码文件
Require valid-user #要求用户认证不许匿名
SVNPath /home/svn #指定svn根目录
</Location>
c、重启httpd 服务
systemctl restart httpd
systemctl status httpd #查看启动状态
d、http模式访问
在网页输入对应的URL并带上在subversion.conf中设置的Location值即可:
(如上面Location的值为 /svn,此处我们在IE中输入 svn_server_ip/svn即可访问)
4、安装问题
1、http模式访问svn时,web端提示内部服务错误
出现上述错误,查看http的错误日志信息(/etc/httpd/logs目录下的error_log),发现访问时提示如下错误:
[Wed Aug 2311:32:02.149537 2017] [authn_file:error] [pid 3216] (13)Permission denied:[client 10.32.151.30:63692] AH01620: Could not open password file:/home/svn/.svnpasswd
从出错日志信息可以看出,当前由于权限问题,无法进行访问。
我们查看/home/svn/.svnpasswd,确保此文件的权限以及其所有者为apache
再次通过http模式访问,任然出现上述错误时,估计是因selinux所致,采用getenforce查看selinux,如果是enforcing状态时,我们需要执行setenforce 0去修改它
然后再次访问就可以成功了
5、附录
svn常用的命令
import | 上传代码 |
checkout | 下载代码 |
update | 更新代码 |
status | 查看状态 |
diff | 差异检测 |
log | 历史记录 |
list | 显示目录 |
cat | 查看内容 |
resolve | 解决冲突 |
switch | 切换版本库 |
revert | 恢复 |
add | 增加 |
delete | 删除 |
copy | 复制 |
move | 移动 |
一、 SVN常用命令
1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
简写:svn co
2、往版本库中添加新的文件
svn add file
3、将改动的文件提交到版本库
svn commit -m “LogMessage” [-N][--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
简写:svn ci
4、加锁/解锁
svn lock -m “LockMessage” [--force] PATH
svn unlock PATH
5、更新到某个版本
svn update -r m path
简写:svn up
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
2)svn status -v path(显示文件和子目录状态)
简写:svn st
7、删除文件
svn delete path -m “delete test fle”
简写:svn (del, remove, rm)
8、查看日志
svn log path
9、查看文件详细信息
svn info path
10、比较差异
svn diff path(将修改的文件与基础版本比较)
svn diff -r m:n path(对版本m和版本n比较差异)
简写:svn di
11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
12、SVN 帮助
svn help
svn help ci
二、 SVN不常用命令
13、版本库下的文件和目录列表
svn listpath 显示path目录下的所有属于版本库的文件和目录简写:svn ls
14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法:
1、mkdir PATH...
每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。
2、mkdir URL... 创建版本控制的目录。
每个以URL指定的目录,都会透过立即提交于仓库中创建。在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。
用法: revert PATH... 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录
16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法:
1、switch URL [PATH]
更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
2、switch --relocate FROM TO [PATH...]
改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动 (比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。
17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH... 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
svn cat 目标[@版本]...如果指定了版本,将从指定的版本开始查找。 svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)
三、 SVN其它命令
虽然不像本章先前讨论过的那些命令那么常用,但是有时你也需要这些命令。
svn cleanup
当Subversion修改你的工作副本时(或者任何在.svn中的信息),它尝试尽可能做到安全。在改变一个工作副本前,Subversion把它的意 图写到一个日志文件中。接下来它执行日志文件中的命令来应用要求的修改。最后,Subversion删除日志文件。从架构上来说,这与一个日志文件系统 (journaledfilesystem)类似。如果一个 Subversion操作被打断(例如,进程被杀掉了,或机器当掉了)了,日志文件仍在硬盘上。重新执行日志文件,Subversion可以完成先前开始 的操作,这样你的工作副本能回到一个可靠的状态。
以下是svn cleanup所做的:它搜索你的工作副本并执行所有遗留的日志,在这过程中删除锁。如果Subversion曾告诉你你的工作副本的一部分被“锁定”了,那么你应该执行这个命令。另外, svn status会在锁定的项前显示L。
$ svn status
L somedir
M somedir/foo.c
$ svn cleanup
$ svn status
M somedir/foo.c
$svn import
使用svn import是把未版本化的文件树复制到资料库的快速办法,它需要创建一个临时目录。
$ svnadmin create/usr/local/svn/newrepos
$ svn importmytree file:///usr/local/svn/newrepos/some/project
Adding mytree/foo.c
Adding mytree/bar.c
Adding mytree/subdir
Adding mytree/subdir/quux.h
Committed revision1.
上面的例子把在some/project目录下mytree目录的内容复制到资料库中。
$ svn list file:///usr/local/svn/newrepos/some/project
bar.c
foo.c
subdir/
注意在导入完成后,原来的树没有被转化成一个工作副本。为了开始工作,你仍然需要svn checkout这个树的一个新的工作副本。