2010-12-08 89 views
8

我對mercurial很新,我在這個主題上看了很多,但我一直無法找到明確的答案。subrepo,hg克隆和符號鏈接

The mercurial guide說:「爲了提高效率,只要源和目標位於同一文件系統上,就使用硬鏈接進行克隆(注意,這僅適用於存儲庫數據,而不適用於工作目錄)。」

Repository wiki page說:「所有與存儲庫根目錄中的.hg目錄共存的文件和目錄被稱爲存在於工作目錄中」。

現在,「連接」一subrepo在主回購我做的:

hg init main 
cd main 
echo subrepo = ../subrepo > .hgsub 
hg clone ../subrepo subrepo   # (1) 
hg add 
hg ci -m "initial rev of the main repo" 

請問上述定義意味着我居然創造了副本subrepo當我執行(1)? ?或者我創建一個符號鏈接到../subrepo?根據ls的輸出,它是一個實際的副本。但對我來說這聽起來很奇怪......如果有人可以在這個問題上談一談,我會很感激。

+1

只是一個挑逗,因爲你使用了兩個詞,就好像它們可以互換:[硬鏈接不是符號鏈接](http://linuxgazette.net/105/pitcher.html)。區別基本上是硬鏈接在文件系統中,不能中斷,而符號鏈接只包含路徑並可指向其他文件系統。 Mercurial只使用硬鏈接。 – 2010-12-08 21:33:01

回答

6

首先,Mercurial的那部分,我不是專家,但這是我的理解。

不,你沒有創建一個鏈接到整個目錄。相反,文件被硬鏈接在裏面。

這意味着磁盤上的空間是保留的,以保持您的目錄結構獨立,但文件完全相同,因爲它們只是被克隆,所以它們被構造爲鏈接回原始。

當您開始操作存儲庫時,通過您的addcommitci)命令,Mercurial將斷開硬鏈接,併爲每個按需構建單獨的文件。

現在,這純粹是一個技術性的東西,你不需要知道或關心這一點。如果它更容易,只需將克隆視爲原始存儲庫的完整副本,單獨的文件以及所有這些。硬鏈接部分只是爲了節省磁盤空間的東西是相同的。

由於一個典型的項目有很多文件,而一個典型的changeset只會改變一些文件,而克隆的一個典型原因是你要做一組固定的修改,所以hardlinks很有意義,因爲很多文件在版本庫目錄中將與版本庫的生命週期中的原始版本完全相同。

對於那些不是,所有這些都由Mercurial爲您默默處理。

+0

+1內部分開,應該遵循正常的克隆實踐。儘管爲了學習的目的而玩耍也沒關係。 – pyfunc 2010-12-08 18:55:37

2

讓我們先看看克隆時會發生什麼,而不討論子庫。當你做

$ hg clone A B 

則水銀會令硬鏈接爲內部A/.hg/store/data的文件。所以,如果一個名爲x文件被跟蹤,然後克隆後,你會看到,

A/.hg/store/data/x.i 

B/.hg/store/data/x.i 

是硬鏈接 - 這意味着兩個文件名確指的相同的文件。正如Lasse指出的那樣,這很明智,因爲您可能永遠不會對x克隆進行更改,所以沒有理由爲AB克隆創建兩個不同的x.i文件。另一個優點是,製作硬鏈接比複製文件要快得多,特別是如果x.i非常大:硬鏈接是一個恆定的時間操作。

在上面的示例中,您要爲main存儲庫添加子庫subrepo。子庫由兩部分組成:

  1. 子庫本身。這是你在創建時所創建的

    $ hg clone ../subrepo 
    
  2. subrepository元數據。這是您存儲在.hgsub文件中的內容。您必須告訴Mercurial您想要subrepository的位置以及Mercurial可以從哪裏進行克隆。

你問,如果你複製或符號鏈接庫,你肯定複製(克隆)它,你也有ls證實。之後,您向Mercurial添加了一些元數據,告訴它它可以在哪裏找到子庫。這與正常文件系統意義上的符號鏈接無關,它只是Mercurial的一些元數據。