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

AutrijusTang

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

如您所見,除非有衝突發生,否則對主幹進行合併動作的時候,是不需要先取出一份副本的。

ChiaLiangKao

我在 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

AutrijusTangJesseVincent

另見: SVKUsageSingleUserSVK


arrow
arrow
    全站熱搜

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()