svn使用教程及常見問題解決方案


使用教程轉自:http://www.cnblogs.com/armyfai/p/3985660.html

SVN簡介:

 為什么要使用SVN?

      程序員在編寫程序的過程中,每個程序員都會生成很多不同的版本,這就需要程序員有效的管理代碼,在需要的時候可以迅速,准確取出相應的版本。

Subversion是什么?

   它是一個自由/開源的版本控制系統,一組文件存放在中心版本庫,記錄每一次文件和目錄的修改,Subversion允許把數據恢復到早期版本,或是檢查數據修改的歷史,Subversion可以通過網絡訪問它的版本庫,從而使用戶在不同的電腦上進行操作。

一:SVN服務器搭建和使用。

   1.     首先來下載和搭建SVN服務器,下載地址如下http://subversion.apache.org/packages.html,進入網址后,滾動到瀏覽器最底部看到如下截圖:

  

      個人認為最好用VisualSVN server 服務端和 TortoiseSVN客戶端搭配使用. 點開上面的VisualSVN連接,下載VisualSVN server,下載完成后雙擊安裝,如下圖:

 

點擊Next下一步,如下:

然后再點擊Next項,下一步,如下:

 

點擊【Next】 如下:

 

Location是指VisualSVN Server的安裝目錄,Repositorys是指定你的版本庫目錄.Server Port指定一個端口,Use secure connection勾山表示使用安全連接,

點擊Next,進入下一步,如下圖:

再點擊【Install】,進入如下安裝圖:

等待安裝完成后,點擊【next】,進入下一步:如下圖

點擊【Finish】即可完成安裝。安裝完成后,啟動VisualSVN Server Manager,如圖:

可以在窗口的右邊看到版本庫的一些信息,比如狀態,日志,用戶認證,版本庫等.

要建立版本庫,需要右鍵單擊左邊窗口的Repositores,如下圖:

在彈出的右鍵菜單中選擇Create New Repository或者新建->Repository:

進入下一步,如下圖:

點擊【下一步】,如下圖:

點擊【create】,如下圖:

點擊【Finish】即可完成基本創建。

  2. 需要建立用戶和組,並且需要分配權限

  1. 在VisualSVN Server Manager窗口的左側右鍵單擊用戶組,選擇Create User或者新建->User,如圖:

  

點擊User后,進入如下圖:

填寫Username和password后,點擊ok按鈕后,進入如下圖:

點擊上面的【Add】按鈕后,如下圖

增加longen0707到用戶中(如果有多個用戶,操作一樣)。

  2 .   然后我們建立用戶組,在VisualSVN Server Manager窗口的左側右鍵單擊用戶組,選擇Create Group或者新建->Group,如圖:

  

點擊【Group】按鈕后,進入如下圖:

在彈出窗口中填寫Group name為Developers,然后點Add按鈕,在彈出的窗口中選擇Developer,加入到這個組,然后點Ok.

接下來我們需要給用戶組設置權限,在MyRepository上單擊右鍵,選擇屬性,如圖:

在彈出的對話框中,選擇Security選項卡,點擊Add按鈕,選中longen0707,然后添加進來,權限設置為Read/Write,如下圖:

點擊【確定】按鈕即可。

二:客戶端SVN安裝。

 1.首先我們需要下載 ”svn小烏龜”后,進行安裝。比如我下載如下的:

 

   安裝完成后,比如在我的項目在qiandaun1中,我右鍵就可以看到如下:

  

說明snv已經安裝成功了!

2:checkout項目文件。

    新建或者進入目錄下(比如qianduan1),右鍵 --> Svn Checkout -->

其中URL我可以在SVN服務器獲取到,我在myRepositories下右鍵新建文件

 

qianduan文件被建立,然后比如我這樣右鍵 --> copy下

即可。

將復制的版本庫URL粘貼上,如下圖:

點擊【ok】按鈕后,就可以檢索出來,如下:

如下圖:

 

注意事項:

   .svn這個隱藏目錄記錄着兩項關鍵信息:工作文件的基准版本和一個本地副本最后更新的時間戳,千萬不要手動修改或者刪除這個.svn隱藏目錄和里面的文件!!,否則將會導致你本地的工作拷貝(靜態試圖)被破壞,無法再進行操作。

  1)    TortoiseSVN圖標介紹

    

   一個新檢出的工作復本使用綠色的對勾重載,表示Subversion狀態正常。

    

  在你開始編輯一個文件之后,狀態就變成了已修改,而圖標重載已變成了紅色感嘆號。通過這種方式,你可以很容易地看出那些文件從你上次更新工作復本被修改過,且需要提交。

     如果在提交的過程中出現了沖突,圖標就會變成了黃色感嘆號。

    

加號告訴你有一個文件或者目錄已經被計划加入到版本控制中。

2)     TortoiseSVN Client基礎操作:

    1. SVN檢出(SVN Checkout)

     在文件夾或者目錄下單擊右鍵 > 選擇SVN檢出,如下圖所示

     

  點擊后,在彈開窗口的版本庫url框中輸入版本庫的目錄地址,然后點擊確定,如下圖

 

再點擊ok按鈕后,如下圖:

在彈出的對話框中輸入用戶名和密碼,驗證成功后,項目文件開始從遠程服務器下載到本地工作目錄中。

點擊ok按鈕后,即可獲取完成,如下圖所示:

 2.  增加(Add)

  在test項目文件下,新建一個b.txt文件,提交到版本庫的方法如下2種:

   1. 先提到變更列表中,再commit到配置庫中,選擇新增文件,右鍵SVN菜單執行“Add“操作提交到”變更列表中”,然后右鍵SVN菜單執行”SVN Commit”提交到版本庫中。

   2. 不提交到變更列表中,而是直接commit配置庫中,選擇該文件,右鍵svn菜單執行”SVN Commit”操作。

  3.  刪除(Delete)

     如果被刪除的文件還未入版本庫,則可以直接使用操作系統的刪除操作刪除該文件。

     如果被刪除的文件已入版本庫,則刪除的方法如下:

  1. 選擇被刪除文件,右鍵svn菜單執行”delete”操作,然后選擇被刪除文件的父目錄,右鍵svn菜單執行”SVN Commit”.

使用操作系統的刪除操作刪除該文件,然后選擇被刪除文件的父目錄,右鍵svn菜單執行”SVN Commit”,在變更列表中選擇被刪除的文件。如下圖:

   

 4.  改名(Rename)

    修改文件名,選中需要重命名的文件或文件夾,然后右鍵“TortoiseSVNàRename“,在彈出的對話框中輸入新名稱,點擊”ok”按鈕,並將修改文件名后的文件或文件夾通過 “SVN Commit”提交到SVN服務器上。

 5.  SVN還原(SVN Revert)

    右擊想要回退的文件或者文件夾,在TortoiseSVN彈出菜單中選擇”Update to reversion…” 然后會彈出一個窗口,如下:

  

比如說我們要回退到第10個版本只需要在Revision中填寫相應的版本號,然后點擊ok即可。

 6.  檢查更新(Check for modifications)

     此功能可以顯示你所做的修改有哪些還沒有提交的,此功能不光能看到對文件的修改變化,所有的變化都能看到,包括增加文件或者目錄,刪除文件或者目錄,移動文件或者目錄等,如果你點擊了檢查版本庫,那你還可以看到版本庫里的改動,既別人提交了哪些文件的改動,你還沒更新到本地,如下:

  

 7.  SVN更新(SVN Update)

    更新本地代碼與SVN服務器上最新的版本一致,只要在需要更新的文件夾上點擊右鍵或者在文件下空白處點擊右鍵,選擇”SVN Update” (獲取指定版本中的內容,點擊右鍵執行SVN菜單中的“Update to reversion“),就可以了。

 7.1 如何解決沖突文件

     對於每個沖突的文件Subversion在你的目錄下放置了三個文件:如下:

   

     為什么會產生沖突代碼呢?原因很簡單就是因為不同的人,同時修改了同一個文件的同一個地方,這時候,他提交了,我沒有提交,我就提交不了,這個時候我們要進行先更新,然后在進行提交即可,那如果產生沖突,會生成如上3個文件。 

解決方案如下

      首先我們可以看下1.txt代碼如下:

        <<<<<<< .mine

        aaaasdf11222333 dderderder

        =======

       b>>>>>>> .r5

      然后我去掉多余的代碼,1.txt變成這樣

      aaaasdf11222333 dderderder

      進行提交,還是提交不了,如下所示:

    

  為什么?因為沖突會產生上面的三個文件,有上面3個文件存在肯定提交不了,這三個文件代碼及解釋如下:

  1. 1.txt.mine 是沖突前自己的文件。可以看下內容如下:

      aaaasdf11222333 dderderder

      2.  1.txt.r4 是沖突前本地的版本文件

     內容如下:aaaasdf11222333

      3.  1.txt.r5  是別人趕在你之前提交的版本

      內容如下: b

其中,<<<<<<<<.mine .....=======之間的代碼是你自己的,而======......>>>>>>>.r5是別人與你沖突的代碼部分

這樣就不難理解為什么會產生沖突這種奇怪的東西了,因為你們修改的同一塊代碼,當然會產生沖突。

解決方案如下:

  1. 假如我現在的1.txt中的沖突內容如下:

      <<<<<<< .mine

       6666666666666600000

       =======

      66666666666aaaaaaaaaa666

      >>>>>>> .r16
    前面說過  <<<<<<< .mine …… =======

    ……之間的代碼是我未產生沖突之前修改的代碼,

    ======= ………>>>>>>> .r16 這中間……的代碼是別人與我沖突代碼的部分,從上面的代碼可以看到 aaaaaaaaa是我同事新增的 ,00000是我后增加的。

    1. 使用revert(回滾)操作,該操作表示用戶放棄自己的更新代碼,然后直接提交,這個時候你的代碼就會使服務器上最新的代碼,即A用戶提交的新代碼,你的代碼不會被提交,如下所示:

      點擊ok按鈕后 可以看到其他三個文件都自動刪掉了,1.txt代碼變成如下代碼:

      66666666666aaaaaaaaaa666

      也就是a用戶提交的代碼,我自己更新的代碼需要自己動手復制進去即可提交commit。

    2. 假如我現在3.txt產生沖突代碼如下:

      <<<<<<< .mine

      333333338888888888888=======

      3333cccccccccc3333>>>>>>> .r16

      通過第一點我們知道,333333338888888888888這個內容是我修改后,未產生沖突之前的內容,3333cccccccccc3333這個代碼是A用戶提交的代碼,從上面得知 A用戶新增內容是ccccccc,而我新增的內容是8888888。

      那么第二種解決方法如下:

                    選擇文件->右鍵Editconficts:這種方法需要沖突雙方經過協商之后將代碼更改統一之后再提交。不僅解決了沖突而且還保證了代碼是正確的,因為只有一方的代碼被提交.

     

   如上圖所示,紅色的部分是沖突代碼:theirs表示當前服務器端最新的代碼,Mine表示自己修改后的代碼,Merged表示合並后的代碼。點擊紅色后右鍵選擇:use this text block就可以將該部分代碼作為合並后的代碼

接下來再說說由於沖突導致重要代碼被覆蓋的情況。沖突發生時如果采取的措施不對可能會導致部分代碼丟失,如果想要還原之前的代碼也很容易。

選擇文件->右鍵選擇show log在這里面你可以看見之前提交的所有版本,找到你想要恢復的版本右鍵選擇revert to this version 就可以恢復了.

SVN提交(SVN Commit)

    Svn的提交是將在工作空間做的修改進行提交,包括文件內容的修改,文件或目錄的添加,刪除,命名,移動等操作。如下圖所示:

   

  8.   顯示日志(Show log)

       通過此功能可以查到誰,什么時候,對那個目錄下的那些文件進行了那些操作,如下圖:

  

 9.  版本庫瀏覽(Repo-browser)

     此功能是用來瀏覽需要查看的資料庫,在本地文件夾下點擊右鍵,選擇TortoiseSVNàRepo-browser,在彈出的對話框中輸入資料庫地址,再輸入用戶名和密碼,就能查看到你需要查看到版本庫的內容,在這你還能看到那些文件被誰鎖定了,如下圖:

   

三: 創建分支合並相互操作

   項目中為何要創建分支,及合並?

      比如我現在項目所有的文件放在主干上(trunk)中,由於需求的變更,需要增加新的需求,但是我們主干上還要繼續往下開發,在此我們可以新建一個分支,來做增加新的需求那一塊,主干上繼續開發,等分支上代碼沒有問題的時候,再合並到主干上來。

創建分支的最大的目的就是跟主線進行並行開發時候不影響主線的開發。

   如何操作?

      假如我本地新建一個文件夾test下有2個文件夾trunk(存放主干上的代碼)和branch(存放分支上的代碼),如下所示:

  

一:先提取主干上的代碼。

   點擊trunk --> 鼠標右鍵 --> 點擊SVN Checkout --> 彈出一個對話框,如下圖所示:

  

其中上面的URL是從服務器VisualSVN Server上獲取的,如下所示:

 

  直接右鍵qianduan3 --> Copy URL to Clipboard 即可。

  其中qianduan3項目有如下文件,如下圖所示:

最后點擊上面的checkout按鈕后,就可以在主干上把代碼從遠程服務器上獲取到,如下所示:

 

二:新建分支

  從trunk(主干上)創建分支(branch)步驟如下:

  1. 右鍵trunk --> branch/Tag 如下圖:

  

  在彈出的對話框如下圖:

  

  點擊ok按鈕后,就可以在VisualSVN Serval服務器上新增newBranch,是從如上服務器qianduan3上的文件拷貝一份的,如下所示:

  

現在我們可以再來看看本地branch文件夾了,我現在直接進入branch文件下,右鍵 --> Chenckout下,就可以把newBranch下的所有文件提取出來了,如下所示:

 

點擊ok按鈕就可以把文件提取出來了,如下圖所示:

分支目前建立在svn的服務器端,本地並沒有更新,對本地branch文件夾 右鍵--> update即可,就可以更新到分支代碼,如下所示:

四:合並分支到主干上

   比如我現在對branch分支上新增3.txt文件,然后提交上去,如下所示:

  

我現在想把分支上的代碼3.txt合並到主干上trunk,現在要怎么合並呢?步驟如下:

  1. 回到我們剛剛的主干(trunk)文件夾下,鼠標右鍵該文件夾 --> TortoiseSVN --> Merge 如下圖所示:

  

在彈出的窗口,如下圖所示:

 

接着點擊【Next】下一步,如下圖所示:

再接着【Next】下一步,如下圖所示:

 

就可以看到主干trunk上多加了一個3.txt,就是從分支上合並過來的。

五:合並主干到分支。

 如果主干上有一些更新,比如說jar包更新等等,那么這些要更新到分支上去,如何操作呢?比如我現在在主干上新建一個4.txt文件,比如如下:

 

我現在的分支上目錄如下:

現在是想把主干上的4.txt合並到分支上來,要如何操作?

步驟如下,還是和剛剛操作類似.

 1. 我們在分支點擊branch --> 右鍵TortoiseSVN --> Merge 如下圖所示:

 

在彈出新窗口后,如下圖所示:

接着點擊【Next】下一步,如下圖所示:

 

繼續下一步,如下圖:

最后直接merge,就可以看到分支branch上也有主干上的4.txt文件了,也就是說,合並主干到分支上也是可以的,如下圖所示:

 

 二、關於主干更新到分支,避免主干覆蓋分支的問題:http://blog.sina.com.cn/s/blog_5f54f0be0101f04y.html

一個大項目在開發中可能會拆分成幾個小項目,分別分去,同時共通的部分再由人做,做完后再統一合並。同時,在開發中,共通的部分修改后,其它人要保持同步。
這種情況反應到SVN的分支/合並功能上,再貼切不過了。
SVN可以為一個版本庫中的內容(主干)建立一個分支.分支和主干完全獨立,就相當於把代碼再復制一份,重新添加到版本庫中。但SVN提供另一個功能,就是把主干做出的修改合並到分支中,以及把分支修改的內容合並到主干中。當然,我們也可以把主干的版本庫的路徑切換到分支上,然后更新,來實現把分支的修改更新到主干;以及修改分支路徑來同步主干的修改。但過程復雜,還容易出錯。
SVN 的分支功能還提供一些合並的測試,可以在不改動版本路徑的情況下完成上面的需求。
 
示例:
 
1.將一個整項目建一個分支.
 
SVN <wbr>- <wbr>主干/分支
 
SVN <wbr>- <wbr>主干/分支
 
建立時要注意:
 
1.當前復制源,即專業術語中的 "主干(truck)"
2.分支存放的位置. 當然,分支也是在SVN版本庫中.
3.寫上日志.這個大家應該懂的.
4.是否把主干的路徑切換到分支.如果勾選了,建立分支后,在主干里做出的修改並提交后,更新會提交到分支上。主干的版本源內容不會變.
 
這時我們看一下 trunk 目錄的屬性,可以看到它的路徑已經變成: /calc/branches/my-calc-branch 了。

SVN <wbr>- <wbr>主干/分支
 
為了避免產生困惑。以及失誤。在建立的時候不要勾上 "切換到分支" 的選項。如果勾上了,我們還是切換回去:

SVN <wbr>- <wbr>主干/分支

SVN <wbr>- <wbr>主干/分支
 
注意:
 
1.主干的目錄
2.版本庫源路徑

這時你便可以在 /calc/branches/my-calc-branch 分支上開發新的功能,且不會影響到其他成員開發或維護主干的內容。
 
2.合並主干的變更
也許過了一段時間,原本的 /calc/trunk 主干可能已經有其他成員陸續修正了一些 Bugs,但這時你的分支 /calc/branches/my-calc-branch 就可以直接套用主干 ( /calc/trunk ) 的更新,除了避免重復的工作外 ,也可以避免版本的沖突,因為多人改同樣的文件可能發生沖突。
 
經常將 開發主干 ( /calc/trunk ) 的變更透過 svn merge 合並至 分支 ( /calc/branches/my-calc-branch ) 是一個非常好的習慣,這樣才不會讓你脫離主干(trunk) 過久而導致將分支 ( /calc/branches/my-calc-branch ) 合並回 主干 ( /calc/trunk ) 時發生許多沖突。

SVN <wbr>- <wbr>主干/分支

SVN <wbr>- <wbr>主干/分支
 
從主干 ( /calc/trunk ) 合並至分支 ( /calc/branches/my-calc-branch ) 通常選第 1 個,也就是 [Merge a range of revisions]
 
注意.我們是在分支上使用的 Merge 功能.因為是要在分支上應用主干的更新.

SVN <wbr>- <wbr>主干/分支
 
在 Merge 的窗口有以下注意事項:
 
1.合並的來源,由於我們打算從主干 ( /calc/trunk ) 合並至分支 ( /calc/branches/my-calc-branch ),所以合並的來源要選 /calc/trunk 才對!
2.合並的結果會直接與目前「工作目錄」(Working Copy) 做比對,並修改目前工作目錄中的所有文件。因此建議在做合並之前可以將所有尚未 commit 的檔案先 commit 到版本庫,避免不必要的沖突事件發生。

SVN <wbr>- <wbr>主干/分支
 
在正式進行合並(Merge)之前,建議先執行 Test merge 看看是否會發生什么事!
 
若無異狀則可直接按下 [Merge] 按鈕進行合並動作,這時從 主干 ( /calc/trunk ) 分支出來的到目前工作目錄的版本就會做個比較,然后直接套用變更到你現有的文件、目錄或屬性里。

SVN <wbr>- <wbr>主干/分支
 

在合並之后如果沒有發生沖突,不代表真的沒沖突,所以必須再次對原始碼做出驗證后才能 commit 進版本庫,建議可參考以下流程:
 
1.將項目進行建置(Build)
2.如果沒問題再對項目進行單元測試(Unit Testing)或手動測試(Manual Testing)
3.如果都沒問題再 commit 目前合並無誤的版本到版本庫!
 
SVN <wbr>- <wbr>主干/分支
 
3.合並分支到主干
最后我們的 my-calc-branch 分支已經將新功能開發完成且測試無誤,所以要將 分支 ( /calc/branches/my-calc-branch ) 的最終版本合並回 主干 ( /calc/trunk ),這時的手續如下:

SVN <wbr>- <wbr>主干/分支

SVN <wbr>- <wbr>主干/分支
 
從 分支 ( /calc/branches/my-calc-branch ) 合並回 主干 ( /calc/trunk ) 通常選第 2 個,而特別選擇 [Reintegrate a branch] 這個選項是很重要的,因為這有以下好處:
 
1.讓 Subversion 能知道 主干 ( /calc/trunk ) 是從哪個分支、哪些版本合並進來的
2.有效節省 Subversion Repository (SVN儲存庫) 的空間,因為不用重復儲存分支的所有變更信息
3.可以產生 Revision graph 得知項目開發的分支狀況

SVN <wbr>- <wbr>主干/分支
 
一樣可以先 測試合並(Test merge) 再正式進行 合並(Merge)

SVN <wbr>- <wbr>主干/分支
 
合並完后再將變更 commit 到版本庫

SVN <wbr>- <wbr>主干/分支
 
4.刪除使用完畢的分支
當 分支 ( /calc/branches/my-calc-branch ) 合並回 主干 ( /calc/trunk ) 並 commit 了之后,該分支就沒用了,該分支如果未來不再更新或繼續開發,Subversion 也不會繼續追蹤這個分支的變更 (因為之前已經 Reintegrate 過了),建議將該分支刪除。

SVN <wbr>- <wbr>主干/分支

SVN <wbr>- <wbr>主干/分支

SVN <wbr>- <wbr>主干/分支


免責聲明!

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



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