一般來講,假如 SVN 只用在同一台電腦,或用於同一個區域網路內的多台 Mac 電腦,不需要另外架設 SVN server,只要透過檔案分享,就可以很簡單地共用 SVN 資料庫。
但由於 Windows 跟 Mac 的網路檔案系統不完全相容,如果希望讓 Windows 跟 Mac 間共用 SVN,或者希望從遠端連線 (比如從咖啡店連到家中),建議還是架設 SVN server。
以下設定均以 OS X Lion 為準,因為已經內建 svn client & server 程式,設定上更加簡單。
步驟 1:準備 SVN 資料庫 (repository)
(A) 假如你手邊已經有現成的 SVN repository,而且跟目前 SVN 版本相容,則只需將現有 repository 的 Unix owner 改成 _www:
$ sudo chown -R _www:_www SVN
(若 repository 是從另一台電腦搬來的,版本不相容,則需要使用 svnadmin dump/load 指令,請參考 SVN 說明文件)
(B) 如果還沒有 SVN repository,就要先建立一個
假設在使用者 apple 的 Home 目錄下,建立一個新目錄叫 SVN,實際路徑在 ~apple/SVN:
$ mkdir SVN
$ sudo chown _www:_www SVN
$ sudo -u _www svnadmin create SVN
步驟 2:編輯 SVN 設定
請編輯 SVN/conf/svnserve.conf,修改三行設定 (行首的 # 符號代表註解,要先拿掉)
anon-access = none
auth-access = write
password-db = passwd
再編輯 SVN/conf/passwd
orange = orange_secret
這代表在我們 SVN server 的登入帳號是 orange,密碼是 orange_secret。
請注意:這個虛擬帳號密碼與 OS X 的帳號無關。
步驟 3:測試臨時 SVN server
接下來測試 svnserve 可否正常執行
$ sudo -u _www /usr/bin/svnserve -d -r ~apple/SVN
這時候 svn server 已經跑起來了,你可以執行 telnet 測試是否連接得上:
$ telnet localhost svn
正常結果會出現類似下面的輸出
Trying ::1...
Connected to localhost.
Escape character is '^]'.
( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops
partial-replay ) ) )
接下來也可以使用 SVN client 來測試,比如我在 Mac 上喜歡使用 Versions 圖形介面
Link: svn://localhost/
user: orange
password: orange_secret
假如是使用舊的 SVN 資料庫,可以在 checkout 後,跟舊的比較看看,照理來講兩個目錄會相同
$ diff -r -x .svn Code Code.old
步驟 4:設定 launchd
其實現在 SVN server 已經可以運作了,比較麻煩的是剛剛手動啟動 svnserve。我們希望每次重新開機就會自動執行,以下才是最麻煩的步驟。
OS X Lion 是採用 launchd 來啟動網路服務。請先把下面 XML 檔另存成 org.tigris.Subversion.plist,並且把 /Users/apple/SVN 路徑替換為你的 SVN 資料庫的路徑:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.tigris.Subversion</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/svnserve</string>
<string>--inetd</string>
<string>--root=/Users/apple/SVN</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceDescription</key>
<string>Subversion Server</string>
<key>StandardErrorPath</key>
<string>/dev/null</string>
<key>UserName</key>
<string>_www</string>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<array>
<dict>
<key>SockFamily</key>
<string>IPv4</string>
<key>SockServiceName</key>
<string>svn</string>
<key>SockType</key>
<string>stream</string>
</dict>
<dict>
<key>SockFamily</key>
<string>IPv6</string>
<key>SockServiceName</key>
<string>svn</string>
<key>SockType</key>
<string>stream</string>
</dict>
</array>
</dict>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
</dict>
</plist>
再複製該檔案 org.tigris.Subversion.plist 到 /Library/LaunchDaemon 目錄下 (需 root 權限):
$ sudo cp org.tigris.Subversion.plist /Library/LaunchDaemons/
接下來正式使用 launchd 來控制 SVN server,首先把剛剛測試用的 svnserve 程式關掉
$ sudo killall svnserve
然後告訴 launchd 載入剛剛的設定檔 (以下指令為同一行)
$ sudo launchctl load /Library/LaunchDaemons/org.tigris.Subversion.plist
接下來可以重新開機後,再檢查看看是否成功:
$ telnet localhost svn
Ok 的話,就可以在另一台機器連上 Mac 的 SVN server 了。在 Windows 上,推薦使用廣受好評的 TortoiseSVN 軟體。連接路徑請用 svn://[Mac 電腦名稱或 IP],並且用剛剛建立的帳號密碼登入。
以上設定完成。
補充:一些技術細節
以上使用 _www Unix 使用者去執行 SVN server,會比用 root 或個人帳戶跑安全,未來也可以轉移到 Apache,使用 https 協定更安全。
另外請注意前面設定 launchd 時,讓 svnserve 使用 inetd 模式。這是因為 SVN 的 port 3690 可能會被新版 OS X 的 Application Firewall 檔掉,我找不到方式繞開,所以改用 inetd 模式。
(這個防火牆不是來自 FreeBSD 的那一套 ip firewall,而且剛灌好 Mac 時是關閉的,不過我會建議去「系統偏好設定」->「安全性與隱私」去打開它)
沒有留言:
張貼留言