<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 7113字,需瀏覽 15分鐘

           ·

          2021-07-17 08:42

          最近在公司又開(kāi)始玩SVN啦,這里給大家總結(jié)一下,基本上在公司不是用git就是用SVN進(jìn)行代碼管理,作為程序員,這些工具的使用還是需要熟悉了解一下的,本期孫叫獸給大家分享一下SVN相關(guān)的知識(shí)點(diǎn),做到會(huì)用即可。不懂得可以查查相關(guān)文檔。
          SVN 官網(wǎng):https://subversion.apache.org/
          Github SVN 源碼:https://github.com/apache/subversion
          簡(jiǎn)介
          Subversion(SVN) 是一個(gè)開(kāi)源的版本控制系統(tǒng), 也就是說(shuō) Subversion 管理著隨時(shí)間改變的數(shù)據(jù)。這些數(shù)據(jù)放置在一個(gè)中央資料檔案庫(kù)(repository) 中。這個(gè)檔案庫(kù)很像一個(gè)普通的文件服務(wù)器, 不過(guò)它會(huì)記住每一次文件的變動(dòng)。這樣你就可以把檔案恢復(fù)到舊的版本, 或是瀏覽文件的變動(dòng)歷史。
          主要功能
          • (1)目錄版本控制
            CVS 只能跟蹤單個(gè)文件的歷史, 不過(guò) Subversion 實(shí)作了一個(gè) "虛擬" 的版本控管文件系統(tǒng), 能夠依時(shí)間跟蹤整個(gè)目錄的變動(dòng)。目錄和文件都能進(jìn)行版本控制。
          • (2)真實(shí)的版本歷史
            自從CVS限制了文件的版本記錄,CVS并不支持那些可能發(fā)生在文件上,但會(huì)影響所在目錄內(nèi)容的操作,如同復(fù)制和重命名。除此之外,在CVS里你不能用擁有同樣名字但是沒(méi)有繼承老版本歷史或者根本沒(méi)有關(guān)系的文件替換一個(gè)已經(jīng)納入系統(tǒng)的文件。在Subversion中,你可以增加(add)、刪除(delete)、復(fù)制(copy)和重命名(rename),無(wú)論是文件還是目錄。所有的新加的文件都從一個(gè)新的、干凈的版本開(kāi)始。
          • (3)自動(dòng)提交
            一個(gè)提交動(dòng)作,不是全部更新到了檔案庫(kù)中,就是不完全更新。這允許開(kāi)發(fā)人員以邏輯區(qū)間建立并提交變動(dòng),以防止當(dāng)部分提交成功時(shí)出現(xiàn)的問(wèn)題。
          • (4)納入版本控管的元數(shù)據(jù)
            每一個(gè)文件與目錄都附有一組屬性關(guān)鍵字并和屬性值相關(guān)聯(lián)。你可以創(chuàng)建, 并儲(chǔ)存任何你想要的Key/Value對(duì)。屬性是隨著時(shí)間來(lái)作版本控管的,就像文件容一樣。
          • (5)選擇不同的網(wǎng)絡(luò)層
            Subversion 有抽象的檔案庫(kù)存取概念, 可以讓人很容易地實(shí)現(xiàn)新的網(wǎng)絡(luò)機(jī)制。Subversion 可以作為一個(gè)擴(kuò)展模塊嵌入到Apache HTTP 服務(wù)器中。這個(gè)為Subversion提供了非常先進(jìn)的穩(wěn)定性和協(xié)同工作能力,除此之外還提供了許多重要功能: 舉例來(lái)說(shuō), 有身份認(rèn)證, 授權(quán), 在線壓縮, 以及文件庫(kù)瀏覽等等。還有一個(gè)輕量級(jí)的獨(dú)立Subversion服務(wù)器, 使用的是自定義的通信協(xié)議, 可以很容易地通過(guò) ssh 以 tunnel 方式使用。
          • (6)一致的數(shù)據(jù)處理方式
            Subversion 使用二進(jìn)制差異算法來(lái)表示文件的差異, 它對(duì)文字(人類可理解的)與二進(jìn)制文件(人類無(wú)法理解的) 兩類的文件都一視同仁。這兩類的文件都同樣地以壓縮形式儲(chǔ)存在檔案庫(kù)中, 而且文件差異是以兩個(gè)方向在網(wǎng)絡(luò)上傳輸?shù)摹?/span>
          • (7)有效的分支(branch)與標(biāo)簽(tag)
            在分支與標(biāo)簽上的消耗并不必一定要與項(xiàng)目大小成正比。Subversion 建立分支與標(biāo)簽的方法, 就只是復(fù)制該項(xiàng)目, 使用的方法就類似于硬連接(hard-link)。所以這些操作只會(huì)花費(fèi)很小, 而且是固定的時(shí)間。
          • (8)Hackability
            Subversion沒(méi)有任何的歷史包袱; 它主要是一群共用的 C 程序庫(kù), 具有定義完善的API。這使得 Subversion 便于維護(hù), 并且可被其它應(yīng)用程序與程序語(yǔ)言使用。
          基本概念
          • repository(源代碼庫(kù)):源代碼統(tǒng)一存放的地方
          • Checkout(提?。?當(dāng)你手上沒(méi)有源代碼的時(shí)候,你需要從repository checkout一份
          • Commit(提交):當(dāng)你已經(jīng)修改了代碼,你就需要Commit到repository
          • Update (更新):當(dāng)你已經(jīng)Checkout了一份源代碼, Update一下你就可以和Repository上的源代碼同步,你手上的代碼就會(huì)有最新的變更
          日常開(kāi)發(fā)過(guò)程其實(shí)就是這樣的(假設(shè)你已經(jīng)Checkout并且已經(jīng)工作了幾天):Update(獲得最新的代碼) -->作出自己的修改并調(diào)試成功 --> Commit(大家就可以看到你的修改了) 。
          如果兩個(gè)程序員同時(shí)修改了同一個(gè)文件呢, SVN 可以合并這兩個(gè)程序員的改動(dòng),實(shí)際上SVN管理源代碼是以行為單位的,就是說(shuō)兩個(gè)程序員只要不是修改了同一行程序,SVN都會(huì)自動(dòng)合并兩種修改。如果是同一行,SVN 會(huì)提示文件 Conflict, 沖突,需要手動(dòng)確認(rèn)。

          SVN 安裝

          下載地址:
          https://sourceforge.net/projects/win32svn/
          無(wú)腦安裝即可,安裝成功后在桌面右擊會(huì)有SVN相關(guān)checkout選項(xiàng)。

          生命周期

          創(chuàng)建版本庫(kù)

          版本庫(kù)相當(dāng)于一個(gè)集中的空間,用于存放開(kāi)發(fā)者所有的工作成果。版本庫(kù)不僅能存放文件,還包括了每次修改的歷史,即每個(gè)文件的變動(dòng)歷史。
          Create 操作是用來(lái)創(chuàng)建一個(gè)新的版本庫(kù)。大多數(shù)情況下這個(gè)操作只會(huì)執(zhí)行一次。當(dāng)你創(chuàng)建一個(gè)新的版本庫(kù)的時(shí)候,你的版本控制系統(tǒng)會(huì)讓你提供一些信息來(lái)標(biāo)識(shí)版本庫(kù),例如創(chuàng)建的位置和版本庫(kù)的名字。

          檢出

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

          更新

          顧名思義,update 操作是用來(lái)更新版本庫(kù)的。這個(gè)操作將工作副本與版本庫(kù)進(jìn)行同步。由于版本庫(kù)是由整個(gè)團(tuán)隊(duì)共用的,當(dāng)其他人提交了他們的改動(dòng)之后,你的工作副本就會(huì)過(guò)期。
          讓我們假設(shè) Tom 和 Jerry 是一個(gè)項(xiàng)目的兩個(gè)開(kāi)發(fā)者。他們同時(shí)從版本庫(kù)中檢出了最新的版本并開(kāi)始工作。此時(shí),工作副本是與版本庫(kù)完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本庫(kù)中。
          此時(shí) Tom 的工作副本就過(guò)期了。更新操作將會(huì)從版本庫(kù)中拉取 Jerry 的最新改動(dòng)并將 Tom 的工作副本進(jìn)行更新。

          執(zhí)行變更

          當(dāng)檢出之后,你就可以做很多操作來(lái)執(zhí)行變更。編輯是最常用的操作。你可以編輯已存在的文件,例如進(jìn)行文件的添加/刪除操作。
          你可以添加文件/目錄。但是這些添加的文件目錄不會(huì)立刻成為版本庫(kù)的一部分,而是被添加進(jìn)待變更列表中,直到執(zhí)行了 commit 操作后才會(huì)成為版本庫(kù)的一部分。
          同樣地你可以刪除文件/目錄。刪除操作立刻將文件從工作副本中刪除掉,但該文件的實(shí)際刪除只是被添加到了待變更列表中,直到執(zhí)行了 commit 操作后才會(huì)真正刪除。
          Rename 操作可以更改文件/目錄的名字。"移動(dòng)"操作用來(lái)將文件/目錄從一處移動(dòng)到版本庫(kù)中的另一處。

          復(fù)查變化

          當(dāng)你檢出工作副本或者更新工作副本后,你的工作副本就跟版本庫(kù)完全同步了。但是當(dāng)你對(duì)工作副本進(jìn)行一些修改之后,你的工作副本會(huì)比版本庫(kù)要新。在 commit 操作之前復(fù)查下你的修改是一個(gè)很好的習(xí)慣。
          Status 操作列出了工作副本中所進(jìn)行的變動(dòng)。正如我們之前提到的,你對(duì)工作副本的任何改動(dòng)都會(huì)成為待變更列表的一部分。Status 操作就是用來(lái)查看這個(gè)待變更列表。
          Status 操作只是提供了一個(gè)變動(dòng)列表,但并不提供變動(dòng)的詳細(xì)信息。你可以用 diff 操作來(lái)查看這些變動(dòng)的詳細(xì)信息。

          修復(fù)錯(cuò)誤

          我們來(lái)假設(shè)你對(duì)工作副本做了許多修改,但是現(xiàn)在你不想要這些修改了,這時(shí)候 revert 操作將會(huì)幫助你。
          Revert 操作重置了對(duì)工作副本的修改。它可以重置一個(gè)或多個(gè)文件/目錄。當(dāng)然它也可以重置整個(gè)工作副本。在這種情況下,revert 操作將會(huì)銷毀待變更列表并將工作副本恢復(fù)到原始狀態(tài)。

          解決沖突

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

          提交更改

          Commit 操作是用來(lái)將更改從工作副本到版本庫(kù)。這個(gè)操作會(huì)修改版本庫(kù)的內(nèi)容,其它開(kāi)發(fā)者可以通過(guò)更新他們的工作副本來(lái)查看這些修改。
          在提交之前,你必須將文件/目錄添加到待變更列表中。列表中記錄了將會(huì)被提交的改動(dòng)。當(dāng)提交的時(shí)候,我們通常會(huì)提供一個(gè)注釋來(lái)說(shuō)明為什么會(huì)進(jìn)行這些改動(dòng)。這個(gè)注釋也會(huì)成為版本庫(kù)歷史記錄的一部分。Commit 是一個(gè)原子操作,也就是說(shuō)要么完全提交成功,要么失敗回滾。用戶不會(huì)看到成功提交一半的情況。

          SVN 創(chuàng)建版本庫(kù)

          進(jìn)入 /opt/svn/sunjiaoshou01/conf 目錄,修改默認(rèn)配置文件配置,包括 svnserve.conf、passwd、authz 配置相關(guān)用戶和權(quán)限。
          1、svn 服務(wù)配置文件 svnserve.conf
          svn 服務(wù)配置文件為版本庫(kù)目錄中的文件 conf/svnserve.conf。該文件僅由一個(gè) [general] 配置段組成。
          [general]
          anon
          -access = none
          auth
          -access = write
          password
          -db =/home/svn/passwd
          authz
          -db =/home/svn/authz
          realm
          = tiku
          • anon-access: 控制非鑒權(quán)用戶訪問(wèn)版本庫(kù)的權(quán)限,取值范圍為 "write"、"read" 和 "none"。即 "write" 為可讀可寫(xiě),"read" 為只讀,"none" 表示無(wú)訪問(wèn)權(quán)限,默認(rèn)值:read。
          • auth-access: 控制鑒權(quán)用戶訪問(wèn)版本庫(kù)的權(quán)限。取值范圍為 "write"、"read" 和 "none"。即"write"為可讀可寫(xiě),"read"為只讀,"none"表示無(wú)訪問(wèn)權(quán)限,默認(rèn)值:write。
          • authz-db: 指定權(quán)限配置文件名,通過(guò)該文件可以實(shí)現(xiàn)以路徑為基礎(chǔ)的訪問(wèn)控制。除非指定絕對(duì)路徑,否則文件位置為相對(duì)conf目錄的相對(duì)路徑,默認(rèn)值:authz。
          • realm: 指定版本庫(kù)的認(rèn)證域,即在登錄時(shí)提示的認(rèn)證域名稱。若兩個(gè)版本庫(kù)的認(rèn)證域相同,建議使用相同的用戶名口令數(shù)據(jù)文件。默認(rèn)值:一個(gè)UUID(Universal Unique IDentifier,全局唯一標(biāo)示)。
          2、用戶名口令文件 passwd
          用戶名口令文件由 svnserve.conf 的配置項(xiàng) password-db 指定,默認(rèn)為 conf 目錄中的 passwd。該文件僅由一個(gè) [users] 配置段組成。
          [users] 配置段的配置行格式如下:
          [users]
          admin
          = admin
          thinker
          =123456
          3、權(quán)限配置文件
          權(quán)限配置文件由 svnserve.conf 的配置項(xiàng) authz-db 指定,默認(rèn)為 conf 目錄中的 authz。該配置文件由一個(gè) [groups] 配置段和若干個(gè)版本庫(kù)路徑權(quán)限段組成。
          [groups]配置段中配置行格式如下:
          [groups]
          g_admin
          = admin,thinker

          [admintools:/]@g_admin= rw
          *=[test:/home/thinker]
          thinker
          = rw
          *= r

          SVN 檢出操作

          我們創(chuàng)建了版本庫(kù)sunjiaoshou01,URL為svn://192.168.0.1/sunjiashou01,svn用戶user01有讀寫(xiě)權(quán)限。
          我們就可以通過(guò)這個(gè)URL在客戶端對(duì)版本庫(kù)進(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 兩個(gè)用戶都在版本號(hào)為 100 的時(shí)候,更新了 kingtuns.txt 這個(gè)文件,A 用戶在修改完成之后提交 kingtuns.txt 到服務(wù)器, 這個(gè)時(shí)候提交成功,這個(gè)時(shí)候 kingtuns.txt 文件的版本號(hào)已經(jīng)變成 101 了。同時(shí)B用戶在版本號(hào)為 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服務(wù)器時(shí),由于不是在當(dāng)前最新的 101 版本上作的修改,所以導(dǎo)致提交失敗。

          SVN 提交操作

          我們檢出了版本庫(kù)sunjiaoshou01,對(duì)應(yīng)的目錄放在
          /home/user01/sunjiaoshou01中,下面我們針對(duì)這個(gè)庫(kù)進(jìn)行版本控制。
          查看工作副本中的狀態(tài)
          root@sunjiaoshou:~/svn/sunjiaoshou01/trunk# svn status
          A readme

          此時(shí) readme的狀態(tài)為A,它意味著這個(gè)文件已經(jīng)被成功地添加到了版本控制中。
          為了把 readme 存儲(chǔ)到版本庫(kù)中,使用 commit -m 加上注釋信息來(lái)提交。
          如果你忽略了 -m 選項(xiàng), SVN會(huì)打開(kāi)一個(gè)可以輸入多行的文本編輯器來(lái)讓你輸入提交信息。
          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)我們想放棄對(duì)文件的修改,可以使用 SVN revert 命令。
          root@sunjiaoshou:~/svn/sunjiaoshou01/trunk# svn revert readme Reverted'readme'
          進(jìn)行 revert 操作之后,readme 文件恢復(fù)了原始的狀態(tài)。revert 操作不單單可以使單個(gè)文件恢復(fù)原狀, 而且可以使整個(gè)目錄恢復(fù)原狀。
          假如我們想恢復(fù)一個(gè)已經(jīng)提交的版本怎么辦。
          為了消除一個(gè)舊版本,我們必須撤銷舊版本里的所有更改然后提交一個(gè)新版本。這種操作叫做 reverse merge。
          首先,找到倉(cāng)庫(kù)的當(dāng)前版本,現(xiàn)在是版本 22,我們要撤銷回之前的版本,比如版本 21。
          svn merge -r 22:21 readme

          SVN 查看歷史信息

          通過(guò)svn命令可以根據(jù)時(shí)間或修訂號(hào)去除過(guò)去的版本,或者某一版本所做的具體的修改。以下四個(gè)命令可以用來(lái)查看svn 的歷史:
          • svn log: 用來(lái)展示svn 的版本作者、日期、路徑等等。
          • svn diff: 用來(lái)顯示特定修改的行級(jí)詳細(xì)信息。
          • svn cat: 取得在特定版本的某文件顯示在當(dāng)前屏幕。
          • svn list: 顯示一個(gè)目錄或某一版本存在的文件。

          SVN分支

          Branch 選項(xiàng)會(huì)給開(kāi)發(fā)者創(chuàng)建出另外一條線路。當(dāng)有人希望開(kāi)發(fā)進(jìn)程分開(kāi)成兩條不同的線路時(shí),這個(gè)選項(xiàng)會(huì)非常有用。
          比如項(xiàng)目 demo 下有兩個(gè)小組,svn 下有一個(gè) trunk 版。
          由于客戶需求突然變化,導(dǎo)致項(xiàng)目需要做較大改動(dòng),此時(shí)項(xiàng)目組決定由小組 1 繼續(xù)完成原來(lái)正進(jìn)行到一半的工作(某個(gè)模塊),小組 2 進(jìn)行新需求的開(kāi)發(fā)。
          那么此時(shí),我們就可以為小組2建立一個(gè)分支,分支其實(shí)就是 trunk 版(主干線)的一個(gè)copy版,不過(guò)分支也是具有版本控制功能的,而且是和主干線相互獨(dú)立的,當(dāng)然,到最后我們可以通過(guò)(合并)功能,將分支合并到 trunk 上來(lái),從而最后合并為一個(gè)項(xiàng)目。

          SVN 標(biāo)簽(tag)

          版本管理系統(tǒng)支持 tag 選項(xiàng),通過(guò)使用 tag 的概念,我們可以給某一個(gè)具體版本的代碼一個(gè)更加有意義的名字。
          Tags 即標(biāo)簽主要用于項(xiàng)目開(kāi)發(fā)中的里程碑,比如開(kāi)發(fā)到一定階段可以單獨(dú)一個(gè)版本作為發(fā)布等,它往往代表一個(gè)可以固定的完整的版本,這跟 VSS 中的 Tag 大致相同。
          這種基本操作比較簡(jiǎn)單,和git這種思維基本一致的代碼指令操作,如果熟練使用git的話,這個(gè)過(guò)一遍知識(shí)點(diǎn)即可,使用SVN一般不用命令就用可視化工具好點(diǎn)!
          好啦,本期SVN內(nèi)容孫叫獸就分享到這里,我們下期見(jiàn)!
          瀏覽 76
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品手机在线 | 天天爽爽夜夜爽爽 | 国产A片网址 | 激情综合激情网 | 天天狠天天干 |