SVN使用說明-也許你不會(轉)


SVN使用:
1. 首先是安裝TortoiseSVN這個Win下的客戶端(當然用subversion自己的svn這個客戶端也可以完成所有操作,理論上)。這個客戶端是集成到Explore里的,所以沒有什么獨立的窗體,所有操作右鍵菜單來完成。
2. svn使用基本流程:
下面說的命令都與TortoiseSVN菜單上的名稱一致。
a. 初次(initial)取出(checkout)repos,建立本地工作拷貝(WC WorkingCopy)。
b. 與repos同步(update),保證將要進行的編輯是最新版本。
c. 編輯源代碼(包括創建、修改、刪除)。
d. 與repos同步(update),提交之前先要同步到最新的版本,保證所有在自己之前的有關提交已經在本地有所知曉。
e. 解決沖突(resolve conflict)。
f. 提交(commit),一定要寫上這次提交的內容的摘要,便於以后查閱。
g. 繼續b。
每次開始新的編輯前的同步repos很重要,另外經常地update沒有壞處,特別是多人項目中。如果每次提交(commit)前不進行更新(update)的到最新的版本的話,svn會提示當前的拷貝過期,需要更新。
在使用的過程中,時刻注意當前的工作拷貝(WC WorkingCopy)所對應的URL很重要,特別是當有了branches和tag等時候。使用svn info可以查看到這些信息。使用TortoiseSVN時,通過下面的操作查看這些信息:右鍵單擊工作拷貝的根文件夾(不是上級文件夾),菜單中選擇則屬性(不是TortoiseSVN那個菜單),然后在出現的對話框中選擇Subversion標簽就可以看到了。
3. 使用branches
(關於branches的內容可以在svn-book:Chapter4 Branching and Merging得到)
當多個人合作(Sally和John)時,可能有這樣的情況出現:John突然有個想法,跟原先的設計不太一致,可能是功能的添加或者日志格式的改進等等,總而言之,這個想法可能需要花一段時間來完成,而這個過程中,John的一些操作可能會影響Sally的工作,John從現有的狀態單獨出一個project的話,又不能及時得到Sally對已有代碼做的修正,而且獨立出來的話,John的嘗試成功時,跟原來的合並也存在困難。這時最好的實踐方法是使用branches。John建立一個自己的branch,然后在里面實驗,必要的時候從Sally的trunk里取得更新,或者將自己的階段成果匯集到trunk中。
附:TortoiseSVN幫助里的branch的說明:
One of the features of version control systems is the ability to isolate changes onto a separate line of development. This line is known as a branch. Branches are often used to try out new features without disturbing the main line of development with compiler errors and bugs. As soon as the new feature is stable enough then the development branch is merged back into the main branch (trunk).
3.1 創建branch
(詳細的解釋參考svn-book:Chapter4 Branching and Merging:Using Branches:Creating a Branch)
實際是svn copy操作
$ svn copy SourceURL/trunk \
       DestinationURL/branchName \
      -m "Creating a private branch of xxxx/trunk."
TorToiseSVN操作更為簡單,只要在working copy里右鍵空白,然后在TorToiseSVN菜單中選擇Branches/Tags,就可將整個目錄分支(branch)出去,或者點擊某個文件將文件單獨分支(branch),而且有多種選擇,指定是“直接在服務器端copy HEAD版本”、“直接在服務器端copy指定版本”(這兩種相當於svn copy中源和目的都是URL)、“用當前的工作拷貝(WC Working Copy)生成”。同時還有一個checkbox用於在完成了這次分支(branch)后直接切換(switch)當前的工作拷貝(WC Working Copy)到分支。
3.2 使用merge來應用branch的修改
3.2.1 trunk的變化及時更新到branch
例子原型出自svn-book:Chapter 4:Branching and Merging:Copying Changes Between Branches:Copying Specific Changes
接着前面的例子,John在實驗過程中,Sally對原有的某個文件做了一些改動,如拼寫檢查等,John知道了,希望將這些改動也放到自己的當前的工作拷貝(WC Working Copy)中。svn中使用merge指令來完成。假設Sally的修訂使repos從Rev345到了Rev346,所以John就是要將Rev345:Rev346(前:后)的變更應用到當前的WC。使用TortoiseSVN的操作就是在WC中右鍵空白處,然后在相關菜單中選擇“Merge...”,在彈出的對話框中,From指定比較前項的位置和版本(這里是trunk的Rev345),To指定后項的位置和版本(這里是trunk的Rev346,可以使用一個復選框使的To的位置與From相同)。
相應的svn merge指令參考后面“merge操作實質”可知。
3.2.2 branch最終合並回trunk
例子原型出自svn-book:Chapter 4:Branching and Merging:Common Use-Cases:Merging a Whole Branch to Another
John經過嘗試,終於實現了想法,並通過測試,現在他決定將所有的工作合並到trunk去。
這里要注意的是,John打算合並的是自己的工作,假設John的branch(johnBranch)開始於Rev233,John的工作提交到repos是Rev289,那么John的工作是將johnBranch:Rev233到johnBranch:Rev289的內容合並到trunk。而不是johnBranch:Rev233到trunk:HEAD,因為這個變化包含了對John工作的增加和對trunk中其他人的工作的撤銷(如果John沒有及時將他人在trunk的工作合並到自己的johnBranch的話)。
TortoiseSVN的操作是這樣的,先checkout出trunk(也可以switch到trunk),即保證當前的工作拷貝(WC WorkingCopy)是trunk,然后使用菜單中的“Merge...”,選擇From為johnBranch:Rev233選擇To為johnBranch:Rev289。
相應的svn merge指令參考后面“merge操作實質”可知。
3.2.3 merge操作的實質
svn merge命令的原型如下
svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
svn merge -r N:M SOURCE[@REV] [WCPATH]
In the first and second forms, the source paths (URLs in the first form, working copy paths in the second) are specified at revisions N and M. These are the two sources to be compared. The revisions default to HEAD if omitted.
In the third form, SOURCE can be a URL or working copy item, in which case the corresponding URL is used. This URL, at revisions N and M, defines the two sources to be compared.
WCPATH is the working copy path that will receive the changes. If WCPATH is omitted, a default value of “.” is assumed, unless the sources have identical basenames that match a file within “.”: in which case, the differences will be applied to that file.
可以看出merge實際是比較前后(源:目的)兩個版本(revision)之間的差別(用運算符就是 目的 – 源),然后將這些差別應用(施用)到工作拷貝(WC WorkingCopy)上的一個操作,根據源與目的版本號的先后,出現了“合並”、“撤銷”(源版本號大於目的版本號)等不同效果,然后通過提交(commit)來將這些效果保存到服務器端的repos中。
4. 版本(Revision)關鍵字
HEAD, BASE, COMMITTED, PREV是指定版本號時可以使用的一些保留字,含義如下:(參考svn-book:Chapter3:Guided Tour:Revisions:Numbers,Keywords)
HEAD:The latest revision in the repository.
BASE:The “pristine” revision of an item in a working copy.
COMMITTED:The last revision in which an item changed before (or at) BASE.
PREV:The revision just before the last revision in which an item changed. (Technically, COMMITTED - 1.)
說明:
a. 只有HEAD能用於URL,BASE,COMMITTED,PREV都是用於工作拷貝(WC Working Copy)的。
b. HEAD雖然含義是“當前最新的版本”,但用於WC時,當前未提交(即未進入版本管理)的變化是不包含在內的。所以比如:
剛commit過main.txt為Rev10,即HEAD=10,COMMITTED=10,這時對main.txt進行一些編輯,然后svn diff -r HEAD:COMMITTED,不會顯示剛剛的編輯操作,因為剛剛的編輯操作並沒有納入到版本管理,即HEAD沒有反映出“當前最新”,實際是反映的“當前版本管理中的最新”。
c. BASE的含義,上面的英文說得不夠清楚,其實是指最后一次更新(update)操作 或者 取出(checkout)操作(當initial checkout)時取出的那些文件,這些被svn無修改地保留在.svn管理目錄里。
5. 文件的添加、刪除、重命名
當向項目里添加了一個新文件時,需要使用TortoiseSVN菜單中的“add”指令來為下一次commit做添加文件的准備,使得下次commit時知道有這樣的事件發生。對應的svn命令行操作就是svn add。
當從項目里刪除文件時,也需要顯示地將這個事件告訴svn,方法就是右鍵單擊要刪除的文件,在TortoiseSVN菜單中選擇刪除,而不是簡單地用os的刪除。
文件重命名與刪除同理。
6. 忽略列表
比如一個VC的項目用subversion管理,vc會生成debug目錄,release目錄以及其下的編譯臨時文件,而我們可能只需要對源文件進行版本管理,那些臨時文件都不關心,這時可以把他們加入ignore list。同樣使用TortoiseSVN菜單完成這個。對於錯誤的加入到了ignore list的文件,可以在TortoiseSVN菜單中的Remove from ignore list撤銷。這個暫時不知道svn對應的命令。
7. 解決沖突(conflict)
所謂沖突,簡單地說,就是兩個人改了同一個地方,而修改又不同。比如Sally和John同時Update到了最新的trunk,Rev5。Sally吧main.txt的第一行改為了x=5,提交了,然后repos到了Rev6,同時John在自己的工作拷貝(WC WorkingCopy)中,把main.txt第一行改成了x=6,然后准備同步(update)repos然后提交,可是在update的時候就會提示出現了沖突(conflict)。這時svn目錄下出現了幾個文件:main.txt.mine, main.txt.r5, main.txt.r6
按照svn-book的解釋,含義如下:
filename.mine : This is your file as it existed in your working copy before you updated your working copy—that is, without conflict markers. This file has your latest changes in it and nothing else. (If Subversion considers the file to be unmergeable, then the .mine file isn't created, since it would be identical to the working file.)
filename.rOLDREV : This is the file that was the BASE revision before you updated your working copy. That is, the file that you checked out before you made your latest edits.
filename.rNEWREV : This is the file that your Subversion client just received from the server when you updated your working copy. This file corresponds to the HEAD revision of the repository.
其實就是main.txt.mine是John執行update之前的本地文件main.txt,main.txt.r5是本地上次update時得到的,即BASE版,而main.txt.r6是這次update得到的。這時還有一個main.txt文件其實是包含了相互沖突的內容的用於手工解決沖突的文件。
解決沖突有三個方法:
a. 手工解決。編輯main.txt,保存其成為最終希望的版本。然后使用svn resolved去掉conflict標志。TortoiseSVN的操作這次要復雜一些,在main.txt上右鍵,菜單中選擇“resolved...”,在彈出的對話框中右鍵main.txt,然后在對話框中選擇“resolved”,tortoiseSVN會要求確認一次,選擇yes之后會發現生成的三個臨時文件沒有了,而main.txt的沖突標記變成了修改。
b. 直接選用使用一個臨時文件。命令行相當於這樣:
$ cp main.txt.mine main.txt
然后同樣要用svn resolved去掉conflict標志。這個方法的TortoiseSVN的操作是在“resolved”對話框里,右鍵main.txt的菜單上選擇“Resolved conflict using mine”或者“Resolved conflict using theirs”
c. 撤銷更改。這是John決定放棄自己對main.txt的更改並且接受Rev6版時的做法。用這種方法,如果是用svn這個client時,無需調用svn resolved了,因為不打算提交新的內容到repos(當然如果其他的resolve決定提交新的內容時,還要對其他文件resolved的)。TortoiseSVN里的操作是在沖突菜單(resolved對話框里右鍵單擊要解決沖突的文件時出現的菜單)里選擇Revert,同樣tortoise會讓要求確認一次。
當有多個conflict時,需要一個一個resolve,TortoiseSVN的Resolved對話框里每次都是對一個對象進行操作,盡管前面的有復選框(復選框作用未知,猜測是跟lock關)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM