web-dev-qa-db-ja.com

ネットワーク共有フォルダーのGITリポジトリでの同時実行性

裸のgitリポジトリを(Windows)ネットワーク共有に保存したい。私はLinuxを使用しており、前述のネットワーク共有をCIFSでマウントしています。私の同僚はWindowsXPを使用しており、ネットワーク共有をネットワークドライブとして(ActiveDirectoryから)自動マウントしています。

同時実行の問題なしに、両方のコンピューターからリポジトリを使用できるかどうか疑問に思います。

私はすでにテストを行っており、私の側ではクローンを作成できますが、両方が同じリポジトリ(プッシュ/プル)に同時にアクセスするとどうなるか心配です。

Git FAQ)には、ネットワークファイルシステムの使用(およびSMBFSに関するいくつかの問題)に関する参照がありますが、network/server/windows /によってファイルロックが行われているかどうかはわかりません。 linux-ないだろうと確信しています。

では、サーバーなしで、問題なく、ネットワーク共有でgitリポジトリを使用した人はいますか?

ありがとうございました、
アレックス

PS:共有を使用してサーバーにアクセスできないため、httpサーバー(またはgit-daemon)の使用は避けたいと思います。また、あるものから別のものにプッシュ/プルするだけでよいことは知っていますが、バックアップ上の理由から、共有にコード/リポジトリを用意する必要があります。

更新:

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

しかし、私たちは通常かなり頻繁にコミットし、頻繁にリベース/マージする必要があります。私の見解では、最良のオプションは共有に中央リポジトリを配置することであり(バックアップが保証されるように)、両方がそのリポジトリからクローンを作成し、それを使用してリベースします。

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

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

アップデート2:

共有ドライブのリポジトリは  リポジトリ、作業コピーは含まれていません。

48
Alex

Gitは最小限のファイルロックを必要とします。これが、ネットワークファイルシステム上でこの種の共有リソースを使用する際の問題の主な原因であると私は信じています。これを回避できる理由は、Gitリポジトリ内のほとんどのファイル(オブジェクトデータベースを形成するすべてのファイル)がコンテンツのダイジェストとして名前が付けられ、作成されると不変になるためです。したがって、2つのクライアントが同じファイルを異なるコンテンツに使用しようとする問題は発生しません。

オブジェクトデータベースの他の部分は扱いにくいです。参照は「refs」ディレクトリの下のファイル(または「packed-refs」)に保存され、これらは変更されます。ただし、refs/*ファイルは小さく、常に書き換えられます。編集されるのではなく。この場合、Gitは新しい参照を一時的な「.lock」ファイルに書き込み、ターゲットファイルの名前を変更します。ファイルシステムがO_EXCLセマンティクスを尊重する場合、それは安全です。そうでない場合でも、発生する可能性のある最悪の事態は、refファイルを上書きするレースです。これは遭遇するのが面倒ですが、それ自体が破損を引き起こすことはありません。共有リポジトリにプッシュした場合、プッシュは成功したように見えますが、実際には他の誰かが成功したように見えます。しかし、これは、プル(他の人のコミットにマージ)してもう一度プッシュするだけで解決できます。

要約すると、ここではレポの破損はそれほど問題ではないと思います---ロックの問題が原因で状況が少し悪くなる可能性があるのは事実ですが、Gitレポの設計は被害を最小限に抑えます。

(免責事項:これは理論的にはすべて良いように聞こえますが、レポを同時にハンマーで叩いてテストしたことはなく、CIFSではなくNFSでのみ共有しています)

43
araqnid

なぜわざわざ? Gitは配布されるように設計されています。各マシンにリポジトリを用意し、公開とプルのメカニズムを使用して、マシン間で変更を伝達するだけです。

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

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

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

7

どうやら中央のgitリポジトリの使用がサポートされています。ほとんどの規定された使用法は、sshまたはhttpアクセスを示しており、どちらもリポジトリへの同時アクセスを回避していません。完全に分散して使用している場合でも、3人以上の共同作業者がどこでも同じリポジトリにプッシュすると、この質問が発生します。これまでのところ、質問に答えた回答はありません。 gitの設計により、ブランチへのN回の同時プッシュを処理できますか?

5
user207971