史上最全SVN使用總結(jié),建議先收藏后觀看(SVN使用

      網(wǎng)友投稿 1082 2025-04-01

      最近在公司又開始玩SVN啦,這里給大家總結(jié)一下,基本上在公司不是用git就是用SVN進(jìn)行代碼管理,作為程序員,這些工具的使用還是需要熟悉了解一下的,本期孫叫獸給大家分享一下SVN相關(guān)的知識點,做到會用即可。不懂得可以查查相關(guān)文檔。


      SVN 官網(wǎng):https://subversion.apache.org/

      Github SVN 源碼:https://github.com/apache/subversion

      簡介

      Subversion(SVN) 是一個開源的版本控制系統(tǒng), 也就是說 Subversion 管理著隨時間改變的數(shù)據(jù)。這些數(shù)據(jù)放置在一個中央資料檔案庫(repository) 中。這個檔案庫很像一個普通的文件服務(wù)器, 不過它會記住每一次文件的變動。這樣你就可以把檔案恢復(fù)到舊的版本, 或是瀏覽文件的變動歷史。

      主要功能

      (1)目錄版本控制

      CVS 只能跟蹤單個文件的歷史, 不過 Subversion 實作了一個 "虛擬" 的版本控管文件系統(tǒng), 能夠依時間跟蹤整個目錄的變動。目錄和文件都能進(jìn)行版本控制。

      (2)真實的版本歷史

      自從CVS限制了文件的版本記錄,CVS并不支持那些可能發(fā)生在文件上,但會影響所在目錄內(nèi)容的操作,如同復(fù)制和重命名。除此之外,在CVS里你不能用擁有同樣名字但是沒有繼承老版本歷史或者根本沒有關(guān)系的文件替換一個已經(jīng)納入系統(tǒng)的文件。在Subversion中,你可以增加(add)、刪除(delete)、復(fù)制(copy)和重命名(rename),無論是文件還是目錄。所有的新加的文件都從一個新的、干凈的版本開始。

      (3)自動提交

      一個提交動作,不是全部更新到了檔案庫中,就是不完全更新。這允許開發(fā)人員以邏輯區(qū)間建立并提交變動,以防止當(dāng)部分提交成功時出現(xiàn)的問題。

      (4)納入版本控管的元數(shù)據(jù)

      每一個文件與目錄都附有一組屬性關(guān)鍵字并和屬性值相關(guān)聯(lián)。你可以創(chuàng)建, 并儲存任何你想要的Key/Value對。屬性是隨著時間來作版本控管的,就像文件容一樣。

      (5)選擇不同的網(wǎng)絡(luò)層

      Subversion 有抽象的檔案庫存取概念, 可以讓人很容易地實現(xiàn)新的網(wǎng)絡(luò)機(jī)制。Subversion 可以作為一個擴(kuò)展模塊嵌入到Apache HTTP 服務(wù)器中。這個為Subversion提供了非常先進(jìn)的穩(wěn)定性和協(xié)同工作能力,除此之外還提供了許多重要功能: 舉例來說, 有身份認(rèn)證, 授權(quán), 在線壓縮, 以及文件庫瀏覽等等。還有一個輕量級的獨立Subversion服務(wù)器, 使用的是自定義的通信協(xié)議, 可以很容易地通過 ssh 以 tunnel 方式使用。

      (6)一致的數(shù)據(jù)處理方式

      Subversion 使用二進(jìn)制差異算法來表示文件的差異, 它對文字(人類可理解的)與二進(jìn)制文件(人類無法理解的) 兩類的文件都一視同仁。這兩類的文件都同樣地以壓縮形式儲存在檔案庫中, 而且文件差異是以兩個方向在網(wǎng)絡(luò)上傳輸?shù)摹?/p>

      (7)有效的分支(branch)與標(biāo)簽(tag)

      在分支與標(biāo)簽上的消耗并不必一定要與項目大小成正比。Subversion 建立分支與標(biāo)簽的方法, 就只是復(fù)制該項目, 使用的方法就類似于硬連接(hard-link)。所以這些操作只會花費很小, 而且是固定的時間。

      (8)Hackability

      Subversion沒有任何的歷史包袱; 它主要是一群共用的 C 程序庫, 具有定義完善的API。這使得 Subversion 便于維護(hù), 并且可被其它應(yīng)用程序與程序語言使用。

      基本概念

      repository(源代碼庫):源代碼統(tǒng)一存放的地方

      Checkout(提取):當(dāng)你手上沒有源代碼的時候,你需要從repository checkout一份

      Commit(提交):當(dāng)你已經(jīng)修改了代碼,你就需要Commit到repository

      Update (更新):當(dāng)你已經(jīng)Checkout了一份源代碼, Update一下你就可以和Repository上的源代碼同步,你手上的代碼就會有最新的變更

      日常開發(fā)過程其實就是這樣的(假設(shè)你已經(jīng)Checkout并且已經(jīng)工作了幾天):Update(獲得最新的代碼) -->作出自己的修改并調(diào)試成功 --> Commit(大家就可以看到你的修改了) 。

      如果兩個程序員同時修改了同一個文件呢, SVN 可以合并這兩個程序員的改動,實際上SVN管理源代碼是以行為單位的,就是說兩個程序員只要不是修改了同一行程序,SVN都會自動合并兩種修改。如果是同一行,SVN 會提示文件 Conflict, 沖突,需要手動確認(rèn)。

      史上最全SVN使用總結(jié),建議先收藏后觀看(SVN使用)

      SVN 安裝

      -:

      https://sourceforge.net/projects/win32svn/

      無腦安裝即可,安裝成功后在桌面右擊會有SVN相關(guān)checkout選項。

      生命周期

      創(chuàng)建版本庫

      版本庫相當(dāng)于一個集中的空間,用于存放開發(fā)者所有的工作成果。版本庫不僅能存放文件,還包括了每次修改的歷史,即每個文件的變動歷史。

      Create 操作是用來創(chuàng)建一個新的版本庫。大多數(shù)情況下這個操作只會執(zhí)行一次。當(dāng)你創(chuàng)建一個新的版本庫的時候,你的版本控制系統(tǒng)會讓你提供一些信息來標(biāo)識版本庫,例如創(chuàng)建的位置和版本庫的名字。

      檢出

      Checkout 操作是用來從版本庫創(chuàng)建一個工作副本。工作副本是開發(fā)者私人的工作空間,可以進(jìn)行內(nèi)容的修改,然后提交到版本庫中。

      更新

      顧名思義,update 操作是用來更新版本庫的。這個操作將工作副本與版本庫進(jìn)行同步。由于版本庫是由整個團(tuán)隊共用的,當(dāng)其他人提交了他們的改動之后,你的工作副本就會過期。

      讓我們假設(shè) Tom 和 Jerry 是一個項目的兩個開發(fā)者。他們同時從版本庫中檢出了最新的版本并開始工作。此時,工作副本是與版本庫完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本庫中。

      此時 Tom 的工作副本就過期了。更新操作將會從版本庫中拉取 Jerry 的最新改動并將 Tom 的工作副本進(jìn)行更新。

      執(zhí)行變更

      當(dāng)檢出之后,你就可以做很多操作來執(zhí)行變更。編輯是最常用的操作。你可以編輯已存在的文件,例如進(jìn)行文件的添加/刪除操作。

      你可以添加文件/目錄。但是這些添加的文件目錄不會立刻成為版本庫的一部分,而是被添加進(jìn)待變更列表中,直到執(zhí)行了 commit 操作后才會成為版本庫的一部分。

      同樣地你可以刪除文件/目錄。刪除操作立刻將文件從工作副本中刪除掉,但該文件的實際刪除只是被添加到了待變更列表中,直到執(zhí)行了 commit 操作后才會真正刪除。

      Rename 操作可以更改文件/目錄的名字。"移動"操作用來將文件/目錄從一處移動到版本庫中的另一處。

      復(fù)查變化

      當(dāng)你檢出工作副本或者更新工作副本后,你的工作副本就跟版本庫完全同步了。但是當(dāng)你對工作副本進(jìn)行一些修改之后,你的工作副本會比版本庫要新。在 commit 操作之前復(fù)查下你的修改是一個很好的習(xí)慣。

      Status 操作列出了工作副本中所進(jìn)行的變動。正如我們之前提到的,你對工作副本的任何改動都會成為待變更列表的一部分。Status 操作就是用來查看這個待變更列表。

      Status 操作只是提供了一個變動列表,但并不提供變動的詳細(xì)信息。你可以用 diff 操作來查看這些變動的詳細(xì)信息。

      修復(fù)錯誤

      我們來假設(shè)你對工作副本做了許多修改,但是現(xiàn)在你不想要這些修改了,這時候 revert 操作將會幫助你。

      Revert 操作重置了對工作副本的修改。它可以重置一個或多個文件/目錄。當(dāng)然它也可以重置整個工作副本。在這種情況下,revert 操作將會銷毀待變更列表并將工作副本恢復(fù)到原始狀態(tài)。

      解決沖突

      合并的時候可能會發(fā)生沖突。Merge 操作會自動處理可以安全合并的東西。其它的會被當(dāng)做沖突。例如,"hello.c" 文件在一個分支上被修改,在另一個分支上被刪除了。這種情況就需要人為處理。Resolve 操作就是用來幫助用戶找出沖突并告訴版本庫如何處理這些沖突。

      提交更改

      Commit 操作是用來將更改從工作副本到版本庫。這個操作會修改版本庫的內(nèi)容,其它開發(fā)者可以通過更新他們的工作副本來查看這些修改。

      在提交之前,你必須將文件/目錄添加到待變更列表中。列表中記錄了將會被提交的改動。當(dāng)提交的時候,我們通常會提供一個注釋來說明為什么會進(jìn)行這些改動。這個注釋也會成為版本庫歷史記錄的一部分。Commit 是一個原子操作,也就是說要么完全提交成功,要么失敗回滾。用戶不會看到成功提交一半的情況。

      SVN 創(chuàng)建版本庫

      進(jìn)入 /opt/svn/sunjiaoshou01/conf 目錄,修改默認(rèn)配置文件配置,包括 svnserve.conf、passwd、authz 配置相關(guān)用戶和權(quán)限。

      1、svn 服務(wù)配置文件 svnserve.conf

      svn 服務(wù)配置文件為版本庫目錄中的文件 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:?控制非鑒權(quán)用戶訪問版本庫的權(quán)限,取值范圍為 "write"、"read" 和 "none"。即 "write" 為可讀可寫,"read" 為只讀,"none" 表示無訪問權(quán)限,默認(rèn)值:read。

      auth-access:?控制鑒權(quán)用戶訪問版本庫的權(quán)限。取值范圍為 "write"、"read" 和 "none"。即"write"為可讀可寫,"read"為只讀,"none"表示無訪問權(quán)限,默認(rèn)值:write。

      authz-db:?指定權(quán)限配置文件名,通過該文件可以實現(xiàn)以路徑為基礎(chǔ)的訪問控制。除非指定絕對路徑,否則文件位置為相對conf目錄的相對路徑,默認(rèn)值:authz。

      realm:?指定版本庫的認(rèn)證域,即在登錄時提示的認(rèn)證域名稱。若兩個版本庫的認(rèn)證域相同,建議使用相同的用戶名口令數(shù)據(jù)文件。默認(rèn)值:一個UUID(Universal Unique IDentifier,全局唯一標(biāo)示)。

      2、用戶名口令文件 passwd

      用戶名口令文件由 svnserve.conf 的配置項 password-db 指定,默認(rèn)為 conf 目錄中的 passwd。該文件僅由一個 [users] 配置段組成。

      [users] 配置段的配置行格式如下:

      [users]

      admin = admin

      thinker =123456

      3、權(quán)限配置文件

      權(quán)限配置文件由 svnserve.conf 的配置項 authz-db 指定,默認(rèn)為 conf 目錄中的 authz。該配置文件由一個 [groups] 配置段和若干個版本庫路徑權(quán)限段組成。

      [groups]配置段中配置行格式如下:

      [groups]

      g_admin = admin,thinker

      [admintools:/]@g_admin= rw

      *=[test:/home/thinker]

      thinker = rw

      *= r

      SVN 檢出操作

      我們創(chuàng)建了版本庫sunjiaoshou01,URL為svn://192.168.0.1/sunjiashou01,svn用戶user01有讀寫權(quán)限。

      我們就可以通過這個URL在客戶端對版本庫進(jìn)行檢出操作。

      svn checkout http://svn.server.com/svn/project_repo --username=user01 以上命令將產(chǎn)生如下結(jié)果:

      root@sunjiaoshou:~/svn# svn checkout svn://192.168.0.1/sunjiaoshou01--username=user01

      A sunjiaoshou01/trunk

      A sunjiaoshou01/branches

      A sunjiaohsou01/tags

      Checkedout revision 1.

      檢出成功后在當(dāng)前目錄下生成sunjiaoshou01副本目錄。查看檢出的內(nèi)容

      root@sunjiaoshou:~/svn# ll sunjiaoshou01/

      total 24

      drwxr-xr-x 6 root root 4096Jul2119:19./

      drwxr-xr-x 3 root root 4096Jul2119:10../

      drwxr-xr-x 2 root root 4096Jul2119:19 branches/

      drwxr-xr-x 4 root root 4096Jul2119:19.svn/

      drwxr-xr-x 2 root root 4096Jul2119:19 tags/

      drwxr-xr-x 2 root root 4096Jul2119:19 trunk/

      SVN 解決沖突

      版本沖突原因:

      假設(shè) A、B 兩個用戶都在版本號為 100 的時候,更新了 kingtuns.txt 這個文件,A 用戶在修改完成之后提交 kingtuns.txt 到服務(wù)器, 這個時候提交成功,這個時候 kingtuns.txt 文件的版本號已經(jīng)變成 101 了。同時B用戶在版本號為 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服務(wù)器時,由于不是在當(dāng)前最新的 101 版本上作的修改,所以導(dǎo)致提交失敗。

      SVN 提交操作

      我們檢出了版本庫sunjiaoshou01,對應(yīng)的目錄放在

      /home/user01/sunjiaoshou01中,下面我們針對這個庫進(jìn)行版本控制。

      查看工作副本中的狀態(tài)

      root@sunjiaoshou:~/svn/sunjiaoshou01/trunk# svn status

      A readme

      此時 readme的狀態(tài)為A,它意味著這個文件已經(jīng)被成功地添加到了版本控制中。

      為了把 readme 存儲到版本庫中,使用 commit -m 加上注釋信息來提交。

      如果你忽略了 -m 選項, SVN會打開一個可以輸入多行的文本編輯器來讓你輸入提交信息。

      root@sunjiaoshou:~/svn/sunjiaoshou01/trunk# svn commit -m "SVN readme."Adding readme

      Transmitting file data .Committed revision 8.

      svn commit -m "SVN readme."

      SVN 版本回退

      當(dāng)我們想放棄對文件的修改,可以使用?SVN revert?命令。

      root@sunjiaoshou:~/svn/sunjiaoshou01/trunk# svn revert readme Reverted'readme'

      進(jìn)行 revert 操作之后,readme 文件恢復(fù)了原始的狀態(tài)。revert 操作不單單可以使單個文件恢復(fù)原狀, 而且可以使整個目錄恢復(fù)原狀。

      假如我們想恢復(fù)一個已經(jīng)提交的版本怎么辦。

      為了消除一個舊版本,我們必須撤銷舊版本里的所有更改然后提交一個新版本。這種操作叫做 reverse merge。

      首先,找到倉庫的當(dāng)前版本,現(xiàn)在是版本 22,我們要撤銷回之前的版本,比如版本 21。

      svn merge -r 22:21 readme

      SVN 查看歷史信息

      通過svn命令可以根據(jù)時間或修訂號去除過去的版本,或者某一版本所做的具體的修改。以下四個命令可以用來查看svn 的歷史:

      svn diff:?用來顯示特定修改的行級詳細(xì)信息。

      svn cat:?取得在特定版本的某文件顯示在當(dāng)前屏幕。

      svn list:?顯示一個目錄或某一版本存在的文件。

      SVN分支

      Branch 選項會給開發(fā)者創(chuàng)建出另外一條線路。當(dāng)有人希望開發(fā)進(jìn)程分開成兩條不同的線路時,這個選項會非常有用。

      比如項目 demo 下有兩個小組,svn 下有一個 trunk 版。

      由于客戶需求突然變化,導(dǎo)致項目需要做較大改動,此時項目組決定由小組 1 繼續(xù)完成原來正進(jìn)行到一半的工作(某個模塊),小組 2 進(jìn)行新需求的開發(fā)。

      那么此時,我們就可以為小組2建立一個分支,分支其實就是 trunk 版(主干線)的一個copy版,不過分支也是具有版本控制功能的,而且是和主干線相互獨立的,當(dāng)然,到最后我們可以通過(合并)功能,將分支合并到 trunk 上來,從而最后合并為一個項目。

      SVN 標(biāo)簽(tag)

      版本管理系統(tǒng)支持 tag 選項,通過使用 tag 的概念,我們可以給某一個具體版本的代碼一個更加有意義的名字。

      Tags 即標(biāo)簽主要用于項目開發(fā)中的里程碑,比如開發(fā)到一定階段可以單獨一個版本作為發(fā)布等,它往往代表一個可以固定的完整的版本,這跟 VSS 中的 Tag 大致相同。

      這種基本操作比較簡單,和git這種思維基本一致的代碼指令操作,如果熟練使用git的話,這個過一遍知識點即可,使用SVN一般不用命令就用可視化工具好點!

      好啦,本期SVN內(nèi)容孫叫獸就分享到這里,我們下期見!

      SVN 開發(fā)者

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel有隱藏行時進(jìn)行復(fù)制的操作流程
      下一篇:Linux上安裝Redis
      相關(guān)文章
      亚洲国产一区二区a毛片| 18禁亚洲深夜福利人口| 久久亚洲国产精品123区| 日韩欧美亚洲中文乱码| 亚洲一卡2卡三卡4卡无卡下载| 中文字幕亚洲男人的天堂网络| 亚洲1区1区3区4区产品乱码芒果| 亚洲网站在线观看| 久久亚洲中文字幕精品有坂深雪| 亚洲AV美女一区二区三区| 久久久久亚洲av无码尤物| 久久久久亚洲av无码尤物| 久久精品国产亚洲夜色AV网站| 在线观看亚洲精品国产| 国产偷国产偷亚洲清高动态图 | 国产成人精品日本亚洲专区| 亚洲男女内射在线播放| 亚洲性日韩精品一区二区三区 | 国产成人精品久久亚洲| 中文字幕第13亚洲另类| 国产亚洲AV夜间福利香蕉149| 亚洲国产另类久久久精品| 亚洲AV福利天堂一区二区三| 91亚洲导航深夜福利| 亚洲高清美女一区二区三区| 亚洲人成7777影视在线观看| 在线观看亚洲AV日韩A∨| 亚洲AV无码成人精品区日韩 | 色天使色婷婷在线影院亚洲| 亚洲精品色婷婷在线影院| 亚洲一级特黄无码片| 久久久久久久综合日本亚洲 | 亚洲a一级免费视频| 亚洲精品国产手机| 久久精品国产亚洲av麻豆图片| 亚洲日本VA中文字幕久久道具| 麻豆亚洲AV成人无码久久精品 | 亚洲一卡一卡二新区无人区| 国产成人不卡亚洲精品91| 国产亚洲精品成人a v小说| 亚洲国产精品无码久久久不卡 |