版本控制工具入門——SVN

本文首發(fā)于 LOGI'S BLOG,由作者轉(zhuǎn)載。

SVN 全稱 Subversion,是 CVS 的替代品,在當(dāng)前時(shí)間節(jié)點(diǎn),與 Git 共同為軟件公司采用,進(jìn)行項(xiàng)目管理。

軟件安裝

主流的 SVN 服務(wù)端為 VisualSVN Server,客戶端為 TortoiseSVN,以下操作都以上述軟件為例。

工作流程

項(xiàng)目經(jīng)理首先將項(xiàng)目初始化到 SVN 服務(wù)器 上,開發(fā)人員首次獲取遠(yuǎn)程倉庫使用 Checkout 命令,之后如服務(wù)器發(fā)生變更,使用 Update 命令更新代碼,本地開發(fā)完成后,使用 Commit 命令提交。

                —————Commit—————>| SVN Server
Project Manager <————Checkout————| svn://192.168.1.1
                <————Update——————| Project Shop
                                 |      |--core.php
                <————Checkout————|      |--common.php
   Developer    <————Update——————|
                —————Commit—————>|

服務(wù)端配置

初始化版本倉庫

  • 安裝好 SVN 服務(wù)端 后,創(chuàng)建 D://SVN/WebApp 文件夾存放所有項(xiàng)目
  • 進(jìn)入 WebApp 目錄,新建 Shop 目錄作為當(dāng)前項(xiàng)目倉庫
  • CMD 窗口 切換到 WebApp,通過 svnadmin create Shop 命令初始化版本倉庫

監(jiān)管倉庫目錄

啟動(dòng)監(jiān)管服務(wù)后,客戶端才能通過 svn://ip 訪問到項(xiàng)目倉庫。

REM 啟動(dòng)后臺(tái)監(jiān)管
REM -d(daemon) -r(repository)
svnserve -d -r D://SVN/WebApp/Shop

如有多個(gè)倉庫,可監(jiān)管所有項(xiàng)目的上級(jí)目錄,此時(shí)客戶端可通過 svn://ip/repo/name 訪問某個(gè)倉庫。

REM 啟動(dòng)監(jiān)管
REM -d(daemon) -r(repository)
svnserve -d -r D://SVN/WebApp

使用命令監(jiān)管需要保持窗口狀態(tài),不能關(guān)閉,也無法開機(jī)自啟,為解決以上問題,可將其添加到 Windows Services。具體操作為,在 CMD 中以管理員身份執(zhí)行以下命令。

REM 創(chuàng)建服務(wù)
sc create SVNService binpath="C:\Program Files\Subvision\bin\svnserve.exe --service -r D:\SVN" start=auto

REM 開啟服務(wù)
net start SVNService

REM 停止服務(wù)
net stop SVNService

REM 刪除服務(wù)
sc delete SVNService

權(quán)限控制

默認(rèn)情況下,SVN 服務(wù)端不允許匿名用戶上傳文件,為了方便調(diào)試,可對(duì)項(xiàng)目目錄下的 conf/svnserve.conf 文件進(jìn)行更改。

REM 所有用戶均可讀可寫
anon-access = write

但在實(shí)際開發(fā)中,處于安全考慮,應(yīng)該建立多個(gè) SVN 賬號(hào),并對(duì)它們分配不同權(quán)限。具體操作為,更改項(xiàng)目目錄下的 conf/svnserve.conf 文件,打開認(rèn)證選項(xiàng)。

REM 禁用匿名用戶訪問
# anon-access = write

REM 打開認(rèn)證功能
password-db = passwd
authz-db = authz

隨后,更改項(xiàng)目目錄下的 conf/passwd 文件,配置用戶名和密碼。

[users]
    admin = admin
    logi1 = 123456
    logi2 = 123456
    logi3 = 123456
    logi4 = 123456

最后,更改項(xiàng)目目錄下的 conf/authz 文件,配置用戶分組,和各組權(quán)限。

[groups]
    admin = admin
    developer = logi1,logi2,logi3,logi4

# 對(duì)每個(gè)倉庫單獨(dú)配置
[Shop:/]
    @admin = rw
    @developer = r
    # * 代表剩下的組,或匿名組
    * = r

同步 SVN 和 WEB 服務(wù)器

為了實(shí)時(shí)預(yù)覽 SVN 服務(wù)器上的文件,可將其同步到 WEB 服務(wù)器中,方便瀏覽器訪問查看。該需求可通過 SVN 服務(wù)器提供的 鉤子程序 實(shí)現(xiàn)。此處,我們利用項(xiàng)目目錄下的 hooks/post-commit.tmpl 鉤子,它在 commit 完成后被觸發(fā),鉤子一般使用 batshell 開發(fā)。

新建 hooks/post-commit.cmd 文件,并編寫以下內(nèi)容。

REM Apache HTML 文件目錄
SET WEB_SERVER_DIR="D:\server\apache\htdocs\shop"

REM SVN 可執(zhí)行程序
SET SVN="D:\svn\bin\svn.exe"

REM 更新數(shù)據(jù)到 Apache 目錄
%SVN% update %WEB_SERVER_DIR%

切換到 Apache HTML 目錄,進(jìn)行一次 Checkout 操作,此后,服務(wù)端一旦收到 commit,便會(huì)觸發(fā)批處理,隨后便可通過瀏覽器預(yù)覽提交。

客戶端使用

客戶端安裝完畢后需要重啟電腦加載注冊(cè)表,否則 SVN 狀態(tài)圖標(biāo) 不會(huì)顯示。如需漢化,先安裝漢化包,隨后右鍵桌面空白處,依次點(diǎn)擊 TortoiseSVN -> Settings -> General,選擇 Language 下拉框中的 中文(簡(jiǎn)體) 確定即可。

拉取服務(wù)端代碼

新建項(xiàng)目目錄并進(jìn)入,空白處右鍵鼠標(biāo),依次進(jìn)入 TortoiseSVN -> 版本庫瀏覽器,輸入 SVN 服務(wù)器 svn://192.168.1.1 后點(diǎn)擊確定。右鍵版本庫中列出的倉庫,選擇 檢出,點(diǎn)擊 確定。此時(shí),打開文件管理器的 顯示隱藏文件選項(xiàng),便可看到初始化的 .svn 文件夾。

Checkout 做了兩件事,首先與服務(wù)端建立連接,其次拉取最新代碼。以后如需更新代碼,要使用 Update 指令。

更新服務(wù)端代碼和本地代碼提交

更新代碼使用 Update。提交代碼用 Commit,需要說明的是 message 要根據(jù)公司規(guī)定填寫,例如 模塊——功能——作者。

圖標(biāo)含義和忽略文件列表

右鍵項(xiàng)目目錄空白處,依次進(jìn)入 TortoiseSVN -> 設(shè)置 -> 圖標(biāo)覆蓋 -> 圖標(biāo)集 可查看所有圖標(biāo)含義。

對(duì)于無需上傳服務(wù)器的文件,可將其添加到忽略列表。具體操作為右鍵項(xiàng)目需要忽略的文件,依次點(diǎn)擊 TortoiseSVN -> 增加到忽略列表,可選擇通配符形式,如 *.ppt,如果是目錄,選擇 以遞歸方式忽略

版本回退

一般誤刪文件或新版本有重大問題時(shí),要進(jìn)行版本回退。右鍵項(xiàng)目目錄空白處,依次進(jìn)入 TortoiseSVN -> 更新至版本。在 回退對(duì)話框 中點(diǎn)擊 顯示日志,在彈出的 日志對(duì)話框 中,選擇 對(duì)應(yīng)提交 后確定,之后點(diǎn)擊 回退對(duì)話框 的確定即可。

解決版本沖突

假設(shè)開發(fā)人員 A 和 B 同時(shí)拉取服務(wù)器上的同一文件進(jìn)行開發(fā),A 先于 B 提交,B 在提交時(shí)就會(huì)發(fā)送版本沖突。

此時(shí),B 應(yīng)該先 Update,隨后手動(dòng)編輯文件解決沖突,可與 A 商量如何解決,最后 Commit

假設(shè) index.php 發(fā)生沖突,在 Update 后會(huì)生成 4 個(gè)相關(guān)文件,分別是:

  • 整合后的文件,index.php
  • B 自己開發(fā)的文件,index.php.mine
  • 兩人都未開發(fā)前的文件:index.php.r6
  • A 先開發(fā)完畢提交的文件,index.php.r7

B 只需將 index.php 中的沖突解決,隨后刪除其他三個(gè)文件,提交即可。沖突區(qū)域如下所示:

<<<<<<< .mine
    echo 'by B'
=======
    echo 'by A'
>>>>>>> .r7
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容