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