### 外部定義
有時候創建一個由多個不同檢出得到的工作拷貝是非常有用的,舉個例子,你或許希望不同的子目錄來自不同的版本庫位置,或者是不同的版本庫。你可以手工設置這樣一個工作拷貝―使用**svn checkout**來創建這種你需要的嵌套的工作拷貝結構。但是如果這個結構對所有的用戶是很重要的,每個用戶需要執行同樣的檢出操作。
很幸運,Subversion提供了*外部定義*的支持,一個外部定義是一個本地路經到URL的影射―也有可能一個特定的修訂版本―一些版本化的資源。在Subversion你可以使用`svn:externals`屬性來定義外部定義,你可以用**svn propset**或**svn propedit**(見[“為什么需要屬性?”一節])創建和修改這個屬性。它可以設置到任何版本化的路經,它的值是一個多行的子目錄和完全有效的Subversion版本庫URL的列表(相對于設置屬性的版本化目錄)。
~~~
$ svn propget svn:externals calc
third-party/sounds http://sounds.red-bean.com/repos
third-party/skins http://skins.red-bean.com/repositories/skinproj
third-party/skins/toolkit -r21 http://svn.red-bean.com/repos/skin-maker
~~~
`svn:externals`的方便之處是這個屬性設置到版本化的路徑后,任何人可以從那個目錄取出一個工作拷貝,同樣得到外部定義的好處。換句話說,一旦一個人努力來定義這些嵌套的工作拷貝檢出,其他任何人不需要再麻煩了―Subversion會在原先的工作拷貝檢出之后,也會檢出外部工作拷貝。
注意前一個外部定義實例,當有人取出了一個`calc`目錄的工作拷貝,Subversion會繼續來取出外部定義的項目。
~~~
$ svn checkout http://svn.example.com/repos/calc
A calc
A calc/Makefile
A calc/integer.c
A calc/button.c
Checked out revision 148.
Fetching external item into calc/third-party/sounds
A calc/third-party/sounds/ding.ogg
A calc/third-party/sounds/dong.ogg
A calc/third-party/sounds/clang.ogg
…
A calc/third-party/sounds/bang.ogg
A calc/third-party/sounds/twang.ogg
Checked out revision 14.
Fetching external item into calc/third-party/skins
…
~~~
如果你希望修改外部定義,你可以使用普通的屬性修改子命令,當你提交一個`svn:externals`屬性修改后,當你運行**svn update**時,Subversion會根據修改的外部定義同步檢出的項目,同樣的事情也會發生在別人更新他們的工作拷貝接受你的外部定義修改時。
**svn status**命令也認識外部定義,會為外部定義的子目錄顯示`X`狀態碼,然后迭代這些子目錄來顯示外部項目的子目錄狀態信息。
Subversion目前對外部定義的支持可能會引起誤導,首先,一個外部定義只可以指向目錄,而不是文件。第二,外部定義不可以指向相對路徑(如`../../skins/myskin`)。第三,同過外部定義創建的工作拷貝與主工作拷貝沒有連接,所以舉個例子,如果你希望提交一個或多個外部定義的拷貝,你必須在這些工作拷貝顯示的運行**svn commit**―對主工作拷貝的提交不會迭代到外部定義的部分。
另外,因為定義本身使用絕對路徑,移動和拷貝路徑他們附著的路徑不會影響他們作為外部的檢出(盡管相對的本地目標子目錄會這樣,當然,根據重命名的目錄)。這看起來有些迷惑―甚至讓人沮喪―在特定情形。舉個例子,如果你在`/trunk`開發線對一個目錄使用外部定義,指向同一條線上的其他區域,然后使用**svn copy**把分支開發線拷貝到`/branches/my-branch`這個新位置,這個項目新分支的外部定義仍然指向`/trunk`版本化資源。另外,需要意識到如果你需要一個重新規劃你的工作拷貝的父目錄(使用**svn switch --relocate**),外部定義*不*會重新選擇父目錄。
- 第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
- 術語表