2016-04-05 19 views
1

私は現在、多くのユーザーがおり、参照されたレポが自動的に(頻繁に)更新されるときにgit clone --referenceを最適化として使用するのが安全かどうかを調査中です。Gitクローン - 参照と同時更新

主なリポジトリが離れているため(ゆっくりと)多数の大きなリポジトリを使用する多くのユーザーが1台のサーバーにいるという計画です。

初期クローン速度とサーバーディスク領域の両方を最適化するために、ユーザーはgit clone --reference /home/robot/repo.git <repo>のクローンスクリプトを使用して、ほとんどのデータを共有します。

"ロボット"ユーザーは、cronジョブで頻繁にgit fetch操作を実行します。

Gitリポジトリへの同時アクセスは、同じユーザが所有していても、ディレクトリが書き込み可能な場合でも安全ですが、この場合、参照リポジトリは読み取り専用ですユーザーはロックファイルをそこに書き込むことができません。

私の質問は、「ロボット」レポが他のユーザーがリポジトリにアクセスしている間にfetch/gc/repackを実行するとどうなりますか?遠隔レポからのフェッチへのクローン/フェッチ/プルフォールバックをゆっくりと行いますか?ログ/チェックアウト/リベースなどの他のコマンドは失敗しますか?ユーザーリポジトリで破損が発生する可能性がありますか?

注:

  • 私はそれを読むために開始さ前に、ユーザー・プロセスは、レポがロックされているかどうかを確認することができます確信しています。私はの間に書き込み操作について質問しています。の読み取り中です。
  • ドキュメントでは、ガベージコレクトが参照されたクローンを壊す可能性があることを認識していますが、この場合は早送りの更新のみが行われるため、削除されることはありません。
  • 私はドキュメントを見てきましたが、 "concurrent"という単語は表示されませんので、私はその件に関する公式声明を見つけるのに苦労しています。
  • このサイトのその他のほとんどの質問は、同時プル、プッシュ、フェッチに関するものです。その場合、これらの操作はアトミック(参照が変更されているか、変更されていない)なので安全です。パックされたオブジェクトファイルへの継続的なアクセスが必要となるため、共有または参照されたクローンの場合はあまり明らかではないようです。
  • あなたはかなり複雑なの束のために安全だなど、

答えて

1

これは、ローカルファイルシステムを使用してLinuxシステム上でれないので、ネットワークの問題が存在しない、とOSのサポートにはバリエーション、異なるGitのバージョン理由。

基本的には、(--dissociateなし)--referenceクローニング:それぞれについて、

  • .git/objects/info/alternatesへの参照へのパスを書き込む(the gitrepository-layout documentationを参照)
  • は、それが "欲しい" と言うことを約ですいるIDをコミットは、に見えますそのオブジェクトを見つけることができるかどうかを確認します。

これが発生している間、何らかの種類のアップデートが代替製品に起こっているとします。あなたのクローンはハッシュ値を持っていて、質問に答える過程にあります: "このオブジェクトは代用品ですか?"

答えが「いいえ」であると仮定すると、代わりに元のオブジェクトからオブジェクトが取得され、そのオブジェクトは永遠に保持されます(または後で必要がなくなるまでのいずれか早いほうまで)。 。この場合、あなたは大丈夫です

は、それが答えは見つかったことを代わりに仮定の2つの可能性がある「はい、オブジェクトが代替である。」:

  • オブジェクトが緩いオブジェクトとして保存されている、または
  • オブジェクトはパック内にあります。

nowのオブジェクトが緩んでいるが、パックされている間に、オブジェクトはすぐにパックに表示され、その後、緩いオブジェクトはリンク解除されます。参照gitリポジトリは、パックが安定したストレージに完全に書き込まれるまで、緩いオブジェクトのリンクを解除しません。したがって、このシーケンスの途中でクローンが終了し、オブジェクトが必要な別のgitコマンドを実行しても、緩いオブジェクトが見つかるか、パックが見つかります。

  • ルーズオブジェクトが見つかった場合は、そのファイルを開いてください。これは、参照リポジトリのgitコマンドがファイルのリンクを解除すると、あなたのgitはすでにそれを開いていて、それを使用できることを意味します。

  • gitがパック内のオブジェクトを検出した場合は、pack-fileを開いてそのオブジェクトを探します。つまり、pack-fileが再パックされ、削除(リンク解除)されている場合、gitは既に開いていて、それを使用することができます。パックファイルは自己完結型なので、で十分です。あなたはドキュメントがについて警告するものである、への参照リポジトリは(gcまたは類似経由)オブジェクトを削除することができた場合

これのいずれかがうまくいかないだけです。あなたがオブジェクトを開いている(ゆるやかなフォームまたはパックされたフォームで)場合はOKですが、一旦それがなくなると、の後にが見つかりません。

これはすべて、ファイルを削除してもファイルを保持しているOSに依存します。一部のファイルシステム( NFS )は正しく動作するとは限りません。また、あらゆる種類のリモートのファイルシステム(Dropboxなど)も問題を引き起こす可能性があります。あなたがローカルのファイルシステムに固執していれば、あなたのハードウェアは失敗しません。とにかくここに表示されていない "シンパック" を除き


+0

ありがとうございます。私が理解している重要な点は、オブジェクトがそこに2回あるかもしれないが、決してそこにはないことであり、パックファイルは原子的に作成されるということです。これは安心です。 :-) – ams

+0

彼らは本当に原子的ではありませんが、それらは*原子性をシミュレートします(私は最近、参照用クローンを使用するように$作業を確信していますので、まだ多くの経験はありませんが、 。 – torek

+0

ファイルを側面に作成し、それを位置に移動することは、ファイルシステムでは不可能です。私はそれを取る。 – ams