TortoiseSVN:Subversion客戶端
1. 引言
· 團隊開發?
· 修改文件而他人也在改?你修改的內容丟失?
· 保存了文件可又后悔了?想得到幾天前的版本?
· 發現了bug,想知道bug何時引入的?
這些問題都遇到了?那就使用TortoiseSVN吧。TortoiseSVN是Subversion的客戶端。Subversion是針對CVS的不足而開發的版本控制系統。
2. 基本概念
檔案庫Repository
Subversion是版本管理的后臺系統,其核心是保存數據的檔案庫-repository。 檔案庫用分層的“文件-目錄”文件系統數來存儲數據。連接到檔案庫的客戶能讀寫數據。檔案庫記錄了你的每一次修改!客戶端可以從檔案庫中取到過去的版本。
圖2.1. 典型服務器/客戶機模型
版本模型Versioning Models
基本問題:共享數據而不相互覆蓋?
文件共享的問題The Problem of File-Sharing
在合作開發中文件共享的問題是顯而易見的。
圖 2.2. 要避免的問題
鎖定-修改-解鎖The Lock-Modify-Unlock Solution
Visual SourceSafe采用的就是這種模型。
Figure 2.3. 鎖定-修改-解鎖方案
問題:
· 鎖定可能引起管理問題: 如忘記解鎖別人無法使用。
· 鎖定造成不必要的串行作業。
· 鎖定可引起安全問題。
拷貝-修改-合并The Copy-Modify-Merge Solution
Subversion和CVS等采用拷貝-修改-合并模型。項目成員從檔案庫讀取個人的工作拷貝,所有項目成員并行地在工作拷貝上工作,然后合并在一起形成新的版本(version)。
圖 2.4. 拷貝-修改-合并方案
Figure 2.5. ...Copy-Modify-Merge Continued
如果修改不重疊,TortoiseSVN可自動合并。修改重疊則引起沖突(conflict)。沖突只能靠手工修改!
這種模型好像很混亂,但實際上很好用。解決沖突的時間大大小于因鎖定而等待的時間。解決沖突的最好辦法是溝通。
實際操作Subversion
工作拷貝Working Copies
Subversion的工作拷貝就是包含文件的本地目錄樹,與一般目錄的樹狀結構相同,可以進行任意的工作!工作結束后可將新的文件“發布”到檔案庫。
工作拷貝中包含了由Subversion創建和維護的一個特殊的子目錄.svn ,該目錄保存了重要的信息。不要刪除這個目錄!
例如,假定你的檔案庫包含兩軟件項目:paint和calc。
圖 2.6. 檔案庫文件系統
用取出(checkout)得到工作拷貝。
Repository URLs:檔案庫URL
Subversion的檔案庫借助不同方法得到:本地磁盤、網絡協議等:
Table 2.1. Repository Access URLs
Schema
Access Method
file:///
本地磁盤.
http://
透過Apache.
例:
File:///c:/svn/prj/template/Dist
c:/svn/prj/template是檔案庫的目錄,Dist是檔案庫的子目錄名稱
http://build:88/prj/template/Dist
http://build:88是Apache設置的URL,prj是通過Apache設置的位置,template是檔案庫名稱,Dist是目錄名
版本Revisions
svn commit 操作送交修改。檔案庫接受一次送交后,在文件系統樹創建新的狀態,稱之為版本revision。每個版本是一個遞增的自然數。
圖 2.7. 檔案庫
全局版本號
版本號代表整個檔案庫而非單個文件!
工作拷貝如何跟蹤檔案庫?
Subversion將下列兩種管理信息記錄在.svn/:
· 工作版本 working revision
· 從檔案庫更新的時間。
通過這些信息,在與檔案庫交換信息后,Subversion可得出文件的四種狀態:
l 未修改,新版本,送交無效
l 本地修改,新版本,可送交,更新無效
l 未修改,但在檔案庫中已修改,過期,送交無效,可更新
l 本地修改,在檔案庫中已修改,過期。先更新,修改沖突,再送交。
3. 服務器設置
基于Apache的服務器
這是設置Subversion服務器的最好方法。優點:
l 利用WebDAV
l 用瀏覽器瀏覽檔案庫
l 認證
l 安全
本地檔案庫
用TortoiseSVN創建檔案庫
圖 3.1. 沒有版本控制的文件夾TortoiseSVN菜單
1. 進入資源管理器
2. 創建檔案庫的子目錄,如C:/SVNRepository。
3. 在新建的目錄中右鍵 TortoiseSVN->在此建立檔案庫Create Repository here....
可用FSFS和BDB兩種格式創建。
注意:不要編輯檔案庫中的文件!
本地進入方式:file:///C:/SVNRepository/
檔案庫備份
最簡單的辦法是備份檔案庫文件夾!
推薦辦法:
svnadmin hotcopy path/to/repository path/to/backup --clean-logs4. 日常應用指南
操作TortoiseSVN
圖 4.1. TortoiseSVN右鍵菜單
所有TortoiseSVN命令均可以在資源瀏覽器的右鍵菜單中執行。
認證
如果檔案庫設置了權限保護,則會彈出認證對話框。
圖 4.2. 認證對話框
如果使用Windows域認證,用戶名前需要包括域名,如MYDOMAIN/johnd.
數據匯入檔案庫Importing Data Into A Repository
檔案庫結構Repository Layout
根據不同需要來建立檔案庫的結構:
1. 創建新的空文件夾。
2. 創建目錄結構 – 先不放文件!
3. 右鍵菜單,點擊匯入…(Import...)將結構加入到檔案庫中。
注意:文件夾的名字不匯入檔案庫。通過檔案庫瀏覽器(Repo Browser)可直接瀏覽檔案庫結構。
匯入Import
在將項目文件匯入到檔案庫前,先進行下列操作:
1. 刪除與項目無關的中間文件如生成的臨時文件*.obj等。 如果設置了忽略的文件類型,或忽略的目錄,可不刪除。
2. 在文件夾中組織文件。
在資源瀏覽器中進入項目頂層文件夾,右鍵得到快捷菜單,選擇匯入… (Import...) ,出現對話框:
圖 4.3. 匯入對話框
在對話框中輸入倉庫的URL。
匯入信息(import message)作為記錄信息。
注意
只要點擊確定OK TortoiseSVN將把整個目錄及目錄內的文件加入到檔案庫中。頂層文件夾的名字不會加入到檔案庫中,但其他子文件夾的名字均加入以保持檔案庫的結構。該項目的文件現在處在檔案庫版本控制中。請注意:目前的本地項目文件夾不處在版本控制下!要得到版本控制,必須取出checkout檔案庫得到工作拷貝!
特殊文件Special Files
有時你有一個包含用戶特定數據的文件需要在版本控制下,這意味著每個開發人員需要修改它以適應他的本地設置,用戶每次送交均要保存這文件的變化,因此對這類文件進行版本控制很困難。
對此建議使用template 文件,創建一共文件,它包含所有開發人員需要信息,將它加入到版本控制下,每個開發人員均可取出這個文件, 復制并重新命名,然后修改就沒有問題了。不需要加入版本控制的文件可通過設置Subversion 特性(property) svn:ignored 來忽略。
取出工作拷貝Checking Out A Working Copy
從檔案庫執行取出(checkout)就能得到工作拷貝。
在資源瀏覽器中選定將要存放工作目錄的拷貝,右鍵彈出快捷菜單,選擇C出…Checkout...,將出現對話框:(如果該目錄已在版本控制下,則沒有取出而是更新(Update)和送交(Commit))
圖 4.4. 取出對話框
如果文件夾不存在,會自動創建。
注意
你只能將文件取出到一個空目錄里。如果你想取出剛匯入的文件,Subversion將報錯。你只能將文件取出到另一個目錄或先刪除已經存在的源文件再執行取出。
匯出Exporting
如果不想包含.svn ,可將檔案庫匯出到一個空目錄。這時所有文件不處在版本控制下。方法:右鍵,選擇TortoiseSVN-〉 匯出…(Export...)。
狀態信息Getting Status Information
通過圖標可知道文件的狀態:修改/新增/刪除/換名。
圖標
圖 4.5. 資源瀏覽器顯示的圖標
新近取出的工作拷貝。Subversion狀態是正常normal.
文件已修改,需要送交到檔案庫。Subversion狀態是已修改modified。
在更新文件后自己的修改與他人的修改沖突。狀態是沖突conflict。
將加入到版本控制的文件或文件夾。狀態是新增added 。
文件(夾)將從版本控制中刪除,版本控制將忽略這些文件(夾)。狀態是刪除deleted。
檔案庫狀態 Status Of The Repository
圖 4.6. 檢查更新
想知道別人修改了哪些文件?用檢查更新..(Check For Updates...) 命令。彈出的對話框將顯示出你的修改或檔案庫中別人的修改,這樣可在更新前檢查是否有沖突。
送交Commit.... 命令也可用來顯示本地的修改,如果不想實際送交到檔案庫,點擊取消Cancel 即可。
將別人的改動更新到你的工作拷貝
圖 4.7. 已完成更新的進度對話框
有時你想將他人的改動合并到你本地的工作拷貝。從服務器上取改動到本地的過程叫更新updating。 更新也許是單個文件、或選擇的一組文件、或整個目錄。在資源瀏覽器中選擇待更新的文件或目錄, 右鍵并選擇更新Update ,他人的修改將合并到你本地的文件中,你所做的改動保存在同一文件中。這時檔案庫沒有受變化,即合并只在本地進行。
如果你和他人改動的是相同部分但改動不一樣,就會在更新過程中產生沖突 conflicts。沖突在對話框中用紅色表示,雙擊后用外部編輯器解決沖突。
TortoiseSVN也允許你將工作拷貝更新到指定版本。用更新至版本Update to Revision... 命令,在彈出的對話框中輸入指定的版本號即可。
注意
如果你更新到指定版本,再送交是將出現out of date 錯誤!如果你想撤銷修改并從以前的版本開始工作,你必須使用從“顯示記錄”對話框中選擇復原自此版本以來的變更Revert changes from this revision 命令或使用快捷菜單中的合并Merge... 菜單命令。
更新至版本Update to Revision... 命令允許復原至低版本。比如你的工作目錄版本是100,你想復原至版本50-直接填寫在復原對話框中填寫復原至版本50。通常,不復原單個文件,確實需要,從記錄對話框(Log)選擇儲存版本至Save revision to... 命令。
解決沖突Resolving Conflicts
有時你從檔案庫更新文件會有沖突。沖突產生于兩人都修改文件的某一部分。解決沖突只能靠人而不是機器。當產生沖突時,你應該打開沖突的文件,查找以<<<<<<<開始的行。沖突部分被標記:
<<<<<<< filename your changes======= code merged from repository>>>>>>> revisionSubversion為每個沖突文件產生三個附加文件:
filename.ext.mine
更新前的本地文件。
filename.ext.rOLDREV
你作改動的基礎版本。
filename.ext.rNEWREV
更新時從檔案庫得到的最新版本。
使用外部合并工具或使用快捷菜單的編輯沖突Edit Conflict 命令來解決沖突。然后從快捷菜單中執行已解決Resolved 命令,將改動送交到檔案庫。請注意,解決命令并不解決沖突,而僅僅是刪除filename.ext.mine and filename.ext.r* 文件并允許你送交。
改動送到檔案庫Sending Your Changes To The Repository
這個過程叫送交committing 。 在送交前需要確認工作拷貝是最新的。用更新Updates 或先用檢查更新Check For Updates 檢查變更了的文件。如果你的工作拷貝已更新且沒有沖突,可用快捷菜單中的送交Commit... 完成送交過程。
圖 4.8. 送交對話框
如果某文件不想在版本控制下,取消復選框即可。
送交框中不需要控制的文件
許多不需要版本控制文件如obj文件等也出現在送交對話框中,解決辦法:
· 在服務器端編輯配置文件config,將不需要控制的文件 (或通配符)添加到排除文件列表。其影響是全局的。
· 通過快捷菜單命令Add to ignore list將文件添加到svn:ignore 列表。只影響到本目錄。
圖 4.9.送交進度
加入新文件或目錄Adding New Files And Directories
圖 4.11. 加入快捷菜單
開發中新增文件或文件夾,如需要加入到版本控制,選擇加入Add;如果不想要加入到版本控制,選擇加入忽略列表Add To Ignore List
Ignoring Files And Directories 忽略文件和目錄
圖 4.12. 不需要版本控制快捷菜單
大多數項目會有一些文件(夾)不需要版本控制,如編譯產生的*.obj, *.lst,等。每次送交,TortoiseSVN提示那些文件不需要控制,挺煩的。
最好是在項目中加入忽略列表。
全局忽略列表The Global Ignore List
忽略文件的另一個辦法是加入全局忽略列表global ignore list。 全局忽略列表是客戶端特性,他影響所有項目,但只在該客戶端PC起作用。通常用 svn:ignore 會更好因為它對所有客戶起作用。
刪除、換名和移動Deleting, Renaming And Moving
從快捷菜單的TortoiseSVN 子菜單進入刪除、改名等操作
Figure 4.13. Explorer context menu for versioned files
如果你想在工作拷貝中移動文件:
1. 選擇待移動的文件和文件夾;
2. 按住左鍵拖動right-drag 文件(夾)到跟蹤拷貝內的新地方;
3. 松開左鍵
4. 在彈出菜單中選擇move files in Subversion to here
如果你在資源管理器中象往常那樣刪除了文件而沒有在版本控制中刪除,送交對話框將提示這些文件并讓你在送交前在版本控制中刪除它們。
撤銷修改Undo Changes
如果你想撤銷自上次更新后所作的改動,選擇文件,左鍵right click,在快捷菜單的TortoiseSVN子菜單中選擇復原revert ,在對話框中選擇你想要復原的文件,點擊確定OK.
圖 4.14. 復原對話框
撤銷已送交的變更Undoing Changes which have been Committed
復原Revert 只撤銷本地的改動,而不撤銷已送交文件的改動。如果你想撤銷某一版本的全部變更,可從版本記錄對話框中處理。
Revision Log Dialog 版本記錄對話框
對每次送交的更改,你必須同時提供更改的記錄,以便日后能找出為什么/如何改動。記錄對話框
記錄對話框顯示所有記錄信息并顯示在3個格里:
· 頂格顯示版本號,包括日期,送交者等。
· 中格顯示上格所選版本的完整記錄Log。
· 底格顯示該版本改動的文件列表。
在頂格還提供快捷菜單!
彈出記錄對話框
圖4.15. 記錄對話框
彈出Log記錄對話框的方式:
· 從TortoiseSVN 子快捷菜單
· 從屬性頁
· 更新進度對話框。
分支/標記Branching / Tagging
版本控制的作用是能將變更隔離成獨立的方向,稱之為分支branch. 分支用于主發布前嘗試新特性。
另一特性是標記特殊版本,以利于在任何時間重新創建環境。這個過程叫標記tagging.
Subversion并沒有特別的用于分支和標記的命令,而是用cheap copies代替。Cheap copies有點像連接links。
在由工作拷貝創建branch/tag前,你必須確認已更新檔案庫。
創建branch/tag非常簡單:
圖 4.18. 分支/標記對話框
從工作目錄父文件夾點出快捷鍵,選擇分支/標記Branch/Tag... ,輸入檔案庫中存放分支/標記路徑的URL,在原來輸入trunk 的地方輸入tags/tagname ,這里tagname 可能是ProjectName_v1.10.
C:/SVNRepository/trunk/ProjectName/... C:/SVNRepository/trunk/AnotherProject/... C:/SVNRepository/branches/ProjectName_SpecialDebugBuildBasedOn_v1.09/ C:/SVNRepository/tags/ProjectName_v1.10點擊OK ,Subversion在你選擇的檔案庫的目錄內創建了一個cheap copy。創建Branch / Tag不影響你的工作目錄。
取出或切換…To Checkout or to Switch...
…這確實是個問題!由于Checkout取出了分支中的所有數據, 轉向Switch... 只是轉移你工作目錄中變化了的數據。
為了能在新的的工作拷貝上工作,你可以:
· 再次執行取出Checkout 。你可以取出任意次到你本地硬盤上的任何地方。
· 轉換到新創建的檔案庫拷貝上。只需執行切換Switch...
在下面的對話框中輸入你的分支的URL,保留“Head Revision”點擊 OK,你的工作目錄將切換到新的分支/標記branch / tag.
切換與更新,不會丟失你在本地所作的修改,而是將未送交的修改合并。
Figure 4.19. 切換對話框
分支與標記的不同點:
· 標記用于創建項目特殊階段的靜態快照 – 不再用于開發 – 而分支是用于開發的。這是我們建議使用/trunk /branches /tags 的理由。
· 如果你在工作拷貝上修改并送交,則在分支的修改體現在分支上而不是主干上。。
將分支合并到主干上
圖 4.20. 合并對話框
(略)
創建并應用補丁Creating and Applying Patches
如果誰都可以修改,項目將沒完沒了,永遠不會穩定下來。怎么辦呢?通過“補丁patch”!將補丁送交的具有寫權限開發團隊,他們先審查補丁,再決定是否送交到檔案庫。
補丁文件僅顯示工作拷貝和基礎版本的差異。
Creating a Patch File 創建補丁文件
首先你需要測試你的修改是否正確,然后用創建補丁Create Patch... 而不是使用送交Commit... ,這將創建包含改動的文件。
Applying a Patch File 套用補丁文件
重新裝入工作拷貝Relocating a working copy
Figure 4.21. The Relocate Dialog
如果因為某種原因檔案庫修改位置,你需要使用重新定位命令。
檔案庫瀏覽器The Repository Browser
直接在檔案庫上工作!
圖 4.22. 檔案庫瀏覽器
進入檔案庫瀏覽器后,使用快捷菜單!
誰動了我的奶酪?Who Changed Which Line?
Figure 4.28. 注解/譴責對話框
有時你不但要知道那些代碼改動了,還要知道誰改動的!使用追根溯源(譴責)Blame... 即可!將Blame翻譯成譴責真不好,其意思只是追根溯源
圖 4.29. TortoiseBlame
使用內建在TortoiseSVN中的TortoiseBlame可非常方便地查看修改的歷史
Final Step 最后
TortoiseSVN是開源項目,可通過http://svn.collab.net/repos/tortoisesvn/ 獲取最新的源代碼。這些源代碼是我們學習的極好的范本!
Enjoy it!