Mercurialでリポジトリを複製する際のハードリンク

コマンドを使用してリポジトリを複製する場合
hg clone AB
      
      



mercurialはまず、新しいリポジトリの.hgフォルダー内のファイルのハードリンクを作成しようとします。 これにより、クローン作成が高速化され、ハードディスクのスペースが節約されます。



ハードリンクは、LinuxおよびWindows NTFSファイルシステムでサポートされています。 ハードリンク(Windows FATなど)をサポートしていないファイルシステムの場合、およびリモートサーバーからhttp / httpsまたはsshを使用してクローンを作成する場合、mercurialはすべてのファイルを完全にコピーします。



mercurialが独立したリポジトリクローンを作成するために、手動で--pullパラメーターを指定できます。

 hg clone --pull AB
      
      





変更をリポジトリにコミットまたはプッシュするとき、mercurialは.hgフォルダー内の各ファイルのハードリンクの数をチェックします。 2つ以上のリンクがある場合、このファイルのハードリンクを書き込む前に「壊れる」(ハードリンクを持つXXXファイルが一時ファイルにコピーされ、XXXファイルが削除され、一時ファイルの名前がXXXに変更されます)。



Windows共有でのクローン作成


Windowsを実行しているコンピューターでは、共有リソースにあるファイルへのハードリンクの数を受け取ると、実際にはさらに多くのハードリンクがあっても、常に1が返されます。



これは、共有リソース上にあるリポジトリにコミットするときに水銀が、ファイルがリポジトリのファイルに緊密にリンクされている他のリポジトリを破壊する可能性があることを意味します。 さらに、コミット時に、エラーメッセージは表示されません。これは、コミットが行われたリポジトリがそのまま残るためです。 次のコマンドでリポジトリを確認できます
 hg verify
      
      





ここでは、バージョン1.6.3以降、このような状況を防ぐために、mercurialはリポジトリがWindows共有上にある場合にコミットするときに常にハードリンクをコミットすると述べています。



現在、バージョン2.2.1がありますが、共有リソースのリポジトリにコミットすると、それに関連付けられている他のリポジトリはまだ壊れています。 この問題は、--pullオプションを使用してすべてのリポジトリを複製した後にのみ解決されました。



この動作には、デフォルトでいくつかの魔法があります。そのため、私が首尾よくつかんだ頭痛の種のいくつかをつかむことができます。 したがって、私はこの情報をここに転送することにしました。 誰かが時間と神経を節約することを願っています。



オリジナル: http : //mercurial.selenic.com/wiki/HardlinkedClones

破損したリポジトリの回復: http : //mercurial.selenic.com/wiki/RepositoryCorruption



All Articles