SVN基本的理解和使用
生活随笔
收集整理的這篇文章主要介紹了
SVN基本的理解和使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SVN
一 、 簡介
二、 安裝
三 、 SVN 生命周期
檢出
更新
四 、 SVN的啟動模式
首先,在服務端進行SVN版本庫的相關配置手動新建版本庫目錄mkdir /opt/svn利用svn命令創建版本庫svnadmin create /opt/svn/runoob使用命令svnserve啟動服務svnserve -d -r 目錄 --listen-port 端口號-r: 配置方式決定了版本庫訪問方式。--listen-port: 指定SVN監聽端口,不加此參數,SVN默認監聽3690由于-r 配置方式的不一樣,SVN啟動就可以有兩種不同的訪問方式方式一:-r直接指定到版本庫(稱之為單庫svnserve方式)svnserve -d -r /opt/svn/runoob在這種情況下,一個svnserve只能為一個版本庫工作。authz配置文件中對版本庫權限的配置應這樣寫:[groups]admin=user1dev=user2[/]@admin=rwuser2=r使用類似這樣的URL:svn://192.168.0.1/ 即可訪問runoob版本庫方式二:指定到版本庫的上級目錄(稱之為多庫svnserve方式)svnserve -d -r /opt/svn這種情況,一個svnserve可以為多個版本庫工作authz配置文件中對版本庫權限的配置應這樣寫:[groups]admin=user1dev=user2[runoob:/]@admin=rwuser2=r[runoob01:/]@admin=rwuser2=r如果此時你還用[/],則表示所有庫的根目錄,同理,[/src]表示所有庫的根目錄下的src目錄。使用類似這樣的URL:svn://192.168.0.1/runoob 即可訪問runoob版本庫。五 、 創建版本庫
使用svn命令創建資源庫[runoob@centos6 ~]# svnadmin create /opt/svn/runoob01 [runoob@centos6 ~]# ll /opt/svn/runoob01/ total 24 drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 conf drwxr-sr-x 6 root root 4096 2016/08/23 16:31:06 db -r--r--r-- 1 root root 2 2016/08/23 16:31:06 format drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 hooks drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 locks -rw-r--r-- 1 root root 229 2016/08/23 16:31:06 README.txt 進入/opt/svn/runoob01/conf目錄 修改默認配置文件配置,包括svnserve.conf、passwd、authz 配置相關用戶和權限。1、svn服務配置文件svnserve.confsvn服務配置文件為版本庫目錄中的文件conf/svnserve.conf。該文件僅由一個[general]配置段組成。[general] anon-access = none auth-access = write password-db = /home/svn/passwd authz-db = /home/svn/authz realm = tiku anon-access: 控制非鑒權用戶訪問版本庫的權限,取值范圍為"write"、"read"和"none"。 即"write"為可讀可寫,"read"為只讀,"none"表示無訪問權限。 缺省值:readauth-access: 控制鑒權用戶訪問版本庫的權限。取值范圍為"write"、"read"和"none"。 即"write"為可讀可寫,"read"為只讀,"none"表示無訪問權限。 缺省值:writeauthz-db: 指定權限配置文件名,通過該文件可以實現以路徑為基礎的訪問控制。 除非指定絕對路徑,否則文件位置為相對conf目錄的相對路徑。 缺省值:authzrealm: 指定版本庫的認證域,即在登錄時提示的認證域名稱。若兩個版本庫的 認證域相同,建議使用相同的用戶名口令數據文件。 缺省值:一個UUID(Universal Unique IDentifier,全局唯一標示)。2、用戶名口令文件passwd用戶名口令文件由svnserve.conf的配置項password-db指定,缺省為conf目錄中的passwd。該文件僅由一個[users]配置段組成。[users]配置段的配置行格式如下:<用戶名> = <口令> [users] admin = admin thinker = 123456 3、權限配置文件權限配置文件由svnserve.conf的配置項authz-db指定,缺省為conf目錄中的authz。該配置文件由一個[groups]配置段和若干個版本庫路徑權限段組成。[groups]配置段中配置行格式如下:<用戶組> = <用戶列表> 版本庫路徑權限段的段名格式如下:[<版本庫名>:<路徑>] [groups] g_admin = admin,thinker[admintools:/] @g_admin = rw * =[test:/home/thinker] thinker = rw * = r 本例是使用svnserve -d -r /opt/svn 以多庫svnserve方式啟動SVN,所以URL:svn://192.168.0.1/runoob01六 、 檢出操作
svn checkout http://svn.server.com/svn/project_repo --username=user01 以上命令將產生如下結果:root@runoob:~/svn# svn checkout svn://192.168.0.1/runoob01 --username=user01 A runoob01/trunk A runoob01/branches A runoob01/tags Checked out revision 1. 檢出成功后在當前目錄下生成runoob01副本目錄。查看檢出的內容root@runoob:~/svn# ll runoob01/ total 24 drwxr-xr-x 6 root root 4096 Jul 21 19:19 ./ drwxr-xr-x 3 root root 4096 Jul 21 19:10 ../ drwxr-xr-x 2 root root 4096 Jul 21 19:19 branches/ drwxr-xr-x 4 root root 4096 Jul 21 19:19 .svn/ drwxr-xr-x 2 root root 4096 Jul 21 19:19 tags/ drwxr-xr-x 2 root root 4096 Jul 21 19:19 trunk/ 你想查看更多關于版本庫的信息,執行 info 命令。七、 SVN 解決沖突
版本沖突原因: 假設 A、B 兩個用戶都在版本號為 100 的時候,更新了 kingtuns.txt 這個文件,A 用戶在修改完成之后提交 kingtuns.txt 到服務器, 這個時候提交成功,這個時候 kingtuns.txt 文件的版本號已經變成 101 了。同時B用戶在版本號為 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服務器時,由于不是在當前最新的 101 版本上作的修改,所以導致提交失敗。我們已在本地檢出 runoob01 庫,下面我們將實現版本沖突的解決方法。我們發現 HelloWorld.html 文件存在錯誤,需要修改文件并提交到版本庫中。我們將 HelloWorld.html 的內容修改為 "HelloWorld! http://www.runoob.com/"。root@runoob:~/svn/runoob01/trunk# cat HelloWorld.html HelloWorld! http://www.runoob.com/ 用下面的命令查看更改:root@runoob:~/svn/runoob01/trunk# svn diff Index: HelloWorld.html =================================================================== --- HelloWorld.html (revision 5) +++ HelloWorld.html (working copy) @@ -1,2 +1 @@ -HelloWorld! http://www.runoob.com/ +HelloWorld! http://www.runoob.com/! 嘗試使用下面的命令來提交他的更改:root@runoob:~/svn/runoob01/trunk# svn commit -m "change HelloWorld.html first" Sending HelloWorld.html Transmitting file data .svn: E160028: Commit failed (details follow): svn: E160028: File '/trunk/HelloWorld.html' is out of date 這時我發現提交失敗了。因為此時,HelloWorld.html 已經被 user02 修改并提交到了倉庫。Subversion 不會允許 user01(本例使用的 svn 賬號)提交更改,因為 user02 已經修改了倉庫,所以我們的工作副本已經失效。為了避免兩人的代碼被互相覆蓋,Subversion 不允許我們進行這樣的操作。所以我們在提交更改之前必須先更新工作副本。所以使用 update 命令,如下:root@runoob:~/svn/runoob01/trunk# svn update Updating '.': C HelloWorld.html Updated to revision 6. Conflict discovered in file 'HelloWorld.html'. Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,(mc) my side of conflict, (tc) their side of conflict,(s) show all options: mc Resolved conflicted state of 'HelloWorld.html' Summary of conflicts:Text conflicts: 0 remaining (and 1 already resolved) 這邊輸入"mc",以本地的文件為主。你也可以使用其選項對沖突的文件進行不同的操作。默認是更新到最新的版本,我們也可以指定更新到哪個版本svn update -r6 此時工作副本是和倉庫已經同步,可以安全地提交更改了root@runoob:~/svn/runoob01/trunk# svn commit -m "change HelloWorld.html second" Sending HelloWorld.html Transmitting file data . Committed revision 7.八 、 提交操作
我們在庫本版中需要增加一個readme的說明文件。root@runoob:~/svn/runoob01/trunk# cat readme this is SVN tutorial. 查看工作副本中的狀態。root@runoob:~/svn/runoob01/trunk# svn status ? readme 此時 readme的狀態為?,說明它還未加到版本控制中。將文件readme加到版本控制,等待提交到版本庫。root@runoob:~/svn/runoob01/trunk# svn add readme A readme 查看工作副本中的狀態root@runoob:~/svn/runoob01/trunk# svn status A readme 此時 readme的狀態為A,它意味著這個文件已經被成功地添加到了版本控制中。為了把 readme 存儲到版本庫中,使用 commit -m 加上注釋信息來提交。如果你忽略了 -m 選項, SVN會打開一個可以輸入多行的文本編輯器來讓你輸入提交信息。root@runoob:~/svn/runoob01/trunk# svn commit -m "SVN readme." Adding readme Transmitting file data . Committed revision 8. svn commit -m "SVN readme." 現在 readme 被成功地添加到了版本庫中,并且修訂版本號自動增加了1。九、 版本回退
當我們想放棄對文件的修改,可以使用 SVN revert 命令。svn revert 操作將撤銷任何文件或目錄里的局部更改。我們對文件 readme 進行修改,查看文件狀態。root@runoob:~/svn/runoob01/trunk# svn status M readme 這時我們發現修改錯誤,要撤銷修改,通過 svn revert 文件 readme 回歸到未修改狀態。root@runoob:~/svn/runoob01/trunk# svn revert readme Reverted 'readme' 再查看狀態。root@runoob:~/svn/runoob01/trunk# svn status root@runoob:~/svn/runoob01/trunk# 進行 revert 操作之后,readme 文件恢復了原始的狀態。 revert 操作不單單可以使單個文件恢復原狀, 而且可以使整個目錄恢復原狀。恢復目錄用 -R 命令,如下。svn revert -R trunk 但是,假如我們想恢復一個已經提交的版本怎么辦。為了消除一個舊版本,我們必須撤銷舊版本里的所有更改然后提交一個新版本。這種操作叫做 reverse merge。首先,找到倉庫的當前版本,現在是版本 22,我們要撤銷回之前的版本,比如版本 21。svn merge -r 22:21 readme十 、 查看歷史信息
通過svn命令可以根據時間或修訂號去除過去的版本,或者某一版本所做的具體的修改。以下四個命令可以用來查看svn 的歷史:svn log: 用來展示svn 的版本作者、日期、路徑等等。svn diff: 用來顯示特定修改的行級詳細信息。svn cat: 取得在特定版本的某文件顯示在當前屏幕。svn list: 顯示一個目錄或某一版本存在的文件。1、svn log 可以顯示所有的信息,如果只希望查看特定的某兩個版本之間的信息,可以使用:root@runoob:~/svn/runoob01/trunk# svn log -r 6:8 ------------------------------------------------------------------------ r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html first. ------------------------------------------------------------------------ r7 | user01 | 2016-11-07 02:23:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html second ------------------------------------------------------------------------ r8 | user01 | 2016-11-07 02:53:13 +0800 (Mon, 07 Nov 2016) | 1 lineSVN readme. ------------------------------------------------------------------------ 如果只想查看某一個文件的版本修改信息,可以使用 svn log 文件路徑。root@runoob:~/svn/runoob01# svn log trunk/HelloWorld.html ------------------------------------------------------------------------ r7 | user01 | 2016-11-07 02:23:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html second ------------------------------------------------------------------------ r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html first. ------------------------------------------------------------------------ r5 | user01 | 2016-11-07 01:50:03 +0800 (Mon, 07 Nov 2016) | 1 line------------------------------------------------------------------------ r4 | user01 | 2016-11-07 01:45:43 +0800 (Mon, 07 Nov 2016) | 1 lineAdd function to accept input and to display array contents ------------------------------------------------------------------------ r3 | user01 | 2016-11-07 01:42:35 +0800 (Mon, 07 Nov 2016) | 1 line------------------------------------------------------------------------ r2 | user01 | 2016-08-23 17:29:02 +0800 (Tue, 23 Aug 2016) | 1 linefirst file ------------------------------------------------------------------------ 如果希望得到目錄的信息要加 -v。如果希望顯示限定N條記錄的目錄信息,使用 svn log -l N -v。root@runoob:~/svn/runoob01/trunk# svn log -l 5 -v ------------------------------------------------------------------------ r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 line Changed paths:M /trunk/HelloWorld.htmlchange HelloWorld.html first. ------------------------------------------------------------------------ r5 | user01 | 2016-11-07 01:50:03 +0800 (Mon, 07 Nov 2016) | 1 line Changed paths:M /trunk/HelloWorld.html------------------------------------------------------------------------ r4 | user01 | 2016-11-07 01:45:43 +0800 (Mon, 07 Nov 2016) | 1 line Changed paths:M /trunk/HelloWorld.htmlAdd function to accept input and to display array contents ------------------------------------------------------------------------ r3 | user01 | 2016-11-07 01:42:35 +0800 (Mon, 07 Nov 2016) | 1 line Changed paths:A /trunk/HelloWorld.html (from /trunk/helloworld.html:2)D /trunk/helloworld.html------------------------------------------------------------------------ r2 | user01 | 2016-08-23 17:29:02 +0800 (Tue, 23 Aug 2016) | 1 line Changed paths:A /trunk/helloworld.htmlfirst file ------------------------------------------------------------------------ 2、svn diff 用來檢查歷史修改的詳情。檢查本地修改 比較工作拷貝與版本庫 比較版本庫與版本庫 (1)、如果用 svn diff,不帶任何參數,它將會比較你的工作文件與緩存在 .svn 的"原始"拷貝。root@runoob:~/svn/runoob01/trunk# svn diff Index: rules.txt =================================================================== --- rules.txt (revision 3) +++ rules.txt (working copy) @@ -1,4 +1,5 @@ Be kind to others Freedom = Responsibility Everything in moderation -Chew with your mouth open (2)、比較工作拷貝和版本庫比較你的工作拷貝和版本庫中版本號為 3 的文件 rule.txt。svn diff -r 3 rule.txt (3)、比較版本庫與版本庫通過 -r(revision) 傳遞兩個通過冒號分開的版本號,這兩個版本會進行比較。比較 svn 工作版本中版本號2和3的這個文件的變化。svn diff -r 2:3 rule.txt 3、svn cat 如果只是希望檢查一個過去版本,不希望查看他們的區別,可使用svn catsvn cat -r 版本號 rule.txt 這個命令會顯示在該版本號下的該文件內容4、svn list svn list 可以在不下載文件到本地目錄的情況下來察看目錄中的文件:$ svn list http://192.168.0.1/runoob01 README branches/ clients/ tags/十一、 分支
Branch 選項會給開發者創建出另外一條線路。當有人希望開發進程分開成兩條不同的線路時,這個選項會非常有用。比如項目 demo 下有兩個小組,svn 下有一個 trunk 版。由于客戶需求突然變化,導致項目需要做較大改動,此時項目組決定由小組 1 繼續完成原來正進行到一半的工作(某個模塊),小組 2 進行新需求的開發。那么此時,我們就可以為小組2建立一個分支,分支其實就是 trunk 版(主干線)的一個copy版,不過分支也是具有版本控制功能的,而且是和主干線相互獨立的,當然,到最后我們可以通過(合并)功能,將分支合并到 trunk 上來,從而最后合并為一個項目。我們在本地副本中創建一個 my_branch 分支。root@runoob:~/svn/runoob01# ls branches tags trunk root@runoob:~/svn/runoob01# svn copy trunk/ branches/my_branch A branches/my_branch root@runoob:~/svn/runoob01# 查看狀態:root@runoob:~/svn/runoob01# svn status A + branches/my_branch A + branches/my_branch/HelloWorld.html A + branches/my_branch/readme 提交新增的分支到版本庫。root@runoob:~/svn/runoob01# svn commit -m "add my_branch" Adding branches/my_branch Replacing branches/my_branch/HelloWorld.html Adding branches/my_branch/readmeCommitted revision 9. 接著我們就到 my_branch 分支進行開發,切換到分支路徑并創建 index.html 文件。root@runoob:~/svn/runoob01# cd branches/my_branch/ root@runoob:~/svn/runoob01/branches/my_branch# ls HelloWorld.html index.html readme 將 index.html 加入版本控制,并提交到版本庫中。root@runoob:~/svn/runoob01/branches/my_branch# svn status ? index.html root@runoob:~/svn/runoob01/branches/my_branch# svn add index.html A index.html root@runoob:~/svn/runoob01/branches/my_branch# svn commit -m "add index.html" Adding index.html Transmitting file data . Committed revision 10. 切換到 trunk,執行 svn update,然后將 my_branch 分支合并到 trunk 中。 root@runoob:~/svn/runoob01/trunk# svn merge ../branches/my_branch/ --- Merging r10 into '.': A index.html --- Recording mergeinfo for merge of r10 into '.':G . 此時查看目錄,可以看到 trunk 中已經多了 my_branch 分支創建的 index.html 文件。root@runoob:~/svn/runoob01/trunk# ll total 16 drwxr-xr-x 2 root root 4096 Nov 7 03:52 ./ drwxr-xr-x 6 root root 4096 Jul 21 19:19 ../ -rw-r--r-- 1 root root 36 Nov 7 02:23 HelloWorld.html -rw-r--r-- 1 root root 0 Nov 7 03:52 index.html -rw-r--r-- 1 root root 22 Nov 7 03:06 readme 將合并好的 trunk 提交到版本庫中。root@runoob:~/svn/runoob01/trunk# svn commit -m "add index.html" Adding index.html Transmitting file data . Committed revision 11.十二 、 標簽
版本管理系統支持 tag 選項,通過使用 tag 的概念,我們可以給某一個具體版本的代碼一個更加有意義的名字。Tags 即標簽主要用于項目開發中的里程碑,比如開發到一定階段可以單獨一個版本作為發布等,它往往代表一個可以固定的完整的版本,這跟 VSS 中的 Tag 大致相同。我們在本地工作副本創建一個 tag。root@runoob:~/svn/runoob01# svn copy trunk/ tags/v1.0 A tags/v1.0 上面的代碼成功完成,新的目錄將會被創建在 tags 目錄下。root@runoob:~/svn/runoob01# ls tags/ v1.0 root@runoob:~/svn/runoob01# ls tags/v1.0/ HelloWorld.html readme 查看狀態。root@runoob:~/svn/runoob01# svn status A + tags/v1.0 提交tag內容。root@runoob:~/svn/runoob01# svn commit -m "tags v1.0" Adding tags/v1.0 Transmitting file data .. Committed revision 14.總結
以上是生活随笔為你收集整理的SVN基本的理解和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Redis 实现消息队列
- 下一篇: POI的常规使用