2009-04-15 19 views
44

(Windows)ネットワーク共有に裸のgitリポジトリを格納したいと考えています。私はLinuxを使用し、上記のネットワーク共有をCIFSでマウントしています。私の同僚はWindows xpを使用し、ネットワークドライブとしてネットワーク共有を(何とかActiveDirectoryから)オートマウントしています。ネットワーク共有フォルダのGITリポジトリでの並行性

両方のコンピュータからリポジトリを使用できるかどうかは、並行性の問題はありません。

私はすでにテストしましたが、私の最終的にはクローンOKですが、同じリポジトリ(プッシュ/プル)に同時にアクセスすると何が起きるか心配です。

git FAQには、ネットワークファイルシステム(およびSMBFSのいくつかの問題)に関するリファレンスがありますが、network/server/windows/linuxでロックされているファイルがあるかどうかはわかりません。確かにそこにはないと確信している。

だから、誰もサーバーを使わずにネットワーク共有にgit repoを使用しても問題はありませんか?私は株式を持つサーバへのアクセスを持っていないので、私はhttpサーバ(またはのgit - デーモン)を使用しないようにしたい:


アレックス

PS、ありがとうございます。また、私はちょうど私たちが1つから別のものにプッシュ/プルできることを知っていますが、バックアップのためにシェア上にコード/レポを持つ必要があります。

更新:

私の心配は、ネットワーク障害の可能性についてではありません。それでも、私たちは必要なブランチをローカルに持ち、ソースをコンパイルすることができます。

しかし、私たちは通常、頻繁にコミットし、頻繁にリベース/マージする必要があります。私の観点からは、最良の選択肢は共有上に中央リポジトリを置くことです(バックアップが保証されるので)、私たちはそれを複製してリベースすることになります。

しかし、私たちはこれを頻繁に行っているため、ファイル/ repo破損を恐れています。通常、私たちはをリモートリポジトリにアクセスするたびにお互いに照合することができます:)しかし、それはコンピュータ/ネットワークによって保護される方が良いでしょう。

GITにはこれを行うための内部メカニズムがあります(誰かがあなたのリポジトリの1つに移動することができるので、あなたがそれに取り組んでいる可能性があります)が、決定的なものはまだ見つかりませんでした。

アップデート2:

レポ共有ドライブには、作業コピーを含有しない、レポだろう。

+3

アレックスの質問ありがとう、私は同様の状況に直面しており、これは非常に有用だった。追加するポイントがいくつかあります:WindowsとLinuxのexeはネットワーク共有上で同じベアレポに対応し、理論的にはバージョン間にいくつかの違いがある可能性があるため、両方ともgitの同じバージョンを使用していることを確認する必要があります。おそらくあなたが念頭に置いておく必要がある旗だけではないでしょう。 –

+0

も参照してください:http://stackoverflow.com/questions/1489542/are-there-any-concurrency-issues-in-backing-up-git –

+0

同時ユーザー数を1に制限すると便利ですフォルダの先進的な共有オプション – Omar

答えて

39

Gitは、ネットワークファイルシステム上でこの種の共有リソースを使用するときの問題の主な原因と思われる最小のファイルロックを必要とします。 Gitリポジトリのファイルのほとんどは---オブジェクトデータベースを構成するすべてのもの---その内容のダイジェストと呼ばれ、いったん作成されると不変であるということです。したがって、異なるコンテンツに対して同じファイルを使用しようとする2人のクライアントの問題は発生しません。

オブジェクトデータベースの他の部分は手間がかかります。refsは "refs"ディレクトリ(または "packed-refs")の下のファイルに格納され、これらは変更されます。refs/*ファイルは小さく、常に書き直されます編集するよりもむしろ。この場合、Gitは新しいrefを一時的な ".lock"ファイルに書き込み、それをターゲットファイルの名前に変更します。ファイルシステムがO_EXCLセマンティクスを尊重すれば、それは安全です。もしそうでないとしても、起こりうる最悪の事態は、refファイルを上書きするレースでしょう。これは遭遇するのは面倒ですが、それは腐敗を引き起こしてはいけません。あなたが共有しているリポジトリにプッシュする場合があります。そのプッシュは成功したように見えますが、実際には誰かが行ったのと同じです。しかし、これは単純に(他の人のコミットをマージして)再度プッシュすることでソートできます。

要約すれば、私はrepoの破損がここではあまり問題にはならないと思います---ロック問題のために物事が少し間違っているかもしれませんが、Git repoのデザインは損傷を最小限に抑えます。どうやら中央Gitのリポジトリを使用して

+0

ありがとう!私が探していたこのような説明のために。私は試してみて、何か悪いことが起きたかどうかを見てみましょう。私はこの質問を更新します。 素敵な一日を! – Alex

+0

URLを提供することができますか、これについて詳しく説明していますか?本当に面白い – knocte

7

なぜ気になるのですか? Gitは配布されるように設計されています。各マシンにリポジトリを用意して、publishとpullのメカニズムを使って変更をその間に伝播してください。

バックアップの目的で、夜間タスクを実行して、リポジトリを共有にコピーします。

または、共有上にそれぞれ1つのリポジトリを作成して作業しますが、それらを相互にチェンジセットを取得できる分散リポジトリとして使用します。この方法を使用すると、ネットワーク経由で常時アクセスするため、ビルドなどのパフォーマンスが低下します。

または、自分のコンピュータに分散リポジトリを配置し、コミットを共有上のリポジトリにプッシュする定期的なタスクを実行します。

+0

alexandreiからの本当の質問は、分散した性質に関するものではないが、CIFS/windows共有の失敗(マウントの問題、切断など)によってプッシュが失敗するとどうなるか –

+0

ポイントは、心配するのはなぜですか? gitを設計した方法でgitを使うだけでいいのではありません。 –

+0

ここでの最後の指針は、質問に非常にエレガントに答えてくれると思います。それぞれのコンピュータのレポが異なる時間に自動的に共有にプッシュされるようにしてください。 – supercheetah

-2

ちょうど集中型バージョニングシステムを使用したいと思っているように聞こえるので、バックアップのためのクエリが成立します。 おそらくxxx2gitを使ってローカルで作業することができます。

+0

これは私たちが現在やっていることです。その間にSVNがありますが、それは同じ問題です。サーバもなく、ファイルベースでも使用しています。これがGITに切り替える理由の1つでした(同じワークコピーの異なるブランチ間を切り替えるために、私たちの仕事によく合っているという事実) – Alex

5

(このすべては、理論的には良い音が、私はそれをテストするためにレポのいずれかの同時ハンマリングを行っていませんでした、とだけNFS上でCIFSをしていない共有免責事項)サポートされています。ほとんどの処方箋は、sshまたはhttpアクセスを示し、どちらもリポジトリへの同時アクセスを避けていません。完全に分散して使用している場合でも、2人以上の共同作業者が同じレポにどこかを押し込むと、この問題が発生します。これまでのところ、答えは答えられていません。 gitの設計はブランチへの同時N個のプッシュを処理することを可能にしますか?

関連する問題