### 檢驗歷史
我們曾經說過,版本庫就像是一臺時間機器,它記錄了所有提交的修改,允許你檢查文件或目錄以及相關元數據的歷史。通過一個Subversion命令你可以根據時間或修訂號取出一個過去的版本(或者恢復現在的工作拷貝),然而,有時候我們只是想*看看*歷史而不想*回到*歷史。
有許多命令可以為你提供版本庫歷史:
**svn log**
展示給你主要信息:附加在版本上的日志信息和所有版本的路徑修改。
**svn diff**
展示一個文件改變的詳細情況。
**svn cat**
取得在特定版本的某一個文件顯示在當前屏幕。
**svn list**
顯示一個目錄在某一版本存在的文件。
### **svn log**
找出一個文件或目錄的歷史信息,使用**svn log**命令,**svn log**將會提供你一條記錄,包括:誰對文件或目錄作了修改、哪個修訂版本作了修改、修訂版本的日期和時間、還有如果你當時提供了日志信息,也會顯示。
~~~
$ svn log
------------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line
Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line
Added main() methods.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line
Initial import
------------------------------------------------------------------------
~~~
注意日志信息缺省根據*時間逆序排列*,如果希望察看特定順序的一段修訂版本或者單一版本,使用`--revision` (`-r`)選項:
~~~
$ svn log --revision 5:19 # shows logs 5 through 19 in chronological order
$ svn log -r 19:5 # shows logs 5 through 19 in reverse order
$ svn log -r 8 # shows log for revision 8
~~~
你也可以檢查單個文件或目錄的日志歷史,舉個例子:
~~~
$ svn log foo.c
…
$ svn log http://foo.com/svn/trunk/code/foo.c
…
~~~
這樣*只會*顯示這個工作文件(或者URL)做過修訂的版本的日志信息。
如果你希望得到目錄和文件更多的信息,你可以對**svn log**命令使用`--verbose` (`-v`)開關,因為Subversion允許移動和復制文件和目錄,所以跟蹤路徑修改非常重要,在詳細模式下,**svn log** 輸出中會包括一個路徑修改的歷史:
~~~
$ svn log -r 8 -v
------------------------------------------------------------------------
r8 | sally | 2002-07-14 08:15:29 -0500 | 1 line
Changed paths:
M /trunk/code/foo.c
M /trunk/code/bar.h
A /trunk/code/doc/README
Frozzled the sub-space winch.
------------------------------------------------------------------------
~~~
**為什么**svn log**給我一個空的回應?**
當使用Subversion一些時間后,許多用戶會遇到這種情況:
~~~
$ svn log -r 2
------------------------------------------------------------------------
$
~~~
乍一看,好像是一個錯誤,但是想一下修訂版本號是作用在版本庫整體之上的,如果你沒有提供路徑,**svn log**會使用當前目錄作為默認的目標,所以,作為結果,如果你對一個本身和子目錄在指定版本到現在沒有做過修改的目錄運行這個命令,你會得到空的日志。如果你希望察看某個版本做的修改的日志,只需要直接告訴**svn log**使用版本庫頂級的目錄作為參數,例如**svn log -r 2 。
### svn diff
我們已經看過**svn diff**―使用標準區別文件格式顯示區別,它在提交前用來顯示本地工作拷貝與版本庫的區別。
事實上,**svn diff**有*三*種不同的用法:
-
檢查本地修改
-
比較工作拷貝與版本庫
-
比較版本庫和版本庫
#### 比較本地修改
像我們看到的,不使用任何參數調用時,**svn diff**將會比較你的工作文件與緩存在`.svn`的“原始”拷貝:
~~~
$ svn diff
Index: rules.txt
===================================================================
--- rules.txt (revision 3)
+++ rules.txt (working copy)
@@ -1,4 +1,5 @@
Be kind to others
Freedom = Responsibility
Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$
~~~
#### 比較工作拷貝和版本庫
如果傳遞一個`--revision`(`-r`)參數,你的工作拷貝會與指定的版本比較。
~~~
$ svn diff --revision 3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt (revision 3)
+++ rules.txt (working copy)
@@ -1,4 +1,5 @@
Be kind to others
Freedom = Responsibility
Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$
~~~
#### 比較版本庫與版本庫
如果通過`--revision` (`-r`)傳遞兩個版本號,通過冒號分開,這兩個版本會進行比較。
~~~
$ svn diff --revision 2:3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt (revision 2)
+++ rules.txt (revision 3)
@@ -1,4 +1,4 @@
Be kind to others
-Freedom = Chocolate Ice Cream
+Freedom = Responsibility
Everything in moderation
Chew with your mouth open
$
~~~
你不僅可以用**svn diff**比較你工作拷貝中的文件,你甚至可以通過提供一個URL參數來比較版本庫中兩個文件的的區別,通常在本地機器沒有工作拷貝時非常有用:
~~~
$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt
…
$
~~~
### **svn cat**
如果你只是希望檢查一個過去的版本而不希望察看它們的區別,使用**svn cat**:
~~~
$ svn cat --revision 2 rules.txt
Be kind to others
Freedom = Chocolate Ice Cream
Everything in moderation
Chew with your mouth open
$
~~~
你可以重定向輸出到一個文件:
~~~
$ svn cat --revision 2 rules.txt > rules.txt.v2
$
~~~
你一定疑惑為什么不只是使用**svn update --revision** ,將文件更新到舊的文件,我們有使用**svn cat**的原因。
首先,你或許希望使用外置的比較工具(或許是一個圖形化的工具,或者你的格式無法用標準區別格式察看)察看這兩個版本的區別,這種情況下,你需要得到一個舊的版本的拷貝,所以重定向到一個文件,并且在你的比較工具中指定這兩個版本來察看區別。
有時候察看整個文件比只看區別要容易。
### **svn list**
**svn list**可以在不下載文件到本地目錄的情況下來察看目錄中的文件:
~~~
$ svn list http://svn.collab.net/repos/svn
README
branches/
clients/
tags/
trunk/
~~~
如果你希望察看詳細信息,你可以使用`--verbose` (`-v`)參數:
~~~
$ svn list --verbose http://svn.collab.net/repos/svn
2755 harry 1331 Jul 28 02:07 README
2773 sally Jul 29 15:07 branches/
2769 sally Jul 29 12:07 clients/
2698 harry Jul 24 18:07 tags/
2785 sally Jul 29 19:07 trunk/
~~~
這些列告訴你文件和目錄最后修改的修訂版本、做出修改的用戶、如果是文件還會有文件的大小,最后是修改日期和項目的名字。
### 關于歷史的最后一個詞
除了以上的命令,你可以使用帶參數`--revision`的**svn update**和**svn checkout**來使整個工作拷貝“回到過去”:
~~~
$ svn checkout --revision 1729 # Checks out a new working copy at r1729
…
$ svn update --revision 1729 # Updates an existing working copy to r1729
…
~~~
看到了吧?我們說過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
- 術語表