本文首發(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ā),鉤子一般使用 bat 或 shell 開發(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