PageRank



轉移公告

計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。

新文章只發佈在 http://www.hoamon.info/blog/

何岳峰 敬上

2007年1月22日 星期一

版本控制系統:svn(subversion)

不管你是寫程式還是系統設定檔的管理,在在都是一門學門,尤其是你得和其他人一同工作的時候。如果你是把工作完成的程式檔壓縮起來寄給別人的話,那你一定得聽聽什麼是版本控制。

目前市面上,比較有名(而且是open source)的版本控制系統有兩種:cvs及subversion。之前我也是用cvs的,不過在我看了這一篇文章後,我就把cvs丟了。

版本控制系統不外乎要解決的是三個地方的文件(含純文字檔、圖檔等)合併問題,依術語來說就是檔案庫、你的工作複本及別人的工作複本。

檔案庫永遠是文件最後該放置的地方,而你的工作複本一開始是從檔案庫來的,經過你的修改,最後再送回檔案庫中;而別人的工作複本也是一樣是從檔案庫來的,也是經由別人的修改,最後再送回檔案庫中。

而版本控制系統的工作就是在於能合諧地整合你所修改的工作複本及別人修改的工作複本,讓他們能在送進檔案庫時不會蓋掉任一方的成果。

說到這裡,你一定很心動了吧!畢竟當你只能用copy的方式作版本控制時,經常發生的蓋檔問題絕對讓你到現在還記憶猶新。

所以,請花個30分鐘來看看這一篇文章吧。距離你不寫程式的年紀,應該還有個五~十年的光景,早學早超生呀!

在使用svn時候,有二個觀念是很重要的。

一、詳實的送交註解

一定要詳實地寫上送交註解(commit comment),不要只是寫:「又更新版本了」、「解決一個bug」…等等之類無用的訊息,應該是「解決$input變數在$_GET ['input']=''時不能賦值的問題」、「給grace--在樣版中的$greeting應該定義為$hello,因為…」…等等之類的訊息。

二、看別人寫的commet

使用者在svn update前應該先查出自已目前的版本號,查目前版本號的方法如下,最大的號碼即為你目前的版本號

# svn status -N -v

然後在svn update後,把原本版本號到最新版本號之間的送交註解看一下。例如:原本你的工作複本版本號為13,當你修改過後要送交之前得作一次svn update,版本號跳為17,那你這時候應該要作一次看comment的指令:

# svn log -r 13:17
或是
# svn log -r 13:17 -v

先看看別人之前改了什麼,然後你自已評估與目前你所修改的程式流程有沒有衝突,例如:別人在16版的時候把$content[_msg]變數改為 $content[_lang]變數,那麼如果你有使用$content[_msg]的話,你就應該先改好手邊的工作複本,再作svn commit。

如果你覺得看comment不夠清楚,那麼直接比較一下程式碼到底有那裡是不同,指令是:

# svn diff -r 16

上面的指令會比較第16版與你手邊已修改但還未送交的版本作比較,如果你只想比較單一檔案的話,指令是:

# svn diff -r 16 iLovePerl.php

直接把檔案名帶進出。

有時候你個人的commit周期太慢了(可能因為一個bug一直抓不出來),
那你還是要在未上傳檔案庫前,經常地(至少是一天一次)觀看遠端檔案庫的版本情況,
像是你的工作複本到遠端檔案庫之間的送交註解,其指令如下:

# svn log -r BASE:HEAD

這樣才不會與其他人的距離差太遠,否則等你要commit時,才來調整你的程式碼,
這又太慢了。

有時候,在svn所控制的專案中,你有不想作版本控制的檔案,那該這麼作呢!

像是資料庫的設定檔,這個東西,每個程設師在開發狀態時,可能用的都是臨時性的資料庫,一個人一種設定,如果每一次commit或update後都把別人用的或是自己用的給重設了,
那是件很麻煩的事,所以呢,我們使用svn:ignore性質來解救我們,方法如下,後來的Config代表的是一個資料夾,是你所想忽略的檔案所在的那一個資料夾,如果你想忽略的檔案是在現在的目錄中,那就把 Config 換成 .

# svn propedit svn:ignore Config

然後它會進入stdin的模式,你直接打檔名進去即可,像是

# svn propedit svn:ignore Config
DB.config

然後按下 Ctrl+D即可。請記住DB.config是在Config資料夾中的檔案喔,而且DB.config檔不應該送進svn add中喔


=== 後記 ===

現在我已經改用 Mercurial/Hg(http://hoamon.blogspot.com/2009/03/from-subversion-to-mercurial.html) 了,最大的優點是可離線操作,不像 svn 如果沒有中央伺服器,有些工作就沒辦法作了。

6 則留言:

  1. 文章中所述的這一篇文章的連接已經不存在了。可以改成:
    http://svn.stu.edu.tw/svnbook/

    回覆刪除
  2. 謝謝 bestlong ,已更正。

    回覆刪除
  3. 建議你試試 perforce, 效能好、功能強,而且有非常 friendly 的 GUI(還不只一個)。

    回覆刪除
  4. 是這個軟體嗎: http://www.google.com.tw/url?sa=t&ct=res&cd=1&url=http%3A%2F%2Fwww.perforce.com%2F&ei=eTGPRq0cneCwAtHziZ8I&usg=AFQjCNHwtOtpnZRe7FBQHk1oILolC7WmyQ&sig2=vpHXiHRth5xcUigYtWsQ2w
    它好像不是 Open Source 的,而且還要花錢買。

    回覆刪除
  5. 它不是 open source 的,但不付錢的話也可以讓 2 個 user、5 個 workspace 使用(http://www.perforce.com/perforce/price.html).
    重點是真的好用,雖然貴了點.

    回覆刪除
  6. 現在我已經改用 Mercurial/Hg(http://hoamon.blogspot.com/2009/03/from-subversion-to-mercurial.html) 了,最大的優點是可離線操作,不像 svn 如果沒有中央伺服器,有些工作就沒辦法作了。

    回覆刪除

注意:只有此網誌的成員可以留言。

Related Posts Plugin for WordPress, Blogger...