Linux上安装SVN
http://flatfish2000.iteye.com/blog/425196
http://hu-bj.iteye.com/blog/314852
http://wyb8511.iteye.com/blog/351104
http://sunxin1001.iteye.com/category/49042
http://sgl124764903.iteye.com/blog?page=3&show_full=true
这两天mm不在线,不能聊天。闲着无聊,就主动领活,把实验室的svn服务构架起来了。幸亏有活做,要不老想着mm,慢慢就由甜蜜变成思念的痛了。
下面就是全过程了,呵呵,欢迎交流。当然服务器和客户端都为linux,我用的是debian。
Svn安装:
采用新立得软件包安装subvesion及subvesion tools
客户端和服务器端是一样的。
服务器端:
许多位置都可以放置 Subversion 文件仓库,假设Subversion 文件仓库放在 /home/svn,并且项目名称是简单的“myproject”。
同样的,也有许多常用的方式设置文件仓库的访问权限。然而,这也是安装过程中最经常出现错误的地方。创建一个名为“Subversion”的组来拥有文件仓库所在的目录。下面是操作说明:
在 Ubuntu 菜单上选择“系统->系统管理->用户和组”;
切换到“组”标签;
点击“添加组”按钮;
组名为“subversion”;
将自己和“www-data”(别的用户)加入组成员中;
点击“OK”以确认修改,关闭该程序。
注销然后再登录以便使自己能够成为 subversion 组的一员,然后就可以执行签入文件(Check in,也称提交文件)的操作了。
对于多个用户和多个组,可以增加用户和组来实现。将不同的用户加入不同的组中。
如:subversion1中有用户 user1,user2
subversion2中有用户 user3
‘‘‘‘‘‘
下来是具体的准备工作:
建立版本库的目录
$ sudo mkdir /home/svn
$ cd /home/svn
$ sudo mkdir myproject
$ sudo chown -R root:subversion myproject
$ sudo chmod -R g+rws myproject
最后的一条命令赋予组成员对所有新加入文件仓库的文件拥有相应的权限。
下面的命令用于创建 SVN 文件仓库(版本库):
$ sudo svnadmin create /home/svn/myproject
Subversion 文件仓库可以通过许多不同的方式进行访问(Check Out,签出)
模式访问方法
file:/// 直接访问本地硬盘上文件仓库($ svn file:///home/svn/myproject)
svn:// 通过自带协议访问 svnserve 服务器($ svn://localhost/home/svn/myproject)
对文件仓库的访问权限基于文件系统的权限。
如果该用户具有读/写权限,那么该用户就可以签出/提交修改。如果像前面那样设置了相应的组,就可以简单的将一个用户添加到“subversion”组中以使其具有签出和提交的权限。
当创建了 SVN 文件仓库,修改 /home/svn/myproject/conf/svnserve.conf 来配置其访问控制。
内容修改为:
[general]
anon-access = none
auth-access = write
password-db = /home/svn/myproject/conf/pwd.conf
authz-db = /home/svn/myproject/conf/authz.conf
可以在“passwd”文件中维护用户清单。编辑同一目录下“passwd”文件,添加新用户。语法如下:
[users]
<用户1> = <密码1>
<用户2> = <密码2>
其中,[users]是必须的。下面列出要访问svn的用户,每个用户一行。示例:
[users]
alan = password
king = hello
配置svn用户访问权限
注意:
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。
* 对权限配置文件的修改立即生效,不必重启svn。
用户组格式:
[groups]
<用户组名> = <用户1>,<用户2>
其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。
版本库目录格式:
[<版本库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>
权限主体可以是用户组、用户或*,用户组在前面加@,*表示全部用户。权限可以是w、r、wr和空,空表示没有任何权限。
示例:
[groups]
admin = alan
[/]
@admin = rw
[myproject:/abc/aaa]
king = rw
[myproject:/pass]
king = r
如果是对于不同的组有不同的版本库的访问权限,需要建立不同的版本库,并且在每个版本库中的passwd中添加能访问本版本库的用户。而在authz中可以设置每个组中的用户对版本库中不同的文件的访问。
当然在svn启动中要对不同的版本库进行svnserve
svn的启动:
$ svnserve -d --listen-port 9999 -r /home/svn/myproject
说明:-d表示以daemon方式(后台运行)运行
–listen-port 9999表示使用9999端口,可以换成你需要的端口。但注意,使用1024以下的端口需要root权限
可以省略。缺省情况下默认端口为3690
-r /home/svn指定根目录是/home/svn
说明(重要):
有时候会出现一些问题:如客户端没有写权限等诸如此类问题。可能的原因及解决方法如下:
可能原因之一:配置authz时,没有注意svnserve启动参数-r所指定的目录。
这里有两种情况:
1:-r直接指定到版本库(单库svnserve方式)
如有一个库myproject1,路径为/home/svn/myproject1
使用以下命令启动svnserve
svnserve -d -r /home/svn/myproject1
这种情况下,一个svnserve只能为一个版本库工作
而authz应当配置成如下:
[groups]
subversion = user1,user2
[/](此处应注意)
@subversion = rw
这样访问myproject1就可以通过svn://59.66.122.183/
2:指定到版本库的上级目录(多库svnserve方式)
在路径/home/svn下有两个或两个以上的版本库,为了说明问题方便,假设有两个,myproject1和myproject2
使用以下指令启动svnserve
svnserve -d -r /home/svn
这种情况下一个svnserve可以为多个版本库工作。
这时如果想限定指定库的指定目录的访问者,就应该指定具体的库,所以authz中应是如下:
[groups]
subversion1 = user1
,user2
subversion2 = user3
[myproject1:/]
(此处应注意)
@subversion1 = rw
@subversion2 = r
[myproject2:/]
@subversion1 = r
@subversion2 = rw
###假设需要对myproject1中的aaa文件设定成user3为rw
###则可编写代码如下:
[myproject1:/aaa]
user3 = rw
检查:
netstat -ntlp
会出现如下信息说明启动成功:
激活Internet连接 (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5028/cupsd
tcp6 0 0 :::3690 :::* LISTEN 9731/svnserve
branches 分支目录,每个开发工作者在此目录下建立自己的日常工作目录,日常开发工 作都在自己的工作目录,严禁在主干目录下进行日常开发工作。
tags 标签目录,存放项目的发布版本
trunk 开发主干目录,严禁在此目录下做与自己任务无关的修改,如添加无关文件等等
只有当自己负责的任务,有重大成果时,才允许开发工作者修改主干下的文件,提交
建立一个临时文件夹,如在路径/home/svn下,在里面建立三个文件夹,用于装载SVN Project的版本信息,或者分支版本
mkdir temp
mkdir temp/trunk
mkdir temp/tags
mkdir temp/branches
建立好后,在/home/svn输入命令
svn import temp/ svn: //localhost/projectname -m "OK"
到此为止,服务器端的安装及配置已经初步成功了。
客户端:
找到所要工作的项目的源代码文件夹,如/home/proj
进入:cd /home/proj
执行了该命令,就可以通过下面的命令来访问文件仓库,通过这一步可以从版本库中提取版本副本。
svn co svn://【服务器ip】/myproject/trunk –revision 版本号
需要说明的是 check out(简写为co)后面访问的必须是目录而不能是文件,所以要提取某一个版本副本的时候,要访问副本所在的目录。
也可以在版本库之后指定一个目录,这样会将你的工作目录放到信的目录里,如:
svn co svn://【服务器ip】/myproject/trunk /home/subv
基于服务器的配置,它会要求输入密码。一旦通过验证,就会签出文件仓库中的代码。
以下所有的操作必须在工作副本中进行!
把增加的svn文件添加入svn库:将尚未纳入管理的版本,通过add将版本纳入管理,从此版本库就会多出这个版本。
svn add file
svn add test.php
提交文件:完成一次修改后,使用这个指令来将修改送回版本库记录,成为一个新的版本。
svn commit test.php
svn ci –file test.php(对于不是目录的文件)
在对副本进行增加或者拷贝时,直接commit会出现错误提示:尚未纳入版本控制,此时可通过先用add,然后再commit。当不知道哪些文件应该add时, svn status 命令会将工作复本中未纳入版控制目录与档案显示出来。
更新文件:
更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
查看历史:
如果你只是希望检查一个过去的版本而不希望察看它们的区别,使用 svn cat:
svn cat –revision 2 test.php
删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://【服务器ip】/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn commit -m ‘delete test file‘,推荐使用这种
分支与合并:
分支:也就是简单的copy
svn copy svn://【服务器ip】/trunk svn://【服务器ip】/branches/wsz_branch
主干为trunk,然后创建分支:/branches/wsz_branch,然后我可以在我的分支的库里做修改,以不至于改坏主干上的文件。
合并:这个过程比较复杂,建议看svn帮助说明。
就是merge这个指令:
svn merge svn://【服务器ip】/trunk svn://【服务器ip】/branches/wsz_branch
-----这是把主干上的库里的文件合并到自己的分支上。
Svn merge -r 8:7 test.txt
-----这是把版本8的修改合并到版本7里。而合并后的test.txt经过commit后会变成版本9。
文件的回滚:
1、 如果对代码的改动没有check in,把本地改动过的文件删掉,然后执行一次update来还原文件。
2、 改动已经check in。
这种情况下,有多种办法可以进行撤销修改。一般我们推荐用svn merge来达成目的。
典型的操作过程如下:
1、保证我们拿到的是最新代码:
svn update
假设是28版本。
2、然后找出要移除的确切版本:
svn log test.php
根据log怀疑是27版本改坏的,比较一下:
svn diff -r 26:27 test.php
发现果真是27版本坏事。
3、撤销27版本的改动:
svn merge -r 27:26 test.php
为了保险起见,再次确认合并的结果:
svn diff test.php
发现已正确撤销了改动,提交。
4、提交改动
svn commit -m "Revert wrong change from r27"
提交后版本变成了29。