Gitリポジトリをマシン上の複数のユーザーと共有するにはどうすればよいですか?


216

複数の開発者がプルできる必要があるステージングサーバーにGitリポジトリがあります。git-init私が探しているものに非常に近い旗を持っているようだ:--shared、私も、そのリポジトリに引っ張って複数の人が欲しい除いて。git-cloneさんの--sharedフラグは完全に異なる何かを。

既存のリポジトリの権限を変更する最も簡単な方法は何ですか?


「Github for Windows」を使用して、2つのGithubアカウントを切り替えています: stackoverflow.com/questions/18565876/…-
アリサ

回答:


186

権限は害虫です。

基本的に、これらの開発者全員がgitリポジトリ内のすべてに書き込みできることを確認する必要があります。

開発者グループに書き込み機能を付与する優れた方法については、New-Wave Solutionに進んでください。

標準ソリューション

すべての開発者を特別に作成したグループに入れると、原則として次のことができます。

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

次にumask、ユーザーのをに変更して、002グループ書き込み可能な権限で新しいファイルが作成されるようにします。

これに関する問題は大勢です。あなたが想定しているディストリビューションにしている場合umask022(例えば共通持つものとしてusers、デフォルトではすべての人を含むグループ)が、これは他の場所でのセキュリティ上の問題を開くことができます。遅かれ早かれ、慎重に作成されたアクセス許可スキームを台無しにして、rootアクセスを取得して修正するまで(つまり、上記のコマンドを再実行するまで)リポジトリを無効にします。

New-Waveソリューション

あまりよく理解されておらず、OS /ツールのサポートがもう少し必要な優れたソリューションは、POSIX拡張属性を使用することです。かなり最近になってこのエリアに来たばかりなので、ここでの私の知識はそれほど熱くありません。ただし、基本的に、拡張ACLは、3つのデフォルトスロット(ユーザー/グループ/その他)以外にもアクセス許可を設定する機能です。

もう一度、グループを作成してから実行します:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

これにより、グループの拡張ACLが設定され、グループメンバーは、既に存在するファイル(最初の行)の読み取り/書き込み/アクセスができるようになります。次に、既存のすべてのディレクトリに、新しいファイルに同じACLを適用するように指示します(2行目)。

それがあなたをあなたの道に導くことを願っています。


62
git initには、グループ作業用にcore.sharedRepository変数を設定する--sharedというパラメーターがあります。既存のリポジトリに変数を設定することもできます。gitはファイルを操作する前にumaskを適切な値に設定するため、umaskを手動で設定する必要がなくなります。
ptman

6
POSIX拡張属性の+1-私へのニュース!
RobM

5
私がやったときchmod -R g+swX、それはGitを非常に不幸にし、もはやgitリポジトリではないと判断しました(「repoはgitリポジトリではないようです」)。すべてのファイルをchmod gsする必要がありました。ディレクトリに setgidビットを設定するには、試してくださいfind /path/to/repo -type d -print0 | xargs -0 chmod g+s。まだやるchgrp -R thegroup /path/to/repo
rescdsk

10
chmod -R g+swX gitrepoファイルにsetguidビットを適用しますが、これはセキュリティ上のリスクです。代わりに、find . -type d -exec chmod g+s {} +ディレクトリにのみ適用することができます。
イアン・ダン

1
ACL(setfacl)には、グループIDを継承するためにディレクトリ内に作成された新しいファイルとサブディレクトリを強制するsetgidの設定がありません。したがって、chmodを使用してsetgidを個別に設定する必要があります。ただし、Gitの--sharedオプション(git-scm.com/docs/git-init)では、ユーザーのgmaskを設定してumaskをオーバーライドできます。
チェイスT.

121

リポジトリを作成した場合(または既存のリポジトリから新しいベアリポジトリを複製した場合)

$ git init --shared=group 

または

$ git init --shared=0NNN

Gitは、デフォルトのumaskが提供する以上の権限を処理することになっています。ついにこれは私のバージョンのGit(1.6.3)にも当てはまります。もちろん、これはユーザーが同じグループに属していることを前提としています。

ただし、読み取り/書き込みの度合いが異なる複数のグループのユーザーの管理が必要な場合は、gitosisを使用します。また、ブランチレベルのアクセス許可を提供するために提供されているgitosisフォークであるgitolite(http://github.com/sitaramc/gitolite)についても言及しましたが、個人的にすべて使用したとは言えません。


9
これは間違いなく正しい答えです。
エリオッタブル

4
私はこの問題を抱えており、これが断然最良の答えです。唯一の問題は、--shared引数が16進数ではなく8進数を取ることです。Git 1.7.8のソースでこれを確認しました。2番目の例はである必要がありますgit init --shared=0NNN
qpingu

3
何がNNN-permissionsマスクまたはグループ番号または何か他のものは?
クレイグマックイーン14

20
ところで、上記の「グループ」はキーワードであり、グループ名のプレースホルダーではありません。chgrpコマンドを使用してグループを割り当てます。新しいgit init --bare --shared=group myprojレポジトリの場合、myprojがレポジトリ名、chgrp -R mygroup myprojmygroupがグループ名です。
ラブラドール14

2
デフォルトグループが本来のグループと異なる場合にユーザーがコミットすると、事態が悪化する可能性があることに注意してください。この問題を修正するには、各ユーザーが適切なグループのリポジトリにあるすべてのファイルをchgrpする必要があります。これは、コミットしてプッシュする前に、全員に正しいグループの下/への新しいファイルの作成/切り替えを行わせる方法を見つけない限り、繰り返されます。
ragerdl

55

これは言われていないので、すぐに追加したいと思います。

パーミッションの問題がtheirい頭を切り取らないようにするには、git共有リポジトリの設定ファイルで次を設定してください:

[core]
    sharedRepository = true

これにより、システムの「umask」設定が確実に尊重されます。


6
git-config(1)(kernel.org/pub/software/scm/git/docs/git-config.html)core.sharedRepositoryによると、gitを尊重させるには、これを「umask」または「false」に設定する必要がありますユーザーのumask。
デビッドシュミット

14
これとuser35117の答えは正しいです。「true」は「group」と同じであり、これはコマンドで設定できることに注意してくださいgit config core.sharedRepository true
ColinM

ファイルがリモートにプッシュされると、ファイルの所有権は変わりますか?
ドク・トラン

2
事後ではなく、クローンを作成するときにこれを設定する場合は、と同等git init --sharedですgit clone --config core.sharedRepository=true--shared似たようなコマンドでそのような異なる意味に使用する奇妙なgit 。
-stevek_mcc

21

Gitのユーザーマニュアルにはする方法について説明リポジトリを共有いくつかの方法で。

より複雑ですが、リポジトリを共有するための機能満載の方法は次のとおりです。

6人の開発者のチームにGitHubを使用しています。


1
Gitosisが好きです。これは、公開キーに基づいてアクセスを制御する非常に効果的な方法です。
マイクマズール

これらのソリューションは、「複数の人がそのリポジトリにプルしたい」という問題をどのように解決しますか?
ワンブル

gitosisをご覧ください。それはあなたの問題を解決します。
pilif

3
リポジトリを共有すると、人々はそこからプルできるようになります。おそらくクローンを作成するか、リモートブランチを追加する必要があります。私がリンクしたドキュメントは、あなたの問題を解決する手順を非常に明確に説明します。開発者がGitとソースコードを共同作業するのを支援するために、説明したすべての方法を使用しました。私の知る限り、ServerFaultは手持ち用ではありません。
jtimberman

3
Gitosisの使用に同意する必要があります。複数のSSHキーで認証された単一のアカウントを使用することにより、権限の問題を回避します。また、gitコミットによって完全に管理されます。
ジェレミーブーゼ2009年

9

また見gitoliteあなたのgitリポジトリをホストするため。どうやら、Gitosisはもう開発されていません。


4

プッシュするときにユーザーがアクセス許可の問題を持たないように、共有リポジトリのアクセス許可を修正する1つの方法は、それを行う更新後フックスクリプトを作成することです。これはどのgitバージョンでも動作するはずです。

/myrepo.gitに共有リポジトリがあるとします。そのリポジトリ内のすべてのファイルは、たとえばmysharedgroupに属します。そのリポジトリにプッシュするすべてのユーザーもmysharedgroupに属している必要があります。次に、次のファイルを作成します(mysharedgroupを設定に変更します)。

/myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null

ユーザーが異なるデフォルトグループを持っている場合の正しい答え
Pat

ディレクトリにsetgidビットを設定すると、ユーザーが作成するファイルは、ディレクトリと同じグループ所有権を継承します(ユーザーがそのグループに属している場合)。ユーザーのデフォルトグループではない場合でも。この場合、このフックは必要ありません。これが、@ wombleの回答(およびそれに関する私のコメント)の役割です。
-rescdsk

私のcentos7マシンでは、このページにリストされているすべてのソリューションを試した後、上記の@bkmksのソリューションのバリエーションが実際に機能する唯一のオプションでした(上記のように更新後ではなく、マージ後およびチェックアウト後のフックを設定します)。
マイクゴディン

エラーメッセージまたはSTDERの警告をにパイプするソリューションを促進することは悪いアドバイスだと思います/dev/null。最初にこれらのメッセージをユーザーに見せてから、自分で決定してください。
ダニエルベーマー

3

新しいレポジトリの設定に関するさまざまな他の回答とコメントからの良いアドバイスの断片を集約するには:

あなたはブランドの新しいレポを設定している場合myrepoには/srv/gitグループのためにmygroup、これはあなたが望むものです。

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. 最初の行はレポジトリを作成します
  2. 2行目はそのグループを mygroup
  3. 3行目は、次の構成でベアリポジトリを初期化します。
    1. core.bare = true:裸のレポにする
    2. core.sharedrepository = 1(と同じcore.sharedrepository = group):リポジトリで作成され、後で作成されるすべてのディレクトリはgitによって管理され、mygroup読み取り、書き込み、および実行の許可が許可されます(sgidビットも設定されているためmygroup、一次グループ)
    3. receive.denyNonFastforwards = 1:リポジトリへの非早送りプッシュを拒否します

ユーザー、グループ、または他のユーザーのアクセス許可を微調整する場合は、を使用します--shared=0NNN。ここNNNで、は標準のユーザー、グループ、およびファイルの他のビットですディレクトリの実行およびsgidビットはgitによって適切に管理されます)。たとえば、これにより、ユーザーへの読み取りおよび書き込みアクセスが許可され、グループへの読み取り専用アクセスが許可されます(他へのアクセスは許可されません)。

git init --bare --shared=0640 /srv/git/myrepo.git

これにより、ユーザーおよびグループへの読み取りおよび書き込みアクセスが許可されます(他へのアクセスは許可されません)。

git init --bare --shared=0660 /srv/git/myrepo.git

これにより、ユーザーおよびグループへの読み取りおよび書き込みアクセスと、他への読み取り専用アクセスが許可されます。

git init --bare --shared=0664 /srv/git/myrepo.git

グループへの書き込みアクセスを許可しない場合は、最初に使用chownしてリポジトリの所有者を設定してからgit init、そのユーザーとしてコマンドを実行してください(リポジトリが正しい所有者で初期化されていることを確認してください)すべての初期ファイルとサブディレクトリ)。


より高い投票応答よりも正確です。
XO01


1

正確にこれを行うことは、既存のリポジトリに対して私にとってはうまくいきました。これは、いくつかの回答とコメントからアドバイスを受け取ります。

リポジトリの親ディレクトリから、サーバーで:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group

0

@stevek_mccの回答は、この質問をグーグルで検索したときに探していたものです

git clone --config core.sharedRepository=true
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.