概述
在團隊開發的過程中,通常有如下需求:協同修改、數據備份、版本管理、權限控制、歷史記錄等,因此有了版本控制的思想。
版本控制
指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一。
版本控制工具
對版本控制思想的具體實現,版本控制工具可以分爲集中式、分佈式兩種。
- 集中式:CVS、SVN、VSS···
- 分佈式:GIT
由於將入職的公司使用 SVN 較多,所以在這具體地學習一下。
SVN
SVN 全稱 Subversion,採用 C/S 結構設計,常用的操作如下:
- Checkour:檢出,從服務器端的版本庫中下載需要的內容到本地。在一次開發中,只需做一次。
- Update:更新,把服務器端相對於本地的修改下載到本地。
- Commit:提交,將本地的修改上傳到服務器。
Linux下的安裝和使用
服務器端安裝
爲了學習演示客戶端的操作,先在雲服務器上搭建自己的 SVN 版本庫。
- 首先安裝服務器端程序,查看版本信息
yum install -y subversion
svn --version
- 創建並配置版本庫
mkdir /usr/local/svn/repository -p // 創建版本庫目錄
cd /usr/local/svn/repository
mkdir mypro //在版本庫目錄下創建具體項目目錄
svnadmin create mypro/ //真正創建 SVN 版本庫
創建完項目的版本庫後,版本庫中有以下默認內容:
- 配置並啓動 SVN 服務
vim /etc/sysconfig/svnserve //修改 SVN 默認根目錄
systemctl enable svnserve.service //設置開機啓動
systemctl start svnserve.service //啓動 SVN 服務
ps aux | grep svn //檢查是否啓動成功
注: SVN 默認使用 3690 端口,雲服務器需要開放相應端口。
命令行操作
命令行的操作,可以創建兩個工作區來模擬兩個開發人員:
檢出
開發人員檢出項目
svn checkout svn://ip.ip.ip.ip/mypro ./ //檢出版本庫中所有內容
harry、sally 分別執行以上命令,目錄下會自動創建 .svn 目錄:
修改版本庫的url:
svn sw --relocate svn://old_ip/目錄 svn://new_ip/目錄
添加
SVN 要求提交一個新建的文件前需要先把它添加到版本控制體系(區別於版本庫)中:
svn add xxx
在 harry 下創建 hello.txt 文件,並添加到版本控制體系中:
提交
提交之前,需要設置版本庫的權限,在 …/mypro/conf 下的 svnserve.conf 文件中進行配置,下圖開啓匿名的寫權限:
之後可以提交 harry 創建的文件,由下圖可知上傳成功,且當前版本爲1:
svn commit xxx -m “描述”
在服務端就可以看到我們提交的文件:
svn list svn://ip.ip.ip.ip/mypro
更新
前面 harry 用戶提交了文件,對服務端的版本庫產生了修改,而 sally 用戶檢出的版本還是上一個版本,這時 sally 用戶就可以進行更新的操作:
svn update [文件名] // []表示可選
衝突與解決
衝突的產生
過時文件:開發人員本地的版本相對服務器端版本來說是舊的版本,在舊的版本上進行了修改。
產生衝突的條件:
- 本地當前編輯的文件已經過時了。
- 從服務器端更新下來的修改和本地的修改在“同文件同位置”不一致。
製造衝突:
在命令行我們可以製造衝突。
- harry:
- sally:
這時我們先提交 sally 修改後的 hello.txt:
此時,harry 本地的版本是落後於服務端的,harry 在提交時就會提醒本地文件已經過時:
然後我們執行更新操作,這時候就產生了衝突,我們先選擇 p 推遲:
衝突表現
-
文件內:
-
目錄內(r後面的數字表示版本號):
衝突的解決
手動解決
- 刪除衝突發生時產生的三個文件
- 刪除衝突文件內多餘的符號
- 將文件編輯到滿意的狀態後提交
半自動解決
-
設置 SVN_EDITOR 環境變量
which vim //獲取 vim 的路徑
vim /etc/profile //編輯 profile 文件
//在文件下面加入: export SVN_EDITOR= vim 的路徑
source /etc/profile 系統重新加載 profile
-
在 svn 給我們的選擇中,選擇 e 進行編輯
-
編輯滿意後,選擇 r 選項標記此衝突已解決(解決後得再次提交)