1. 程式人生 > >專案(七)SVN版本管理與大型程式碼上線方案

專案(七)SVN版本管理與大型程式碼上線方案

 

SVN介紹

  • Svn(subversion)是近年來崛起的非常優秀的版本管理工具,與CVS管理工具一樣,SVN是一個跨平臺的開源的版本控制系統。Svn版本管理工具管理著隨時間改變的各種資料。這些資料放置在一箇中央資料檔案庫(repository)中,這個檔案庫很像一個普通的檔案伺服器或者FTP伺服器,但是,與其他伺服器不同的是,SVN會備份並記錄每個檔案每一次的修改更新變動。這樣我們就可以把任意一個時間點的檔案恢復到想要的某一箇舊的版本,當然也可以直接瀏覽指定檔案的更新歷史記錄。
  • 為什麼會有svn這樣一個專案?
  • 官方解釋:為了接管CVS的使用者基礎,確切的說,我們寫了一個新的版本控制系統,它和CVS很相似,但是它修正了以前CVS所沒有解決的許多問題。問題見SVN官方首頁。
  • SVN是一個非常通用的軟體系統,它常被用來管理程式原始碼,但是它也可以管理任何型別的檔案,如文字,視訊,圖片等等。

SVN相關站點:

Subversion官網:
http://subversion.tigris.org/
http://subversion.apache.org/
svn客戶端:http://toroisesvn.net/
svn中文網站:http://www.iusesvn.com/
中文常見問題解答FAQ:http://subversion.apache.org/faq.zh.html
官方手冊:http://svnbook.red-bean.com/ 中英都有

svn與git的區別 

 svn集中式版本控制系統

svn版本控制系統是集中式的資料管理,存在一箇中央版本庫,所有開發人員本地開發所使用的程式碼都是來自於這個版本庫,提交程式碼也都必須提交到這個中央版本庫。

svn版本控制系統工作流程如下:

  1. 在中央庫上建立或從主幹複製一個分支
  2. 從中央庫check out 下這個分支的程式碼
  3. 增加自己的程式碼檔案,修改現存的程式碼或刪除程式碼檔案
  4. commit程式碼,假設有人在剛剛的分支上提交了程式碼,你就會被提示程式碼過期,你得先up你的程式碼後再提交。up程式碼的時候如果出現衝突,需要解決好衝突後再進行提交。

缺點:

當無法連線到中央版本庫的環境下,你無法提交程式碼,將程式碼加入版本控制;
你無法檢視程式碼的歷史版本以及版本的變化過程。提交到版本控制系統中的程式碼我們都預設通過自測可執行的,如果某個模組的程式碼比較複雜,不能短時間內實現為可測試的功能,那麼你需要等很長的時間才能提交自己的程式碼,由於程式碼庫集中管理,因此,需要對中央版本庫的儲存做備份。這點分散式的版本控制系統要好一些。Svn的備份要備份所有程式碼資料以及所有更改的版本記錄。

 git分散式的版本控制

  • git是由Linus開發的,所以很自然的git和Linux檔案系統結合的比較緊密,以至於在windows上你必須使用cygwin才能使其完美的工作。
  • 那git憑啥叫做分散式的版本控制系統呢?還是從其工作模式講起把。
  • git中沒有了中央版本庫的說法了,但是為了開發小組的程式碼共享,我們通常還是會搭建一個遠端的git倉庫。
  • 但是和svn不同的是,開發者本地也包含了一個完整的git倉庫,從某種程度上說本地的倉庫和遠端的倉庫在身份上是等價的,沒有主從之分。
  • 如果你的專案是閉源專案,或者你習慣於以往的集中式的管理模式的話,那麼在git下你也可以像svn那樣的工作,只是流程中可能會增加一些步驟。
  1. 你本地建立一個git庫,並將其add到遠端git庫中。
  2. 你在本地新增或者刪除檔案,然後commit,當然commit操作都是提交到本地的git庫中了。(嗯,其實是提交到git目錄下的objects目錄中去了)
  3. 將本地git庫的分支push到遠端git庫的分支,如果這個時候遠端git庫中已經有別人push過,那麼遠端git庫將不允許你push,這時候你需要先pull,然後如果有衝突,處理好衝突,commit到本地git庫後,再push到遠端git庫。

從上面的描述我們可以看到,我們每個開發人員的本地都會有一個git庫,我們可以隨時進行commit而不需要聯網,可以隨時檢視歷史版本,當某一個功能點開發完了之後我們可以將commit後的內容push到遠端git庫了,如果遠端git庫的版本在你上次clone或者pull之後變化了,那麼你需要進行pull並處理衝突,提交之後,再push到遠端git庫。

運維人員掌握版本管理

對於版本管理系統,運維人員需要掌握的技術點:

  1. 安裝,部署,維護,排障。
  2. 簡單使用,很多公司都是由開發來管理,包括建立新倉庫和新增刪除賬號
  3. 對於版本控制系統,運維人員相當於開發商,開發人員是業主,運維搭建的系統為開發人員服務的。

1.5 SVN服務執行模式與訪問方式

1.5.1 SVN服務端執行方式

svn服務常見的執行訪問方式有3種:

(1)獨立伺服器訪問

訪問地址如:svn://svn.yunjisuan.org/sadoc;

(2)藉助apache等http服務

訪問地址如:http://svn.yunjisuan.com/sadoc;

a,單獨安裝apache+svn(不要用)
b,CSVN(apache+svn)是一個單獨的整合的軟體,帶web介面管理的SVN軟體

(3)本地直接訪問(例如:file://application/svndata/sadoc)

QQ截圖20170912203307.png-75.6kB

在這裡,主要給同學們介紹第一種方式以及第二種方式中的CSVN web管理方式

1.5.2 SVN客戶端訪問方式

SVN客戶端可以通過多種方式訪問伺服器端,例如:本地磁碟訪問,或各種各樣不同的網路協議訪問,但一個版本庫地址永遠都是一個URL,URL反映了訪問方法。

訪問方式 說明
file:// 直接通過本地磁碟或者網路磁碟訪問版本庫
http:// 通過WebDAV協議訪問支援Subversion的Apache伺服器
https:// 與http://相似,但是用SSL加密訪問
svn:// 通過TCP/IP自定義協議訪問svnserve伺服器
svn+ssh:// 通過認證並加密的TCP/IP自定義協議訪問svnserve伺服器

1.6 SVN檔案庫資料格式

svn儲存版本資料有2種方式:BDB(一種事務安全型表型別)和FSFS(一種不需要資料庫的儲存系統)。因為BDB方式在伺服器中斷時,有可能鎖住資料,所以還是FSFS方式更安全一點。

  • BDB:

伯克利DB(Berkeley DB),版本庫可以使用的一種經過充分測試的後臺資料庫實現,不能在通過網路共享的檔案系統上使用,伯克利DB是Subversion 1.2版本以前的預設版本庫格式

  • FSFS:

一個專用於Subversion版本庫的檔案系統後端,可以使用網路檔案系統(例如 NFS 或 SMBFS)。是1.2版本及其後的預設版本庫格式。

1.7.1 SVN 集中式版本管理系統

Svn是一種集中式檔案版本管理系統。集中式管理的工作流程如下圖:

QQ截圖20170912205406.png-31.5kB

集中式程式碼管理的核心是SVN伺服器,所有開發者在開始新一天的工作之前必須從伺服器獲取程式碼,然後進行開發,最後解決衝突,提交。所有的版本資訊都放在SVN伺服器上。因此如果脫離了伺服器,開發者就無法進行提交程式碼工作。

1.7.2 開發者利用SVN版本管理系統工作過程

下面舉例說明:

開始新一天的工作:

  1. 首先從SVN伺服器下載專案組最新程式碼。
  2. 進入自己的分支,進行開發工作,每隔一小時向伺服器上自己的分支提交一次程式碼(很多程式設計師都有這個習慣。因為有時候自己對程式碼改來改去,最後又想還原到新一個小時的版本,或者看看前一個小時自己修改了哪些程式碼,就需要這樣做了)。
  3. 下班時間快到了,把自己的分支合併到伺服器主分支上,一天的工作完成,並反映給伺服器。

優點:

  1. 管理方便,邏輯清晰明確,符合一般人思維習慣。
  2. 易於管理,集中式svn伺服器更能保證資料安全性。
  3. 程式碼一致性非常高。
  4. 適合開發人數不多的專案開發。
  5. 普及度高,大部分軟體配置管理的大學教材都是使用svn和vss。

 搭建SVN服務端

建立svn版本庫資料儲存根目錄(svndata)及使用者,密碼許可權目錄(svnpasswd)

第一個目錄是資料儲存根目錄

第二個目錄是使用者,密碼許可權目錄

建立專案版本庫

建立一個新的Subversion專案yunjisuan,其實,類似yunjisuan這樣的專案可以建立多個,每個專案對應不同的程式碼,這裡只是以建立一個專案為例演示:

編輯svn配置檔案

修改如上,特別提示:此配置檔案裡的每條配置程式碼必須頂格寫,不能有空格。

12行表示:禁止匿名訪問   13:驗證訪問可寫  20:密碼檔案位置  27:驗證檔案位置

將authz檔案和passwd檔案拷貝到/application/svnpasswd下

啟動svn服務

svn啟動命令幫助

passwd檔案及密碼設定

authz的授權

注意:
1,許可權配置檔案中出現的使用者名稱必須已在使用者配置檔案中定義
2,對許可權配置檔案的修改立即生效,不必重啟svn

重啟動svnserve

搭建SVN客戶端

使用svn客戶端(windows版)

 軟體版本選擇

推薦:TortoiseSVN-1.9.7.27907-x64-svn-1.9.7

注意:32位系統要用32位軟體版本

svn客戶端軟體的使用

(1)先在本地建立一個目錄,起名任意,比如data

滑鼠右鍵點選data目錄

選擇右鍵選單裡的SVN Checkout,出現下圖:

ip是自己虛擬機器ip,yunjisuan為專案目錄

特別提示:
如果連線不通,請檢查Linux虛擬機器的iptables是否關閉。

點選OK後,出現下圖:

密碼為123123

再次點選OK以後,結束。此時目錄裡多了一個隱藏的目錄,表示此目錄已經和svn伺服器連通

如果沒有隱藏目錄,可能是windows設定的不顯示隱藏目錄

命令說明:
(1)SVN Checkout:相當於下載,第一次連線svn伺服器的時候需要和伺服器的對應儲存目錄進行資料同步,如果伺服器的對應目錄裡有資料檔案,那麼就會下載到你的本地對應目錄裡。
(2)SVN Update:更新資料,檢查伺服器端svn儲存目錄裡是否和本地svn儲存目錄資料不一致,如果不一致,那麼下載改變或新增的部分到本地svn目錄裡。(不會刪除本地目錄內容)
(3)SVN Commit:提交資料到svn伺服器端儲存目錄。本地svn儲存目錄會和伺服器端儲存目錄進行比對校驗。會把本地改變的部分和新增的部分同步上傳至伺服器端。

svn客戶端使用測試

(1)向windows的svn儲存目錄data裡放一個空檔案

(2)右鍵點選data目錄,選擇SVN Commit

選擇檔案,點選OK

再點選OK

(3)開啟本地data目錄裡的檔案,隨便寫點內容後,再次進行SVN commit

顏色變了,說明有更新

(4)直接從本地檢視伺服器端的資料內容

右鍵點選本地svn儲存目錄data,選擇TortoiseSVN ===>Repo-browser後出現下圖:

雙擊檔案可以直接遠端開啟檔案,可以看到裡面剛剛被修改後的內容已經更新至伺服器端。

(5)刪除本地svn儲存目錄data裡的檔案,後選擇SVN Update

同學們會發現,剛剛刪除的檔案又重新下載回來了。

(6)繼續刪除本地svn儲存目錄data裡的檔案,後選擇SVN Commit

(7)再次檢視伺服器端儲存目錄裡,發現檔案已經被刪除了

SVN的管理命令(Linux)

 
  1. [[email protected] ~]# svn --help
  2. usage: svn <subcommand> [options] [args]
  3. Subversion command-line client, version 1.6.11.
  4. Type 'svn help <subcommand>' for help on a specific subcommand.
  5. Type 'svn --version' to see the program version and RA modules
  6. or 'svn --version --quiet' to see just the version number.
  7. Most subcommands take file and/or directory arguments, recursing
  8. on the directories. If no arguments are supplied to such a
  9. command, it recurses on the current directory (inclusive) by default.
  10. Available subcommands:
  11. add
  12. blame (praise, annotate, ann)
  13. cat
  14. changelist (cl)
  15. checkout (co) #下載資料
  16. cleanup
  17. commit (ci) #提交資料
  18. copy (cp)
  19. delete (del, remove, rm)
  20. diff (di)
  21. export
  22. help (?, h)
  23. import
  24. info
  25. list (ls) #顯示伺服器端內容
  26. lock
  27. log
  28. merge
  29. mergeinfo
  30. mkdir
  31. move (mv, rename, ren)
  32. propdel (pdel, pd)
  33. propedit (pedit, pe)
  34. propget (pget, pg)
  35. proplist (plist, pl)
  36. propset (pset, ps)
  37. resolve
  38. resolved
  39. revert
  40. status (stat, st)
  41. switch (sw)
  42. unlock
  43. update (up) #更新資料
  44. Subversion is a tool for version control.
  45. For additional information, see http://subversion.tigris.org/

從SVN庫提取資料

將檔案checkout到本地目錄
svn checkout(co) remotepath localpath

下載伺服器端資料到Linux本地目錄

 

檢視SVN版庫中的資料

svn list file:///application/svndata/yunjisuan

 

提交資料到SVN版本庫

(1)一次失敗的提交

(2)換賬戶重新Checkout