1. 程式人生 > >專案管理-SVN學習

專案管理-SVN學習

1,概念

1)專案管理

為了使工作專案能夠按照預定的成本、進度、質量順利完成,而對人員(People)、產品(Product)、過程(Process)和專案(Project)進行分析和管理。

2)常見的專案管理軟體

①SVN (Subversion)

svn

  • SVN 是開發原始碼軟體,無需支付購買費用。同時沒有生產廠家為其提供技術的支援。如發現問題,通常只能靠自己查詢網上的資料進行解決。
  • 支援Linux、windows、macOS等多平臺。svn伺服器有2種執行方式:獨立伺服器和藉助apache。易用性高。
  • 它的客戶機 / 伺服器存取方法使得開發者可以從任何因特網的接入點存取最新的程式碼;
  • 它的無限制的版本管理檢出 (checkout :注 1)的模式避免了通常的因為排它檢出模式而引起的人工衝突;
  • 它的客戶端工具可以在絕大多數的平臺上使用。
  • 同樣, SVN 也不提供對變更流程的自動管理功能; SVN 的許可權設定單一,無法完成複雜的許可權控制。

②Git

Git
- Git是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放原始碼的版本控制軟體。
- github是一個用git做版本控制的專案託管平臺。
- Git 只關心檔案資料的整體是否發生變化,而SVN這類版本控制系統則只關心檔案內容的具體差異。這類系統(如SVN)每次記錄有哪些檔案作了更新,以及都更新了哪些行的什麼內容,然而Git 並不儲存這些前後變化的差異資料。

③VSS( Visual Source Safe )

  • VSS是微軟的產品,可以得到穩定的技術支援。
  • 易用,收費。
  • 提供檔案的版本跟蹤功能,對於 build 和基線的管理, VSS 的打標籤的功能可以提供支援。 VSS 提供 share (共享 ) 、 branch( 分支)和合並( merge) 的功能,對於團隊的開發進行支援。 VSS 不提供對流程的管理功能,如對變更的流程進行控制。 VSS 不能提供對異地團隊開發的支援。此外 VSS 只能在 windows 平臺上執行,不能執行在其他作業系統上。

④ClearCase

  • Rational公司的ClearCase是軟體行業公認的功能最強大、價格最昂貴的配置管理軟體。
  • 主要應用於複雜產品的並行開發、釋出和維護。

3)svn相關名詞

①repository(原始碼庫、配置庫)

原始碼統一存放的地方。
SVN的核心是配置庫,儲存所有的資料,配置庫按照檔案樹形式儲存資料。任意數量的客戶端可以連線到配置庫,讀寫這些檔案。
SVN會記錄配置庫種的每一次更改,不僅針對檔案也包括目錄本身,包括增加、刪除和重新組織檔案和目錄。

②WorkSpace(工作副本)

是個人的工作空間,我們可以從配置庫拿到原始碼,放在本地作為工作副本。在工作副本種我們可以進行程式碼的編寫與除錯執行。通過SVN可以把新版本的程式碼提交到配置庫中。

2,意義

1)記錄

①記錄一個專案從開始到結束的整個過程;
②追蹤專案中所有內容的變化情況(增刪改);

2)版本控制

記錄每個版本之間的異同點,如版本2.0相比較版本1.0多了什麼內容,功能等。

3)許可權控制

防止程式碼混亂,提高安全性。

4)責任追究

可以清楚的知道誰對哪個檔案進行了什麼修改,導致了專案無法正常執行。

5)回退處理

執行了錯誤的操作之後還可以有補救的機會,如從版本1.0升級到版本2.0,後來發現版本2.0有一個錯誤,這時候可以進行回退處理,比較方便。

6)衝突解決

在團隊的多人協同開發中,衝突是經常有的事情,比如存在著相同的檔名稱,同一個檔案中有著相同功能的函式等等,這時候使用原始碼管理工具可以比較方便的解決衝突。衝突的解決一般按照“複製-修改-合併”原則進行。

3,安裝與配置

安裝svn伺服器
svn伺服器
安裝客戶端和漢化包(建議使用英文版,不安裝漢化包)
svn客戶端
部分軟體需要安裝SVN外掛(如eclipse)

4,使用

1)SVN操作

安裝完後,右擊本地任何資料夾,都會出現SVN選單。

①Checkout(提取/檢出)

從repository中checkout,即可將SVN伺服器中的檔案下載到本地WorkSpace中。

check out跟check in對應。
check out匯出獲得檔案後,匯出的檔案仍處於SVN版本控制中,與版本庫保持關聯,比如你可以進行Svn Update或者Svn Commit操作。同時匯出資料夾下有一個.svn的隱藏資料夾,儲存著一些版本的元資料資訊。

②Repo-browser

輸入svn伺服器地址即可進入。

③Export/import

export跟import對應。
export 簡單匯出一個版本的資料,匯出的檔案脫離SVN版本控制,修改後無進行Update和Commit操作。匯出資料夾下沒有.svn目錄。

import:將初始的專案(專案目錄結構、介面、通用元件、靜態頁面等)匯入版本庫

④Create repository here

建立本機的原始碼庫。
可以在本機別處右鍵 SVN-Check out, 在彈出框中的URL of respository框中輸入(注意,這裡是使用file協議)file:///E:\svn\repository\trunk\testProject
svn

⑤Commit(提交)

修改程式碼後,需要更新SVN伺服器中的程式碼。從WorkSpace中Commit,即可將資料同步到repository中。

注意:

  • 提交時務必填寫註釋
    建議在建立 svn 路徑的時候直接限制為必填,
    否則不允許提交成功。
  • 提交註釋填寫具體
    所屬模組或功能(必須與專案實施進度計劃一致)
    性質(正常開發、修改 BUG、擴充套件功能)
    狀態(編碼中(x%)、除錯通過、獨測通過、聯測通過 需要說明)
    更新說明(本次提交所涉及修改部分的簡要說明)
  • 先更新,再提交

⑥Update (更新)

通過Update可以將WorkSpace中的資料與Repository上的資料進行同步。
注意:
每次寫程式碼之前,應該先更新

⑦Revert(回退)

撤銷修改,滾回上次更新的版本

⑧add(新增)

在專案中增加一個新檔案,如果該檔案沒有入庫則SVN伺服器無法識別,選擇該檔案單擊滑鼠右鍵執行add命令,將檔案入庫。下圖為svn中新增標識,表示檔案已經入庫,需要進行Commit操作才能提交到伺服器。
add

其它svn圖示:
svn圖示

⑨clean up(清理)

i>場景

本地檔案鎖定,使用“清除”命令。

SVN本地更新時,由於一些操作中斷,如磁碟空間不夠、使用者取消、兩個人同時更新、更新時序衝突,可能會造成本地檔案被鎖定的情況。這時候無論你在執行SVN的更新、提交等子命令都會提示“**locked”的錯誤。一般出現這種情況的解決方法:使用SVN clean up來清除鎖定。
如果在根目錄下都無法clean的話,一般採取的方法是另外找一個目錄重新CHECKOUT。但有時SVN目錄下可能有一些自己本地修改的檔案,還未提交到SVN伺服器,
這時重新CHECKOUT需要注意本地檔案的備份,並且不要強制覆蓋伺服器上其它人修改的內容。
其實SVN加鎖會在.SVN(隱藏檔案)中生成一個名字叫lock的檔案(無後綴),查詢所有的,手工刪除。然後再嘗試更新,系統可能會提示某個.base檔案無法訪問。
找到它,把相關的檔案或其所在的目錄刪除,重新UPDATE。
在相應的目錄中,比如我在更新metasploit的“/opt/metasploit3/msf3/lib/active_support/core_ext”這個目錄時就遇到了類似的情況,把.SVN子目錄(注意,“.”目錄是個隱藏目錄,需要選擇“資料夾選項”→“檢視”→“顯示隱藏檔案”選單項)裡面log檔案刪除,就可以了。然後繼續做svn cleanup命令。

ii>機制

當SVN改變你的工作拷貝(或是.svn中的任何資訊),在進行任何修改操作時,SVN都會把日誌記錄到日誌檔案中,然後執行log檔案中的命令。在執行過程中,會在工作拷貝的相關部分儲存一個鎖,防止SVN客戶端在變更過程中訪問工作拷貝。如果SVN的操作中斷了(舉個例子:程序被殺死了,機器死掉了),日誌檔案會儲存在硬碟上。通過執行日誌檔案,SVN可以完成上一次沒有完成的操作,你的工作拷貝可以回到一致的狀態。
這就是svn clean up命令的功能:它查詢工作拷貝中的所有遺留的日誌檔案,刪除程序中工作拷貝的鎖。如果SVN告訴你工作拷貝中的一部分已經“鎖定”了,你就需要執行這個命令了。

iii>使用技巧

程式碼衝突後,clean up後,再次update,在某些情況下會自動合併程式碼。

⑩setting(設定)

svn設定介面。
可以在saved Data中清除歷史資料。(有時候登入過其它賬號,再次登入另一個賬號會造成許可權衝突,處理方法就是clear all)

2)SVN目錄結構

Subversion有一個很標準的目錄結構,是這樣的:
比如專案是proj,svn地址為svn://proj/,那麼標準的svn佈局是
svn://proj/|+-trunk+-branches+-tags
這是一個標準的佈局,trunk為主開發目錄,branches為分支開發目錄,tags為tag存檔目錄(不允許修改)。

①以trunk作為開發主線

我們的所有的開發都是基於trunk進行開發,當一個版本/release開發告一段落(開發、測試、文件、製作安裝程式、打包等)結束後,程式碼處於凍結狀態(人為規定,可以通過hook來進行管理)。此時應該基於當前凍結的程式碼庫,打tag。當下一個版本/階段的開發任務開始,繼續在trunk進行開發。
此時,如果發現了上一個已發行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在開發的版本(Developing Version)無法滿足時間要求,這時候就需要在上一個版本上進行修改了。應該基於發行版對應的tag,做相應的分支(branch)進行開發。
例如,剛剛釋出1.0,正在開發2.0,此時要在1.0的基礎上進行bug修正。

②以branches作為開發主線(推薦)

在每一個release的branch中進行各自的開發,trunk只做釋出使用。
這種開發模式當中,trunk是不承擔具體開發任務的,一個版本/階段的開發任務在開始的時候,根據已經release的版本做新的開發分支,並且基於這個分支進行開發。
如果存在bug,則在branch基礎上進行修正。

3)SVN伺服器目錄

svn
目錄中資料夾作用:

①conf(配置目錄)

conf目錄
–authz檔案
新增組及其使用者accp=user01,user02
為組使用者設定目錄的讀寫許可權,組前面要用@符,第一個[/]表示目錄,[/]@accp=rw
–passwd檔案
格式:使用者名稱=密碼
user01=1234
user02=1234
–svnserver.conf檔案
取消以下幾個註釋
password-db = passwd
authz-db = authz

這些目錄的設定可以通過視覺化介面來操作。

②db(版本庫)

SVN伺服器版本庫有兩種格式,
一種為FSFS,
一種為BDB
把檔案上傳到SVN版本庫後,上傳的檔案不再以檔案原來的格式儲存,而是被svn以它自定義的格式壓縮成版本庫資料,存放在版本庫中。
如果是FSFS格式,這些資料存放在版本庫的db目錄中,裡面的revs和revprops分別存放著每次提交的差異資料和日誌等資訊

③hooks(鉤子程式)

用於開發部需要svn同步更新伺服器程式碼,需要用到svn鉤子(hooks)技術。
未用到hooks時,開發部commit一個檔案,線上服務的web文件並不同步,而是需要在svn服務上執行
svn update命令後才能同步。
使用hooks後:
開發部commit一個檔案,線上服務(web目錄)同步資料,不需要svn update命令了,這樣就減少了中間的一個小繁瑣,適用於頻繁更新程式碼的情況。

④locks

我們通過Get Lock…命令使SVN檔案變成單執行緒操作,並以此來避免程式碼衝突。這個鎖只有加鎖者自己才可以釋放。
另外我們也可以新增只讀鎖,這個鎖是任何人都可以釋放的。

⑤format

⑥svn.ico

5,版本衝突

1)問題

如果Commit Failed!說明已經衝突了。

此時update後,會多出3個檔案:
temp.txt.mine(格式:衝突檔名.副檔名.mine)記錄了你的檔名內容
temp.txt.r7(格式:衝突檔名.副檔名.r版本號)記錄了當前版本的上一個版本內容
temp.txt.r8(格式:衝突檔名.副檔名.r版本號)記錄了當前版本的內容

2)解決辦法

①備份自己的程式碼,執行revert命令放棄所做的修改。再重新編寫。
②手動合併衝突檔案;
③執行Edit conficts命令解決衝突;

3)衝突避免

①合理分配模組,修改公共模組的時候,同組成員互相溝通。
②每次寫程式碼前,先更新。
③加鎖。
執行Get Lock…命令(如下圖所示),使用完後記得對已加鎖的檔案執行Release lock命令。
get lock
為了減少衝突的發生避免一些不必要的麻煩,通常在變更檔案之前執對該檔案行一次SVN Update操作,但這樣衝突還是會發生的,一個比較有效的方法是對檔案加鎖。
其原理很簡單在對檔案變更之前先對檔案上鎖,這是有兩種可能若檔案有鎖(表明有人在編輯)加鎖失敗,若檔案沒有鎖則加鎖成功。一個檔案上鎖後除了自己別人是不能對檔案編輯的,當我們編輯完成之後再解鎖,然後別人就可以加鎖編輯了。這樣就有效的避免了多人同時操作同一個檔案時產生衝突