目錄
如果你是從頭到尾按章節閱讀本書,你一定已經具備了使用Subversion客戶端執行大多數不同的版本控制操作足夠的知識,你理解了怎樣從Subversion版本庫取出一個工作副本,你已經熟悉了通過svn commit和svn update來提交和接收修改,你甚至也經常下意識的使用svn status,無論目的是什麼,你已經可以正常使用Subversion了。
但是Subversion的特性並沒有止於「普通的版本控制操作」,它也有一些超越了與版本庫傳遞文件和目錄修改以外的功能。
本章重點介紹了一些很重要但不是經常使用的Subversion特性,本章假定你熟悉Subversion對文件和目錄的基本版本操作能力,如果你還沒有閱讀這些內容,或者是需要一個複習,我們建議你重讀第 1 章 基本概念和第 2 章 基本使用,一旦你已經掌握了基礎知識和本章的內容,你會變成Subversion的超級用戶!
就像你在「修訂版本」一節見到的,Subversion的修訂版本號碼非常直接—就是隨提交增大的整數。儘管如此,不會花很長時間你就會忘記每個修訂版本的修改,但幸運的是,典型的Subvesion工作流程中一般不會要求你提供任意的修訂版本號。在需要輸入修訂版本號時,通常或者是你在一個提交郵件中看到了一個修訂版本,或者是在其他Subversion命令的輸出結果中,或者是任何上下文環境得到某個版本號碼的情況下。
但是有時候,你需要精確指定一個時間,而無法記住或者記錄了某個版本,這時除了使用修訂版本號碼,svn允許使用其他形式來指定修訂版本—修訂版本關鍵字和修訂版本日期。
當用來指定修訂版本範圍時,不同形式的Subversion修訂版本可以混合匹配。例如,你可以REV1是修訂版本關鍵字,REV2是修訂版本號,或者是REV1是日期,而REV2是修訂版本關鍵字,等等。不同的修訂版本指定符是等價的,所以你可以在冒號兩邊任意使用。
Subversion客戶端可以理解一些修訂版本關鍵字,這些關鍵字可以用來代替--revision (r)的數字參數,這會被Subversion解釋到特定修訂版本號:
版本庫中最新的(或者是「最年輕的」)版本。
工作副本中一個條目的修訂版本號,如果這個版本在本地修改了,則「BASE版本」就是這個條目在本地未修改的版本。
項目最近修改的修訂版本,與BASE相同或更早。
一個項目最後修改版本之前的那個版本,技術上可以認為是COMMITTED -1。
因為可以從描述中得到,關鍵字PREV,BASE和COMMITTED只在引用工作副本路徑時使用,而不能用於版本庫URL,而關鍵字HEAD則可以用於兩種路徑類型。
下面是一些修訂版本關鍵字的例子:
$ svn diff -r PREV:COMMITTED foo.c # shows the last change committed to foo.c $ svn log -r HEAD # shows log message for the latest repository commit $ svn diff -r HEAD # compares your working copy (with all of its local changes) to the # latest version of that tree in the repository $ svn diff -r BASE:HEAD foo.c # compares the unmodified version of foo.c with the latest version of # foo.c in the repository $ svn log -r BASE:HEAD # shows all commit logs for the current versioned directory since you # last updated $ svn update -r PREV foo.c # rewinds the last change on foo.c, decreasing foo.c's working revision $ svn diff -r BASE:14 foo.c # compares the unmodified version of foo.c with the way foo.c looked # in revision 14
在版本控制系統以外,修訂版本號碼是沒有意義的,但是有時候你需要將時間和歷史修訂版本號關聯。為此,--revision (-r)選項接受使用花括號({和})包裹的日期輸入,Subversion支持標準ISO-8601日期和時間格式,也支持一些其他的。下面是一些例子。(記住使用引號括起所有包含空格的日期。)
$ svn checkout -r {2006-02-17}
$ svn checkout -r {15:30}
$ svn checkout -r {15:30:00.200000}
$ svn checkout -r {"2006-02-17 15:30"}
$ svn checkout -r {"2006-02-17 15:30 +0230"}
$ svn checkout -r {2006-02-17T15:30}
$ svn checkout -r {2006-02-17T15:30Z}
$ svn checkout -r {2006-02-17T15:30-04:00}
$ svn checkout -r {20060217T1530}
$ svn checkout -r {20060217T1530Z}
$ svn checkout -r {20060217T1530-0500}
…
當你指定一個日期,Subversion會在版本庫找到接近這個日期的最近版本,並且對這個版本繼續操作:
$ svn log -r {2006-11-28}
------------------------------------------------------------------------
r12 | ira | 2006-11-27 12:31:51 -0600 (Mon, 27 Nov 2006) | 6 lines
…
你可以使用時間段,Subversion會找到這段時間的所有版本:
$ svn log -r {2006-11-20}:{2006-11-29}
…
因為一個版本的時間戳是作為一個屬性儲存的—不是版本化的,而是可以編輯的屬性(見「屬性」一節)—版本號的時間戳可以被修改,從而建立一個虛假的年代表,也可以被完全刪除。Subversion正確轉換修訂版本日期到修訂版本的能力依賴於修訂版本時間戳順序排列—修訂版本越年輕,則時間戳越年輕。如果順序沒有被維護,你會發現使用日期指定修訂版本不會返回你期望的資料。