SVN:一般項目的流程指南


1 引言

    本文總結了與scm相關流程的常見項目使用流程。

2 檢出

現在你需要決定把庫中的模塊檢出到你本地的什麼位置。若爲主幹開發,請檢出主幹末端到本地工作副本;分支開發,請檢出對應分支到本地。

svn標準命令:svn  co  URL                 導出SVN庫中的最新版本

例如:

svn標準命令:svn  co URL  @REV-r  PATH   導出SVN庫中指定版本,到本地指定路徑下

例如:

備註:關鍵字co告訴svn想要執行檢出操作,而URL指定了想要檢出的內

容在版本庫的位置,最後告訴svn想要把版本庫檢出到本地的位置。

另外,在scmpf上創建好版本後, 即可直接取出相應的主幹/分支/tag, 其URL可以從scmpf上覆制, 如下圖所示:

 

3新模塊

如果不是對已有模塊進行升級,則需要添加新模塊。請rd到icafe平臺發起模塊申請流程,具體步驟見(rd簡易操作指南);流程結束後,該模塊將自動在對應產品線的trunk,branches,tags目錄下創建成功。現在我們需要逐個創建文件/目錄,並通過svn add將本地已經創建好的文件通過svn導入到版本庫的新模塊中。

 

4開發

進入剛剛從版本庫檢出的目錄,若你的工作副本中會有大量不同的工作拷貝,要搞清楚工作拷貝是從哪裏來的,可執行svninfo命令進行查詢:

 

    使用命令:svn info                       顯示當前工作副本版本信息

例如:

使用命令:svn  info  –r revision  URL      顯示該URL第xx版本的信息

使用命令:svn  info  –r   revision  –R   URL   遞歸顯示該URL下每一個文件及目錄的信息

備註:這裏的重點是第二行的URL,SVN會告訴你本地工作副本目錄的原始來源。

4.1修改

對於文件/目錄的創建,新增,刪除,重命名(移動)可使用如下svn命令:

4.1.1創建目錄

使用命令:svn  mkdir  URL(新增目錄--parents  -m “    “ 

例如:

4.1.2新增

    執行svn add後,svn只記住了你想要添加到項目倉庫中的文件的名字;並沒有實際添加文件或者把改動讓團隊的其他人也能看見,所以在add之後,你需要commit。

使用命令:svn  add 目錄名稱     目錄下的所有文件一同納入版本控制  

             svn  ci -m “    ” 

例如:

使用命令:svn  add 文件名稱     僅將此文件納入版本控制

         svn  ci -m “    ”

例如:

4.1.3刪除

不同於CVS,SVN支持目錄/文件的刪除,但是我們規定不能刪除模塊及模塊以上級別的目錄。

使用命令:svn  delete  目錄名稱/文件名稱    刪除本地目錄/文件,下次ci時從庫中刪除

             svn  ci -m “   ”

例如:

使用命令:svn  delete  URL -m            直接從庫中刪除文件

例如:

4.1.4重命名(移動)

重命名操作相當於先新增新的文件,再刪除原來舊的文件;SVN支持在模塊內部對文件名,目錄結構進行調整,但是對於模塊及以上目錄級別:禁止添加新的中文等非英文文件名的文件,在SVN代碼庫SCM已經對此進行了限制。

使用命令:svn  rename wc(本地原來目錄名/文件名) wc(重命名後的目錄名/文件名)

 

           svn  ci -m “        ”       將重命名提交到版本庫

例如:

4.2提交

提交前請先查看本地工作副本狀態,查看改動和差異,確定好你的修改後,就可以將修改提交到版本庫中。

    使用命令:svn  ci -m “     ”             指定日誌信息ARG

    備註:清楚地輸入日誌來表明你所修改的內容是一個很好的習慣,這爲以後版本回退提供了方便;且SCM在後臺對鉤子進行了控制,要求必須提交註釋,並且超過5個字節。

執行完提交後,svn的全局版本號會加1,如下圖所示:

Svn告訴我們,它提交了版本7604。版本號7604是針對整個版本庫而言,而不是某個文件;如上圖,我們修改了兩個文件,但是全局版本號仍然是7604。你可以把svn的全局版本號看做某種全局的標記,並隨着版本庫一直往上升,記錄着每一次提交的改動。

但是,有些時候我們也會遇到提交失敗的情況,比如兩個人同時開發一個文件,在你提交前,另一個人已經將他的修改提交入庫;此時在你提交時,svn會提示“提交失敗”,如下圖:

此時執行svn up操作,svn會幫你合併他人的改動到你的本地工作副本,更新後,你可以執行svn log -v來查看剛剛是誰進行了哪些操作,並通過svn diff –r head來確認合併其他改動後的內容,可繼續提交你的修改入庫,如下:

4.3更新

如上面剛剛提到的例子,如果你不是唯一一個在模塊上工作的人,在你工作的時候很有可能其他人已經更新過項目倉庫了。頻繁地更新你的工作副本,不斷合併他人的改動是一個好習慣。 

使用命令:svn up   沒有指定版本,則將工作副本更新到當前URL的 HEAD 版本

例如:

使用命令:svn  up  -r      更新到-r 選項所指定的版本

例如:

備註:在更新過程中,svn會顯示每一個文件的狀態以及對應的重要活動。添加到項目倉庫中的文件和目錄會被添加到工作副本,從項目倉庫中移除的文件和目錄也會從工作副本中移除。

每更新一項就輸出一行信息,使用首字符來報告執行的動作。這些字符的含義是:

    已添加

    已刪除                                         

    已更新

    合併衝突

    合併成功

但是,在此要提醒下,習慣於使用工具CVS的各位同學:對於CVS命令(cvs up –dr ***_PD_BL/****_BRANCH)即可切換到相應的tag/分支上;但是對於SVN,執行命令(svn up)只能更新到當前工作副本所在URL的末端,(查看當前工作副本所在URL可使用命令svn info);想要更新到某一tag/分支,可使用命令:svn switch.

4.4創建分支

在分支創建之前,我們先來了解下分支的概念特點

4.4.1 什麼是分支

分支是一種特殊的版本形式,即爲把整個目錄拷貝到一個新的位置。我們可以對項目或模塊分出一個並行開發的版本,對這個並行開發的版本進行修改,然後將分支版本的修改合併到主幹或其它分支上來。

4.4.2 分支的特點

1,Svn允許你把修改隔離在各自的開發線上,當你改變一個分支中的文件時,這些更改不會出現在開發主幹(trunk)和其它分支中。

2,在這之後你可以使用 svn merge 把這些變更從一個分支移動到另一個分支(或主幹) ,並行開發示意圖如下:

4.4.3 如何創建分支

  在我們平時的開發中,分支是在發起模塊三位版本申請的時候提交的,當四位版本創建成功後,scm平臺會根據你提供的基線及想要創建的分支名稱,已經幫你把分支創建成功。如下圖所示:

點擊進入三位版本頁面,我們由此可以查詢到創建分支的基線版本,如下圖:

那麼,如果平臺創建分支的所需要做的具體操作有哪些呢?

1,確定基線

2,創建分支

使用命令:svn cp  基線版本url  分支url  -m “log信息

備註:當分支創建成功了後,你需要切換到分支對其進行開發。

4.5標記tag

tag是爲一些文件的拷貝提供了版本庫在某個特定時刻的快照。在主幹/分支開發完成並編譯成功後,我們需要在其末端標記已經申請成功的四位版本號(即tag),然後到平臺上進行單元測試,送測,上線。

使用命令:svn  cp .  URLtag -m  ” log信息

備註:1 svn cp對於原來文件和拷貝的歷史會跟蹤到同一個來源。svn記住了文件的共享歷史,跟蹤歷史的功能也知道這些操作的存在。

 2svn cp還可以複製多個源到一個目的節點,此時該節點必須是目錄。

4.6切換

當你目前本地工作副本爲主幹,此時你想要切換到分支進行開發,或者想要切換到某一tag查看tag的內容,可執行此操作。

使用命令:svn  switch  URL

例如:

 

4.7同步

當分支上的版本上線後,如果主幹上沒有開發,則需要把分支上的內容同步到主幹;同步即覆蓋的意思,將某個分支或者tag的內容完全覆蓋到另外一個分支或者主幹上。實例詳見:http://com.test.com/twiki/bin/view/Sqa/FAQ#對於pre-release狀態處理

若在同步前,主幹在創建分支後沒有提交過任何內容,那麼只要在入四位版本信息頁面,點擊 "同步到主幹" 按鈕即可成功。但是,若主幹上提交了修改,那麼就會報如下錯誤:

此時需要你到svn裏手動執行同步到主幹操作,步驟如下:

4.7.1確定同步的目標位置,將本地更新到目標位置的末端

對於同步到主幹操作,我們首先將本地切換到主幹末端。

使用命令:Svn sw (主幹)url

4.7.2 執行同步操作

切換到主幹後,

使用命令:Svn merge (主幹)url   tagurl

          Svn ci –m “log信息                

          Svn cp (主幹)url  _PD_BL_MAINtagurl   標記同步tag

備註:  執行同步成功後,還需要rd到scmpf四位版本頁面點擊同步到主幹按鈕。

4.8合併

    在介紹合併操作之前,我們先來看一下合併的原理時機

4.8.1  合併原理

1,只要兩個新版本的修改不衝突,合併的版本就包含兩者的修改

ü  在不同位置添加,合併結果兩者都被添加

ü  在不同位置刪除,合併結果中兩者都被刪除

ü  在不同位置更改,合併結果將包括兩者的改動

2,當兩種修改發生衝突,即兩者修改了原版本中的同一代碼時,合併結果將顯示這些衝突

4.8.2  合併時機

當分支版本測試通過或者上線完成後,要及時將此版本合併到其它進行中的分支或主幹上。

4.8.3  合併操作步驟

實例詳見http://com.test.com/twiki/bin/view/Sqa/FAQ#合併操作步驟

使用命令:svn sw分支url       將本地開發環境切換到開發分支上

         svn merge  本版本基線版本url   上線tag的url     將上線tag的url內容合併

         svn    ci  -m “log信息”

         svn cp . (合併tag)的url   -m “log信息”        合併完成後,打合並tag                          

備註:

1,若合併不成功,需要還原,在還原了合併完成的文件後,還需要還原.svn目錄,執行命令svn revert . –R

2,基線的確定:登錄scmpf,查看該模塊當前的最新基線版本和tag

如下圖所示,若想將5.10.14.0版本的內容合併到正在開發中的分支iknow-fwui_5-10-32_BRANCH中,首先需要確定以上兩個分支版本的共同基線:

基線的確定方法,可在scmpf中完成,分別點擊進入5.10.14和5.10.12的三位版本頁面,查詢到以上兩個版本的共同基線爲:5.10.11.0,那麼在執行merge的第一個URL就選爲5.10.11.0的URL。

 

3,合併完成後,一定要標記合併tag,然後還需要到scmpf上標記本次合併

4.9查看

    在修改提交之前,我們可以使用svn st 和svn diff兩個命令來查看本地工作副本當前修改狀態和具體改動內容。svn status、svn diff和 svn revert這三條命令在沒有網絡的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。

4.9.1查看狀態

    在代碼修改完成,提交之前,執行svn st 來查看目錄下的文件和子目錄的狀態,正常狀態時不顯示。輸出的前七列各佔一個字符寬度,其中第一列最爲常用,表示一個項目是增加、刪除,還是修改,輸出結果常出現的幾種狀態:

      “ ” 無修改

      “A” 增加

      “C” 衝突

      “D” 刪除

      “I” 忽略

      “M” 改變

      “R” 替換

      “X” 未納入版本控制的目錄,被外部引用的目錄所創建

      “?” 未納入版本控制

      “!” 該項目已遺失(被非 svn 命令刪除)或不完整

      “~” 版本控制下的項目與其它類型的項目重名

 

使用命令:svn st

例如:

使用命令:svn st –v 

例如:

備註:其中第一列保持相同,第二列顯示工作版本號,第三和第四列顯示最後一次修改的版本號和修改人。

4.9.2查看改動(比較差異)

若是在提交前忘記了文件爲什麼被修改,可以使用svn diff命令來查看文件在版本庫中的版本和本地工作副本的直接區別。

1,提交前,查看當前工作副本與base版本的差異

使用命令:svn  diff

例如:

備註:第一行告訴正在檢查的文件的名字;

兩行等號之後的兩行告訴我們版本庫文件的名字和版本號;

@@-1 +1,2 @@:它告訴我們修改過的地方在文件的哪個位置;

以+開頭的行表示他們是新添加的行;

以-開頭的行表示這些行被移除了。

2,查看當前工作副本與庫中最新代碼的差異

使用命令:svn  diff  -r head            

3,比較任意兩個版本的差異

使用命令:svn  diff  -r reversion1:reversion2          

4,版本庫中任意兩個tag做對比

使用命令:svn   diff    (tag1)URL    (tag2)URL

4.9.3查看日誌

svn log 有幾個非常好用的用法:

1,  最常用的,查看顯示本地工作副本當前目錄下所有文件版本信息

使用命令:svn log

例如:

2,  詳細顯示所有相關路徑的日誌信息

使用命令:svn log –v

例如:

3,  查看分支,tag從主幹的哪一版本建立

使用命令:svn log--stop-on-copy -v

例如:

備註:從此我們可以查看到,bs_1-0-7_BRANCH分支是基於主幹的7574版本開發的。

4,  顯示你所關注的指定版本的日誌信息

使用命令:svn  log –r 

5              還原

恢復所有對文件和目錄的修改,並且解決所有的衝突狀態。svn revert不會只是恢復工作拷貝中一個目錄/文件的內容,也包括了對屬性修改的恢復。最終,你可以使用它來取消所有已經做過的預定操作(例如,文件預定要添加或刪除可以“恢復”)。

使用命令:svn  revert  filename              丟棄對一個文件的修改

備註:svn revert需要你提供至少一個目標,如果你沒有給svn revert提供了目標,它不會做任何事情,這樣是爲了保護你不小心失去對工作副本的修改。

本子命令不會訪問網絡,是本地操作,它能解除任何衝突的狀態,但是,它不恢復被刪除的目錄。恢復被刪除的目錄,需要使用up命令。

6              解決衝突

有時,合併更新等操作會導致文件衝突/樹衝突,svnresolved 命令用於刪除工作拷貝文件或目錄的“conflicted”狀態。這個程序不是語義上的改變衝突標誌,它只是刪除衝突相關的人造文件,從而重新允許PATH提交;也就是說,它告訴Subversion衝突已經“解決了”。

使用命令:svn resolved filename

7              FAQ

Q1: Can't add anyting in existing tags, or create aninvalid tag?

A:SCM禁止修改分支內容,當你試圖對tag進行修改,並提交代碼時,會出現如上提示。此時,請執行svn switch命令切換到tag所標記的主幹/分支進行開發,提交。

 

附錄1 上線異常回滾操作

觸發場景:

產品上線後效果迴歸與預期不符,需要回退重新修改

基本說明

若爲分支開發,請先將此版本同步到主幹(否則不能申請四位版本號,因爲有pre-released版本存在),完成後,將主幹版本回退到出問題版本的基線版本(基線版本可通過scm平臺的三位版本頁面,例如:點擊5.10.16按鈕,查詢到5.0.16.0的基線版本爲

版本操作

  我們需要根據基線版本,來確定回滾到主幹的版本號(即r***),通過剛剛的查詢,我們瞭解到要回滾的5.10.16.0版本的基線版本是5.10.15.0,在svn裏執行

svn co https://svn.test.com/app/search/iknow/tags/fe/iknow-fwui/iknow-fwui_5-10-15-0_PD_BL_MAIN

備註:

        因爲5.10.15.0上線後,執行了同步到主幹的操作,那麼5.10.15.0的內容完全覆蓋到主幹後,主幹的全局版本號爲10424,標記tag:iknow-fwui_5-10-15-0_PD_BL_MAIN後,全局版本號加1,變爲10425;實際上,對於主幹來說,10424與10425的內容一樣;

進入到iknow-fwui_5-10-15-0_PD_BL_MAIN這個tag執行命令

svn log --stop-on-copyv   可以查看到基線版本5.10.15.0是從主幹上的10424版本創建的tag後並提交版本號會自動加1

那我們就將主幹回滾到10424版本,

回滾的命令是:svn merge -r HEAD:10424 URL

  回滾後就可以重新申請模塊開發了,注意,申請新的版本時,分支名稱要做下相應的修改

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章