
インターネット接続が悪い場所に大規模なデータセットAとBの2つのレプリカがあるとします。経験的に、メタデータは転送できますが、実際のファイルデータは転送できないと仮定しますが、完全なオフラインソリューションがより優れています。コピーの1つはデフォルトのコピーで、もう1つは半定期的に更新する必要があるバックアップです。
2つのデータセットを同期する方法は...昔ながらです。誰かが更新する必要があるファイルを外部ドライブにコピーし、AからBに物理的に移動し、別のコピーからファイルを更新します。しかし、特にファイル破損などのエラー状況では、どのファイルを転送する必要があるかを追跡することがますます困難になっています。
外付けドライブにデータセットの完全なコピーを保存することは、容量より少なくとも1段階大きいため、非現実的です。一般的なファイルサイズは数ギガバイトであり、近い将来、データセット全体を数十テラバイト未満に増やすべきではありません。一般的な更新はファイルの追加であり、既存のファイルの更新と削除は非常にまれです。
最も重要なのは、保存されるバイトです。一貫性のないタイムスタンプやファイル権限は気にしません。
コピーBのファイルチェックサムをポータブルドライブに手動で保存し、コピーAで不一致を確認できます。しかし、私と同様のユースケースをサポートする成熟したツールはありますか?
ありがとうございます!
答え1
rsync(1) を見てください。これはこの種の作業のために設計されています。
diff(1)/patch(1)(または違いツール)変更がローカライズされたことがわかっている場合。
データの構造と変更を理解すると、いくつかのプロのツールを見つけることができます。しかし、これはより多くの作業で脆弱であり、変化に応じて成長しません。
ディレクトリがほとんどのテキストファイルの場合は、それをgit(1)リポジトリに設定し、そこからインポートするのも実用的なソリューションです(変更を効率的にインポートして統合するために最適化されています)。
答え2
gitパッチファイルを見ましたか? AとBの両方がgitリポジトリの場合は、作成したgitパッチファイルを外部ドライブにコピーしてバックアップ場所に適用します。
買戻契約 A:
commit 090d683743b24d4fd93cdf2c1fc3fe3613443be0 (HEAD -> master)
Author: somebody <[email protected]>
Date: Thu Jun 20 19:01:14 2019 -0400
added my love for bananas
commit b58c37b8479ce188c896719336a456d168c56ea9
Author: somebody <[email protected]>
Date: Thu Jun 20 18:57:57 2019 -0400
initial commit
買戻契約 B:
commit b58c37b8479ce188c896719336a456d168c56ea9 (HEAD -> master, origin/master, origin/HEAD)
Author: somebody <[email protected]>
Date: Thu Jun 20 18:57:57 2019 -0400
initial commit
gitを使ってパッチファイルを作成できるようになりました。
git diff -p commit_old commit_new > /external_drive/patch.diff
ストレージBでは:
変更を表示するには:
git apply --stat patch.diff
変更を適用するには:
git apply patch.diff
変更を追加してコミットします。
git add -A
git commit -m "added my love for bananas to this directory"
新しいコミットを見る:
git log
commit 4122e3deca160a9167fb54456bb688394aa5dcff (HEAD -> master)
Author: somebody <[email protected]>
Date: Thu Jun 20 19:10:19 2019 -0400
added my love for bananas to this directory
commit b58c37b8479ce188c896719336a456d168c56ea9 (origin/master, origin/HEAD)
Author: somebody <[email protected]>
Date: Thu Jun 20 18:57:57 2019 -0400
initial commit