SVN 學習筆記

低吟不作語發表於2022-04-30

概述

SVN 全稱 SubVersion,是一個開放原始碼的版本控制系統,它的特點是操作簡單,支援跨平臺操作,支援版本回退

SVN 屬於 C/S 結構軟體,分客戶端和服務端:

  • 服務端軟體:VisualSVN
  • 客戶端軟體:TortoiseSVN

SVN 的工作原理如下,SVN 伺服器會把程式碼整合記錄每一次的改動歷史,開發人員通過以下基本命令便能與 SVN 伺服器完成互動:

  • Checkout(檢出):當你手上沒有原始碼的時候,你需要從 SVN 伺服器 checkout 一份
  • Update (更新):當你已經 checkout 一份原始碼, Update 可以讓你的本地原始碼和 SVN 伺服器的原始碼同步
  • Commit(提交):當你已經修改了程式碼,就需要 Commit 到 SVN 伺服器


SVN 服務端安裝與配置

伺服器端軟體儲存與服務端,下載地址:https://www.visualsvn.com/downloads/

一直點選下一步,在選擇元件介面時,建議按照如圖:

選擇安裝位置和資料倉儲

SVN 服務端配置:

  1. 建立一個專案
    1. 首先在 SVN 服務端目錄建立一個公有目錄 WebApp 作為專案目錄
    2. 在 WebApp 目錄下建立專案資料夾,比如 Shop 資料夾,作為專案的版本倉庫
    3. 建立版本倉庫,基本語法:svnadmin create [資料夾目錄]
  2. 進行伺服器端監管
    1. 通過指令:svnserve -d -r [監管資料夾目錄] 監管專案
    2. 通過 SVN://localhost或者 IP 地址就可以直接指向 Shop 版本倉庫
  3. 許可權控制
    1. SVN 伺服器預設不允許匿名使用者上傳檔案到服務端
    2. 在專案資料夾找到 conf/svnserve.conf 修改配置為:anon-access:write

SVN 客戶端安裝與配置

SVN 客戶端下載地址:https://tortoisesvn.net/downloads.html

一直點選下一步即可,安裝完成以後,使用客戶端連線 SVN 伺服器,在本地專案目錄右鍵,選擇 TortoiseSVN - 版本庫瀏覽器,輸入 SVN 伺服器地址,如 svn://localhost,由於設定了 SVN 伺服器監管 Shop 專案,所以會自動指向 Shop 專案

單擊檢出,就會自動檢出資料到客戶端,如果客戶端專案目錄出現了 .svn 隱藏目錄就代表成功了

開發人員通過更新拉取程式碼,在本地進行開發,在專案目錄右鍵 SVN 提交即可提交程式碼到服務端,和· Git 沒有太大差別


SVN 使用詳解

1. 圖示集

常規:客戶端檔案與服務端檔案完成同步

衝突:客戶端提交檔案與服務端檔案有衝突

已刪除:服務端檔案已刪除

增加:客戶端檔案已新增到提交佇列

無版本控制:客戶端檔案沒有新增到提交佇列

修改:客戶端檔案有修改但未提交

只讀:客戶端檔案為只讀形式

鎖定:服務端檔案已鎖定

忽略:客戶端檔案不需要提交上傳

2. 版本衝突

在實際專案開發中,如果兩個人同時修改某個檔案就會產生版本衝突。當發生衝突時,更新伺服器資料到本地,假設衝突檔案為 index.php,則會產出以下檔案:

  • index.php:系統自動整合後的 index.php 檔案
  • index.php.mine:後提交者修改後的 index.php 檔案
  • index.php.r6:index.php 後的 r6 代表版本號,不同的專案也不同,這裡表示 index.php 的起始狀態
  • index.php.r7:前提交者修改後的 index.pho 檔案

要解決版本衝突,只需要刪除除 index.pho 以外的檔案,修改 index.php 檔案的內容,解決衝突再提交即可

3. 配置多倉庫

在 SVN 中一個專案就稱為一個倉庫,實際開發中,我們可能同時開發多個專案,這時需要進行多專案監管,可以通過監管 WebApp 總目錄來達到監管所有倉庫的目的

svnserve -d -r [WebApp目錄]

如果要訪問對應的專案,URL 也有變化:svn://localhost/Shop

4. 許可權控制

首先要開啟許可權功能,每一個倉庫中都有 conf 資料夾,裡面有兩個檔案:

  • authz:授權檔案,標識哪些使用者具有哪些許可權
  • passwd:認證檔案,標識某個倉庫具有哪些使用者以及相應密碼

預設情況下,以上兩個檔案都是禁用的,如需要使用,要在對應專案的 svnserve.conf 配置如下:

# 註釋匿名使用者的可讀寫許可權
# anno-access=write
# 開啟授權與認證檔案
password-db=passwd
authz-db=authz

修改 passwd 檔案,定義相關使用者和密碼

admin=admin888

修改 authz,設定分組

# 組名=使用者列表,使用者列表以逗號分隔
admin=admin
[Shop:/]
# 擁有可讀可寫許可權
@admin=rw
# 匿名使用者只有可讀許可權
*=r

5. 鉤子程式

所謂鉤子就是版本庫事件觸發的程式,例如新修訂版本的建立,或者未版本化屬性的修改,在版本倉庫的 hooks 目錄下包含各種版本庫鉤子模板,常用的鉤子程式有 post-commit.tmpl:提交完成後所觸發的鉤子程式

複製一份 post-commit.tmpl,刪除裡面的內容,重新命名為 post-commit.bat,通過批處理指令編寫鉤子程式:

# 設定服務端svn路徑
SET SVN="D:\svn\bin\svn.exe"
# 設定web伺服器工作目錄
SET DIR="D:\server\apache\shop"
# 通過update指令實時更新資料到DIR目錄
SVN update %DIR%