手冊

外部項目

有時候,建構一個由多個不同檢出的工作副本組成的副本會很有用。例如,您可能希望不同的檔案或子目錄來自儲存庫中的不同位置,或者甚至來自完全不同的儲存庫。如果您希望每位使用者都擁有相同的佈局,您可以定義 svn:externals 屬性,以便在需要它們的位置拉取指定的資源。

外部資料夾

假設您將 /project1 的工作副本檢出到 D:\dev\project1。選取資料夾 D:\dev\project1按一下滑鼠右鍵 並從內容選單中選擇 Windows 選單內容。內容對話方塊會彈出。然後前往 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/foosvn+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 屬性。

透過拖放建立外部項目

如果您已經擁有想要作為外部項目包含在另一個工作副本中的檔案或資料夾的工作副本,您可以簡單地透過從 Windows 檔案總管拖放來新增這些項目。

只需將檔案或資料夾從一個工作副本 按一下滑鼠右鍵並拖曳 到您希望將其作為外部項目包含的位置。當您放開滑鼠按鈕時,會出現一個內容選單:如果您按一下該內容選單項目 SVN 在此新增為外部項目,則會自動新增 svn:externals 屬性。之後您所要做的就是提交屬性變更並更新,以取得正確包含在您的工作副本中的那些外部項目。

TortoiseSVN 首頁