ZHSVKTutorial (Revision 674)
30 秒入門
照著 InstallingSVK 的介紹安裝好 svk 之後,請在命令列模式(Windows 上現在叫作「命令提示字元」,而像是 FreeBSD、Mac OS X 或 Linux 之類的泛 UNIX,通常叫「終端機」)裡,進行下列步驟:
# 首先初始化 svk 的「藏寶圖(depotmap)」
svk depotmap --init
# 從遠端取出檔案庫,放到本機
svk cp http://remote.subversion.repo/project project
# 會有三個停下來問你問題的地方,答案分別是:<Enter>, "project", "project"
# 接著你可能想要改個檔案
cd project ; vim "某檔案" ; ...
# 然後把變動送到「本機」的檔案庫
svk ci
# 再把變動「推」回遠端檔案庫
svk push
# 想知道這段時間裡有沒有人也改了同一個檔案庫嗎?從遠端「拉」回來吧!
svk pull
想實際試試看嗎?請參考 如何透過 SVK 取得 Open Vanilla 的源碼。
從本機檔案庫開始
作為一位新手,使用svk時,頭一件必要的事情就是:
svk depotmap
如此一來,便會做些初始化動作,安排好本機的檔案庫位置,還會跳出編輯畫面,讓你可以自己新增。 svk 內定的「預設檔案庫」目錄(也就是 '')在 ~/.svk/local,你可以在後面加上更多的檔案庫名。
在「depotmap」裡面,一行便表示一項檔案庫的目錄對應,格式為:
depotname: '/path/to/repos'
前面的 depotname 就是命令列之中的 DEPOTPATH,比如:
/depotname/path/in/repos
/depotname/檔案庫/底下的/深層路徑
這也就是為什麼「預設檔案庫」的「根目錄」是 // ,而不是 / 的緣故了。
享受離線工作
(如果你想對已經存在的遠端檔案庫進行操作,請直接跳到下面「遠端檔案庫的替身」這節。)
現在你已經蓋好空的倉庫了,接下來也許是把某個正在進行中的專案計畫搬進去:
svk import -m 'import <projectname>' //projectname/trunk /path/to/project
於是,以後這專案計畫就住進你的本機檔案庫了,你可以看看他的更動紀錄:
svk log -v //projectname
也可以把目前的「發展主幹」(trunk ,或稱「基幹」)提出來, 並放在目前目錄下的 "project-work" 子目錄中, 然後就可以開始進行修改:
svk checkout //projectname/trunk project-work
增刪檔案
svk add project-work/newfile.c
svk rm project-work/nomore.c
檢視目前狀況
svk status project-work
送交目前的更動
svk commit -m 'first change!'
遠端檔案庫的替身
如果你得跟別人共事,首先你得把遠端檔案庫的資料全抓回來:
svk mirror http://svn.example.org/svn/trunk //project/trunk
svk sync //project/trunk
(請注意: 在 SVK 0.20 和之前的版本裡,mirror 的語法是反過來的:
svk mirror //project/trunk http://svn.example.org/svn/trunk
)
修改「替身路徑」並送交替身檔案庫時,svk 會按照您實際的意思去做:送交至遠端的本體檔案庫,還會進行一回同步。
現在,遠端的檔案庫已經可以離線瀏覽了,下面這個指令可以檢視它的歷史紀錄:
svk log //project/trunk
建個本地的分支,才可以離線工作
svk cp -m 'local branch' //project/trunk //project/local
本地分支所在的路徑可以自由指定。
現在,提出一份本機的分支,修改之後,再用 "svk commit" 送回更動吧。
將遠端檔案庫的更動合併至本機檔案庫
在使用版本控制的日子裡,你總是會想要與別人在遠端檔案庫所做的修改,進行一番合併。
# 同步遠端的計畫主幹內容
svk sync //project/trunk
# 事先確認遠端合併過來之後不會產生內容上的衝突
svk smerge -C //project/trunk //project/local
# 立刻把遠端的內容合併過來
svk smerge //project/trunk //project/local
別忘了更新領出來的那份副本:
svk up /path/to/project-local/checkout
如果在合併的過程之中會產生內容衝突,就必須先合併至領出來的副本去,然後手動修改、解決:
svk smerge //project/trunk /path/to/project-local/checkout
(JesseVincent: 如果這件事情可以直接對檔案庫進行,會不會更有道理呢?ChiaLiangKao: 詳見: InteractiveMerge)
解決了 smerge 所指出有內容衝突的檔案之後,利用 "svk resolved" 將其標示為「解決」, 再將更動送回檔案庫去。
# 一次送回所有更動
smerge -l //project/local //project/trunk
# 逐一送回各項更動
smerge -I //project/local //project/trunk
將本機的更動合併至遠端
1. 先將同步主幹到最新,svk 才會自動進行合併
svk sync //project/trunk
2. 照例,檢查是否會有內容衝突:
svk smerge -C //project/local //project/trunk
3. 倘若沒有衝突,再次執行 "svk smerge" ,把 -C 參數拿掉,便會開始合併了。(提示:smerge -l 可以把此次合併時本機紀錄自動存到遠端去;-I 則會逐項送回更動)
4. 如果有衝突,使用上一節的方法,先合併到提領出的副本去,修改完成之後先送回到 //project/local (也就是本機的檔案庫),再重複步驟 1 即可。
每日常用命令提要
那麼,這兒是要合併回去 elixus 檔案庫時的命令紀錄:
svk depotmap
svk mirror https://svn.elixus.org/repos/depot //depot/trunk
svk sync //depot
svk copy -m '' //depot/trunk //depot/local
svk checkout //depot/local ~/svn/depot
vim ~/svn/depot/kwiki/Changes
svk commit -m '* some changes (this log will be propagated back).'
svk smerge -C //depot/local //depot/trunk
svk smerge -l //depot/local //depot/trunk
svk smerge -m '' //depot/trunk //depot/local
Painless import
無痛匯入
現在,考慮在SVN書 裡提到的,
要將他人之前的工作全數匯入時候的情況,svk import 會比一直反覆使用 smerge 來得簡單多了。
頭一次匯入 libcomplex-1.0
svk import -m 'virgin import' //project/vendor/libcomplex/current /path/to/libcomplex-1.0
那麼你可能會需要做個「官方版本」的標籤
svk cp -m 'libcomplex-1.0' //project/vendor/libcomplex/current //project/vendor/libcomplex/1.0
這個步驟其實可以省略,執行一下 svk log //project/vendor/libcomplex/current 就可以馬上告訴你 匯入的歷史紀錄了,你也可以把一些版本釋出之類的資訊寫進紀錄當中,看起來會比叫好一些。
接者建立自家牌的發展主幹
svk cp -m 'initial branch from libcomplex' //project/vendor/libcomplex/current //project/trunk/libcomplex
然後就好整以暇的在自己的發展主幹慢慢修改...
直到有天,再度匯入新版 : libcomplex-1.1
svk import -m 'import libcomplex-1.1' //project/vendor/libcomplex/current /path/to/libcomplex-1.1
再次標上「官方版本」標籤
svk cp -m 'libcomplex-1.1' //project/vendor/libcomplex/current //project/vendor/libcomplex/1.1
現在,合併到自己的主幹上
先檢查是否會有衝突
svk smerge -C //project/vendor/libcomplex/current //project/trunk/libcomplex
smerge 會自動追蹤合併的紀錄。如果沒有衝突,那麼把 -C 參數拿掉再跑一次即可合併。 如果發生衝突,那就必須先合併到某個提領出的副本,然後解決衝突。
svk co //project/trunk /my/work/path
svk smerge //project/vendor/libcomplex/current /my/work/path/libcomplex
解決之後,執行 "svk resolved" 便可將這些問題標示為「已解決」。最後,於提領出的副本之處, 送回解決過後的變動:
svk ci /my/work/path
如您所見,除非有衝突發生,否則對主幹進行合併動作的時候,是不需要先取出一份副本的。
我在 SVK 上手指南之中,想看見.... :
如何將本機的更動合併到遠端檔案庫去
如果您只是希望想將本機的修改直接反向同步回去的話,就這麼辦:
svk commit ~/svn/depot
svk smerge -l //local/depot //depot
svk sync //depot
內容衝突
如何決定本機與遠端是不是回有內容衝突發生
如何解決衝突
如何得知遠端到底有那些異動
如何將遠端的更動合併到本機來
如果您只是希望將遠端的修改同步回來的話,就這麼辦:
svk sync //depot
svk smerge -m '' //depot //local/depot
svk update ~/svn/depot
另見: SVKUsage 與 SingleUserSVK