### 修訂版本: 號碼、關鍵字和日期,噢,我的!
在繼續之前你一定要知道如何識別版本庫的一個修訂版本,像你在[“修訂版本”一節]( "修訂版本")看到的,一個修訂版本就是版本庫的一個“快照”,當你的版本庫持續擴大,你必須有手段來識別這些快照。
你可以使用`--revision`(`-r`)參數來選擇特定修訂版本(**svn --revision REV**),你也可以指定在兩個修訂版本之間的一個范圍 (**svn --revision REV1:REV2**)。你可以在Subversion中通過修訂版本號、關鍵字或日期指定特定修訂版本。
### 修訂版本號
當你新建了一個Subversion版本庫,從修訂版本號0開始,每一次成功的提交加1,當你提交成功,Subversion告訴客戶端這個新版本號:
~~~
$ svn commit --message "Corrected number of cheese slices."
Sending sandwich.txt
Transmitting file data .
Committed revision 3.
~~~
如果你想在未來使用這個版本(我們將在此章的后面講述我們這樣做的方式和原因),你可以通過號碼“3”指定。
### 修訂版本關鍵字
Subversion客戶端可以理解一些*修訂版本關鍵字*,這些關鍵字可以用來代替`--revision`的數字參數,這會被Subversion解釋到特定版本:
### 注意
工作拷貝中的每一個目錄都有一個叫作`.svn`的管理目錄,工作目錄中的每一個文件,Subversion在管理區域為它保留了一個備份,這是上一個版本(叫做“BASE”版本)沒有修改的(沒有關鍵字變化,沒有行結束符號轉化,沒有任何改動)拷貝,我們把這個文件當作*原始拷貝*或*基準文件*使用,它與版本庫中的文件完全一樣。
HEAD
版本庫中最新的版本。
BASE
工作拷貝中的“原始”修訂版本。
COMMITTED
在`BASE`版本之前(或在Base)一個項目最后修改的版本。
PREV
一個項目最后修改版本*之前*的那個版本(技術上為COMMITTED -1)。
### 注意
`PREV`、`BASE`、和`COMMITTED`指的都是本地路徑而不是URL。
下面是一些關鍵字使用的例子,不要擔心現在沒有意義,我們將在本章的后面解釋這些命令:
~~~
$ svn diff --revision PREV:COMMITTED foo.c
# shows the last change committed to foo.c
$ svn log --revision HEAD
# shows log message for the latest repository commit
$ svn diff --revision HEAD
# compares your working file (with local mods) to the latest version
# in the repository.
$ svn diff --revision BASE:HEAD foo.c
# compares your “pristine” foo.c (no local mods) with the
# latest version in the repository
$ svn log --revision BASE:HEAD
# shows all commit logs since you last updated
$ svn update --revision PREV foo.c
# rewinds the last change on foo.c.
# (foo.c's working revision is decreased.)
~~~
這些關鍵字允許你執行許多常用(而且有用)的操作,而不必去查詢特定的修訂版本號,或者記住本地拷貝的修訂版本號。
### 修訂版本日期
在任何你使用特定版本號和版本關鍵字的地方,你也可以在“{}”中使用日期,你也可通過日期或者版本號配合使用來訪問一段時間的修改!
如下是一些Subversion能夠接受的日期格式,注意在日期中有空格時需要使用引號。
~~~
$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
…
~~~
當你指定一個日期,Subversion會在版本庫找到接近這個日期的最新版本:
~~~
$ svn log --revision {2002-11-28}
------------------------------------------------------------------------
r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines
…
~~~
**Subversion會早一天嗎?**
如果你只是指定了日期而沒有時間(舉個例子`2002-11-27`),你也許會以為Subversion會給你11-27號最后的版本,相反,你會得到一個26號版本,甚至更早。記住Subversion會根據你的日期找到*最新的*版本,如果你給一個日期,而沒有給時間,像`2002-11-27`,Subversion會假定時間是00:00:00,所以在27號找不到任何版本。
如果你希望查詢包括27號,你既可以使用(`{"2002-11-27 23:59"}`),或是直接使用(`{2002-11-28}`)。
你可以使用時間段,Subversion會找到這段時間的所有版本:
~~~
$ svn log --revision {2002-11-20}:{2002-11-29}
…
~~~
我們也曾經指出,你可以混合日期和修訂版本號:
~~~
$ svn log --revision {2002-11-20}:4040
~~~
用戶一定要認識到這種精巧會成為處理日期的絆腳石,因為一個版本的時間戳是作為一個屬性存儲的―不是版本化的,而是可以編輯的屬性―版本號的時間戳可以被修改,從而建立一個虛假的年代表,也可以被完全刪除。這將大大破壞Subversion的這種時間―版本轉化功能的表現。
- 第1章介紹
- Subversion的歷史
- Subversion的特性
- Subversion的架構
- 安裝Subversion
- Subversion的組件
- 快速入門
- 第2章基本概念
- 版本模型
- Subversion實戰
- 摘要
- 第3章指導教程
- 導入
- 修訂版本: 號碼、關鍵字和日期,噢,我的!
- 初始化的Checkout
- 基本的工作周期
- 檢驗歷史
- 其他有用的命令
- 摘要
- 第4章分支與合并
- 使用分支
- 在分支間拷貝修改
- 常見用例
- 轉換工作拷貝
- 標簽
- 分支維護
- 摘要
- 第5章版本庫管理
- 版本庫的創建和配置
- 版本庫維護
- 添加項目
- 摘要
- 第6章配置服務器
- 網絡模型
- svnserve,一個自定義的服務器
- httpd,Apache的HTTP服務器
- 支持多種版本庫訪問方法
- 第7章高級主題
- 屬性
- Peg和實施修訂版本
- 外部定義
- 賣主分支
- 本地化
- Subversion版本庫URL
- 第8章開發者信息
- 使用API
- 進入工作拷貝的管理區
- WebDAV
- 使用內存池編程
- 為Subversion做貢獻
- 第9章Subversion完全參考
- svn add
- svn blame
- svn cat
- svn checkout
- svn cleanup
- svn commit
- svn copy
- svn delete
- svn diff
- svn export
- svn help
- svn import
- svn info
- svn list
- svn log
- svn merge
- svn mkdir
- svn move
- svn propdel
- svn propedit
- svn propget
- svn proplist
- svn propset
- svn resolved
- svn revert
- svn status
- svn switch
- svn update
- svnadmin
- svnadmin create
- svnadmin deltify
- svnadmin dump
- svnadmin help
- svnadmin hotcopy
- svnadmin list-dblogs
- svnadmin list-unused-dblogs
- svnadmin load
- svnadmin lstxns
- svnadmin recover
- svnadmin rmtxns
- svnadmin setlog
- svnadmin verify
- svnlook
- svnlook author
- svnlook cat
- svnlook changed
- svnlook date
- svnlook diff
- svnlook dirs-changed
- svnlook help
- svnlook history
- svnlook info
- svnlook log
- svnlook propget
- svnlook proplist
- svnlook tree
- svnlook uuid
- svnlook youngest
- svnserve
- svnversion
- mod_dav_svn Configuration Directives
- 附錄A.Subversion對于CVS用戶
- 目錄的版本
- 更多離線操作
- 區分狀態和更新
- 分支和標簽
- 元數據屬性
- 沖突解決
- 二進制文件和轉化
- 版本化的模塊
- 認證
- 轉化CVS版本庫到Subversion
- 附錄C.WebDAV和自動版本化
- 自動版本化交互性
- Subversion和DeltaV
- 術語表