2011/08/05

svn on ubuntu

之前寫過幾篇跟 SVN 有關的文章,例如 svn server on win-xp ,或是 SVN 版本控管, 不過都是在 winXP 或是 Win7 上的,現在來寫一下怎樣在 Ubuntu 上安裝 svn。最後那篇值得沒用過的人參考一下。

首先,這樣的文章很容易找,例如 Ubuntu Help。不過我試了試會出點小問題,底下是我自己的小心得

一、照 Ubuntu Help 教的,先安裝套件:
sudo apt-get install subversion libapache2-svn
二、先決定自己的 repository 的佈置邏輯,以我為例,我是打算放在 /home/svn/PROJ 下,每個 PROJ 有一個 Repository, 也有得人懶得管理那麼複雜,所有 Projects 都放同一個 repository....決定好之後進行第三步,但是這邊舉例的兩種邏輯其實管理起來差異很大,我再補充補充:
1. 前一種在設定上比較麻煩,但是每個 Project 的 revision number(就是俗稱的版本號碼)是分開各自計算,好處就是可以對每個 Project 做版本控管,也可以做存取權限的控管,也就是可以分別控制誰可以存取
2. 後一種在設定上非常簡單,設過一次就不必再管理,但是將來的 Project 其實是在同一個repository 之下,無法分開控管
三、不管哪一種方式,總要先建立我要放 repository 的 home directory, 因此命令是:
$ sudo mkdir /home/svn
四、我弄了一個 shell script 叫 new-repository.sh....
#!/bin/bash
help()
{
  echo Usage: $0 PROJECT_NAME
  exit 0
}

[ "x$1" = "x" ] && help
SVN_HOME=/home/svn
cd $SVN_HOME
mkdir -p $1
svnadmin create $1
chown -R www-data:subversion $1
cd /home/svn/$1/conf
rm -f passwd svnserve.conf
ln -s $SVN_HOME/.conf/passwd .
ln -s $SVN_HOME/.conf/svnserve.conf .
五、要新弄一個 project 的話,只要簡單的下命令,不過請暫緩這個步驟,請先看第六步再回頭執行這一步:
$ sudo new-repository.sh MY-NEW-PROJECT
譬如
$ sudo new-repository.sh wade
六、從上面的 script 可以看到,事實上我也是讓每個 Project 用相同的存取設定,若您真的要分別管理的話,只要讓該 repository 裡面的 conf/passwd 或是 conf/svnserve.conf 不同即可, 這兩個檔的範例如下:
[users]
wade = iamwade
[general]
anon-access = read
auth-access = write
password-db = passwd
七、當您執行過第五步之後,就會產生一個適當的 repository, 那麼接下來就是要啟動 svn server....但是,竟然沒有 ubuntu 下的 /etc/init.d/svn 或是 /etc/init.d/svnserve....先看看怎麼啟動它:
$ sudo svnserve -d -r /home

$ sudo svnserve -d -r /home/svn
以上兩個方法,將來在存取時的路徑會不一樣,我是採用前一個
八、為了方便啟動/停止此項服務,我自己弄了個 /etc/init.d/svn, 內容如下,存好之後當然要讓它可執行($ sudo chmod +x /etc/init.d/svn):
#! /bin/sh
set -e

test -x /usr/bin/svnserve || exit 0
( /usr/bin/svnserve 2>&1 | grep -q exactly ) 2>/dev/null || exit 0

umask 022
SVN_OPTS="-d -r /home"

. /lib/lsb/init-functions

case "$1" in
  start)
        log_daemon_msg "Starting subversion server" "svnserve"
        if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/svnserve.pid --exec /usr/bin/svnserve -- $SVN_OPTS; then
            pidof svnserve > /var/run/svnserve.pid
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;
  stop)
        log_daemon_msg "Stopping subversion server" "svnserve"
        if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/svnserve.pid; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;

  restart)
        log_daemon_msg "Restarting subversion server" "svnserve"
        start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/svnserve.pid
        if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/svnserve.pid --exec /usr/bin/svnserve -- $SVN_OPTS; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;

  status)
        status_of_proc -p /var/run/svnserve.pid /usr/bin/svnserve svnserve && exit 0 || exit $?
        ;;

  *)
        log_action_msg "Usage: /etc/init.d/svn {start|stop|restart|status}"
        exit 1
esac

exit 0
九、弄好上面的檔之後,就可以用一般的方式來管理服務,譬如 /etc/init.d/svn start, 或是 /etc/init.d/svn stop 或是 /etc/init.d/status
十、以上,您已經可以用 svn co svn://localhost/svn/wade 來取回 wade,當然此時是空的,或是您可以用 svn import /some/where/of/wade svn://localhost/svn/wade。要 remote 使用只要把 localhost 取代成 IP 即可。順便講一下前面第七步講啟動時的兩個方法,我是用前者啟動,若要改成後者,則存取路徑範例是 svn co svn://localhost/wade 。不知道有沒有比較出不同?
十一、若是要用 http:// 也行,我舉我的設定如下,請修改 /etc/apache2/sites-available/default 或是 /etc/apache2/mods-available/dav_svn.conf,後者就整個內容相同即可,前者則要放在<VirtualHost>與</VirtualHost>之間,內容如下:
<Location /svn>
  DAV svn
  SVNParentPath /home/svn
  SVNListParentPath On
  AuthType Basic
  AuthName "wade's repository"
  AuthUserFile /home/svn/.conf/htpasswd
  Require valid-user
</Location>
十二、存好上面的檔之後,只需要 /etc/init.d/apache2 restart 即可生效
十三、對 http:// 的控制,上面並沒有分開控制存取權限,請對 Location 複製去改就可以,譬如:
<Location /svn/wade>
  DAV svn
  SVNPath /home/svn/wade
  # SVNListParentPath On
  AuthType Basic
  AuthName "wade's repository"
  AuthUserFile /home/svn/.conf/htpasswd
  Require valid-user
</Location>

0 意見: