2.5 匯入專案
不用急著把你現有的正式專案匯入檔案庫,先建立一個用來測試的專案目錄就好了。我們先在 c:/temp 底下建一個 ProjectA 的專案目錄結構,參考下面的指令:
c:
cd temp
md ProjectA
md ProjectA/trunk
md ProjectA/branches
md ProjectA/tags
svn import .
http://localhost/svn/repository -m "Initial repository layout"
提示
本文在執行 svn 命令時,都是使用 http 協定的方式,這樣我們可以確知 Subversion 與 Apache HTTP Server 的設定無誤,其他人就可以透過 Internet 存取檔案庫。當然你也可以用其他的協定,例如:file:///,如果使用 file 協定,最後一行指令就變成:
svn import . file:///d:/svn/repository -m "Initial repository layout"
命令執行無誤的話,應會看到如下的畫面:
這時候 ProjectA 這個專案已經匯入檔案庫了,也就是說,其他使用者可以開始存取這個檔案庫的專案取出文件和程式碼了。你可以參考 Subversion 的官方手冊中關於 svn.exe 這個用戶端命令列工具的使用方法,多練習一下取出檔案、加入檔案、以及存入檔案等指令。萬一練習的過程中發生錯誤,或者檔案庫弄亂了,你可以把整個檔案庫的目錄砍掉,回到 2.4 節重新做一遍。
以下會進一步討論檔案庫和專案目錄結構的安排方式,如果你急著想試試看用戶端如何存取 Subversion 檔案庫,可以先跳到2.6 節或第 3 節。
2.5.1 檔案庫與專案的配置方式
延續前面的?nbsp;例,如果你再匯入其他專案,例如 ProjectB,那麼整個檔案庫的結構會變成這樣:
/svn/repository/
+-- ProjectA/
+-- ProjectB/
也就是說 repository 這個檔案庫裡面包含了兩個專案。
如果你希望為每個專案建立一個檔案庫,那麼在 2.4 節中建立檔案庫的指令就變成:
md d:/svn
svnadmin create d:/svn/ProjectA
svnadmin create d:/svn/ProjectB
這樣就變成有兩個檔案庫了,檔案庫名稱分別是 ProjectA 與 ProjectB。
提示
如果專案之間有共享的檔案,建議把這些相關的專案放進同一個檔案庫;如果專案之間彼此毫無關係,那就採用一個檔案庫放一個專案的方式,這種方式等於專案就是檔案庫。
第一種方式有個比較奇怪的「功能」你應該要知道,就是一個專案的 check in 動作,也會令其他專案的檔案的修訂版次遞增 ,如果這不是你想要的,請選擇第二種方式,即一個檔案庫只存放一個專案。
2.5.2 專案的目錄結構
這裡補充說明一下 ProjectA 的目錄結構。在 ProjectA 專案的根目錄下建立的 trunk、branches、和 tags 這三個目錄是有特別意義的,它們的作用分別是:
* trunk 目錄用來存份目前專案正在進行開發的程式檔案和文件(又稱為主線,即 mainline);
* branches 用來存放主線的各個仍在發展中的分支;
* tags 則用來存放已經不再變動的分支,也就是其中的檔案不會再修改了。
這是 Subverion 官方手冊建議的目錄結構安排方式,你可以自己決定要不要用這種配置方式,詳細說明請參考官方手冊的第五章,子標題為 "Choosing a Repository Layout"。
提示
目錄名稱建議盡量不要用中文名稱,這樣在使用命令列時比較方便,也比較不會有問題。
2.6 使用 Windows 網域帳戶驗證
照著前面的步驟做,你會發現存取檔案庫時都不用輸入帳號密碼,這是因為我們之前的設定沒有啟用身分驗證的功能。但是我們通常不希望所有人都能任意存取你的檔案庫,免得重要資產外洩,或者資料被破壞,因此了解如何加入身分驗證也是必要的。
Serversion 提供了多種驗證使用者身份的方式,這裡只介紹 Windows 身分驗證的方式,這種方式很適合用在開發團?nbsp;成員都在區域網路內的情況。請依下列步驟進行:
1. 取得 SSPI 模組,下載網址為
http://tortoisesvn.tigris.org/mod_auth_sspi.zip。
2. 把 zip 裡面的 mod_auth_sspi.so 解壓縮到 /modules 目錄下。
3. 把下面這行加入到 Apache 的 httpd.conf 裡面:
LoadModule sspi_auth_module modules/mod_auth_sspi.so
注意上面加入的這行一定要放在下面這行的前面:
LoadModule auth_module modules/mod_auth.so
4. 修改 httpd.conf 的 設定如下:
<Location /svn>
DAV svn
SVNParentPath d:/svn
AuthType SSPI
#AuthName "Subversion repositories"
#AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
SSPIAuth On
SSPIAuthoritative On
SSPIDomain <EPSGY>
SSPIOfferBasic On
</Location>
其中 <EPSGY> 就是你的 Windows 網域控制器的電腦名稱(例如:WIN2KDC),注意兩邊的括號 不用保留。如果你的環境沒有網域控制器,就維持原來的 就行了。在我的環境下,我發現即使有網域控制器,但是這裡不去設定它,還是能夠正常的驗證使用者身分。
5. 重新啟動 Apache。
好了,現在開啟瀏覽器,輸入網址 http://127.0.0.1/svn/repository 看看,你預期應該會看到如下的驗證畫面:
但是卻沒有出現這個畫面,而是直接顯示檔案庫內容,怎麼回事?
因為我們現在是使用 Windows 帳戶驗證,你目前已經登入這台機器了,而你要存取的也是本機的資源,換句話說,你的身分已經被驗證過了,所以就不會再要求你輸入帳號跟密碼,這是採用 SSPI 網域驗證的好處。
那麼,如果你的同事 John 的電腦有加入網域,但是他平時都是登入本機,而非登入網域,在存取檔案庫時會不會要求輸入帳號密碼?答案是如果 John 登入他本機的帳號和密碼跟他在網域使用者的帳號密碼完全一樣的話,就無需再輸入密碼;相反的,如果登入本機的使用者帳號和密碼與網域使用者帳號密碼不同,第一次存取時就必須輸入密碼。
你可以在別台機器上,用一個網域裡沒有的使用者帳號去存取 Subverion 檔案庫,如果正確的話,應該就會出現要求輸入帳號密碼的視窗。
以上還只是最基本的設定,如果你希望做些進階的設定,例如允許所有人都可以檢視檔案庫的內容,但是不能修改;或者要加入 SSL 加密機制,建議您參考 [2] 的第三章。
提示
啟用身分驗證之後,你會發現用命令列工具 svn.exe 存取檔案庫時,如果是用 http:// 協定,有些子命令(subcommand)執行時會出現 "authorization failed" 的錯誤,這時候你可以在 svn 命令中加入 --username 和 --password 來提供使用者名稱和密碼,例如:
svn co http://myserver/svn/ --username michael --password guesswhat
或者你也可以改用 file:/// 協定。
SSPIAuthoritative On
SSPIDomain <EPSGY>
SSPIOfferBasic On
</Location>
其中 <EPSGY> 就是你的 Windows 網域控制器的電腦名稱(例如:WIN2KDC),注意兩邊的括號 不用保留。如果你的環境沒有網域控制器,就維持原來的 就行了。在我的環境下,我發現即使有網域控制器,但是這裡不去設定它,還是能夠正常的驗證使用者身分。
5. 重新啟動 Apache。
好了,現在開啟瀏覽器,輸入網址 http://127.0.0.1/svn/repository 看看,你預期應該會看到如下的驗證畫面:
但是卻沒有出現這個畫面,而是直接顯示檔案庫內容,怎麼回事?
因為我們現在是使用 Windows 帳戶驗證,你目前已經登入這台機器了,而你要存取的也是本機的資源,換句話說,你的身分已經被驗證過了,所以就不會再要求你輸入帳號跟密碼,這是採用 SSPI 網域驗證的好處。
那麼,如果你的同事 John 的電腦有加入網域,但是他平時都是登入本機,而非登入網域,在存取檔案庫時會不會要求輸入帳號密碼?答案是如果 John 登入他本機的帳號和密碼跟他在網域使用者的帳號密碼完全一樣的話,就無需再輸入密碼;相反的,如果登入本機的使用者帳號和密碼與網域使用者帳號密碼不同,第一次存取時就必須輸入密碼。
你可以在別台機器上,用一個網域裡沒有的使用者帳號去存取 Subverion 檔案庫,如果正確的話,應該就會出現要求輸入帳號密碼的視窗。
以上還只是最基本的設定,如果你希望做些進階的設定,例如允許所有人都可以檢視檔案庫的內容,但是不能修改;或者要加入 SSL 加密機制,建議您參考 [2] 的第三章。
提示
啟用身分驗證之後,你會發現用命令列工具 svn.exe 存取檔案庫時,如果是用 http:// 協定,有些子命令(subcommand)執行時會出現 "authorization failed" 的錯誤,這時候你可以在 svn 命令中加入 --username 和 --password 來提供使用者名稱和密碼,例如:
svn co http://myserver/svn/ --username michael --password guesswhat
或者你也可以改用 file:/// 協定。