簡明 SVN 教程

      網友投稿 708 2025-03-31

      轉載


      原文地址:https://zhuanlan.zhihu.com/p/45305208

      最近新入職的公司團隊,有用到 SVN 進行版本控制,所以對 SVN 進行了詳細的學習與了解。

      關于版本控制

      版本控制是一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。

      本地版本控制系統

      許多人習慣用復制整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區別。 這么做唯一的好處就是簡單,但是特別容易犯錯。 有時候會混淆所在的工作目錄,一不小心會寫錯文件或者覆蓋意想外的文件。

      為了解決這個問題,人們很久以前就開發了許多種本地版本控制系統,大多都是采用某種簡單的數據庫來記錄文件的歷次更新差異。

      集中化的版本控制系統

      接下來人們又遇到一個問題,如何讓在不同系統上的開發者協同工作? 于是,集中化的版本控制系統(Centralized Version Control Systems,簡稱 CVCS)應運而生。 這類系統,諸如 CVS、Subversion 以及 Perforce 等,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。 多年以來,這已成為版本控制系統的標準做法。

      這種做法帶來了許多好處,特別是相較于老式的本地 VCS 來說。 現在,每個人都可以在一定程度上看到項目中的其他人正在做些什么。 而管理員也可以輕松掌控每個開發者的權限,并且管理一個 CVCS 要遠比在各個客戶端上維護本地數據庫來得輕松容易。

      事分兩面,有好有壞。 這么做最顯而易見的缺點是中央服務器的單點故障。 如果宕機一小時,那么在這一小時內,誰都無法提交更新,也就無法協同工作。 如果中心數據庫所在的磁盤發生損壞,又沒有做恰當備份,毫無疑問你將丟失所有數據——包括項目的整個變更歷史,只剩下人們在各自機器上保留的單獨快照。 本地版本控制系統也存在類似問題,只要整個項目的歷史記錄被保存在單一位置,就有丟失所有歷史更新記錄的風險。

      分布式版本控制系統

      基于上面的問題,出現了分布式版本控制系統(Distributed Version Control System,簡稱 DVCS)。 在這類系統中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客戶端并不只提取最新版本的文件快照,而是把代碼倉庫完整地鏡像下來。 這么一來,任何一處協同工作用的服務器發生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復。 因為每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。

      更進一步,許多這類系統都可以指定和若干不同的遠端代碼倉庫進行交互。籍此,你就可以在同一個項目中,分別和不同工作小組的人相互協作。 你可以根據需要設定不同的協作流程,比如層次模型式的工作流,而這在以前的集中式系統中是無法實現的。

      針對現狀優化

      基于簡單、使用場景有限、良好的權限管理或者其它原因采用了 SVN 進行版本控制,那么我們就需要想辦法彌補它的不足,針對單點故障的問題,就要對版本庫進行定時全量和增量的備份,以確保源碼的安全。

      關于 SVN

      Subversion(SVN) 是一個開源的集中化的版本控制系統,會記住每一次文件的變動,這樣你可以將文件恢復到舊的版本或者瀏覽文件的歷史變動。

      SVN 的一些概念

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

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

      commit(提交):當你已經修改了代碼,你就需要 commit 到 repository

      update(更新):當你已經 checkout 了一份源代碼,update 一下你就可以和 repository 上的源代碼同步,你手上的代碼就會有最新的變更

      SVN 生命周期

      建版本庫:create 操作創建一個新的版本庫,版本庫用于存放文件,包括了每次修改的歷史。

      檢出:checkout 操作從版本庫創建一個工作副本,作為開發者私人的工作空間,可以進行內容的修改,然后提交到版本庫中。

      更新:update 操作更新版本庫,將工作副本與版本庫進行同步。因為版本庫是整個團隊共用的,當其他人提交了改動,你的工作副本就會過期。

      執行變更:檢出之后,可以進行添加、編輯、刪除、重命名、移動文件/目錄等變更操作。當最終執行了 commit 操作后,就對版本庫進行了相應變更。

      復查變化:當你對工作副本進行了一些修改后,你的工作副本就會比版本庫新,在 commit 操作之前使用 status/diff 操作復查下你的修改是一個好的習慣。

      修復錯誤:如果你對工作副本做了許多修改,當時不想要這些修改了,revert 操作可以重置工作副本的修改,恢復到原始狀態。

      解決沖突:合并的時候可能發生沖突,使用 merge 操作進行合并。因為 SVN 合并是以行為單位的,只要不是修改的同一行,SVN 都會自動合并,如果是同一行,SVN 會提示沖突,需要手動進行確認修改,合并代碼。其中 resolve 操作可以幫助找出沖突。

      提交更改:將文件/目錄添加到待變更列表,使用 commit 操作將更改從工作副本更新到版本庫,提交是添加注釋說明,是個好的習慣。

      SVN 的一些優點

      原子提交,一次提交不管是單個還是多個文件,都是作為一個整體提交的。在這當中發生的意外例如傳輸中斷,不會引起數據庫的不完整和數據損壞。

      目錄與文件都能進行版本控制。

      重命名、復制、刪除文件等動作都保存在版本歷史記錄當中。

      SVN 安裝

      Windows

      一般的Windows 軟件安裝方法,-:Subversion

      CentOS

      大多數 GNU/Linux 發行版系統自帶了Subversion ,所以它很有可能已經安裝在你的系統上了。可以使用下面命令檢查是否安裝了。

      $ svn --version

      1

      如果沒有安裝可以使用命令安裝

      $ sudo yum install subversion

      1

      Ubuntu

      安裝命令

      $ sudo apt install subversion

      1

      SVN 服務器配置

      新建版本庫目錄

      $ mkdir /opt/svn

      1

      創建版本庫

      $ svnadmin create /opt/svn/zinaer

      1

      在目錄 /opt/svn/zinaer/conf 中有 svnserve.conf、passwd、authz 文件配置相關用戶和權限。

      服務配置文件 svnserve.conf

      [general] anon-access = none auth-access = write password-db = passwd authz-db = authz realm = zinaer

      1

      2

      3

      4

      5

      6

      說明:

      anon-access:控制非鑒權用戶訪問版本庫的權限。取值:write、read 和 none。缺省值:read。

      auth-access:控制鑒權用戶訪問版本庫的權限。取值:write、read 和 none。缺省值:write。

      authz-db:指定權限配置文件名。用于實現以路徑為基礎的訪問控制。如果不是絕對路徑,就是相對 conf 目錄的相對路徑。缺省值:authz。

      realm:指定版本庫的認證域,即在登錄時提示的認證域名稱。如果兩個版本庫的認證域相同,建議使用相同的用戶名口令數據文件。缺省值:一個 UUID(全局唯一標識)。

      用戶名口令文件 passwd

      由 svnserve.conf 的配置項 password-db 指定。格式:<用戶名> = <口令>

      [users] admin = admin zinaer = 123456

      1

      2

      3

      權限配置文件 authz

      由 svnserve.conf 的配置項 authz-db 指定。格式:<用戶組> = <用戶列表>、[<版本庫名>:<路徑>]

      [groups] g_admin = admin,zinaer [zinaer:/] @g_admin = rw * = r

      1

      2

      3

      4

      5

      6

      說明:@ 表示一個組名,而不是用戶名,* 表示其余所有人。

      啟動服務

      $ svnserve -d -r 目錄 --listen-port 端口號

      1

      -r 指定版本庫根目錄 --listen-port 指定 SVN 監聽端口,默認監聽 3690

      -r 配置決定了不同的訪問方式。

      方式一:-r 直接指定到版本庫(單庫模式)

      $ svn serve -d -r /opt/svn/zinaer

      1

      authz 配置文件:

      [groups] admin = admin,zinaer dev = zinaer001 [/] @admin = rw zinaer = r

      1

      2

      3

      4

      5

      6

      客戶端使用 URL:svn://192.168.10.10/ 即可訪問 zinaer 版本庫。

      方法二:指定到版本庫的上級目錄(多庫模式)

      $ svn serve -d -r /opt/svn

      1

      authz 配置文件:

      [groups] admin = admin,zinaer dev = zinaer001 [zinaer:/] @admin = rw zinaer001 = r [zinaer001:/] @admin = rw zinaer001 = r

      1

      2

      3

      4

      5

      6

      7

      8

      9

      客戶端使用 URL:svn://192.168.10.10/zinaer 即可訪問 zinaer 版本庫。

      SVN 檢出操作

      我們已經創建了版本庫 zinaer,并且啟動了服務,URL 為:svn://192.168.10.10/zinaer 用戶 zinaer 由讀寫權限。

      $ svn checkout svn://192.168.10.10/zinaer --username zinaer --password 123456

      1

      查看版本庫詳細信息

      $ svn info

      1

      SVN 解決沖突

      假設賬號 admin 和 zinaer 都創建了版本庫副本,在版本號是 1 的時候,都更新了 hello.txt 文件,admin 在修改完后提交到了服務器,這時候文件版本變成了 2。同時 zinaer 在版本 1 的時候也進行了修改,這時候提交到服務器由于不是在版本 2 上進行的修改,導致提交失敗。

      現在我們來處理沖突,使用命令查看更改:

      $ svn diff Index: hello.txt =================================================================== --- hello.txt (revision 3) +++ hello.txt (working copy) @@ -1 +1 @@ -hello world https://skm.zinaer.com +hello world https://skm.zinaer.com 123

      1

      2

      3

      4

      5

      6

      7

      8

      如果我們直接提交會提示什么

      $ svn commit -m 'change first' Sending hello.txt Transmitting file data .done Committing transaction... svn: E160028: Commit failed (details follow): svn: E160028: File '/hello.txt' is out of date

      1

      2

      3

      4

      5

      6

      可以看到,不能成功提交。為了避免代碼被相互覆蓋,SVN 不允許我們這樣操作,需要先 update

      $ svn update Updating '.': C hello.txt Updated to revision 4. Summary of conflicts: Text conflicts: 1

      1

      2

      3

      4

      5

      6

      此時,和版本庫已經同步了,可以進行 commit 了。

      SVN 提交操作

      我們在版本庫中添加一個 README.md 文件

      $ cat README.md # 簡明 SVN 教程

      1

      2

      查看狀態

      $ svn status ? README.md

      1

      2

      ? 代表 README.md 還沒有加入版本控制中。

      將文件加入版本控制

      $ svn add README.md A README.md

      1

      2

      A 代表加入了版本控制,現在需要將其更新到版本庫中

      $ svn commit -m 'add README.md' Adding README.md Transmitting file data .done Committing transaction... Committed revision 6.

      1

      2

      3

      4

      5

      -m 選項用于添加注釋信息。

      SVN 版本回退

      如果我們想放棄對文件的修改,可以使用 revert 命令。

      我們對 README.md 文件進行修改并查看狀態

      $ svn status M README.md

      1

      2

      現在我們進行撤銷操作,更改到未修改時的狀態

      $ svn revert README.md Reverted 'README.md'

      1

      2

      revert 不僅僅可以使單個文件恢復原狀,而且可以對整個目錄恢復。使用命令 -R

      $ svn revert -R zinaer

      1

      如果想恢復一個已經提交的版本,相當于我們需要撤銷舊版本所有的更改然后提交一個新版本。比如:從版本 8 恢復到版本 7

      $ svn merge -r 8:7 README.md

      1

      SVN 查看歷史消息

      svn diff:用來顯示特定修改的行級詳細信息。

      svn cat:取得在特定版本的某文件顯示在當前屏幕。

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

      SVN 分支

      如果希望開發進程分開成兩條不同的線路時,創建不同的分支進行開發是個很好的方式。

      分支其實就是主線的一個 copy 版,不過分支同樣具有版本控制功能,并且和主分支相互獨立,最后可以將分支合并到主分支,從而成為一個項目。

      我們在本地創建一個 zhanbai 分支

      $ ls branches/ tags/ trunk/ $ svn copy trunk/ branches/zhanbai A branches\zhanbai

      1

      2

      3

      4

      5

      查看狀態

      $ svn status A + branches\zhanbai

      1

      簡明 SVN 教程

      2

      提交新的分支到版本庫

      $ svn commit -m 'add zhanbai' Adding branches\zhanbai Committing transaction... Committed revision 9.

      1

      2

      3

      4

      現在我們開始在 zhanbai 分支進行開發,創建 index.html 文件

      $ cd branches/zhanbai/ $ ls hello.txt index.html README.md

      1

      2

      3

      4

      將 index.html 加入版本控制,并提交到版本庫中

      $ svn status ? index.html $ svn add index.html A index.html $ svn commit -m 'add index.html' Adding index.html Transmitting file data .done Committing transaction... Committed revision 10.

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      切換到 trunk 分支,并更新,然后將 zhanbai 分支合并到 trunk 中

      $ svn merge ../branches/zhanbai/ --- Merging r10 into '.': A index.html --- Recording mergeinfo for merge of r10 into '.': G .

      1

      2

      3

      4

      5

      此時,trunk 中就多了 index.html 文件。然后,將合并號的 trunk 提交到版本庫中

      $ svn commit -m 'add index.html' Adding index.html Committing transaction... Committed revision 12.

      1

      2

      3

      4

      SVN 標簽

      SVN 支持打標簽,也就是在項目開發中,開發到一定階段可以單獨一個版本作為發布時,往往可以打包一個固定的版本。

      $ svn copy trunk/ tags/v1.0 A tags\v1.0

      1

      2

      將在 tags 目錄下創建 v1.0 目錄。

      然后查看狀態,提交 tag 到版本庫中。

      $ svn status A + tags\v1.0 $ svn commit -m 'add v1.0' Adding tags\v1.0 Committing transaction... Committed revision 13.

      1

      2

      3

      4

      5

      6

      7

      SVN

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:word表格怎么插入(word表格怎么增加一列)
      下一篇:辦公軟件excel表格(如何制作excel表格
      相關文章
      国产亚洲欧美在线观看| 亚洲综合图片小说区热久久| 国产午夜亚洲精品理论片不卡 | 亚洲视频在线免费播放| 亚洲精品无码激情AV| 亚洲精品在线不卡| 亚洲AV中文无码乱人伦在线视色| 亚洲精品综合一二三区在线| 亚洲桃色AV无码| 亚洲熟妇av午夜无码不卡| 亚洲视频免费播放| 中文字幕亚洲日韩无线码| 亚洲老熟女五十路老熟女bbw | 久久精品夜色噜噜亚洲A∨| 亚洲一区二区三区在线| 亚洲日本一区二区三区在线 | 亚洲国产午夜福利在线播放| 亚洲无限乱码一二三四区| 亚洲国产精品综合久久网络| 激情五月亚洲色图| 久久久亚洲精品无码| 亚洲欧洲日产国码一级毛片| 亚洲精品精华液一区二区| 亚洲福利一区二区三区| 99亚洲精品高清一二区| 伊人久久综在合线亚洲91| 五月天婷亚洲天综合网精品偷| 久久夜色精品国产噜噜噜亚洲AV| 色欲aⅴ亚洲情无码AV| 中文字幕亚洲精品无码| 亚洲韩国精品无码一区二区三区 | 亚洲啪AV永久无码精品放毛片| 亚洲Av永久无码精品三区在线 | 久久精品亚洲福利| 精品国产人成亚洲区| 狠狠亚洲婷婷综合色香五月排名| 亚洲色欲久久久综合网东京热| 国产亚洲色婷婷久久99精品| 亚洲AV无码一区二区二三区软件| 亚洲爱情岛论坛永久| 亚洲精品福利网站|