1

に Mercurial リポジトリがありますc:\Dropbox\code。以下を使用して、このレポのクローンをローカルに作成しました。

hg clone -U c:\Dropbox\code c:\GoogleDrive\codeBackup

このベア リポジトリは、バックアップのみを目的としています。私は定期的に変更を codeBackup にプッシュしています。さらに、両方のディレクトリがクラウド (それぞれ Dropbox と Google ドライブ) にバックアップされます。

codeクローン操作で元のリポジトリへのハードリンクが使用されたため、リポジトリが破損した場合、リポジトリはcodeBackup自動的に破損しますか? したがって、私のダブル クラウド バックアップ戦略は役に立たないのでしょうか?

PS : フォールバック オプションは、クラウド サービスを使用して以前の既知の良好な状態を復元することであることを理解しています。


更新:掘り下げた後、参考のためにこれらを追加します

問題は、'hg clone' が (--pull オプションなしで) 実行された場合、ファイルシステムがハードリンク機能を提供している場合 (NTFS が提供する)、ハードリンク1を使用して、宛先とソースのリポジトリが .hg/store 内のファイルを共有することです。 .

Mercurial は、クローンの 1 つに対してコミットまたはプッシュが行われると、.hg 内のそのようなハードリンクを解除するように設計されています。このための前提条件は、mercurial が「このファイルにはいくつのハードリンクがありますか?」と尋ねる場合、mercurial が使用している Windows API が正しい答えを返すことです。

hg プロセスが 1 つの Windows コンピューターで実行されていて、リポジトリ ファイルが別の Windows コンピューターのネットワーク共有にある場合、この回答はほとんど常に間違っていることがわかりました (実際には 1 より大きい場合でも、常に 1 と報告されます)。

  • ハードリンクを回避するには (--pull を使用):

    hg clone -U --pull c:\Dropbox\code c:\GoogleDrive\codeBackup

  • ハードリンクを確認するには:

    fsutil hardlink list <file>: のすべてのハードリンクを表示します<file>

    find . -links +1: ハードリンクが 1 を超えるすべてのファイルを表示します

    ls -l: 各ファイルの横にハードリンク数を表示

4

2 に答える 2

1

リポジトリが破損する唯一の方法はcode(最初に にクローンを作成したときに破損していないと仮定してcodeBackup) 、コミット、履歴の書き換えなど、何かを書き込むときです。ハードリンクされたファイルに何かが書き込まれるたびに、 Mercurial は最初にハード リンクを解除し、ファイルの独立したコピーを作成してから、その新しく作成されたコピーのみを変更します。

あなたの質問に答えるために: 通常の使用シナリオでは、リポジトリの破損はリポジトリに伝播しませんcodeBackup

于 2013-07-01T09:44:16.910 に答える