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