Linux 搭建svn服务器

在linux下搭建一个专属的svn服务器。

  1. 通过yum直接安装subversion

    $ yum install subversion
    
  2. 创建版本库。版本库是一个svn用来进行版本管理的控制中心,我们将/home/svn作为我们管理所有版本库的目录,然后在其中创建一个project的版本库。

    $ mkdir /home/svn
    $ svnadmin create /home/svn/project
    
  3. 修改版本库配置。

    $ cd /home/svn/project && ls
    conf  db  format  hooks  locks  README.txt
    

    创建完毕的版本库中存在conf,hooks,locks等目录和文件。

    $ cd conf/ && ls
    authz  passwd  svnserve.conf
    

    进入conf目录我们能看到3个配置文件:authz,passwd,svnserve.conf。authz是svn用户的权限配置文件,passwd是svn用户密码的配置文件,svnserve.conf是版本库的主配置文件。

    $ vi passwd
    

    我们先修改passwd,在文件末尾添加一行表示添加一个用户。

    [users]
    sidfate = sidfate
    

    然后修改authz,在文件末尾添加我们刚刚创建的svn用户对根目录的权限设置,这里我们设置为rw(读写),这里的根目录指的是版本库的根目录。

    [/]
    sidfate = rw      
    

    最后修改svnserve.conf,去除下面配置前的注释。

    anon-access = read
    auth-access = write
    password-db = passwd
    authz-db = authz
    

    这里说明一下,网上的资料有的说讲realm = My First Repository这一行也去注释,实际测试没有必要,还有如果你在客户端尝试checkout时出现权限验证的错误可以将authz-db = authz这一行注释回去就可以了。

  4. 启动和关闭svn服务。

    $ svnserve –d –r /home/svn/project/ 
    

-d指明以守护模式运行,-r指定根目录,还可以使用–listen-port=切换监听端口,默认端口为3690。关闭svn服务可以使用以下命令。

```shell
$ ps -ef | grep svnserve
root      1452   871  0 15:44 pts/0    00:00:00 grep svnserve
root     29508     1  0 Jan20 ?        00:00:00 svnserve -d -r /home/svn/project/
$ kill 29508
```
  1. 本地与服务器数据同步。我们现在可以在客户端环境checkout到本地,windows环境下可以使用第三方工具TortoiseSVN,操作很方便,如果是linux客户端,我们可以使用checkout命令。

    $ svn checkout svn://myurl/project
    

    这里有一个误区,没有接触过版本控制的人可能尝试了在本地添加一个文件并上传,然后发现在服务器上找不到上传的文件。实际上版本控制记录了你的提交,你可以在本地的另一处checkout该项目发现你上传的文件已经存在了。在服务器上其实也是同一个道理,你在服务器上同样需要checkout一份代码,我们之前所作的其实就是创建了一个文件控制的中枢,你提交文件到svn服务器,然后在你的服务器上更新代码。也许你会觉得这个步骤繁琐了,别担心,我们可以使用svn的post-commit来自动同步代码的更新,来达到你本地的代码提交后服务器上的代码同步更新的功能。

    $ cd /home/svn/project/hooks 
    $ cp post-commit.tmpl post-commit
    $ vi post-commit
    

    找到你版本库的hooks目录,拷贝post-commit.tmpl为post-commit,然后编辑该文件,添加以下内容。

    REPOS="$1"
    REV="$2"
    cd /home/wwwroot/project/ && /usr/bin/svn update --username sidfate --password sidfate
    

    注意第三条语句,/home/wwwroot/project/就是我放在服务器上的代码目录,这里的操作就是每次有svn提交后进入该目录然后更新代码。还要注意的是,请给予post-commit足够的权限,不然提交的时候会提示该文件出错。

    $ chmod 770 post-commit
    

    仍然需要注意的一个问题是如果你的svn目录中存在中文命名的文件,那么可能会出现以下类似的错误:

    svn: Error converting entry in directory '.' to UTF-8 
    

    这个时候你需要在之前编写的post-commit文件里的命令前加上一段设置编码。

    export LANG=en_US.UTF-8 && cd /home/wwwroot/project/ && /usr/bin/svn update --username sidfate --password sidfate