回答:
権限は害虫です。
基本的に、これらの開発者全員がgitリポジトリ内のすべてに書き込みできることを確認する必要があります。
開発者グループに書き込み機能を付与する優れた方法については、New-Wave Solutionに進んでください。
すべての開発者を特別に作成したグループに入れると、原則として次のことができます。
chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo
次にumask
、ユーザーのをに変更して、002
グループ書き込み可能な権限で新しいファイルが作成されるようにします。
これに関する問題は大勢です。あなたが想定しているディストリビューションにしている場合umask
の022
(例えば共通持つものとしてusers
、デフォルトではすべての人を含むグループ)が、これは他の場所でのセキュリティ上の問題を開くことができます。遅かれ早かれ、慎重に作成されたアクセス許可スキームを台無しにして、root
アクセスを取得して修正するまで(つまり、上記のコマンドを再実行するまで)リポジトリを無効にします。
あまりよく理解されておらず、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行目)。
それがあなたをあなたの道に導くことを願っています。
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
。
chmod -R g+swX gitrepo
ファイルにsetguidビットを適用しますが、これはセキュリティ上のリスクです。代わりに、find . -type d -exec chmod g+s {} +
ディレクトリにのみ適用することができます。
リポジトリを作成した場合(または既存のリポジトリから新しいベアリポジトリを複製した場合)
$ git init --shared=group
または
$ git init --shared=0NNN
Gitは、デフォルトのumaskが提供する以上の権限を処理することになっています。ついにこれは私のバージョンのGit(1.6.3)にも当てはまります。もちろん、これはユーザーが同じグループに属していることを前提としています。
ただし、読み取り/書き込みの度合いが異なる複数のグループのユーザーの管理が必要な場合は、gitosisを使用します。また、ブランチレベルのアクセス許可を提供するために提供されているgitosisフォークであるgitolite(http://github.com/sitaramc/gitolite)についても言及しましたが、個人的にすべて使用したとは言えません。
--shared
引数が16進数ではなく8進数を取ることです。Git 1.7.8のソースでこれを確認しました。2番目の例はである必要がありますgit init --shared=0NNN
。
NNN
-permissionsマスクまたはグループ番号または何か他のものは?
git init --bare --shared=group myproj
レポジトリの場合、myprojがレポジトリ名、chgrp -R mygroup myproj
mygroupがグループ名です。
これは言われていないので、すぐに追加したいと思います。
パーミッションの問題がtheirい頭を切り取らないようにするには、git共有リポジトリの設定ファイルで次を設定してください:
[core]
sharedRepository = true
これにより、システムの「umask」設定が確実に尊重されます。
git config core.sharedRepository true
。
git init --shared
ですgit clone --config core.sharedRepository=true
。--shared
似たようなコマンドでそのような異なる意味に使用する奇妙なgit 。
Gitのユーザーマニュアルにはする方法について説明リポジトリを共有いくつかの方法で。
より複雑ですが、リポジトリを共有するための機能満載の方法は次のとおりです。
6人の開発者のチームにGitHubを使用しています。
プッシュするときにユーザーがアクセス許可の問題を持たないように、共有リポジトリのアクセス許可を修正する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
/dev/null
。最初にこれらのメッセージをユーザーに見せてから、自分で決定してください。
新しいレポジトリの設定に関するさまざまな他の回答とコメントからの良いアドバイスの断片を集約するには:
あなたはブランドの新しいレポを設定している場合myrepo
には/srv/git
グループのためにmygroup
、これはあなたが望むものです。
mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
mygroup
core.bare = true
:裸のレポにするcore.sharedrepository = 1
(と同じcore.sharedrepository = group
):リポジトリで作成され、後で作成されるすべてのディレクトリはgitによって管理され、mygroup
読み取り、書き込み、および実行の許可が許可されます(sgidビットも設定されているためmygroup
、一次グループ)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
、そのユーザーとしてコマンドを実行してください(リポジトリが正しい所有者で初期化されていることを確認してください)すべての初期ファイルとサブディレクトリ)。
git-daemonを使用してリポジトリを共有できます。詳細については、git-daemonのドキュメントを参照してください。
編集:
また、この記事でgitリポジトリを共有する8つの方法を確認してください。