« Q4 PGOM | Main | 行銷學大師 Philip Kotler 的演講 »

October 15, 2006

Use SVN as local repository

這裡有篇文章講如何在 Win32 上設定 svn server
http://anonsvn.labs.jboss.com/labs/jbossrules/tags/3.0.3-GA/drools-repository/doc/subversion/Svn-Win32-Inst-Guide.html

照著作差不多就可以裝起來, 有幾點要注意的, 我放在文章的最後面, 這裡先來講一些東西

用過 VSS 跟 CVS, 才會知道 SVN 真是好用到不行 (尤其是搭配烏龜 SVN)
SVN 很好用, 但有一點我覺得美中不足的地方, 就是沒有 local repository

SVN 的意義不僅僅是 database, 否則自己每天壓 zip 檔就好, 他的重點在於 control & tracking

如果你要改一個東西, 從 A => B, 通常這中間會有許多階段性的修改
A => a1, a2, a3, b1, b2, b3 => B

有蠻多人的做法是, 悶著頭改, 改到 B 之後, 一次 commit 進去
但這樣做就會失去中間修改過程中的資訊
有時候悶著頭改, 改到最後, 哪裡改爛了都不知道

譬如說以前 optimize H.264, 有時後一次更動數十個檔案, 修改的地方有數百個之多
改了一兩天, 突然發現改爛了, 卻不知道是從何時開始改壞的
這時候你該怎麼辦? 要摸摸鼻子 rollback, 還是花時間去追?

說真的, commit 不要錢, 多 commit 無妨, 我比較建議一步一腳印的做法
你覺得改到一個階段就可以 commit, 不一定要 feature complete
讓 SVN 來幫助你減輕負擔, 減少錯誤, 也讓 SVN 紀錄一切過程

以前面的例子來說, 假設你在 b1 時發現爛掉了, 但你確定 a3 的版本是對的
那麼你就可以專心的看是 b1 的哪些修改有錯, 不用 a1, a2, a3, b1 全部都追, 這樣就差很多

所以時時 commit, 你就是在利用 SVN 幫你做追蹤, 確認的工作

但是如果每個人都這樣做, 人數一多的話, 有時候 commit log 就會非常精采
這時候, 如果自己能有一個 local repository 就很棒了
中間修改的過程 a1, a2, a3, b1, b2, b3 可以 commit 在自己 local
對於大家共用的 share respository, 大家就只會看到 A => B 這樣簡單的修改
只可惜 SVN 不提供這樣的功能 (我知道 SVK 有, 但是我們沒有採用 SVK, 我也沒花時間去研究 SVK :P)

但還是可以架設自己的 local repository, 再利用 Araxis Merge 之類的工具跟 share repository 來同步

我自己第一次弄 local repository 是去年出差的時候開始
平常用慣了 SVN, 但如果出差兩個星期, 沒有 SVN 可以用就會很痛苦
兩個星期你有很多事要做, 但沒有 SVN 意味著你無法做 versioning, 無法 tracking, 沒辦法 diff

================================================================================

另一個想講的是, 我們修改程式的時候, 通常會在改之前, 把原先的那段程式 comment 起來, 一方面是怕改爛, 一方面是作為參考
問題是改完之後, 原本那段已經變成 comment 的 code 是要砍掉, 還是繼續留在原地?
砍掉還是留著都各有優缺點, 這個問題以前我也和 Patrick 討論過

留著的最大缺點是, 隨著時間累積, 他會加大你程式碼的長度, 讓程式看起來混亂
日後別人改到這裡, 會不知道 comment 掉的 code 到底要不要也改, 維持一致性, 以免以後這段 code 會在被打開
有人會覺得不用去改, 反正以後也不會再被打開. 那既然如此, 何必留一段幾乎不會再被用到的 code?

我和 Patrick 的結論是, 勇敢的砍掉, 然後讓 SVN 紀錄這件事情, 以後有問題再用 SVN 來追
剛開始我也怕怕的, 擔心以後用 SVN 追會很麻煩, 但最後我發現, 砍掉的 code 在回頭翻出來的機會很少
也就是說, 我們在開發的過程中留下的那些被 disable 的程式片段, 多半不會再被用到, 留著只是徒增程式碼的長度而已
再者, SVN + Araxis Merge, 追蹤起來也不會很困難

(當然不是說都不能留, 該留的還是要留. 我想說的是這兩種方式太偏向任何一邊都不好, 分寸得自己拿捏)

寫 code 很重要, 但是在開發的過程中, 砍 code 也很重要, 因為他可以控制你程式的複雜度
沒有人會希望 GM 的時候, 也寫出一個萬行的大怪物, 這樣不管是 debug, 寫新 feature, 或是 optimize 都很辛苦

寫程式的時候永遠要把 maintain 的因素考慮進去, 不管以後是你 maintain 還是交給別人 maintain

================================================================================

1. 請用 apache 2.0.x 的版本
2. 在設定 apache module 的部分, 因為 DLL 的關係, 請用 "C:\Program Files\Subversion\bin\mod_dav_svn.mo" 的形式, 不要使用 Apache 的相對路徑
3. 設定 apache 的目錄權限 (如果你是出差要用的話, 一定要設):
<Location /svn/myrepos>
    DAV svn
    SVNPath c:/path/to/directory/myrepos
    Order deny, allow
    Deny from all
    Allow from localhost
</Location>

Posted by chenhsiu at October 15, 2006 12:10 PM

Comments