svn使用方法

使用場景:

假如你的項目(這裏指的是手機客戶端項目)的某個版本(例如1.0版本)已經完成開發、測試並已經上線了,接下來接到新的需求,新需求的開發須要修改多個文件中的代碼,當需求已經開始開發一段時間的時候,忽然接到用戶或測試人員的反饋,項目中有個重大bug須要緊急修復,而且要求bug修復後要當即上線;此時應該怎麼修復bug呢?是在當前已經開發新需求的基礎上進行修復嗎?答案是否認的,緣由是:若是是在已經開發新需求的基礎上進行修復bug,那麼新需求還沒開發好,更沒有測試,怎麼馬上(或最可能快的)上線?!再次若是新功能的開發和bug修復的代碼都涉及到同一段代碼衝突了怎麼辦 。很顯然不能在當前開發的代碼基礎上進行bug修復工做完美的解決方案是:在當時完成的那個版本中進行bug fix,這樣帶來的好處是:
1:bug修復好以後可當即上線,不會由於新需求尚未完成或測試而延遲上線時間程序員

2: bug修復是在原來上線的那個版本進行修復的,引發新bug的風險小,若是是在新需求的基礎上修復bug, 那麼新功能可能會帶來新的bugxcode

 

 

SVN倉庫目錄結構Repository:

trunk
tags
branches
 

trunk(主幹|主線) branchs(分支) tags(標記)

truck(主幹|主線|主分支):是用來作主方向開發的,新功能的開發應放在主線中,當模塊開發完成後,須要修改,就用branch。
branch(分支):分支開發和主線開發是能夠同時進行的,也就是並行開發,分支一般用於修復bug時使用工具

tag(標記):用於標記某個可用的版本,能夠標記已經上線發佈的版本,也能夠標記正在測試的版本,一般是隻讀的測試

 

SVN具體操做步驟:(TortoiseSVN版本: 1.8.8)

一:建立倉庫

1. 建立目錄結構D:\TortoiseSVN\Repository\Repo-iOSspa

2. 在該目錄結構上右鍵調試

---> TortoiseSVN日誌

---> Create repository here(建立倉庫這裏) 
---> Create folder structure(建立文件結構) ---> Start Repobrowser(開始倉庫瀏覽) ---> Ok
code

 

       

 

 

二:將項目上傳到SVN上

       桌面右鍵blog

 

       ---> TortoiseSVNip

       --->repo-browser--> URL:  file:///D:/TortoiseSVN/Repository/Repo-iOS ---> Ok

       --> 選中trunk文件夾右鍵

       ---> Add folder... 

       ---> 選中要上傳到SVN的項目的最外層目錄,輸入日誌

       ---> Ok
       

 

 

三:Check Out 

1. 在電腦任意位置建立一個存放項目代碼的目錄,例如:D:\TortoiseSVN\Repository\Source
2. 將代碼檢出到該位置
   

 

四:開發週期

       1. 在目錄D:\TortoiseSVN\Repository\Source\trunk\MyAppProject上進行開發,注意是在trunk主線上

 

由於項目剛創建,這是在開發新功能,因此要在主線上開發


       2. 開發一段時間後,經測試,上線到App Store,Android上傳到其它應用商城,摘取上線時的HomeViewController文件中一段代碼以下

 

[objc] view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. - (void) viewDidLoad {  
  2.    [super viewDidLoad];  
  3.    // -----------------------------------------  
  4.     int y = 0;  
  5.     int result = 10 / y;     
  6.     NSLog(@"iOS APP 第一階段開發完成了! 結果是:%ld", result);  
  7.    // End  
  8. }  

 

       3. 在D:\TortoiseSVN\Repository\Source\tags 目錄下新建一個目錄:1.0,並將該目錄提交到SVN上,而後右鍵         D:\TortoiseSVN\Repository\Source\trunk\MyAppProject該目錄---> TortoiseSVN---->Branch/tag... -----> To Path :/tags/1.0/MyAppProject 並選中 Head revision in repository ---> Ok此時Source/tags/1.0 目錄中沒有任何內容,須要更新一下該目錄作update操做。更新以後看到一個完整的項目源碼保存到該目錄中(該目錄下的源碼可看作是trunk目錄下版本爲1.0的一個副本),查看一下/tags/1.0/HomeViewController中的viewDidLoad和trunk/MyAppProject/HomeViewController中的viewDidLoad代碼徹底同樣。

 

 

       4. 開發下一階段的新需求,開發中ing


       5. 用戶或測試人員反饋應用有重大bug,須要當即修復該bug並儘快上線, 此時程序員須要爲 tags/1.0 下的MyAppProject 打一個分支branch,
          操做過程以下:選中Source/tags/1.0/MyAppProject 右鍵 TortoiseSVN---->Branch/tag... -----> To Path :/branches/MyAppProject  ---> Ok
 此時看D:\TortoiseSVN\Repository\Source\branches目錄下仍然沒有任何內容,也須要update一下,更新以後發現該目錄下
 也出現一個完整的項目代碼(該代碼可看作是tags/1.0/MyAppProject的一個副本),注意打分支和打標記都是使用Branch/tag...菜單,不一樣的是To Path 的目錄不同,圖解看打分支的圖,只是to path 值不同,此時branches/MyAppProject/HomeViewController中的viewDidLoad和tags/1.0/MyAppProject/HomeViewController中的viewDidLoad代碼徹底一致。


       6. 切換工做空間,使用Xcode|Eclipse集成工具打開/branches/MyAppProject下的項目,而後在此基礎上調試並修復bug,注意打開的必須是分支中的項目


       7. bug 修復好後,先提交修改的文件,並進行客戶端App上線,上線完成後再將branches/MyAppProject/打個tag到1.0.1目錄下(tags/1.0.1)(操做步驟同步驟3),tag操做完成後,能夠看到tags/1.0.1/HomeViewController.viewDidLoad 和  branches/ MyAppProject/HomeViewController.viewDidLoad是徹底一致的,將branches/MyAppProject打一個新的tag是以便於下次在此基礎上再次修復bug,至此bug修復已經完成;修復bug後的代碼以下:

 

[objc] view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. - (void) viewDidLoad {  
  2.    [super viewDidLoad];  
  3.    // -----------------------------------------  
  4.     int y = 10;  
  5.     int result = 10 / y;  
  6.     NSLog(@"iOS APP 第一階段開發完成了! 結果是:%ld", result);  
  7.    // End  
  8.   
  9.    NSLog(@"1.0 版本閃退bug 已修復, 程序出現除0異常");  
  10. }  

 

       8. 接下來將branch和trunk進行合併,操做步驟以下:

         右鍵 branches/MyAppProject ------>TortoiseSVN

         ----> Merge... 

         ---> Merge a range of revisions 

         ----> Next --->URL to merge from : file:///D:/TortoiseSVN/Repository/Repo-iOS/trunk/MyAppProject 

         ----> Next

         ----> Merge

 

       

 

9. 將trunk和branches進行合併 步驟以下,

  右鍵/turnk/MyAppProject ----> Merge... -----> Merge a range of revisions   -----> Next 

----->  URL to merge from : file:///D:/TortoiseSVN/Repository/Repo-iOS/branches/MyAppProject

  步驟同上,只是  URL to merge from   的路徑不同。合併完成後,查看一下/trunk/MyAppProject/HomeViewController/viewDidLoad方法以下:

 

[objc] view plain  copy
 
 在CODE上查看代碼片派生到個人代碼片
  1. - (void) viewDidLoad {  
  2.    [super viewDidLoad];  
  3.    // -----------------------------------------  
  4.     int y = <strong>10</strong>;            // <strong>能夠看到branches分支中的代碼已經合併到主線上了</strong>  
  5.     int result = 10 / y;  
  6.     NSLog(@"iOS APP 第一階段開發完成了! 結果是:%ld", result);  
  7.    // End  
  8.   
  9.    NSLog(@"<strong>1.0 版本閃退bug 已修復, 程序出現除0異常</strong>");  
  10.   
  11.    NSLog(@"其餘同事在主線trunk中進行新需求開發...");  
  12.    NSLog(@"其餘同事在主線trunk中進行新需求開發...");  
  13. }  

 

10. 此時合併完全結束,branches目錄下的源碼若是不想要也能夠刪掉,接着修改bug的這位程序員須要切換工做空間到主線上來,使用Xcode從新打開trunk/MyAppProject項目,接着開發還沒有完成的新功能。SVN目錄以下:

 

         

說明:

1. 分支開發和主幹開發是兩個徹底獨立的過程,二者能夠同時進行開發
2. 因分支和主幹開發是並行的,因此二者能夠任意的屢次提交當前工程所修改的文件