
ホストAとBの2つがあります。
A は Git を提供し、B からプッシュされた rev を受け取ります。
B は、自分で引っ張らない限り、押すだけで受け取ることはありません。
同時操作の心配がないため、B を GC またはプルーニング リビジョンに設定できますが、A が GC またはプルーニングを実行している間に、B が A にリビジョンをプッシュすることはできますか? 何が起きますか?
基本的に知りたいのは、GC またはプルーンを実行するときに A の通信を破棄する必要があるかどうか、またはその必要がないかどうかです。
答え1
Git GCのマニュアルページ州:
git gc が別のプロセスと同時に実行されると、別のプロセスが使用しているが参照を作成していないオブジェクトが削除されるリスクがあります。これにより、別のプロセスが失敗するか、別のプロセスが後で削除されたオブジェクトへの参照を追加した場合にリポジトリが破損する可能性があります。Git には、この問題を大幅に軽減する 2 つの機能があります。
--prune の日付より新しい変更時刻を持つオブジェクトと、そこからアクセス可能なすべてのものが保持されます。
データベースにオブジェクトを追加するほとんどの操作では、オブジェクトが既に存在する場合はその変更時刻が更新されるため、#1 が適用されます。
ただし、これらの機能は完全なソリューションには至っていないため、コマンドを同時に実行するユーザーは破損のリスクをある程度受け入れる必要があります (実際にはリスクは低いようです)。
そしてさらに:
--prune=<date>
日付より古いルーズ オブジェクトを削除します (デフォルトは 2 週間前ですが、設定変数 gc.pruneExpire で上書きできます)。
--prune=now
ルーズ オブジェクトは、その古さに関係なく削除されます。また、別のプロセスがリポジトリに同時に書き込んでいる場合は破損のリスクが高まります。以下の「注意」を参照してください。--prune はデフォルトでオンになっています。
つまり、リスクはあります。ただし、A と B のクロックがほぼ同期していて、リポジトリに適用する Git コマンドが完了するまでに 2 週間以上かからない場合は、同じリポジトリへの同時プッシュと GC のリスクは許容できるものと考えます。