Subversion 實務建議

摘要:Subversion 實務建議

 

Subversion 實務建議

蔡煥麟
huanlin.tsai at msa.hinet.net
Revision: 1.0  (Mar-18-2005)


實務 1. 備份檔案庫

一旦你使用了 Subversion 來管理版本,檔案庫就成為你開發時最重要的資產之一了,因此最好利用排程工具,定期將檔案庫備份,如果你的檔案庫都放在一個統一的目錄下,例如:d:/svn,就只要完整備份這個目錄就行了。


實務 2. 盡量熟悉命令列工具

儘管你大部分時候都是使用視覺化工具(例如:TortoiseSVN)來執行版本控制的日常工作,熟悉命令列工具仍然非常有用,特別是當你要執行一些批次作業時。


實務 3. 建立測試環境

有些團隊可能是用 nightly build 或 weekly build 的建置方式,然後對新建置的版本進行測試,這種方式可能是由專人負責建置,然後把新版的程式部署到測試機器上。

另一種可能的情況是,測試人員隨時都可以測試最新版的程式,也就是每當程式修改好,check in 到檔案庫之後,測試人員就要能測到最新版的程式。這種需求可以透過在測試機器上建立排程來達到,排程的工作是執行一個批次檔,而這個批次檔裡面就是些 Subversion 的 update 命令。例如:

REM 此批次檔用來更新測試機器的程式檔案

c:
cd\MyProject\BookWeb\BookWeb.war
svn update -N

cd Image
svn update
cd ..

cd Script
svn update
cd ..

cd Jsp
svn update
cd ..

cd WEB-INF\classes
svn update
cd ..\lib
svn update
cd ..

這種方式要注意一個問題,就是測試機器上的應用程式目錄裡面,每個目錄都會有一個隱藏的 .svn 目錄。如果要把測試機器上的檔案部署到用戶端,並且排除 .svn 目錄,就要使用 Subversion 的匯出(export)功能。


實務 4. 只 check in 完成的檔案

程式還有編譯錯誤及警告時,不要 check in 到檔案庫。一方面是基於測試的理由(程式當然是可以運作才放上去測試),另一方面,是因為這樣做可能會對別人造成困擾,因為別的開發人員可能有將整個專案 的程式碼取出,那麼每當他在本機上建置專案時,就會出現一堆編譯錯誤,包括他自己的程式和你的程式的錯誤。如果每個人都在程式還未能通過編譯時就 check in,那麼每次編譯專案產生的錯誤訊息將多到令人無法忍受。


實務 5. 每次 check in 時,輸入摘要事項

每當我們要 check in 檔案時,Subversion 會要求我們輸入一段文字,用來簡單說明這次 check in 做了哪些改變。你可以把重要的備註事項寫進去,以後如果要回頭比對版本,可以幫助你更找到需要的版本。


實務 6. 不要保留沒用的註解

以往沒有版本控制時,我們在修改程式時,常常會把一段程式碼註解掉,以便日後反悔時,可以恢復。但是這類註解掉的程式碼往往會一直留在那裡,直到程式改了好幾個版本,已經沒有利用價值以後,成為程式裡的一堆礙眼的垃圾。

有了版本控制以後,因為可以隨時回到任一個歷史版本,你可以放心的把不要的程式碼刪除,再配合實務 5,以後要恢復歷史版本就很容易了。


實務 7. 不要留下多餘的檔案

以往沒有使用版本控制系統時,我們有時候會自己做一點版本管理,例如修改 Foo.java 之前,先把它複製成一個新的檔案,並且加上序號,例如:Foo_1.java,然後再修改 Foo.java。現在有了版本控制系統,可以不用這樣了,免得多了一堆垃圾檔案。

我曾看過一種情況,就是有人還是習慣用附加編號的方式自己備份舊版的檔案,而且跟新版的檔案放在同一個目錄下,另一方面,他又習慣把程式的檔名用序號來命 名(懶得想個適切的檔名),結果備份的檔名和開發中的檔名都是用序號來命名,有一天某人要清理專案目錄中的垃圾時,就把所有帶序號的檔名都砍了,造成程式 無法編譯或執行。還好我們有時光機器可以回到過去,要不然就麻煩了。


實務 8. 檔名大小寫第一次就決定好

如果你的作業系統不區分檔名的大小寫,例如:Windows,你最好第一次就把檔案名稱的大小寫確定下來。否則如果日後要改檔名,而且新的檔名和舊的檔名只有大小寫的不同,例如:myprg.java 和 MyPrg.java,你在送交和更新時可能會碰到一些麻煩。


實務 9. 指定忽略的檔案

在一個專案裡面,可能有些目錄裡面的某些檔案是你不希望加入檔案庫的,因此你在第一次匯入檔案庫之前,最好先把這些檔案搬移到別處,等到匯入檔案庫之後,在把它們搬回來,並且將這些檔案加入忽略清單。 以 Web 應用程式為例,參考下列步驟:

  1. 先大致建構出網站的雛形,檔案目錄結構大致底定之後,才將檔案匯入檔案庫。

  2. 建立檔案庫,並且準備匯入檔案庫。有一些檔案可能是你不希望進行版本控管的,因為當其他小組成員更新這些檔案之後,可能會造成他的開發環境出問題,例如: 無法編譯或執行程式等。不管是什麼原因,只要你有不想要放入檔案庫的檔案,就在匯入檔案庫之前,先把整個專案的檔案複製一份到一個暫存目錄下(c:\ temp),然後把 c:/temp 中所有不想控管版本的檔案刪除掉,然後再匯入檔案庫。匯入完成後把 c:/temp 底下的檔案全部刪除。

  3. 取出專案。先把整個專案的檔案*搬移*到 c:/temp 底下,接著從檔案庫取出(check out)專案,假設取出至 d:/myprj 目錄下。

  4. 把 c:/temp 底下的所有檔案複製到 d:/myprj,注意所有已經存在的檔案都不要覆蓋掉,亦即只複製新的檔案過去。這些新的檔案並未加入版本控制,你可以把它們加入忽略清單(ignore list)裡面,以後這些檔案就不會被存入檔案庫了。


Q & A


問題:

使用 client 工具存取檔案庫時(例如:browse, commit, update),client 工具好像當掉了。

原因:

可能是因為 client 端在某次 commit 時異常中止動作,導致 server 端的 Subversion 資料庫鎖定無法釋放,一直等待 client 結束這次的 commit,因此其他的 clients 也必須等待,看起來就像當掉一樣。

解答:

使用 svnadmin 工具來復原資料庫,例如:

c:/>svnadmin recover d:/svn/MyRepos


問題:

每次 Eclipse/WSAD 建置專案以後,類別輸出路徑底下的檔案版本就會跟 JavaSource 的檔案相互混淆?

原因:

Eclipse/WSAD 在建置專案時,會先把建置路徑完全清空,然後把 JavaSource 裡面的所有檔案目錄複製一份到 建置路徑(類別輸出路徑)下,但只有 .java 檔但不會複製過去,而是會將他們編譯成 .class 檔。這樣會導致 JavaSource 底下的 .svn 目錄都被複製到建置路徑下,例如:WEB-INF\classes\.svn,導致類別輸出路徑下的 .svn 目錄被蓋掉,因而使得 classes 目錄和 JavaSource 目錄混淆,發生相互影響的情形。

解答:

解決方法是修改 Eclipse/WSAD 的編譯器設定,把 ".svn/" 加入「已過濾的資源(Filtered Resource)」。參考下面的 WSAD 設定圖:

這樣設定還不夠,因為 Eclipse/WSAD 預設在建置專案時會先清空建置路徑(類別輸出路徑),使得建置路徑下的 .svn 目錄被清掉,因此,類別輸出路徑應該不要加入版本控制,做法是使用 svn:ignore 把建置路徑排除。

但是有些情況你可能還是希望將建置路徑加入版本控制,例如:你希望每當有小組成員編譯好他的檔案時,立刻 check in 就能立刻對新的程式進行測試,而不用等到 daily build 或 weekly build 完成時。

所以,如果你想要將建置路徑加入版本控制,除了更改 Filtered Resource 選項,還要讓 Eclipse/WSAD 在建置專案時不清空資料夾,此選項為「進行完整建置時清除輸出資料夾」,在上面的圖中可以找到。可是這樣一來,以後建置路徑可能會留下一些垃圾檔案,每當你刪除 JavaSource 裡面的檔案被刪除時,要記得到建置路徑下刪除對應的 .class 檔。

網路資源