天天看點

版本控制二(建立倉庫與使用)

安裝完後,Subversion會自動在環境變量path裡面加入bin目錄的位址.可以在指令行裡面操作.

Subversion的元件大緻可以分為兩種:用戶端元件和伺服器元件,因為通路資料倉庫也需要通過伺服器元件.伺服器元件又有三種,是供管理者使用的:

svnadmin:用來調整和修正svn檔案庫的工具

mod_dav_svn:給Apache-2.X網頁伺服器使用的外G子產品;可以用來将你的檔案庫透過網絡對外開放,以供他人進行存取.

svnserve:一個獨立地伺服器程式(内置),可以作為伺服器程式執行,或是被SSH啟動;另一個讓你的檔案庫在網絡上可供其他人存取的方法.

用戶端元件隻有一個,供使用者使用:svn,指令行用戶端程式,這是用來管理資料的主要工具.

我要這個目錄下面建立一個倉庫:F:/RevisionControl/Repository/svn,預設安裝完隻有倉儲行的元件,那麼現在就用這個元件來建立一個倉庫,又可以稱之為檔案庫,這是管理者的操作,要用到svnadmin:

這樣就在F:/RevisionControl/Repository/svn目錄下建立了一個名為firstsvn的倉庫,建立倉庫的文法:

可以看到倉庫建立完後生成了一堆檔案和目錄,這些目錄的含義是:

db目錄:就是所有版本控制的資料存放檔案 hooks目錄:放置hook腳本檔案的目錄 locks目錄:用來放置Subversion檔案庫鎖定資料的目錄,用來追蹤存取檔案庫的用戶端 format檔案是一個文本檔案,裡面隻放了一個整數,表示目前檔案庫配置的版本号 conf目錄:是這個倉庫的配置檔案(倉庫的使用者通路帳号、權限等)

你把你的檔案更新或者加入到倉庫以後,不要試着找到這些檔案,它們雖然在db目錄下,但是以它自己的方式儲存着,正常方法看不了.可以說conf目錄是最重要的目錄.

倉庫建立之後還不能馬上使用,需要啟動.有兩種啟動方式:svn伺服器啟動和Windows服務啟動方式.

先使用svn伺服器啟動的方式,在cmd指令行輸入文法為:

svnserve -d –r 文檔倉庫路徑

其中d代表背景執行,r是指定倉庫的根目錄.指令執行後,如果不知道是否啟動,因為指令行沒有任何反應,有的隻是沒有反應.可以通過在另一個cmd指令行中輸入netstat -an的指令檢視目前端面的監聽情況來辨識是否啟動.它的監聽端口号為:3690:

版本控制二(建立倉庫與使用)

圖為已啟動.但是這種啟動方式不好,因為隻要你關閉了輸入啟動指令的指令行,你的Subversion也就停止了.是以建議使用第二種方式:以服務方式啟動.

還是在指令行輸入:

表示建立一個名為"SVN-Service"的服務,要指定binpath,設定自動啟動.需要注意一點,這種方式為多倉庫,如果指定到svn目錄下的firstsvn,就是單倉庫.多倉庫可以對目錄下多個工程進行版本控制.下方出現"[SC] CreateService SUCCESS"表示建立成功.這個時候可以在服務裡面找到它:

版本控制二(建立倉庫與使用)

可以看出建立完它是沒有啟動的,啟動後就可以使用了.删除的文法為:

可以使用了.當一個新人加入項目組的時候,第一次要checkout工程,修改完以後要commit,團隊的人可以通過update來擷取最新的版本.

我在F:/Develop/workroom/目錄下建立一個使用者,就叫user1,用他來做checkout:

子指令checkout後面可以跟兩個參數,第一個參數為指定的url,由于我是多倉庫,是以需要指定具體的倉庫.第二個參數(上面沒寫)指定checkout的目的地.預設就是目前執行指令的路徑,我用cd指令切過來了,是以不指定也行.

指令執行後可以看到user1的目錄下多了個目錄:firstsvn.裡面有一個隐藏目錄:.svn.這個目錄裡面包含了你的版本庫的資訊,可以讓你commit或者update的時候不用再輸入url.

由于目前版本庫裡面沒有任何東西,也沒有對它操作過,是以是取出版本0.現在我就在裡面增加一個檔案,就叫hello.txt,裡面隻有一句話:hello world:

版本控制二(建立倉庫與使用)

然後commit,commit之前輸入先要add,相當于給它一個标記.輸入指令:

下面出現了"A",相當于給了它标記,接着commit,徹底儲存在版本庫中:

可以看到指令執行後出現了這麼一些話,就是說你的東西送出上去了,要說明一下,就像寫程式的時候加注釋一樣,總不能無緣無故地就出現吧?

用-m指令,加了還是報錯,也很正常!不能随便什麼人就往版本庫裡面加東西吧?看上面的一些操作,沒有對來訪都進行核查,肯定不行的,這就要用到版本庫的conf目錄.把這個目錄打開,總共有三個檔案:

svnserve.conf 定義所有認證和授權政策 passwd 存放項目成員帳戶資訊 authz 主要是做複雜的群組權限控制

把svnserve.conf檔案打開,也很多東西,注釋更多,其他的不用管,可以看到這麼一行:

這是對匿名使用者的權限,預設為read,可以先把前面的注釋去掉,不要留下空格,然後把read改為write,不用重新開機,再試試之前的指令:

完成了,這個時候你把檔案删掉都不怕了,因為版本庫中已經有了.那麼你要修改這個檔案呢?修改完後還是commit就行了.

如果其他成員更新了這個檔案,隻需要update就可以了:

如果删除:

跟add類似,隻是加入了一個标記,相當于在你本地删除了,因為你現在在本地看不到這個檔案,但是版本庫中還有,其他成員可以擷取到.你可以通過commit來使删除生效,或者revert來取消這次操作:

那麼現在可以總結一下常用指令:

svn checkout -從版本庫取出一個工作拷貝 svn commit -将改動的檔案送出到版本庫 svn update -更新你的工作拷貝 svn add-向版本庫中添加新檔案 svn delete-從版本庫中删除檔案 svn revert-取消所有的本地編輯

還有svn的常用指令:

svn info-顯示本地或遠端條目的資訊 svn list-列出版本庫目錄的條目 svn status-檢視目前工作區狀态 svn help-擷取幫助資訊

還有對于每一個更新的項目之後都會有标記,就像add之後會出現"A",delete之後會出現"D"一樣:

A添加 D删除 U更新 C沖突 G合并

Subversion還有目錄規範,建立三個頂級目錄:

/trunk 存放開發的“主線” /branches 存放支線副本 /tags 存放标簽副本

Subversion 提供了主線、分支管理技術,使得在軟體開發中可以更友善、靈活的對項目的進度、版本的釋出、版本的維護、軟體功能的拓展與定制進行管理。

主線(trunk):一個項目建立時就存在,并伴随着項目的成長而不斷的成長,直到項目完全結束。

分支(branch):一般是指功能分支,例如:我們的某個項目要添加一個子產品,但這個子產品又比較複雜,實作難度比較大。為了不影響主線的穩定,我們就可以建立一個功能分支來專門開發這個子產品,當這個子產品開發完成以後,并通過測試部門的各項測試,再合并到主線中去。再比如,我們的交警 GPS 項目已經開發完成了,但是這個項目是給泉州交警做的,現在我們又接到了一個交警項目,不過是要給廈門交警大隊的。現在廈門交警大隊要求我們給他們定制一些功能。我們又不想再主線上進行修改,這個時候,我們也可以建立一個分支,并在這個分支上開發,這時是不會對主線造成影響的。等給廈門開發完成了以後,我們發現,他們要求的有些功能其實很好,以後别的地方可能也需要同樣的功能。這個時候我們就可以根據我們的需要,将有用的子產品有選擇的合并到主線中來。

标簽(tag):标簽和分支一樣,也是一個目錄,不過這個目錄中一般存放的是釋出的資訊(當然我們也可以隻用分支,但是用标簽更清楚明了一些)。還是拿我們的交警項目來舉個例子:我們的交警項目開發完成了以後,要拿給泉州交警大隊用了,也就是要釋出(release),假設這個版本叫做1.0.2。這個時候,我們就要建立一個标簽,當泉州交警大隊用了三個月,發現了一個 BUG,我們隻需要簽出這個标簽中的代碼(它和我們剛提供給泉州交警大隊時候的是一模一樣的),進行調試,并修正這個 BUG。然後再釋出一個版本,假設叫做1.1.0,這個時候我們就在建立一個 1.1.0的标簽……

要注意,标簽目錄裡面的代碼,要進行嚴格的控制,除了修正 BUG 外,不能做任何其他的事情。

如果本文有任何問題,請及時指出,以免對後來者産生不必要的困擾,不勝感激!

繼續閱讀