2008年1月6日 星期日

明天要出發囉! :D

感謝在 AIINK 這段期間 clkao 的照顧。 :D

然後就是進去努力奮練身體了。XD

SVK 速成

在 clkao 的推薦下使用了 SVK ,原本我是 subversion 的使用者,在 Linux 的 Command-Line 底下使用 subversion 體會到諸多不便,用過 svk 之後便愛不釋手。

有鑑於 svn 許多令人詬病的地方,長長的 URI、Commit 的時候無法挑選哪些檔案 ci ( command-line )、以及調閱 log 的速度慢,要做離線版本控制也相當不便 ...etc。 ( 所謂離線版本控制的白話就是說,你可以到深山裡面一邊泡溫泉寫 Code , 也可以在火車上、飛機上、草原上,快樂的使用 SVK。 )

SVK 提供了一個快速有效的解決方案,使用方式相當簡單。

安裝

在 ubuntu 下安裝 svk ( 已經有包好的套件了 )
$ sudo apt-get install svk
如果要從 CPAN 裝的話也可:
$ cpan SVK

設定自動完成 (completion script)

相關作法可以參考 SVKPathCompletion

Mirror

假設要 checkout http://svn.xxx.org/svn/foobar ,在 svk 裡,checkout 之前要先進行靜射(mirror),以及 同步(sync) 的動作,首先 mirror 指令是這樣下的:
svk mkdir //mirror -m "for mirror depots"
svk mirror //mirror/foobar http://svn.xxx.org/svn/foobar/trunk
//mirror/foobar 你可以把他想成是一個虛擬路徑,但是事實上他是建立在 ~/.svk/local 內 svn 的 filesystem 內。
而因為 //mirror 的路徑尚未建立,所以要先使用 mkdir 先將之建立,在進行 mirror 到 foobar 這個路徑上。 其中 //mirror/foobar 命名隨你方便即可。

[註1]: 當然你也可以直接用 co ,SVK 會問你要設定的 depot,然後自動做 mirror,sync,checkout 等動作。

[註2]: 將 jifty 鏡射到 //mirror/foobar 上之後,以後便不需再輸入網址,並且 svk 有 completion script (deb 已經將 completion script 包好了,因此裝完直接可用,CPAN 的版本要自己設定 completion script ),你可以透過 Tab 鍵自動輸入 depot 位址。

譬如:
$ svk co //mi   # 此時按下 Tab 鍵
$ svk co //mirror/ # 自動補齊。接著按兩下 Tab
//mirror/Foo //mirror//Bar
$ svk co //mirror/ # 自動會顯示其他可能的 Completion

Sync

我們 mirror 完了,接著做 sync ,將遠端的修定版下載回來:
$ svk sync //mirror/foobar
另外要注意的是 sync 所做的動作會將所有的修改下載回來,如果你只要 head version (最新的修定版) ,可以加上參數 -s HEAD ,或全部 -a。 ( 可用 svk help [command] 查詢 )

Checkout

接著將 checkout 出來:
svk co //mirror/foobar foobar

Add, Delete and Revert

切換目錄進去之後( $ cd foobar
),可能做了一些編輯:
$ touch Foobar
新增檔案:
$ svk add Foobar
刪除檔案
$ svk rm Book
復元檔案:
$ svk revert SomeThing.pm

Commit

要提交我們所做的修改可以下 ci 或是 commit :
$ svk ci
如果只要 commit Foobar 一個檔案,可下:
$ svk ci Foobar
Commit 指令會進入編輯器,這時候可以選擇將不想 Commit 的檔案去掉,直接將那行刪除即可 ( SVN 不能喔 )。或者要新增檔案也可直接將 "?" 號改成 A,SVK 自動會將此檔案新增,或者 D (Delete) , R (Revert) 等等 ...
some log message
=== Targets to commit (you may delete items from it) ===
=== You may change '?' to 'A' to add unversioned items ===
M /home/svk/foobar/lib/Foo/Bar.pm
A Makefile.PL
A Foobar
D Useless_File
R DontModifyMe.pl
? MANIFEST
[註]: 如果不想進入編輯器也可用 -m "log message"。

Update

接著如果別人 commit 了,要更新 repo 只需要
$ svk up -s
-s 代表 sync 的動作,意思就是從遠端更新回來。

Local Branch

如要做一個 local branch (這樣就可以做離線 commit 了),首先將 //mirror/foobar 複製到 //local/foobar ( svk 會記住這個 //local/foobar 從那邊複製過來 ):
$ svk mkdir //local
$ svk cp //mirror/foobar //local/foobar
接著 switch 到 //local/foobar 上:
$ svk sw //local/foobar
等到連線的時候只要做:
$ svk push -C   # dry-run , 檢查看看有沒有 conflict
$ svk push # 便將修改 merge back 回 //mirror/foobar

Create a branch from trunk

如要從 trunk 建立一個 branch:
$ svk cp //local/Bar/trunk   //local/Bar/branches/y-feature
如要 merge branch (將 x-feature merge 到 y-feature 去):
$ svk smerge //local/Bar/x-feature   //local/Bar/y-feature
要刪除 repo
$ svk rm //local/Bar/y-feature

Import

假設現在有一個叫作 Foo::Bar 的模組放在 /home/src 下,完整路徑是 /home/src/foo-bar/。我們若要將此 foo-bar 資料夾匯入進去,我們可下
$ svk mkdir -p //mirror/foo-bar/ -m "create mirror depot"
$ svk import /home/src/foo-bar //mirror/foo-bar/ -m "import source from foo-bar"
下 -m "訊息" ,是一個很快速並且簡潔的方法,因為你不需要再進入編輯器輸入訊息。
而 mkdir 後面的 -p 代表要建立父層的資料夾 ( parent directory )。

Diff

在 Commit 之前若是要查看自己修改了哪些變動,可以使用 svk diff
$ svk diff
若要和上兩個 revision 比對,可下
$ svk diff -r -2
以上,基本上 svk 用起來 svn 大同小異,但是 svk 用起來便利許多。 ;-)

其他相關文件:
SVK 使用心得
OSDC.TW 2007 - SVK / clkao
方便實用的分散式版本控制系統-SVK
使用 svk 建立開發分支 / jserv
An SVK primer
SVK in a nutshell

22

好一段時間都以為自己已經 24 歲了。最近屈指一數才發現我原來還是 22...
可能是惡夢後遺症。

話說昨天作夢,忘了夢到什麼讓人生氣的事情,於是伸手一拳,重重的打在鐵櫃門上面.. (痛..)

2008年1月5日 星期六

aNobii

我的 aNobii 好像復活了,因為發覺挺好玩,逛別人的書櫃也挺有趣,大家都讀了好多書,真厲害。

不過太多書很難全部放上去,就從最近的書會放上去做紀錄。
小弟讀的書不多,見笑了。