### 版本模型
版本控制系統的核心任務是提供協作編輯和數據共享,但是不同的系統使用不同的策略來達到目的。
### 文件共享的問題
所有的版本控制系統都需要解決這樣一個基礎問題:怎樣讓系統允許用戶共享信息,而不會讓他們因意外而互相干擾?版本庫里意外覆蓋別人的更改非常的容易。
考慮[圖2.2 “需要避免的問題”]( "圖2.2.需要避免的問題")的情景,我們有兩個共同工作者,Harry和Sally,他們想同時編輯版本庫里的同一個文件,如果首先Harry保存它的修改,過了一會,Sally可能湊巧用自己的版本覆蓋了這些文件,Harry的更改不會永遠消失(因為系統記錄了每次修改),Harry所有的修改*不會*出現在Sally的文件中,所以Harry的工作還是丟失了―至少是從最新的版本中丟失了―而且是意外的,這就是我們要明確避免的情況!
**圖2.2.需要避免的問題**

### 鎖定-修改-解鎖 方案
許多版本控制系統使用*鎖定-修改-解鎖*這種機制解決這種問題,在這樣的系統里,在一個時間段里版本庫的一個文件只允許被一個人修改。首先在修改之前,Harry要“鎖定”住這個文件,鎖定很像是從圖書館借一本書,如果Harry鎖住這個文件,Sally不能做任何修改,如果Sally想請求得到一個鎖,版本庫會拒絕這個請求。在Harry結束編輯并且放開這個鎖之前,她只可以閱讀文件。Harry解鎖后,就要換班了,Sally得到自己的輪換位置,鎖定并且開始編輯這個文件。[圖2.3 “鎖定-修改-解鎖 方案”]( "圖2.3.鎖定-修改-解鎖 方案")描述了這樣的解決方案。
**圖2.3.鎖定-修改-解鎖 方案**

鎖定-修改-解鎖模型有一點問題就是限制太多,經常會成為用戶的障礙:
-
*鎖定可能導致管理問題。*有時候Harry會鎖住文件然后忘了此事,這就是說Sally一直等待解鎖來編輯這些文件,她在這里僵住了。然后Harry去旅行了,現在Sally只好去找管理員放開鎖,這種情況會導致不必要的耽擱和時間浪費。
-
*鎖定可能導致不必要的線性化開發。*如果Harry編輯一個文件的開始,Sally想編輯同一個文件的結尾,這種修改不會沖突,設想修改可以正確的合并到一起,他們可以輕松的并行工作而沒有太多的壞處,沒有必要讓他們輪流工作。
-
*鎖定可能導致錯誤的安全狀態。*假設Harry鎖定和編輯一個文件A,同時Sally鎖定并編輯文件B,如果A和B互相依賴,這種變化是必須同時作的,這樣A和B不能正確的工作了,鎖定機制對防止此類問題將無能為力―從而產生了一種處于安全狀態的假相。很容易想象Harry和Sally都以為自己鎖住了文件,而且從一個安全,孤立的情況開始工作,因而沒有盡早發現他們不匹配的修改。
### 拷貝-修改-合并 方案
Subversion,CVS和一些版本控制系統使用*拷貝-修改-合并*模型,在這種模型里,每一個客戶聯系項目版本庫建立一個個人*工作拷貝*―版本庫中文件和目錄的本地映射。用戶并行工作,修改各自的工作拷貝,最終,各個私有的拷貝合并在一起,成為最終的版本,這種系統通常可以輔助合并操作,但是最終要靠人工去確定正誤。
這是一個例子,Harry和Sally為同一個項目各自建立了一個工作拷貝,工作是并行的,修改了同一個文件A,Sally首先保存修改到版本庫,當Harry想去提交修改的時候,版本庫提示文件A已經*過期*,換句話說,A在他上次更新之后已經更改了,所以當他通過客戶端請求*合并*版本庫和他的工作拷貝之后,碰巧Sally的修改和他的不沖突,所以一旦他把所有的修改集成到一起,他可以將工作拷貝保存到版本庫,[圖2.4 “拷貝-修改-合并 方案”]( "圖2.4.拷貝-修改-合并 方案")和[圖2.5 “拷貝-修改-合并 方案(續)”]( "圖2.5.拷貝-修改-合并 方案(續)")展示了這一過程。
**圖2.4.拷貝-修改-合并 方案**

**圖2.5.拷貝-修改-合并 方案(續)**

但是如果Sally和Harry的修改*交迭*了該怎么辦?這種情況叫做*沖突*,這通常不是個大問題,當Harry告訴他的客戶端去合并版本庫的最新修改到自己的工作拷貝時,他的文件A就會處于沖突狀態:他可以看到一對沖突的修改集,并手工的選擇保留一組修改。需要注意的是軟件不能自動的解決沖突,只有人可以理解并作出智能的選擇,一旦Harry手工的解決了沖突―也許需要與Sally討論―它可以安全的把合并的文件保存到版本庫。
拷貝-修改-合并模型感覺是有一點混亂,但在實踐中,通常運行的很平穩,用戶可以并行的工作,不必等待別人,當工作在同一個文件上時,也很少會有交迭發生,沖突并不頻繁,處理沖突的時間遠比等待解鎖花費的時間少。
最后,一切都要歸結到一條重要的因素:用戶交流。當用戶交流貧乏,語法和語義的沖突就會增加,沒有系統可以強制用戶完美的交流,沒有系統可以檢測語義上的沖突,所以沒有任何證據能夠承諾鎖定系統可以防止沖突,實踐中,鎖定除了約束了生產力,并沒有做什么事。
- 第1章介紹
- Subversion的歷史
- Subversion的特性
- Subversion的架構
- 安裝Subversion
- Subversion的組件
- 快速入門
- 第2章基本概念
- 版本模型
- Subversion實戰
- 摘要
- 第3章指導教程
- 導入
- 修訂版本: 號碼、關鍵字和日期,噢,我的!
- 初始化的Checkout
- 基本的工作周期
- 檢驗歷史
- 其他有用的命令
- 摘要
- 第4章分支與合并
- 使用分支
- 在分支間拷貝修改
- 常見用例
- 轉換工作拷貝
- 標簽
- 分支維護
- 摘要
- 第5章版本庫管理
- 版本庫的創建和配置
- 版本庫維護
- 添加項目
- 摘要
- 第6章配置服務器
- 網絡模型
- svnserve,一個自定義的服務器
- httpd,Apache的HTTP服務器
- 支持多種版本庫訪問方法
- 第7章高級主題
- 屬性
- Peg和實施修訂版本
- 外部定義
- 賣主分支
- 本地化
- Subversion版本庫URL
- 第8章開發者信息
- 使用API
- 進入工作拷貝的管理區
- WebDAV
- 使用內存池編程
- 為Subversion做貢獻
- 第9章Subversion完全參考
- svn add
- svn blame
- svn cat
- svn checkout
- svn cleanup
- svn commit
- svn copy
- svn delete
- svn diff
- svn export
- svn help
- svn import
- svn info
- svn list
- svn log
- svn merge
- svn mkdir
- svn move
- svn propdel
- svn propedit
- svn propget
- svn proplist
- svn propset
- svn resolved
- svn revert
- svn status
- svn switch
- svn update
- svnadmin
- svnadmin create
- svnadmin deltify
- svnadmin dump
- svnadmin help
- svnadmin hotcopy
- svnadmin list-dblogs
- svnadmin list-unused-dblogs
- svnadmin load
- svnadmin lstxns
- svnadmin recover
- svnadmin rmtxns
- svnadmin setlog
- svnadmin verify
- svnlook
- svnlook author
- svnlook cat
- svnlook changed
- svnlook date
- svnlook diff
- svnlook dirs-changed
- svnlook help
- svnlook history
- svnlook info
- svnlook log
- svnlook propget
- svnlook proplist
- svnlook tree
- svnlook uuid
- svnlook youngest
- svnserve
- svnversion
- mod_dav_svn Configuration Directives
- 附錄A.Subversion對于CVS用戶
- 目錄的版本
- 更多離線操作
- 區分狀態和更新
- 分支和標簽
- 元數據屬性
- 沖突解決
- 二進制文件和轉化
- 版本化的模塊
- 認證
- 轉化CVS版本庫到Subversion
- 附錄C.WebDAV和自動版本化
- 自動版本化交互性
- Subversion和DeltaV
- 術語表