跳到主要內容

SVN簡明課程

1. 版本控制介紹



1.1. 什麼是版本控制


版本控制系統用於保存編寫開發應用程序時的文檔的各個修訂版(revision)。
版本控制也稱作Revision Control System(RCS)。
名詞解釋:
  • 修訂版(revision):可以認為是某個文件在其生命週期內各個保存的快照,每個快照和一個時間區間對應。
  • 版本庫(Repository):存放修訂版的數據庫
  • 本地工作拷貝(Local working copy):修訂版在本地的副本
  • 版本的檢入(Check in):本地副本提交到服務器的版本庫
  • 檢出(Check out):從服務器的版本庫中取出修訂版成為本地副本
  • 版本號的來源:有兩種策略,基於文件的計數和基於倉庫的計數,subversion使用後者
  • 標籤(Tags):為版本加一個名字,便於檢出
  • 分支(Branches):修訂版打分支,以後可以平行修改,互不干擾
  • 合併(Merging):將分支的修訂版合併為一個新的修訂版
  • 鎖(Locking):為修訂版枷鎖
  • 衝突(Conflict):並發版本控制時防止修訂版混亂的錯誤機制

1.2. 使用版本控制的好處


對團隊和個人都有好處:
  • 為團隊提供了所有項目文檔的回退按鈕;
  • 支持多個開發人員在可控的方式下為相同的代碼工作;
  • 版本控制系統保存了文檔在過去的各個改動,便於查找是誰,在何時,因為什麼修改了文檔;
  • 支持在文檔的主線上同時有多個版本;
  • 支持查詢在某個時點上項目各個文檔的狀態,可用於研究生產效率等,也可用於對以前的軟件發行版的再發行。

1.3. 常見的版本控制系統



2. Subversion介紹


Subversion是新一代的版本控制工具,正逐步替代CVS。
資源:

3. Subversion基本使用



3.1. Subversion安裝


Subversion是典型的C/S模式應用程序。
安裝過程很簡單,圖形界面,默認選擇即可。
輸入svn命令查看安裝是否成功:

svn --version

svn命令是subversion程序的客戶端
svnserver命令可以啟動svn服務器,用於搭建簡易的svn服務器環境

3.2. 服務器端


以下是搭建簡易的服務器端環境的做法,正式一般配合apache通過http訪問。

3.2.1. 創建版本庫


創建服務器端版本庫,相當於DBMS創建數據庫示例。
命令行:

svnadmin create file_path/repo_name


3.2.2. 啟動服務器



svnserve.exe -d  -r file_path

  • -d 後台執行
  • -r 版本庫的根目錄
訪問該版本庫的url:svn//localhost/repo_name

3.3. 客戶端



3.3.1. 初始導入(import)


通過命令行導入:

svn import -m "init import" http://10.0.0.6/svn/teaching/

該命令可將當前路徑下文件導入到版本庫中。

3.3.2. 檢出(checkout)


通過命令行檢入:

svn co http://hibernate3demo.googlecode.com/svn/tags/helloworld_r1

或者:

svn checkout http://hibernate3demo.googlecode.com/svn/tags/helloworld_r1

或者:通過第三方圖形工具的檢出,比如tortoiseSVN(http://tortoisesvn.tigris.org/)
將svn服務器的最新修訂版下載到本地成為本地工作拷貝。

3.3.3. 保持更新(update)


命令行:

svn update

或者

svn up

或者通過tortoiseSVN
用svn服務器的最新修訂版更新本地工作拷貝。
多人合作時:
  • 更新要經常頻繁的做,儘量讓問題及早暴露,便於處理。
  • 提交代碼前要更新,否則容易產生版本衝突。

3.3.4. 添加(add)


命令行:

svn add file_path

或者通過tortoiseSVN,eclipse插件。
告知svn服務器,添加目錄和/或文件到服務器上,這個操作類似SQL的insert,但是並沒有真的操作,直到commit。

3.3.5. 提交改動


相當於通用概念:檢入(checkin)。
命令行:

svn commit

或者:

svn ci

或者通過tortoiseSVN,eclipse插件。
提交本地工作拷貝的所有改動,而且是原子性的。
要求:一般要註明修改的原因

svn ci -m "修改bug #224"

要求:提交之前要做更新

svn up
svn ci -m "修改bug #224"


3.3.6. 還原改動


對應提交(commit),要有類似回滾(rollback)的操作。

svn revert

或者通過tortoiseSVN,eclipse插件。
這個操作對開發人員十分有用,在改動被人很多代碼後可以「一鍵恢復」。

3.3.7. 「還原」已提交的改動


revert只適合未提交的情況。
如果已經提交,發現問題,要回退到之前的修訂版。
首先需要:

svn up

讓本地工作拷貝更新到最新狀態。
然後:

svn log your_file_path

查看文件日誌,這時候提交時填寫的說明信息就派上用場了。
查看兩個修訂版之間的不同:

svn diff -r 舊修訂版序號:新修訂版序號 your_file_path

或者通過tortoiseSVN,eclipse插件。
決定用哪個舊的修訂版號後,用舊的修訂版號文件覆蓋新的修訂版號文件。

svn merge -r 新修訂版序號:舊修訂版序號 your_file_path

還需要:

svn commit -m "恢復到某修訂版(某修訂版作廢)"

或者通過tortoiseSVN,eclipse插件。
這個還原是所謂的,不是用舊的版本號替代,而是將舊文件覆蓋新文件。

3.3.8. 拷貝文件和目錄


命令行:

svn copy path/file_name newpath/new_file_name
svn commit -m "xxxx"

或者:

svn cp path/file_name newpath/new_file_name
svn commit -m "xxxx"

或者:利用windows的資源管理器/unix的cp命令
或者通過tortoiseSVN,eclipse插件。
svn的copy,是很重要的工具,版本分支和標籤等概念都通過它實現。
svn的copy,是廉價的拷貝。

3.3.9. 重命名目錄/文件


命令行:

svn move file_name new_file_name

或者:

svn mv file_name new_file_name


3.3.10. 處理合併衝突


svn默認不對文件加鎖。
如果不同人編輯了同一個文件的不同部分,提交時會自動合併。
如果不同人編輯了同一個文件的同一部分,後提交者會報告合併衝突。
解決方法(人工仲裁):
  • 放棄改動;
  • 堅持你的改動,找到.mine的文件名,恢復為原文件名,然後執行:
    svn resolved file_name
     

3.3.11. 刪除文件


將本地工作拷貝刪除。
命令行:

svn delete file_path

或者:

svn del file_path


4. Subversion高級內容



4.1. 文件鎖


一般用於二進制內容,因為無法合併。
如果某個文件加鎖,其他用戶的本地工作拷貝(更新後)將是只讀的。
當該用戶提交後,其他用戶的本地工作拷貝(更新後)才可以寫操作。
其他用戶可以「撬鎖」,然後進行寫操作。
高級配置可以配置「撬鎖」權限,使不是什麼人都可以「撬鎖」。

4.2. 版本庫創建策略


單一的版本庫保存一個項目。
單一的版本庫保存多個項目。
多個版本庫。

4.3. 使用標籤和分支


在svn中標籤和分支都源於copy命令。
3個約定俗成的目錄:
  • trunk:主幹
  • branches:分支
  • tags:標籤
發佈分支:

svn cp -m "創建用於實現radio標籤的分支" https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_1 https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2

切換分支:

svn switch https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2

合併分支需要兩個步驟:
合併操作

svn merge -r 33:HEAD https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_2

或者:

svn merge https://easymorse-simpletag.googlecode.com/svn/trunk/simpletag@HEAD https://easymorse-simpletag.googlecode.com/svn/branches/simpletag_select_1@HEAD

提交。

5. 未講到的內容


  • svn備份
  • subversion屬性
  • 與apache集成的配置和使用

留言

這個網誌中的熱門文章

17分鐘波段策略

使用中 觀察中 待修正 TXF_17min_1 TXF_17min_2 TXF_17min_3 TXF_17min_4 TXF_17min_5 TXF_17min_6 TXF_17min_7 TXF_17min_8 TXF_17min_9 TXF_17min_10 * TXF_17min_11 TXF_17min_12 TXF_17min_13 TXF_17min_14 * TXF_17min_15