最近有機會接觸到公司的新項目,對於多人蔘與的項目,充分感受到 源代碼的版本控制
的重要性。爲了深刻理解和複用起見,本文將從 搭建
、配置
和 使用
多方面總結 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
具體安裝流程就不闡述了,可參考其他文章完成配置 。
Tips.01. 安裝過程中,其中 SVN 服務器端口配置推薦使用HTTPS 的
8443
端口,因爲 HTTPS 安全性比較高,儘管443
是標準 HTTPSport。
Tips.02. 還有就是用於驗證的身份配置:Windows 驗證和 Subversion 身份驗證,默認是 Subversion 身份驗證。 安裝 SVN For MacOS:自帶了 SVN 的服務器端和客戶端功能。參考其他文章完成配置即可 。
SVN 客戶端
Windows Client:TortoiseSVN
-
MacOS Client:Cornerstone
在 Mac 上可利用 SVN 圖形界面工具來管理源代碼,可以大大減小使用命令行的痛苦 。
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.conf
、Passwd
文件和 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
:將本地修改的內容提交到服務器。
<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 衝突 ,開始的時候讓人覺得害怕,但有規律可循。例如有以下文本: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 環境搭建與使用