svn installation for linux

回复 收藏
RHEL5 上安装配置 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

/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目录下的所有信息)

  [/var/repos/svn2]

  user2=r(表示user2能够读/var/repos/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目录,以下是我的配置:

      (如果这里写上svn,在URL那里便有两个,不写就只有一个)
       DAV svn
       SVNParentPath /var/repos
       AuthType Basic
       AuthName "Subversion repository"
       AuthUserFile /home/svn/passwd
       AuthzSVNAccessFile /home/svn/auth
       Require valid-user
  


第三步,建立本地访问控制文件

    htpasswd -c /home/svn/passwd tube
        -m 添加用户

   会提示你输入密码,默认是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 :  单独运行的服务器,作为守护进程运行。
2011-07-13 13:39 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: