Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1477836
  • 博文数量: 187
  • 博客积分: 10375
  • 博客等级: 上将
  • 技术积分: 3127
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-07 10:58
文章分类

全部博文(187)

文章存档

2013年(1)

2012年(8)

2011年(28)

2010年(36)

2009年(47)

2008年(67)

我的朋友

分类:

2009-11-18 18:24:21

Part 1: 平台搭建篇

一、安装apache

1.       Download httpd-2.2.9.tar.bz2

2.       #./configure --enable-dav --enable-so --prefix=/usr/local/apache

3.       #make

4.       #make install

5.       拷贝源码包module里面的所有到 /usr/local/apache/module里面, 如果已经有了就不用拷了,不然的话编译Subversion会通不过

6.       修改配置文件,开启ServerName 192.168.1.235:80

7.       启动#/usr/local/apache/bin/apachectl  -k start

8.       在浏览器输入地址 看能否访问,地址应为你的服务器地址。如果浏览器出现It works. 说明apache安装成功

二、安装Subversion

1.       安装前的准备(Prerequisite

You'll need the following build tools to compile Subversion:

* autoconf 2.58 or later (Unix only)

* libtool 1.4 or later (Unix only)

* a reasonable C compiler (gcc, Visual Studio, etc.)

1)     libz  (REQUIRED for client and server) 大多数机器已经有了

2)     安装libapr libapr-util

* libapr and libapr-util (REQUIRED for client and server)

AGo to to download the lastest version of apr and apr-util.

apr-1.3.2.tar.bz2

apr-util-1.3.2.tar.bz2

B.  解压缩

    #tar  jxvf  apr*.bz2 每个文件单独解压

C 编译安装

    #./configure  -–prefix=/usr/local/apr  //for apr

    #./configure  --prefix=/usr/local/apr  –with-apr=/usr/local/apr //for apr-util

    #make

    #make install

3)     安装expat XML Parser

Download expat-2.0.1.tar.gz

#./configure

#make

#make install

4)     安装libneon  for http://

Download neon-0.28.2.tar.gz

#./configure  --prefix=/usr/local/neon

#make

#make install

5)     安装openssl      for https://

Download openssl-0.9.8h.tar.gz

#./configure  --prefix=/usr/local/openssl

#make

#make install

6)     Berkeley DB (OPTIONAL for client and server) 这个我没装,可选

There are two different repository 'back-end'implementations.  One implementation stores data in a flat filesystem (known as FSFS); the other implementation stores data in a Berkeley DB database (known as BDB).  When you create a repository, you have the option of specifying a storage back-end.  The Berkeley DB back-end will only be available if the BDB libraries are discovered at compile time.

2.       安装Subversion

1)     Download subversion-1.5.1.tar.bz2

2)     解压#tar  jxvf  subversion-1.5.1.tar.bz2

3)     进入解压后的目录

#./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-apxs=/usr/local/apache/bin/apxs --with-neon=/usr/local/neon

#make

#make install

4)     运行#/usr/local/svn  --version看是否安装成功,至少应具备以下几个模块:

The following repository access (RA) modules are available:

* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.

  - handles 'http' scheme

* ra_svn : Module for accessing a repository using the svn network protocol.

  - handles 'svn' scheme

* ra_local : Module for accessing a repository on local disk.

  - handles 'file' scheme

Part 2: 环境配置篇

1.       配置svn主目录

#mkdir  /home/svn

2.       创建主版本库

#svnadmin  create  /home/svn

此时会在/home/svn里面生成以下文件和文件夹:

conf  db  format  hooks  locks   README.txt

3.       可以创建多个子版本库,对应不同的project

#svnadmin  create /home/svn/project1

#svnadmin  create /home/svn/project2

……

4.       停止apache

#/usr/local/apache/bin/apachectl  stop

5.       编辑httpd.conf

LoadModule dav_svn_module     modules/mod_dav_svn.so

LoadModule authz_svn_module   modules/mod_authz_svn.so

 

a.       如果svn只有一个主版本

  DAV  svn

  SVNPath /home/svn

b.       如果svn有多个版本库

  DAV  svn

  SVNParentPath /home/svn

6.       重启apache服务器

#/usr/local/apache/bin/apachectl  start

7.       在浏览器输入

对应于只有一个版本库的如下访问:

即可

但对于多个版本库的需指明具体到哪个版本库的路径:

 

8.       Import checkout

A设置树形目录

/tmp/project/ppcdn2.0/branch

/tmp/project/ppcdn2.0/tags

/tmp/project/ppcdn2.0/trunk

                  Foo.c

                  Test.c

                  Makefile

即把你欲上传的源文件都拷贝到trunk目录下

然后运行以下命令上传

#svn import /tmp/project/ file:///home/svn -m "initial import"

这个命令的意思是把project 目录下的全部东西按原目录层次上传。

这样就可以通过 直接访问树形目录

倘若还有ppcdn3.0,多个项目我就可以方便的点击树形目录

如果分别为ppcdn2.0ppcdn3.0建立单独的版本库,则每次需要输入完整路径才能访问。

这个地方折腾了我很久,我一开始是建立的多个版本库,每次访问都很麻烦。所以如果想省力访问的话,最好只建一个版本库!

B)检出

#svn checkout file:///home/svn/ppcdn2.0 /home/gxl/ppcdn2.0

C)你现在在project目录里有了一个版本库的个人拷贝,你可以编辑你的工作备份中的文件,并且提交到版本库。

 

* 进入到你的工作备份,编辑一个文件的内容。

* 运行svn diff来查看你的修改的标准区别输出。

* 运行svn commit来提交你的改变到版本库。

* 运行svn update将你的工作拷贝与版本库同步

 

9.       设置权限认证(详细设置见  6)

1 基本HTTP认证

最简单的客户端认证方式是通过HTTP基本认证机制,简单的使用用户名和密码来验证一个用户所自称的身份,Apache提供了一个htpasswd工具来管理可接受的用户名和密码,这些就是你希望赋予Subversion特别权限的用户,让我们给SallyHarry赋予提交权限,首先,我们需要添加他们到密码文件。

为了简便,建议把/usr/local/apache/bin/目录下的文件在/usr/bin下面建立符号链接#ln –s /usr/local/apache/bin/htpasswd /usr/bin/htpasswd

$ ### First time: use -c to create the file

$ ### Use -m to use MD5 encryption of the password, which is more secure

$ htpasswd -cm /etc/subversion/passwd harry

New password: *****

Re-type new password: *****

Adding password for user harry

$ htpasswd -m /etc/subversion/passwd sally  //注意跟上面的命令有区别

New password: *******

Re-type new password: *******

Adding password for user sally

 

下一步,你需要在httpd.confLocation区里添加一些指示来告诉Apache如何来使用这些密码文件,AuthType指示指定系统使用的认证类型,这种情况下,我们需要指定Basic认证系统,AuthName是你提供给认证域一个任意名称,大多数浏览器会在向用户询问名称和密码的弹出窗口里显示这个名称,最终,使用AuthUserFile指示来指定使用htpasswd创建的密码文件的位置。

 

添加完这三个指示,你的区块一定像这个样子:

  DAV svn

  SVNParentPath /home/svn

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile /etc/subversion/passwd

 

这个区块还没有结束,还不能做任何有用的事情,它只是告诉Apache当需要授权时,要去向Subversion客户端索要用户名和密码。我们这里遗漏的,是一些告诉Apache什么样客户端需要授权的指示。哪里需要授权,Apache就会在哪里要求认证,最简单的方式是保护所有的请求,添加Require valid-user来告诉Apache任何请求需要认证的用户:

  DAV svn

  SVNParentPath /home/svn

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile /etc/subversion/passwd

  Require valid-user

需要警惕:HTTP基本认证的密码是用明文传输,因此非常不可靠的,如果你担心密码偷窥,最好是使用某种SSL加密,所以客户端认证使用https://而不是http://,为了方便,你可以配置Apache为自签名认证。

 



10.   认证访问详细设置

按访问的权限可分为匿名访问、认证访问和混合访问三种。下面各给出一个配置示例:

1)     匿名访问

  DAV svn

  SVNParentPath /var/svn

 

  # our access control policy

  AuthzSVNAccessFile /usr/local/apache/conf/svn.access

 

2)     认证访问

  DAV svn

  SVNParentPath /var/svn

 

  # our access control policy

  AuthzSVNAccessFile /path/to/access/file

 

  # only authenticated users may access the repository

  Require valid-user

 

  # how to authenticate a user

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile /path/to/users/file

 

3)     混合访问

  DAV svn

  SVNParentPath /var/svn

 

  # our access control policy

  AuthzSVNAccessFile /path/to/access/file

 

  # try anonymous access first, resort to real

  # authentication if necessary.

  Satisfy Any

  Require valid-user

 

  # how to authenticate a user

  AuthType Basic

  AuthName "Subversion repository"

  AuthUserFile /path/to/users/file

 

至于这个accessfile到底是什么内容,请看基于路径的授权

 



11.   基于路径的授权

Apachesvnserve都可以给用户赋予(或拒绝)访问许可,通常是对整个版本库:一个用户可以读版本库(或不),而且他可以写版本库(或不)。如果可能,也可以定义细粒度的访问规则。一组用户可以有版本库的一个目录的读写权限,但是没有其它的;另一个目录可以是只对一少部分用户可读。

Do You Really Need Path-based Access Control?

许多第一次设置Subversion的管理员会在未经太多的思考的情况下轻易选择使用路径为基础的访问控制,管理员通常知道团队的成员工作在哪个项目,所以 很容易确定赋予哪些团队访问哪些目录,不能访问哪些目录。这看起来是很自然的事情,它满足了管理员紧密控制版本库访问的愿望。

注意,这个特 性通常有一些看不见(和可见的)代价。可见的,需要更多的工作来确信用户对某个路径有读写权限;在一些情况下,会是非常大的性能损失。不可见的,考虑你创 建的文化,大多数情况下,因为特定用户不能够在特定目录提交修改,所以社会契约不必通过技术来加强。团队有时候可以自然的互相协作;一些人会通过为他人提 交不能正常工作目录的内容的方法帮助别人,你设置了一种不期望交流的障碍。你也要建立一套项目开发、新人加入等活动的规则,还有很多额外的工作。

记住这是一个版本控制系统,即使一些人不小心提交了一些不该提交的东西,很容易回退修改。如果一个用户故意提交到了错误的位置,这是一个社会问题,需要在Subversion之外解决。

So before you begin restricting users' access rights, ask yourself if there's a real, honest need for this, or if it's just something that “sounds good” to an administrator. Decide whether it's worth sacrificing some server speed for, and remember that there's very little risk involved; it's bad to become dependent on technology as a crutch for social problems. []

As an example to ponder, consider that the Subversion project itself has always had a notion of who is allowed to commit where, but it's always been enforced socially. This is a good model of community trust, especially for open source projects. Of course, sometimes there are truly legitimate needs for path-based access control; within corporations, for example, certain types of data really can be sensitive, and access needs to be genuinely restricted to small groups of people.

To be more specific: the value of the section names are either of the form [repos-name:path] or the form [path]. If you're using the SVNParentPath directive, then it's important to specify the repository names in your sections. If you omit them, then a section such as [/some/dir] will match the path /some/dir in every repository. If you're using the SVNPath directive, however, then it's fine to only define paths in your sections—after all, there's only one repository.

如果你使用了多个版本库即SVNParentPath,那么你需要这种形式[repos-name:path] 如果你只是使用了单个版本库,那么可以忽略版本库的名称,直接写[path]

下面将会给出几个access文件的sample 示例,

[calc:/branches/calc/bug-142]

harry = rw

sally = r

在第一个例子里,用户harrycalc版本库中/branches/calc/bug-142具备完全的读写权利,但是用户sally只有读权利,任何其他用户禁止访问这个目录。

当然,访问控制是父目录传递给子目录的,这意味着我们可以为Sally指定一个子目录的不同访问策略:

[calc:/branches/calc/bug-142]

harry = rw

sally = r

 

# give sally write access only to the 'testing' subdir

[calc:/branches/calc/bug-142/testing]

sally = rw

现在Sally可以读取分支的testing子目录,但对其他部分还是只可以读,同时,Harry对整个分支还继续有完全的读写权限。

也可以通过继承规则明确的的拒绝某人的访问,只需要设置用户名参数为空:

[calc:/branches/calc/bug-142]

harry = rw

sally = r

 

[calc:/branches/calc/bug-142/secret]

harry =

在这个例子里,Harrybug-142目录树有完全的读写权限,但是对其中的secret子目录没有任何访问权利。

提示: 需要记住的是最详细的的路径会被匹配,服务器首先找到匹配自己的目录,然后父目录,然后父目录的父目录,就这样继续下去,更具体的路径控制会覆盖所有继承下来的访问控制。

缺省情况下,没有人对版本库有任何访问,这意味着如果你已经从一个空文件开始,你会希望给所有用户对版本库根目录具备读权限,你可以使用星号(*)实现,用来代表所有用户

[/]

* = r

This is a common setup; notice that there's no repository name mentioned in the section name. This makes all repositories world-readable to all users. Once all users have read-access to the repositories, you can give explicit rw permission to certain users on specific subdirectories within specific repositories.

The asterisk variable (*) is also worth special mention because it's the only pattern that matches an anonymous user. If you've configured your server block to allow a mixture of anonymous and authenticated access, all users start out accessing anonymously. The server looks for a * value defined for the path being accessed; if it can't find one, then it demands real authentication from the client.

访问文件也允许你定义一组的用户,很像Unix/etc/group文件:

[groups]

calc-developers = harry, sally, joe

paint-developers = frank, sally, jane

everyone = harry, sally, joe, frank, sally, jane

组可以被赋予通用户一样的访问权限,使用“at”(@)前缀来加以区别:

[calc:/projects/calc]

@calc-developers = rw

 

[paint:/projects/paint]

jane = r

@paint-developers = rw

Another important fact is that the first matching rule is the one which gets applied to a user. In the prior example, even though Jane is a member of the paint-developers group (which has read-write access), the jane = r rule will be discovered and matched before the group rule, thus denying Jane write access.

组中也可以定义为包含其它的组:

[groups]

calc-developers = harry, sally, joe

paint-developers = frank, sally, jane

everyone = @calc-developers, @paint-developers

 

 

12.   Most Important 常见错误:

Error1: Can’t open ‘/home/svn/db/txn-current-lock’: Permission denied

这种错误比较常见,而且一开始我一直以为是自己没有配置好认证权限的问题,我反复的配置1011两步,结果还是没解决,我在windows下用tortoiseSVN客户端一直无法commit和添加文件,老是弹出这个错误。可我在linux下可以用

#svn import …. 这个命令,我一直很纳闷,后来经过琢磨和上网搜索,终于解决。问题在于我的/home/svn目录下的一切子目录和文件都是属于root用户的,而我每次在linux下也是以root 用户import的,所以一直没有问题。可在windows从客户端访问就有问题了。

解决办法: /home/svn目录下的所有文件和子目录添加读写权限

#chmod  –R  o+rw  /home/svn

Okay, 问题解决。现在可以方便从windows下面checkoutcommit了。

 

阅读(2371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~