13

私が興味を持っているシナリオは2つあります。

  • リポジトリは共有されており、2人のユーザーが同時にリポジトリに変更をプッシュしたい
  • cronジョブを使用して、夜間または毎週の「gc」をスケジュールしたいと思います。実行され、操作中に誰かがプッシュまたはクローンを作成したいと考えています。

これらのシナリオのいずれかで破損のリスクはありますか?

4

2 に答える 2

3

一般に、" git gc" は、別の並行プロセスが使用しているが参照を作成していないオブジェクトを削除する場合があります。
Git 2.12 (2017 年第 1 四半期) には、これに関する詳細が含まれています。

Matt McCutchen ( )によるコミット f1350d0 (2016 年 11 月 15 日)を参照してください。( 2017 年 1 月 10 日コミット 979b82fJunio C Hamanoによってマージされました)mattmccutchen
gitster

Jeff King のコメントを参照してください。

最新バージョンの git は、これを支援するために 2 つのことを行います。

  • 「最近」のオブジェクト (2 週間以内) によって参照されるオブジェクトも、最近のものと見なされます。したがって、ツリーを指す新しいコミット オブジェクトを作成すると、コミットを参照する前であっても、そのツリーは保護されます。

  • オブジェクトが既にあるためにオブジェクトの書き込みが最適化されている場合、git はファイル (loose オブジェクトまたは packfile) の mtime を更新して更新します。

ただし、これは完全ではありません。削除中の既存のオブジェクトを参照することを決定できます。また、プルーニング プロセス自体はアトミックではありません (ファイルシステムで約束されているという理由だけで、そうするのは難しいです)。

長時間実行されるデータ (文字通り数日または数週間存在する可能性のある一時インデックス ファイルなど) がある場合、それは潜在的な問題だと思います。そして解決策は、おそらく何らかの方法で参照を使用してオブジェクトを指すことです。
誰かがたまたまgit-gc同時に実行している短期的な操作について心配している場合は、それが問題になる可能性があることに同意しますが、実際には無視できる何かがあると思います。

ビジーなマルチユーザー サーバーの場合は、auto-gc を完全にオフに-kして、安全のために " " を手動で再パックすることをお勧めします。

これが、git gcman ページに以下が含まれるようになった理由です。

一方、' git gc' が別のプロセスと同時に実行される場合、他のプロセスが使用しているが参照を作成していないオブジェクトを削除するリスクがあります。これにより、他のプロセスが失敗したり、他のプロセスが後で削除されたオブジェクトへの参照を追加した場合にリポジトリが破損したりする可能性があります。

Git には、この問題を大幅に軽減する 2 つの機能があります。

  • 日付よりも新しい変更時刻を持つオブジェクトは--prune、そこから到達可能なすべてのものとともに保持されます。

  • オブジェクトをデータベースに追加するほとんどの操作では、オブジェクトがすでに存在する場合はオブジェクトの変更時刻を更新するため、#1 が適用されます。

ただし、これらの機能は完全な解決策にはほど遠いため、コマンドを同時に実行するユーザーは、「git config gc.auto 0」で自動ガベージ コレクションをオフにしない限り、破損のリスクを覚悟しなければなりません (実際には低いと思われます)。 .


「自動ガベージをオフにしない限り」を含む最後の文に注意してください:Git 2.22(2019年第2四半期)はgcドキュメントを修正します。

コミット0044F77、コミットDAECBF2コミット7384504 コミット22D4E3Bコミット080A448、54D56F5のコミット、 D257E0Fのコミット、B6A8D09コミット(2019年07)、およびFC559FBコミットCF9CD77コミットB6A8D09を参照してください。 . ( 2019 年 4 月 25 日コミット ac70c53Junio C Hamanoによってマージされました)avar
gitster

gcdocs: への誤った参照を削除gc.auto=0

" " が原因でリポジトリが破損する可能性は、gcその "gc" が " gc --auto" を介して呼び出されたかどうかとは関係ありませんが、他の同時操作が発生しているかどうかには関係ありません。

これは、段落の前半で既に述べているので、ここでこれを提案する理由はありません。gcユーザーは、ドキュメントの残りの部分から、 が設定されていない限り " " が自動的に実行されることを推測できます。また、 " " は通常の " " よりも何らかの形で破損しやすいとgc.auto=0ほのめかして、この問題を混同すべきではありません。gc --autogc

そうですね、ブロック " " すると、そのgc特定の端末ウィンドウで他の操作を行うことができなくなるという意味ではありますが、ユーザーは別のウィンドウを持っている可能性が高く、サーバー上での同時 " " 処理が破損を引き起こす可能性があることを心配する可能性があります。gc

于 2017-01-15T17:55:08.693 に答える