git annex - 2 つのリポジトリがまったく同一であることを確認する方法

git annex - 2 つのリポジトリがまったく同一であることを確認する方法

別の git annex リポジトリからコンテンツを複製、同期、取得するときに、同一のミラーが設定されていることを確認するにはどうすればよいですか?

以前、ファイル間の比較を行う unison のようなツールを使用したことがありますが、これには時間とメモリの消費量が多くかかります。

健全性チェックを実行するための他の方法はありますか? この主な動機は、既存のリポジトリのクローンを作成したばかりで、サイズが小さいことです。古いリポジトリには未使用または参照されていないオブジェクトがあるため、サイズが小さくなると予想していましたが、サイズがかなり異なります。

そこで、実行できるチェックをいくつか用意したいと思います。

答え1

git fsckGitには、git メタデータ構造の一般的な問題を指摘するサニティ チェック ( ) が組み込まれています。またgit gc、ダングリングやその他の不要なものを削除するガベージ コレクター ( ) もあります。

データの整合性については、基本的にこれは git によって提供される保証であり、入力したデータが出力されるデータです。git log(または最後のコミットのハッシュだけ) が同一であれば、データも同一です。git のすべてのステップは、データ、メタデータ、および以前のものに対してチェックサムが計算されます。これはブロックチェーンのようなもので、データがどこかで変更されると、チェックサムも変更されます。チェックサムが一致しない場合、git はチェックアウト時に多くのエラーを出力します。

Linus Torvalds が Git について語った古い (2007-2008?) 講演を YouTube で視聴できます。そこでは、データの整合性についても話していたと思います。また、ここにドキュメントもあります。https://git-scm.com/book/en/Git-内部-Git-オブジェクト

実際には、git が魔法のように処理してくれるので、人々はこれについて心配する必要はありません。元の状態を維持するために変更をプル/プッシュ/コミットする必要があるかどうかを確認するには、「git status」を実行するだけです。

追加のスペースの使用には他の理由もあります...git stash一度でも使用した場合、スペースを大量に消費する可能性があります。

これは、クローンされたリポジトリに違いがある場所でもあります。git はコミットされなかったローカルの内容には関心がありません。コミットされていない場合は、クローンに関する限り存在しません。

答え2

以下の操作を実行して、git annex が期待どおりに動作することを確認しました。

  1. .git の内容を含む、ソートされた一意のファイル リストを取得します (これにより、git の付録の内容がすべて揃うことが保証されます)
  2. .git コンテンツを含む、ソートされた一意のリンク リストを取得します (これにより、同じリポジトリ構造が確保されます)
  3. ファイルリストを比較します。annex/transfer ディレクトリは無視します。git オブジェクトは異なる場合がありますが、git annex の内容は同一である必要があります。
  4. リンクリストを比較すると、同一である必要があります
  5. git annex fsck を実行するか、すべてのファイルのチェックサムを比較します (これはファイル システムの問題です)

これは機能しますが、少し手間と時間がかかります。さらに、部分的なコピーのみのミラーがあると、プロセスがさらに複雑になる可能性があります。これらのミラーでは、期待するコンテンツのみを比較する必要があります。

関連情報