項目 | SVN 環境搭建與使用

最近有機會接觸到公司的新項目,對於多人蔘與的項目,充分感受到 源代碼的版本控制 的重要性。爲了深刻理解和複用起見,本文將從 搭建配置使用 多方面總結 SVN。

當然,版本控制的工具有很多,譬如 CVS、GIT、SVN,CVS 幾乎淘汰;GIT 適合開源軟件項目;SVN 適合企業內部由項目經理統一協調的多個並行項目的開發。選擇哪款版本控制工具視具體情況而定。

源代碼管理

介紹參考了資料 [1]。

管理工具

  • CVS:歷史悠久,現在幾乎沒人使用。
  • SVN:
    • 集中式版本控制的代表;
    • CVS 的接班人,速度和功能比 CVS 有很大幅度提升.
  • GIT:
    • 分佈式源代碼管理工具;
    • 目前被大多數開源項目使用。

管理意義

  • 目的:爲了解決在軟件開發過程中,由源代碼引發的各種繁瑣的問題。
  • 作用:
    • 能追蹤一個項目從誕生一直到定案的過程;
    • 記錄一個項目的所有內容變化,方便地查閱特定版本的修訂情況.
  • 常見問題:
    • 無法後悔:做錯了一個操作後,沒有後悔藥可以吃;
    • 版本備份:費空間、費時間;
    • 版本混亂:因版本備份過多造成混亂,難於找回正確的想要的版本;
    • 代碼衝突:多人操作同一個文件 ( 團隊開發中的常見問題 );
    • 權限控制:無法對源代碼進行精確的權限控制;
    • 追究責任:出現了嚴重的 BUG,無法得知是誰幹的,容易耍賴.

概念概述

  • Subversion 的簡稱,SVN 是一個開放源代碼的版本控制系統;
  • SVN 用於多個人共同開發同一個項目,共用資源;
  • SVN 服務器有 2 種 運行方式:獨立服務器和藉助 Apache。兩種方式各有利弊,可自行選擇。
  • SVN 存儲版本數據 也有 2 種方式:Berkeley DB ( 事務安全型表類型 ) 和 FSFS ( 不需要數據庫的存儲系統 )。因爲 Berkeley DB 方式在服務器中斷時,有可能鎖住數據,故選擇 FSFS 方式更安全一點。

環境搭建

SVN 服務器

  • 安裝 SVN For Windows:VisualSVN Server

    具體安裝流程就不闡述了,可參考其他文章完成配置 ^{[1,2]}

    Tips.01. 安裝過程中,其中 SVN 服務器端口配置推薦使用HTTPS 的 8443 端口,因爲 HTTPS 安全性比較高,儘管 443 是標準 HTTPSport。
    Tips.02. 還有就是用於驗證的身份配置:Windows 驗證和 Subversion 身份驗證,默認是 Subversion 身份驗證。

  • 安裝 SVN For MacOS:自帶了 SVN 的服務器端和客戶端功能。參考其他文章完成配置即可 ^{[3,4]}

SVN 客戶端

  • Windows Client:TortoiseSVN

  • MacOS Client:Cornerstone

    在 Mac 上可利用 SVN 圖形界面工具來管理源代碼,可以大大減小使用命令行的痛苦 ^{[5]}

SVN 配置與使用

Windows 端配置和使用 SVN 可通過圖形界面工具即可完成操作,詳細的步驟在 [1]、[2] 中也有提及。
故在本章節主要講述 Mac 環境下搭建和配置 SVN。

創建代碼倉庫

  • Step.01. 新建一個 svn 目錄,例如 /Users/kofe/svn,以後可在 svn 目錄下創建多個倉庫目錄。

  • Step.02. 打開終端,創建一個名爲 idea 倉庫,輸入指令:

    # 指令執行成功後,會發現硬盤上多了個 /Users/kofe/svn/idea 目錄
    svnadmin create /Users/apple/svn/idea
    

配置用戶權限

主要是修改 /svn/idea/conf 目錄下的三個文件:svnserve.confPasswd 文件和 Authz 文件。

  • svnserve.conf

    # anon-access = read 代表匿名訪問的時候是隻讀的
    # anon-access = none 代表禁止匿名訪問,需要帳號密碼才能訪問
    anon-access = read
    auth-access = write
    password-db = passwd
    authz-bd = authz
    
  • Passwd 文件:在 [users] 下面添加賬號和密碼。

    [users]
    # 格式:賬號 = 密碼
    kofe = 123456
    lucy = 123456
    
  • Authz 文件:配置用戶組和權限我們可以將在 Passwd 裏添加的用戶分配到不同的用戶組裏。以後就可對不同用戶組設置不同的權限,沒有必要對每個用戶進行單獨設置權限。即在 [groups] 下面添加組名和用戶名,多個用戶之間用逗號 , 隔開。

    [groups] 
    usergroup = kofe, lucy # 格式:組名 = 用戶1, 用戶2, ...
    
    # 使用 [/] 代表 SVN 服務器中的所有資源庫
    # 某個組有讀寫權限
    [/]
    @usergroup = rw
    
    # 使用 [/] 代表 SVN 服務器中的所有資源庫
    # 某個用戶有讀寫權限
    # lucy = rw
    

啓動關閉服務

  • 在終端輸入下列指令:若沒有任何提示,恭喜你啓動成功。

    svnserve -d -r /Users/kofe/svn
    # 或輸入: svnserve -d -r /User/kofe/svn/idea
    
  • 當然,會啓用也要會關閉 SVN 服務器,特別是首次配置完 SVN 服務器需要重啓。
    Case.01. 在 活動監視器 中搜索 svn, 在列表中找到進程 svnserve, 點擊左上角的強制退出進程
    Case.02. 或者可通過 shell 腳本實現一鍵關閉。

    #!/bin/sh
    echo "Current Process List:"
    echo "= = = = = = = = = = ="
    ps -A | grep svn
    echo "= = = = = = = = = = ="
    kill `pgrep "svn"`
    
    echo "Kill successfully!" Current Process Status:
    echo "= = = = = = = = = = = = = = = = = = = = = ="
    ps -A | grep svn
    echo "= = = = = = = = = = = = = = = = = = = = = ="
    

代碼版本控制

當然,充分利用 SVN 圖形界面工具 ( Cornerstone ) 來管理源代碼,可大大減小使用命令行的痛苦,提升使用效率。

  • 首次導入工程文件到 SVN 服務器:

    # /Users/kofe/procedure/idea/SSM_DEMO,指的是需要導入的工程文件
    # svn://localhost/idea 指把工程文件上傳到 idea 目錄下
    # --username=admin --password=123456 指的是校驗用戶名和密碼
    # -m "初始化導入" 指的是提交的信息註釋
    svn import /Users/kofe/procedure/idea/SSM_DEMO svn://localhost/idea --username=kofe --password=123456 -m "初始化導入"
    
  • 從 SVN 服務器下載工程文件到本地 ( Checkout ):

    svn checkout svn://localhost/idea --username=kofe --password=123456 /Users/kofe/procedure/idea
    
  • 二次提交代碼到服務器:二次提交是有一個前提的, 那就是你首先需要在 SVN服務器上下載代碼到本地,然後再去修改這一份代碼, 才能夠二次提交。

    cd /Users/kofe/procedure/idea
    svn commit -m "修改部分代碼 (註釋修改的內容)"
    
  • SVN 基本操作原理:

    • svn checkout:將服務器代碼完整下載到本地。
    • svn update:將服務器最新的代碼下載到本地。
    • svn commit:將本地修改的內容提交到服務器。
    圖3-1SVN 基本操作原理

    <center>圖 3-1 SVN 基本操作原理</center>

代碼版本衝突

  • 版本衝突原因:

    假設 A、B 兩用戶都在版本號爲 100 時更新了 sample.txt 文件,A 用戶在修改完成之後提交 sample.txt 到服務器,這個時候提交成功,這個時候 sample.txt 文件的版本號已經變成 101 了。同時 B 用戶在版本號爲 100 的 sample.txt 文件上作修改,修改完成之後提交到服務器時,由於不是在當前最新的 101 版本上作的修改,所以導致提交失敗。

  • 版本衝突現象:

    衝突發生時,SVN 會在當前工作目錄中保存所有的目標文件版本 [ 上次更新版本、當前獲取的版本 ( 即別人提交的版本 )、自己更新的版本、目標文件 ]。 假設文件名是 sample.txt ,對應的文件名分別是 ( 同時在目標文件中標記來自不同用戶的更改 ):

    sample.txt.r101
    sample.txt.r102
    sample.txt.mine
    sample.txt
    
  • 手工合併 SVN 衝突 ^{[6]},開始的時候讓人覺得害怕,但有規律可循。例如有以下文本:

    Mayonnaise
    Lettuce
    Tomato
    Provolone
    <<<<<<<.mine
    Salami
    Mortadella
    Prosciutto
    =======
    Sauerkraut
    GrilledChicken
    >>>>>>>.r2
    

    一連串的大於、小於、等於號是 SVN 衝突標記,這些數據得全部刪除纔可以提交。在 SVN 衝突區中,或許你需要和你的同事溝通來安排衝突區的文本內容,待所有衝突區得到合理的解決之後方可再提交文件。

    // 是你在衝突區裏面做的修改
    <<<<<<<.mine
    Salami
    Mortadella
    Prosciutto
    =======
    
    // 是別人在衝突區做的修改
    Sauerkraut
    GrilledChicken
    >>>>>>>.r2
    
  • 如何降低衝突解決的複雜度:

    • 在提交時寫上明確的 Message ( 註釋 ),方便以後查找用戶更新的原因。
    • 養成良好的使用習慣,使用 SVN 時每次都是先提交,後更新。每天 早上 打開後,首先要從版本庫 獲取最新版本,每天 下班前 必須將已經編輯過的文檔都 提交 到版本庫。

參考資料

[1] PhelanGeek. SVN 服務器搭建教程. jianshu.com. 2016
[2] RealLiuNing. Windows 10 搭建獨立 SVN 服務器. jianshu.com. 2018
[3] CainLuo. 搭建 MacOS 本地 SVN 服務器. juejin.im. 2016
[4] Sunny Fight. iOS 版本控制 SVN (Mac 環境下 SVN 的使用). jianshu.com. 2016
[5] 天藍. SVN 在 Mac 上使用 Xcode+Cornerstone. jianshu.com. 2017
[6] aaronGao. svn conflict 衝突解決. cnbologs.com. 2016

若有出入,可查看原文章地址:項目 - SVN 環境搭建與使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章