有時候,建構一個由多個不同檢出的工作副本組成的副本會很有用。例如,您可能希望不同的檔案或子目錄來自儲存庫中的不同位置,或者甚至來自完全不同的儲存庫。如果您希望每位使用者都擁有相同的佈局,您可以定義 svn:externals
屬性,以便在需要它們的位置拉取指定的資源。
假設您將 /project1
的工作副本檢出到 D:\dev\project1
。選取資料夾 D:\dev\project1
,按一下滑鼠右鍵 並從內容選單中選擇 → 。內容對話方塊會彈出。然後前往 Subversion 標籤。在那裡,您可以設定屬性。按一下 按鈕。在屬性對話方塊中,如果 svn:externals
已經存在,請按兩下它,或者按一下 按鈕並從選單中選取 externals
。若要新增新的外部項目,請按一下 ,然後在顯示的對話方塊中填寫所需資訊。
URL 必須正確跳脫字元,否則它們將無法運作,例如,您必須將每個空格替換為 %20
。
如果您希望本機路徑包含空格或其他特殊字元,您可以將其括在雙引號中,或者您可以使用 \
(反斜線) 字元作為 Unix shell 樣式的跳脫字元,放在任何特殊字元之前。當然,這也表示您必須使用 /
(正斜線) 作為路徑分隔符號。請注意,此行為是 Subversion 1.6 中的新功能,並且不適用於較舊的用戶端。
您應該強烈考慮在所有外部項目定義中使用明確的修訂版本號碼,如上所述。這樣做表示您可以決定何時拉取外部資訊的不同快照,以及確切拉取哪個快照。除了對於不受您控制的第三方儲存庫的變更不會感到驚訝的常識性考量之外,使用明確的修訂版本號碼也表示,當您將工作副本回溯到先前的修訂版本時,您的外部項目定義也將還原為該先前修訂版本中的外觀,這反過來表示外部工作副本將更新為符合 它們 在您的儲存庫處於該先前修訂版本時的外觀。對於軟體專案而言,這可能是較舊快照的複雜程式碼庫建置成功與失敗之間的差異。
用於編輯 svn:externals
屬性的對話方塊允許您選取外部項目,並自動將它們明確設定為 HEAD 修訂版本。
如果外部專案位於同一個儲存庫中,您在那裡所做的任何變更都將包含在您提交主要專案時的提交清單中。
如果外部專案位於不同的儲存庫中,當您提交主要專案時,您對外部專案所做的任何變更都會顯示或指示,但您必須單獨提交這些外部變更。
如果您在 svn:externals
定義中使用絕對 URL,並且您必須重新定位您的工作副本 (也就是說,如果您的儲存庫的 URL 變更了),那麼您的外部項目將不會變更,並且可能不再運作。
為了避免此類問題,Subversion 用戶端 1.5 及更高版本支援相對外部 URL。支援四種指定相對 URL 的不同方法。在以下範例中,假設我們有兩個儲存庫:一個位於 http://example.com/svn/repos-1
,另一個位於 http://example.com/svn/repos-2
。我們將 http://example.com/svn/repos-1/project/trunk
的檢出放入 C:\Working
中,並且 svn:externals
屬性設定在 trunk 上。
這些 URL 始終以字串 ../
開頭,例如
../../widgets/foo common/foo-widget
這會將 http://example.com/svn/repos-1/widgets/foo
解壓縮到 C:\Working\common\foo-widget
中。
請注意,URL 是相對於具有 svn:externals
屬性的目錄的 URL,而不是相對於外部項目寫入磁碟的目錄。
這些 URL 始終以字串 ^/
開頭,例如
^/widgets/foo common/foo-widget
這會將 http://example.com/svn/repos-1/widgets/foo
解壓縮到 C:\Working\common\foo-widget
中。
您可以輕鬆地參考具有相同 SVNParentPath
(包含多個儲存庫的通用目錄) 的其他儲存庫。例如
^/../repos-2/hammers/claw common/claw-hammer
這會將 http://example.com/svn/repos-2/hammers/claw
解壓縮到 C:\Working\common\claw-hammer
中。
以字串 //
開頭的 URL 僅複製 URL 的協定部分。當必須使用不同的協定存取相同的主機名稱時,這很有用,具體取決於網路位置;例如,內部網路中的用戶端使用 http://
,而外部用戶端使用 svn+ssh://
。例如
//example.com/svn/repos-1/widgets/foo common/foo-widget
這會根據用於檢出 C:\Working
的方法,解壓縮 http://example.com/svn/repos-1/widgets/foo
或 svn+ssh://example.com/svn/repos-1/widgets/foo
。
以字串 /
開頭的 URL 複製 URL 的協定和主機名稱部分,例如
/svn/repos-1/widgets/foo common/foo-widget
這會將 http://example.com/svn/repos-1/widgets/foo
解壓縮到 C:\Working\common\foo-widget
中。但是,如果您從另一個伺服器 svn+ssh://another.mirror.net/svn/repos-1/project1/trunk
檢出您的工作副本,則外部參考將解壓縮 svn+ssh://another.mirror.net/svn/repos-1/widgets/foo
。
如果需要,您也可以為 URL 指定釘住和操作修訂版本。若要深入了解釘住和操作修訂版本,請閱讀 Subversion 書籍中 對應章節 。
如果您將外部項目的目標資料夾指定為子資料夾,如以上範例所示,請確保 所有 中間的資料夾也已版本化。因此,對於上面的範例,資料夾 common
應該要版本化!
雖然如果中間的資料夾未版本化,外部項目在大多數情況下都能正常運作,但有些操作將無法如您預期的那樣運作。而且,檔案總管中的狀態覆蓋圖示也不會顯示正確的狀態。
如果您需要更多關於 TortoiseSVN 如何處理屬性的資訊,請閱讀 名為「專案設定」的章節。
若要了解存取通用子專案的不同方法,請閱讀 名為「包含通用子專案」的章節。
從 Subversion 1.6 開始,您可以使用與資料夾相同的語法將單一檔案外部項目新增到您的工作副本。但是,有一些限制。
檔案外部項目的路徑必須是您設定 svn:externals
屬性的資料夾的直接子項。
檔案外部項目的 URL 必須與檔案外部項目將插入其中的 URL 位於相同的儲存庫中;不支援跨儲存庫檔案外部項目。
檔案外部項目的行為在許多方面都與任何其他版本化檔案相同,但它們無法使用一般指令移動或刪除;必須修改 svn:externals
屬性。