SVN教程
SVN簡介
SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,它採用了分支管理系統,它的設計目標就是取代CVS。說得簡單一點SVN就是用於多個人共同開發同一個項目,共用資源的目的。
Subversion(SVN) 是一個開源的版本控制系統, 也就是說 Subversion 管理着隨時間改變的數據。 這些數據放置在一箇中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變動。 這樣你就可以把檔案恢復到舊的版本, 或是瀏覽文件的變動歷史。
SVN的一些概念
repository(源代碼庫):源代碼統一存放的地方
Checkout(提取):當你手上沒有源代碼的時候,你需要從repository checkout一份
Commit(提交):當你已經修改了代碼,你就需要Commit到repository
Update (更新):當你已經Checkout了一份源代碼, Update一下你就可以和Repository上的源代碼同步,你手上的代碼就會有最新的變更。
日常開發過程其實就是這樣的(第一次剛入職先從源代碼庫checkout源碼,已經Checkout並且已經工作了幾天後):Update(獲得最新的代碼) –>作出自己的修改並調試成功 –> Commit(大家就可以看到你的修改了) 。
如果兩個程序員同時修改了同一個文件呢, SVN可以合併這兩個程序員的改動,實際上SVN管理源代碼是以行爲單位的,就是說兩個程序員只要不是修改了同一行程序,SVN都會自動合併兩種修改。如果是同一行,SVN會提示文件Confict, 衝突,需要手動修改。
SVN的安裝
1.下載svn軟件,在瀏覽器中打開 http://subversion.apache.org/packages.html#windows
2.下載成功後安裝到指定目錄。然後把svn安裝目錄裏的bin目錄添加到環境變量path中。
3.配置成功後,在命令行窗口輸入svnserve –version來測試一下是否安裝成功
SVN創建版本庫
使用命令 svnadmin create 路徑
例如 svnadmin create d:\svnrepertory
SVN的啓動
啓動命令:svnserve -d -r 倉庫路徑
-d:後臺執行
-r:版本庫的根目錄
由於-r 配置方式的不一樣,SVN啓動就可以有兩種不同的訪問方式,分爲多倉庫和單倉庫。
單倉庫(直接指定路徑到倉庫的根路徑),這種情況下,一個svnserve只能爲一個版本庫工作。
直接使用svn://localhost:3690/就能直接訪問。
多倉庫,如果一個目錄下有多個倉庫,我們啓動時指定的是倉庫的父目錄,那麼表示啓動多倉庫。
多倉庫的訪問是 svn://localhost:3690/xxx 。 svn://localhost:3690/默認訪問的是倉庫的父目錄,後面需要加上指定倉庫的名稱。
服務啓動的一個小問題
服務器啓動成功後,控制檯頁面需要一直開啓,不能關閉,一關閉服務就停止。
我們可以將啓動註冊成操作系統的服務,來方便我們開啓關閉 。
註冊服務的命令 sc create svn(服務名稱) binpath= "D:\Subversion\bin\svnserve.exe(svn目錄) --service -r D:\svnrepertory(倉庫的目錄)" displayname= "SVN-Service" start= auto depend= Tcpip
刪除服務的命令 sc delete 服務名稱
然後就可以直接執行開啓關閉服務等操作,也可以設置開機啓動。
SVN的簡單操作
svn檢出操作
我們創建一個空目錄D:\\Demo\user1,用來模仿用戶。在這個目錄我們執行檢出操作。
這個目錄會多出一個隱藏目錄 .svn。我們可以設置電腦的顯示隱藏文件查看。
.svn文件是subversion的版本控制信息文件,最好不要隨便修改。
svn提交操作
我們在剛纔創建的目錄D:\\Demo\user1 創建一個文件demo1.txt ,然後提交 svn commit demo1.txt。這時候會出現錯誤。
該錯誤是因爲我們的文件並未添加到版本控制文件信息中,我們需要使用add子命令,添加到本地版本庫
我們添加版本控制信息後再次提交,又出現錯誤。
這個錯誤是因爲我們沒有設置編輯器來設置日誌信息。我們可以用-m參數來設置日誌信息。
然後提交,這時候又出現錯誤。
這個錯誤因爲我們沒有權限的問題。後面我們會講權限的配置,這時候我們可以先設置爲匿名訪問。
我們設置倉庫的conf/svnserve.conf文件的anon-access屬性。
anon-access: 控制非鑑權用戶訪問版本庫的權限,取值範圍爲"write"、"read"和"none"。 即"write"爲可讀可寫,"read"爲只讀,"none"表示無訪問權限。 缺省值:read
然後進行提交,成功。
創建另一個目錄模擬用戶2 D:\\Demo\user2,我們先使用checkout指令 ,然後就能獲得到我們user1創建的文件,
然後用戶2對文件進行修改,提交。
然後用戶1對文件執行更新指令,就能獲得到用戶2修改後的版本 svn update
SVN的配置相關用戶和權限
進入倉庫的/conf目錄 修改默認配置文件配置,包括svnserve.conf、passwd、authz 配置相關用戶和權限。
1.先打開svnserve.conf文件,將裏面的 auth-access = write註釋去掉。這個選項是開啓權限認證
auth-access: 控制鑑權用戶訪問版本庫的權限。取值範圍爲"write"、"read"和"none"。 即"write"爲可讀可寫,"read"爲只讀,"none"表示無訪問權限。 缺省值:write
然後將password-db = passwd註釋去掉 ,這個是確定賬號配置文件的位置。
將authz-db = authz註釋去掉 ,確定認證配置文件位置。
2.然後打開passwd用戶名口令文件,由svnserve.conf的配置項password-db指定,缺省爲conf目錄中的passwd。該文件僅由一個[users]配置段組成。,配置我們的賬號密碼,一行一個賬號密碼。
3.權限配置文件由svnserve.conf的配置項authz-db指定,缺省爲conf目錄中的authz。該配置文件由一個[groups]配置段和若干個版本庫路徑權限段組成。
配置組,給一組用戶配置權限,而不用每個都一一進行配置。
配置多倉庫權限,用[]指定倉庫名稱,例如[svn:/] ,如果[svn:/doc] 則表示對svn倉庫下的doc目錄進行權限配置
使用@組名=權限名 對組進行權限配置
使用賬號名=權限名 對單個賬號進行配置
使用*表示對其他用戶進行配置
配置單倉庫權限
由於單倉庫不用指定倉庫名 直接使用[/]指定單倉庫,其他配置都一樣
TortoiseSVN
我們上面的操作都是在控制檯上輸入命令進行操作,這個軟件是允許我們以圖形化界面的方式操作,免去很多繁瑣命令。
創建一個空目錄,右鍵通過TortoiseSVN創建一個倉庫。
然後用戶就可以通過右鍵進行checkout、update、commit、add等操作
使用TortoiseSVN後,我們的文件上會多一些圖標,用來文件表示不同的狀態。
SVN解決衝突
假設 A、B 兩個用戶都在版本號爲 100 的時候,更新了 kingtuns.txt 這個文件,A 用戶在修改完成之後提交 kingtuns.txt 到服務器, 這個時候提交成功,這個時候 kingtuns.txt 文件的版本號已經變成 101 了。同時B用戶在版本號爲 100 的 kingtuns.txt 文件上作修改, 修改完成之後提交到服務器時,由於不是在當前最新的 101 版本上作的修改,所以導致提交失敗。
1.我們讓A和B同時檢出一份文件。
2.用戶B對文件進行修改,然後提交
3.用戶A對文件進行修改,然後提交,這時候服務器上的文件已經更新過了
4.出現錯誤,提示文件已經更新,我們點擊ok,然後選擇update更新文件
5.因爲實際上SVN管理源代碼是以行爲單位的,A和B用戶對同一行進行了修改,這時候就會出現衝突
6.我們要提交的文件會多出來兩個文件,一個文件是原來有的內容,一個是B用戶修改的內容
7.我們右鍵要提交的文件,選擇編輯衝突
8.Theirs窗口爲服務器上當前最新版本
Mine窗口爲本地修改後的版本
Merged窗口爲合併後的文件內容顯示
如果要使用服務器版本,在Theirs窗口選中差異內容,右鍵,選擇Use this text block(使用這段文本塊)。
同理如果要使用本地版本,在協商後,在Mine窗口右鍵,選擇Use this text block(使用這段文本塊)
然後點擊保存 ,然後點擊Mark as resolved解決衝突即可。
Eclipse SVN插件
我自己也寫了一些SVN插件使用的東西,可是效果不好,總覺得亂糟糟的一片。我發現了一篇很棒的關於SVN插件使用的教程。大家可以去這個大神這裏學習。
http://blog.csdn.net/v123411739/article/details/22512133
SVN目錄規範
創建倉庫以後,可以選擇創建目錄規範(create folder structure)。然後我們看倉庫瀏覽器,倉庫會多出來三個文件夾。
trunk:主線,用於存放程序的整個進度
branches:分支。
tags:標籤(版本),此目錄下的內容不能修改
Branches 選項會給開發者創建出另外一條線路。當有人希望開發進程分開成兩條不同的線路時,這個選項會非常有用。
比如項目 demo 下有兩個小組,svn 下有一個 trunk 版。
由於客戶需求突然變化,導致項目需要做較大改動,此時項目組決定由小組 1 繼續完成原來正進行到一半的工作(某個模塊),小組 2 進行新需求的開發。
那麼此時,我們就可以爲小組2建立一個分支,分支其實就是 trunk 版(主幹線)的一個copy版,不過分支也是具有版本控制功能的,而且是和主幹線相互獨立的,當然,到最後我們可以通過(合併)功能,將分支合併到 trunk 上來,從而最後合併爲一個項目。
版本管理系統支持 tag 選項,通過使用 tag 的概念,我們可以給某一個具體版本的代碼一個更加有意義的名字。
Tags 即標籤主要用於項目開發中的里程碑,比如開發到一定階段可以單獨一個版本作爲發佈等,它往往代表一個可以固定的完整的版本.例如xx系統1.0版本。