* 準備,下載所需要檔案.
ubuntu 6.06 LTS (kernel 2.6.15-25-k7,gcc-4.0.3) /ubuntu server (2.6.15-26-server,gcc-4.0.4)
Subversion 1.3.2/1.4.2
Apache 2.2.2/2.2.3
GCC 4.1.2最新的版本 Subversion 可以在這裡找到 :http://subversion.tigris.org/project_packages.html
* 下載neon庫,使svn支援webdav,https加密的連結.(下載並重新命名即可,subversion會自動監測並配置),目前只支援 0.25.5.
cd subversion-SVN-LAST-VERSION-DIR
wget http://www.webdav.org/neon/neon-0.25.5.tar.gz
tar xzf neon-0.25.5.tar.gz
mv neon-0.25.5 neon* 檢查已安裝的 Apache2 是否已經安裝了 mod_dav .如果已經成功安裝了Apache,使用 httpd -M 來查看有沒有安裝 dav_module,如果沒有的話 必須附加 ‘–enable-dav’ ‘–enable-dav-fs’ 兩個參數重新編譯 Apache,否則即使編譯通過了svn,apache也會啟動不起來.
如何編譯 Apache 請參考我另外一篇文章.
* 編譯SVN,遇到的問題和解決方案.使用預設的檔案系統儲存資料.最終完整通過安裝和測試的編譯參數為:
./configure --with-apxs=/usr/local/apache2/bin/apxs /
--with-apr=/home/src/server/httpd-2.2.2/srclib/apr /
--with-apr-util=/home/src/server/httpd-2.2.2/srclib/apr-util
--–with-ssl
make
make install其中 /home/src/server/ 為 httpd-2.2.2 原始碼所在檔案夾,根據實際情況調整一下.
◆ 遇到問題:
1) --with-apr 和 --with-apr-util 如果沒有加上的話,即使編譯成功了也會出現
Can’t set position pointer in file ‘/home/svn/repos/db/revs/0′: Invalid argument這樣的錯誤提示.
2) 暫時不能使用 Berkeley DB [* 已解決]
svn儲存檔案更新資料庫的方法有兩個,一種是直接使用 fs (filesystem)來儲存,另一種是通過Oracle提供支援的開來源資料庫 Berkeley DB 進行儲存。但是如果加上 –with-berkeley-db=/usr/local/BerkeleyDB.4.4 就會configure時就會報錯.
configure: error: APR-UTIL was installed independently, it won’t be
possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4
我想 apr-unit 暫時不支援吧,我們就用預設的fs好了.
3) 在make 的時候可能會遇到缺少 srclib/apr/libapr-1.la,srclib/apr-util/libaprutil-1.la 兩個檔案,找不到而make error.
解決辦法:/usr/local/apache2/lib/ 中找到,將其複製到原始碼檔案夾相應的位置中.
Update!!
使用 BerkeleyDB 儲存資料.1) 安裝 BerkeleyDB
cd /usr/local/src
wget http://downloads.sleepycat.com/db-4.3.29.tar.gz
tar xzvf db-4.3.29.tar.gz
cd /usr/local/src/db-4.3.29/build_unix
../dist/configure --enable-compat185
make
make install
2) 更新apr和apr-util原始碼
# 清理編譯後的.la檔案
cd /usr/local/src/httpd-2.2.3
make clean
cd /usr/local/src/subversion-1.3.2
rm -rf apr
rm -rf apr-util
cp -rf /usr/local/src/httpd-2.2.3/srclib/apr ./
cp -rf /usr/local/src/httpd-2.2.3/srclib/apr-util/ ./
3) 編譯安裝
./configure --with-apxs=/usr/local/apache2/bin/apxs /
--with-berkeley-db=/usr/local/BerkeleyDB.4.3 /
--with-ssl
make
make install◆ 遇到問題:
1) BerkeleyDB 版本不能大於 4.3.否則同樣會出現以下錯誤.
configure: error: APR-UTIL was installed independently, it won’t be
possible to use the specified Berkeley DB: /usr/local/BerkeleyDB.4.4主要是apr-util 暫時不支援4.4的版本.
2) 必須更新apr,apr-util 原始碼.
subversion-1.3.2 內建的 apr-util 的版本是0.9.6的,必須升級為 1.2.7 雖然能編譯過去。但在 svn checkout 的時候會提示
svn: REPORT request failed on ‘/!svn/vcc/default’
svn: REPORT of ‘/!svn/vcc/default’: Could not read status line: connection was closed by server.這個問題困擾了我很長時間,Google和官方論壇都無結果。後來昨天竟然自己無意中解決了,感動的得哭了:)
* 配置Apache和SVN,測試成功編譯svn後會在 httpd.conf 中自動加上
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so兩個模組,沒有的話,自行加上或檢測是否真的編譯成功.
假設我們現在要將一個名為 Lair 的項目匯入到 SVN中
1). Apache的配置
在 conf/httpd.conf 或 conf/extra/httpd-vhosts.conf 中加入
<Location /svn/Lair>
DAV svn
SVNPath /home/svn/Lair
</Location>
可以參考以下apache的配置,實現資料加密傳輸,使用者身分識別驗證.
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl.
SSLPassPhraseDialog exec:/etc/sendsslpwd
SSLSessionCache shmcb:/usr/local/apache2/logs/ssl_scache(512000)
SSLSessionCacheTimeout 300
SSLMutex file:/usr/local/apache2/logs/ssl_mutex
<VirtualHost _default_:443>
DocumentRoot /var/SVNRoot
ServerName svn.yousite.com:443
ServerAdmin webmaster@yousite.com
<Location />
DAV svn
SVNPath /var/SVNRoot
AuthzSVNAccessFile /etc/svnserve.conf
Satisfy Any
AuthType Basic
AuthName “yousite SVN Repository”
AuthUserFile /etc/httpd-passwords.txt
Require valid-user
</Location>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/ssl/server.crt
SSLCertificateKeyFile /etc/ssl/server.key
</VirtualHost>
更詳細的配置說明文檔 http://svnbook.red-bean.com/nightly/en/svn.ref.mod_dav_svn.conf.html
2). 配置,並且測試SVN,
建立一個新使用者,用了儲存倉庫.
useradd -m svn建立一個新模組
su daemon (apache是以daemon使用者啟動並執行,所以要切換身份,否則可能會報目錄存取權限錯誤)
svnadmin create --fs-type fsfs /home/svn/Lair匯入原來的項目
svn import /var/www/Lair http://localhost/svn/Lair -m ‘Initial import’
重建立立工作目錄
rm -rf /var/www/Lair (注意備份!!)
svn checkout http://localhost/svn/Lair測試開啟 http://localhost/svn/Lair
如能看到一個你項目錄列表,說明您成功了。
* 其它小結■ 資料轉移:
從 Windows 平台 SVN 伺服器轉移
如果windows svn儲存的格式也是dbd的話,直接將SVN的檔案夾copy過來即可.然後
執行 svnadmin recover /var/SVNRoot 檢查一下資料庫是否損壞.
最後注意許可權,確保 db 目錄下的所有檔案能被apache讀寫(留意httpd.conf中的 User 和 Group)。
chmod 755 db
chmod 666 db/*否則checkout時出現以下錯誤,多數是因為 檔案或者目錄許可權問題 引起的,可以嘗試用 chown 或者 chmod 命令修改一下許可權
<m:human-readable errcode=”160029″>
Could not open the requested SVN filesystem
</m:human-readable>
<m:human-readable errcode=”13″>
Could not open the requested SVN filesystem
</m:human-readable>
Can’t open activity db: APR does not understand this error code
另外一種方法沒有測試過,原理大致和mysqldump一樣,將svn匯出為文字檔,然後重新匯入,好處是可以避免因為儲存格式不同而導致的資料轉移困難。
# dump data to file (assuming a repo @ c:/repo):
svnadmin dump c:/repo > c:/repo.txt
# Copy the file over to linux:
mkdir /repo
svnadmin create /repo
svnadmin load /repo < /repo.txt
■ 設定存取控制
當 httpd.conf 中 設定 AuthzSVNAccessFile 時,可以設定不同使用者對不同目錄的存取控制.以下是一個例子.
[groups]
root = admin.root
web = user1,user2
soft = user3,user4
[/]
@root = rw
[/www]
@web = rw
[/soft]
@soft = rw
一個更複雜的許可權控制例子:
[groups]
root = user1,user2
web = user3,user4,user5,user6
art = user7,user8,user9,user6
blog = user10,user11# 所有的對 根路徑 有讀寫權限而不是具體的某個庫,例如 192.168.1.56/svn/ 下 有 trunk,tag,release 三個庫,
則組內成員都對於這三個庫具有讀寫權限.
[/]
@root = rw
@web = rw
# 指定某個庫(trunk)的存取權限
[trunk:/lib/Lair]
@blog = rw
# user5 將對目錄有任何許可權,雖然他繼承根路徑
[trunk:/apps/views/blog]
@blog = rw
user5 =
[trunk:/apps/views/myblog]
@blog = rw
user5 =
[trunk:/www]
@art = rw
@blog = rw
[trunk:/apps/views]
@art = rw
詳細的說明文檔:http://svnbook.red-bean.com/nightly/en/svn.serverconfig.httpd.html
■ 設定檔,使用其支援對檔案中的 $Id$ 標籤每次提交的時候自動更新版本資訊(自動屬性).
Windows : C:/Documents and Settings/%USERNAME%/Application Data/Subversion/config
Linux : ~/.subversion/config
[miscellany]
enable-auto-props = yes
[auto-props]
*.php=svn:keywords=Id
*.html=svn:keywords=Id
>> 關於自動屬性的更進階討論
■ 幾條常用svn 命令
svn update
svn add “filename”
svn commit
———————–
Change Log:
- 2007-06-14 httpd-2.2.4,subversion-1.4.4,BDB-4.3,下通過.neno 還是不能使用0.2.6的,否則根據沒有辦法 checkout http 協議開頭的URL.
- 2007-01-03 修正關於neno庫的安裝說明,以上配置可以最新版本的 httpd-2.2.3,subversion-1.4.2,BDB-4.3下通過.
- 2006-08-14 neon庫subversion已經內建,不需要在單獨安裝,添加-with-ssl即可使用svn對ssl支援.
- 2006-08-10 補充自動屬性的說明.
- 2006-08-08 加入關於目錄訪問驗證的說明.
- 2006-08-07 httpd,2.2.3測試依然有效,解決bdb資料庫的支援問題,添加從Windows到Linux下的資料轉移方案。
- 2006-07-25 看到到.聲仔對 Can’t set position pointer in file 另一種解決方案,我當時也測試了,好像沒有成功。不想用apache原始碼編譯的朋友可以也測試一下
- 2006-07-09 初稿.
———————–
參考:
- http://subversion.tigris.org/faq.html [FAQ]
- http://svnbook.red-bean.com/ [文檔]
- http://www.svnforum.org/ [論壇]
- http://d.hatena.ne.jp/cooldaemon/searchdiary?word=%2a%5bSubversion%5d
- http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html
- http://www.germane-software.com/~ser/R_n_R/subversion.html#ftn.N45
- http://zen.sh.nu/book/zh/index.html