2012-10-23 11 views
7

私はに興味がある2つのシナリオがあります。Gitリポジトリとの同時操作は可能ですか?

  • リポジトリが共有され、2人のユーザーが同時にそれへの変更をプッシュしたいの
  • が、私は毎晩または毎週「GC」をスケジュールしますcronジョブを使用します。それは実行され、誰かが操作中にプッシュまたはクローンしたい。

これらのいずれのシナリオでも破損する危険性はありますか?

+0

#1の場合、別のブランチに並行してプッシュするとしているとしますか?同じブランチに同時にプッシュすると、SOのどこかで応答されます。 – cmbuckley

+0

あなたはリンクを提供できますか? – dromodel

+2

[q8424232](http:// stackoverflow。最初のpush-only-fast-forwardsがある場合は常に安全です。 [q6028141](http://stackoverflow.com/questions/6028141/concurrent-git-pull-and-push-on-same-remote-repo-from-different-locations)も興味深いかもしれません。 – cmbuckley

答えて

7

Gitでは、Pessimistic Concurrency Controlを使用して並行操作が可能です。

必要に応じて、gitはロックとして動作するいくつかの特別なファイルを作成します。

特に、操作によってインデックスが変更されるたびに、gitは.gitディレクトリにindex.lockというファイルを作成して共有リソースをロックします。 Gitは、他のロックファイルを必要に応じて作成します。たとえば、git index-pack操作中に.keepファイルが作成されます。

一般的に、gitとの同時操作は心配しないでください。gitをサポートするように注意深く設計されています。

誰かが、gcをcronジョブで実行することを心配するべきではないことが分かります。なぜなら、git自体が時々gcをトリガーするからです。これが真である場合でも、man page自体は推奨しています:

Users are encouraged to run this task on a regular basis 
within each repository to maintain good disk space utilization 
and good operating performance. 

はこのため、私はそれはgitののガベージコレクションを実行するためのジョブタスクをスケジュールするには悪いアイデアではないと思います。私はそれが時期尚早の最適化であるか、またはあなたが実際に測定された問題を解決しようとしているのか疑問に思います。私は個人的に手動でgcを実行する必要があった問題はなかったが、あなたのケースがかなり異なる場合は驚かないだろう。

2

一般に、「git gc」は、別の同時プロセス が使用しているオブジェクトへの参照を作成していないオブジェクトを削除することがあります。
Git 2.12(Q1 2017)にこれ以上のものがあります。

commit f1350d0(2016年11月15日)by Matt McCutchen (mattmccutchen)を参照してください。 (commit 979b82fJunio C Hamano -- gitster --、2017年1月10日によって吸収合併)

そしてJeff King's comment次を参照してください。

現代のgitのバージョンこれを支援するために2つのことを行う:

  • 任意のオブジェクトを(2週間以内に)「最近の」オブジェクトによって参照されるものもまた最近と考えられている。だから、あなたは木が

  • を保護されてコミット 我々はすでに オブジェクトを持っているため、オブジェクトの書き込みを行うに最適化されたときに、Gitが更新されますを参照する前であっても、ツリーを指す新しいコミット オブジェクトを作成した場合

  • それをさっぱりするファイル(緩いオブジェクトまたは パックファイル)上のmtime

これは、しかし、完璧ではありません。既存の オブジェクトを削除するときと同じように参照することができます。そして、枝刈りのプロセス自体は ではありません(ファイルシステムによって約束されているのは、 だからです)。

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

忙しいマルチユーザーサーバーの場合は、自動送信をオフにすることをお勧めします。 と「-k」を手動で再送信することをお勧めします。

git gc man pageが今含む理由である:一方

を、「git gc」は別のプロセスと同時に実行されるとき、他のプロセスが使用しているオブジェクトを削除することのリスクが あります への参照を作成していません。これにより、他のプロセスが後で 参照を削除されたオブジェクトに追加すると、他のプロセスが失敗するか、リポジトリが破損する可能性があります。 --prune日付が保たれているよりも新しい修正時刻、それから到達可能なすべてのものと一緒に と

  • 任意のオブジェクト:

    Gitは大幅にこの問題を緩和する2つの特徴を有しています。

  • データベースにオブジェクトを追加するほとんどの操作では、オブジェクトの更新時間が に更新されていれば、オブジェクトが既に存在する場合は#1 に更新されます。 実行が同時にコマンドをユーザーが自動ゴミをオフにしない限り( が実際には低いように思わ)腐敗のいくつかのリスクと一緒に暮らす必要がありますので

はしかし、これらの機能は、完全なソリューションの及ばない コレクションは 'git config gc.auto 0'となります。

関連する問題