安装配置 svn server+apache
第一步,先检查是否安装了下面软件包
#rpm -q subversion httpd mod_dav_svn
如果没有请安装他们!
第二步,建立一个用户,用于管理SVN版本库
useradd -m -s /bin/bash svn
第三步,创建版本库目录,并修改相应权限。
mkdir /var/repos
chown svn.svn /var/repos
第四步,创建项目仓库
su - svn
svnadmin create /var/repos/svn1
svnadmin create /var/repos/svn2
这是在svn1,svn2下面会参数一些文件,包括conf目录。
/var/repos/svn*为所创建的项目仓库的路径,理论上可以是任何目录, 但建议放在/home/svn下
第六步,修改配置文件/var/repos/svn1/conf/svnserve.conf
代码
#去掉#[general]前面的#号
[general]
#匿名访问的权限,可以是read,write,none,默认为read,如果你不愿意匿名共享请配置为none
anon-access = none
#认证用户的权限,可以是read,write,none,默认为write
auth-access = write
#密码数据库的路径,去掉前面的#, 默认使用的是同一目录下的passwd 文件作为用户认证方式
password-db = passwd
注意:所有的行都必须顶格,否则报错。
建议:为了防止不必要的错误,建议你直接用我上面的内容覆盖掉文件原来的内容
第五步,修改配置文件passwd。
代码
[users]
sxy = sxy 格式为:用户名=密码
注意
1. 一定要去掉[users]前面的#,否则svn只能以匿名用户登录,客户端不会出现登录窗口或密码提示,除非你的anon不为none,否则将返回一个错误。
2. 这里的密码都是没有加密的。
第六步,修改authz(可选)
cd /var/repos/svn1/conf
vi authz
用户组格式:
[groups]
<用户组名> = <用户1>,<用户2>
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。用户必须要在passwd文件里能找到,它是给那个里面的user赋权限.
版本库目录格式:
[/目录]
@<用户组名> = <权限>
<用户名> = <权限>
示例:
[groups]
admin = tube
[/]
@admin = rw
[/var/repos/svn1]
user1 = rw(表示user1能够读写/var/repos/svn1目录下的所有信息)
[svn2:/]
user2=r(表示user2能够读svn2项目下的所有信息)
第七步,启动服务器
使用用户svn来管理版本库目录/var/repos,则须转为svn用户,命令如下:
su- svn
然后启动svn服务
svnserve -d -r /var/repos
-d表示以daemon方式(后台运行)运行
-r /var/repos指定根目录是/var/repos
检查服务器是否启动正常:
ps –ef|grep svnserve
这样访问服务器时就可以直接用svn://服务器ip来访问了。如果服务器有多ip的话可以使用--listen-host来指定监听的ip地址.
我们可以在svn客户端中通过svn://192.168.0.xx来访问svn服务器
对于多个代码仓库,我们在启动时也可以用-r选项来指定服务器根目录,但访问时需要写上每个仓库相对于svn根目录的相对路径.
比如,我们现在有两个代码仓库/var/repos/svn1 和/var/repos/svn2,我们用svnserve -d -r /var/repos 来启动,那么在客户端访问时可以用svn://192.168.0.xx/repo1和svn: //192.168.0.xx/repo2来分别访问两个项目
第八步 开放服务器端口
svn默认端口是3690,你需要在防火墙上开放这个端口。
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT
/sbin/service iptables save
你也可以通过svnserve的--listen-port选项来指定一个已经开放的其他端口,不过这样的话客户端使用也必须家上端口,如svn://192.168.0.xx:yyyy/.
第九步,使用svn客户端导入项目
首先,切换至svn用户
su – svn
假设我们当前的项目源代码目录在/home/svn/work目录下。首先,创建这个目录:
mkdir –pv /home/svn/work
然后随便解压缩个源代码包或者自己手工建立一些文件,等等好作为导入项目的演示
接下来,进入项目源代码目录
cd /home/svn/work
导入项目
svn import svn://192.168.0.X/svn1 –m “test-svn1”
接下来你应该可以看到上传得显示。
APACHE部分
第一步,查看subversion两个动态库有没有安装成功
vi /opt/apache/conf/httpd.conf
看到下面两个模块说明安装成功
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
第二步,配置SVN
vi /opt/apache/conf/httpd.conf
将apache使用的用户和组都改为svn
User svn
Group svn
配置svn目录,以下是我的配置:
<Location /svn>
DAV svn
SVNParentPath /var/repos
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /home/svn/passwd
AuthzSVNAccessFile /home/svn/auth
Require valid-user
</Location>
第三步,建立本地访问控制文件
htpasswd -c /home/svn/passwd tube
会提示你输入密码,默认是MD5加密
第四步,建立本地项目控制文件
touch /home/svn/auth
我的文件内容为:
[/]
tube = rw
kevin = rw
shrek = rw
[svn1:/]
@group1 = rw
peter = rw
[svn2:/]
tube = rw
@group2 = rw
[groups]
group1 = testuser1,testuser2
group2 = testuser3,testuser4
以上文件书写格式的解释:
[svn1:/] 这表示,仓库svn1的根目录下的访问权限
user1 = rw svn1仓库user1用户具有读和写权限
user2 = rw svn1仓库user2用户具有读和写权限
user3 = r svn1仓库user3用户具有读权限
[svn2:/] svn2仓库根目录下的访问权限
user1 = r user1用户在svn2仓库根目录下只有读权限
suser2 = // user2用户在 svn2仓库根目录下无任何权限
#[/] // 这个表示在所有仓库的根目录下
#* = r // 这个表示对所有的用户都具有读权限
#[groups] // 这个表示群组设置
#svn1-developers = harry, sally // 这个表示某群组里的成员
#svn2-developers = sally
#[svn1:/]
#@svn1-developers = rw // 如果在前面加上@符号,则表示这是个群组权限设置
第五步,重启httpd服务,访问svn
service httpd restart
svn的访问地址是:http://192.168.0.X/svn/svn1
http://192.168.0.X/svn/svn2
附:SVN客户端使用说明
把本地项目testsvn整个目录里的内容往备份站点塞, 这是最初的结构, 建立最初的rev 0
以后checkout回来同样是按该路径,把目录下的(不包括最后的目录名)文件取回
svn import testsvn svn://path/to/repos -m "最后的这个注释不能少"
取回项目, 路径同上. 最后取出来的新目录名不给定就会用最后路径的最后一个目录名, 这里就是repos目录
svn checkout svn:///path/to/repos A_NewProjectName
更新本地项目. 千万记得,通过第一步import后的那个目录并没有默认建立svn与远程的关系,需要手动从服务器checkout回服务器的版本到本地, 才算正式建立与远程的关系(什么关系? 复杂关系!). checkout回来的项目就可以时不时地执行:
svn update
搅和取回来的项目一番后,察看动了什么(一下命令都要在项目目录下运行)
svn status
你对目录结构的修改或添加删除文件等类操作不能自动commit, 需要根据svn status显示的提示将文件/目录 明确 告诉svn是add, delete, copy 还是move
svn add new_dir
svn delete new_dir
svn status仅仅显示最根本的信息,更多的改动变化通过这个获得:
svn diff
查看项目当前状态。
svn status
查看你做的更改。
svn diff
svn commit -m “message” 提交你的改变到版本库中,后面参数为此次发动的注释.
svn list 列出版本库中当前目录下的文件
svn delete file 在本地中删除file文件。svn commit 提交更新才会在版本库实际删除file文件。
svn add file 增加file文件。同样只有在svn commit 提交后才会在版本库中实际增加。
svn move file file2 将file文件更名为file2
.
svn revert 去除更改。后面可接操作过的文件。
svn log svn 日志。
svn各种状态关键字意义:
L abc.c # svn已经在.svn目录锁定了abc.c
M bar.c # bar.c的内容已经在本地修改过了
M baz.c # baz.c属性有修改,但没有内容修改
X 3rd_party # 这个目录是外部定义的一部分
? foo.o # svn并没有管理foo.o
! some_dir # svn管理这个,但它可能丢失或者不完整
~ qux # 作为file/dir/link进行了版本控制,但类型已经改变
I .screenrc # svn不管理这个,配置确定要忽略它
A + moved_dir # 包含历史的添加,历史记录了它的来历
M + moved_dir/README # 包含历史的添加,并有了本地修改
D stuff/fish.c # 这个文件预定要删除
A stuff/loot/bloo.h # 这个文件预定要添加
C stuff/loot/lump.c # 这个文件在更新时发生冲突
R xyz.c # 这个文件预定要被替换
S stuff/squawk # 这个文件已经跳转到了分支
SVN恢复旧版本
svn没有恢复旧版本的直接功能,不过可以使用svn merge命令恢复。
比如说当前HEAD为14,而我要恢复成10版本,怎么做?用svn merge:
svn update
svn merge --revision 14:10 svn://192.168.0.X/svn1
svn commit -m "restore to revision 10"
可能会很奇怪,因为不理解为什么合并能恢复旧版本。
这里要理解一个关键点,就是svn merge的原理。merge是比较指定版本的差异,然后把这些差异应用到本地工作副本,而-r后的14:10,是指相对于版本14来说版本10的变化(注意,这个版本的次序很重要。),也就是相对版本14,我版本10添加了哪些文件或目录,以及哪些文件添加了哪些行删除了哪些行。又因为本地版本是最新的14,所以把这些差异应用到本地版本时就等于把14改变成10,其效果等于还原到版本10。然后提交,最后的版本号是15。
附:svnserve [选项]
有效选项:
-d [--daemon] : 后台模式
--listen-port arg : 监听端口(后台模式)
--listen-host arg : 监听主机名或IP地址(后台模式)
--foreground : 在前台运行(调试时有用)
-h [--help] : 显示这个帮助
--version : 显示版本信息
-i [--inetd] : inetd 模式
-r [--root] arg : 服务根目录
-R [--read-only] : 不赞成;使用档案库配置文件
-t [--tunnel] : 隧道模式
--tunnel-user arg : 隧道用户名(模式是当前用户UID的名字)
-T [--threads] : 使用线程代替进程
-X [--listen-once] : 监听一次(调试时有用)
软件包和模块说明
svn : Subversion 命令行客户端
svnlook : 检查版本库工具
svnadmin : 建立、调整和修补版本库的工具
Svndumpfilter : 过滤 Subversion 版本库转存文件的工具
mod_dav_svn : apache http 服务器的插件,可以让版本库在网络上可见。
svnserve : 单独运行的服务器,作为守护进程运行。