just put something what I need. Forgive my poor English!

2008年1月20日 星期日

SVK 速成

作者:Cornelius
出處:http://c9s.blogspot.com/2008/01/svk.html
--------------------------------------------------------------

在 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

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

Posted by Cornelius @ 1/06/2008 05:10:00 PM

沒有留言:

張貼留言