2010-12-08 15 views
8

私は水銀のことが新しく、このトピックについて多くのことを読んだことがありますが、明確な答えを見つけることができませんでした。subrepo、hgクローンとシンボリックリンク

The mercurial guide:「効率のために、ハードリンクは、ソースと宛先が同じファイルシステム上にあるときは必ずクローン作成に使用されます(これは作業ディレクトリではなくリポジトリデータにのみ適用されます)。

Repository wiki pageは言う:「リポジトリのルートでの.hgディレクトリと共存のファイルとディレクトリのすべてが作業ディレクトリに住んでいると言われています」。

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" 

は、上記の定義は、私は(1)を実行するとき、私は実際にsubrepoコピーを作成していますことを意味しています:?「リンク」私はメインのレポでsubrepoに今

、 ?または、../subrepoへのシンボリックリンクを作成していますか? lsの出力によれば、それは実際のコピーです。しかし、それは私には奇妙に聞こえる...誰かがこの問題に少しの光を当てることができたら、私は感謝します。

+1

[ハードリンクはシンボリックリンクではありません](http://linuxgazette.net/105/pitcher.html)のように、両方の単語を交換可能なものとして使用しているため、ニックピックです。違いは基本的に、ハードリンクはファイルシステム内にあり、中断することはできませんが、シンボリックリンクはパスだけを含み、他のファイルシステムを指すことができます。 Mercurialはハードリンクのみを使用します。 –

答えて

6

まず、Mercurialのその部分は、私は専門家ではありませんが、私が理解したことはここにあります。

いいえ、ディレクトリ全体へのリンクを作成していません。代わりに、ファイルは内部でハードリンクされていました。

これは、ディレクトリ構造を別に保つためにディスク上のスペースが予約されていることを意味しますが、ファイルはすべて複製されているため同一であるため、元のファイルに戻ってリンクとして構築されます。

addまたはcommitci)のコマンドを使用してリポジトリを操作すると、ハードリンクがMercurialで破損し、必要に応じて別々のファイルが作成されます。

これは純粋に技術的なものです。これについて知りたい、気にする必要はありません。それが簡単ならば、クローンを元のリポジトリの完全なコピーとみなし、ファイルとそのすべてを分離してください。ハードリンクの部分は、同じもののディスクスペースを節約することです。

典型的なプロジェクトには多くのファイルがあり、典型的なチェンジセットではいくつかのファイルしか変更されないため、クローンを作成する典型的な理由は、固定セットの変更を行うことです。ハードリンクは、リポジトリディレクトリの中では、リポジトリの存続期間中に元のものと100%同一になります。

そうでないものについては、Mercurialがそれを静かに処理します。

+0

+1内部が離れているため、クローン作成の通常の方法に従う必要があります。しかし、学習のために遊んでも大丈夫です。 – pyfunc

2

まず、サブリポジトリについて話さずにクローンを作成するときに何が起こるかを見てみましょう。あなたは

$ hg clone A B 

を行うと、その後MercurialはハードリンクA/.hg/store/data内のファイルのためのを行います。これは2つのファイル名が実際に同じファイルを参照することを意味します - だから、ファイルがxと呼ばれる場合が追跡され、その後、クローンした後、あなたは

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

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

は、ハードリンクされていることがわかります。 Lasseが指摘しているように、これは決してxクローンに変更を加えることはないので、これは理にかなっているので、ABクローンの2つの異なるx.iファイルを作る理由はありません。もう1つの利点は、特にx.iが非常に大きい場合に、ファイルをコピーするよりもハードリンクを作成する方がはるかに高速であることです。ハードリンクは一定時間の操作です。

上記の例では、mainリポジトリにサブレポートsubrepoを追加しています。サブレポジトリは、次の2つから構成されます。

  1. サブリポジトリそのもの。これを行うときに作成するもの

    $ hg clone ../subrepo 
    
  2. サブリポジトリのメタデータ。これは.hgsubファイルに格納されています。あなたは、サブリポジトリとMercurialがそれを複製できる場所をMercurialに指示する必要があります。

あなたもlsで確認したように、(複製された)、それをコピーまたはリポジトリをシンボリックリンクする場合は尋ねると、あなたは確かにコピーしました。その後、Mercurialにいくつかのメタデータを追加して、サブリポジトリがどこにあるのかが分かります。これは通常のファイルシステムの意味でのシンボリックリンクとは無関係ですが、これはMercurialのメタデータの一部です。

関連する問題