複数の開発者がプルできるようにする必要があるステージングサーバーにGitリポジトリがあります。 git-init
は私が探しているものに非常に近いフラグを持っているようです:--shared
。ただし、複数の人がそのリポジトリにプルしたい場合も除きます。 git-clone
の--shared
フラグは、まったく異なる処理を行います。
既存のリポジトリの権限を変更する最も簡単な方法は何ですか?
許可は害虫です。
基本的に、それらすべての開発者がgitリポジトリ内のすべてに書き込みできることを確認する必要があります。
開発者のグループに書き込み機能を許可する優れた方法については、New-Waveソリューションにスキップしてください。
すべての開発者を特別に作成されたグループに配置する場合、原則として、次のことを実行できます。
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行目)。
あなたがあなたの道に行くことを願っています。
リポジトリを作成した場合(または既存のリポジトリから新しいベアリポジトリを複製した場合)
$ git init --shared=group
または
$ git init --shared=0NNN
Gitは、デフォルトのumaskが提供する以上の権限を処理することになっています。ついに、これは私のバージョンのGit(1.6.3)にも当てはまります。もちろん、これはユーザーが同じグループに属していることを前提としています。
ただし、読み取り/書き込みの程度が異なる複数のグループのユーザーを管理する必要がある場合は、gitosisを使用します。また、ブランチレベルのアクセス許可を提供することを前提としたGitosisフォークであるgitolite( http://github.com/sitaramc/gitolite )についての言及も聞いたことがあります。個人的に。
これは言われていないので、早急に追加したいと思います。
権限の問題によって醜い頭が切り取られないようにするには、git共有リポジトリの構成ファイルで次のように設定してください。
[core]
sharedRepository = true
これにより、システムの「umask」設定が確実に尊重されます。
Git User Manual は リポジトリを共有する の方法をいくつかの方法で説明しています。
より複雑ですが、機能をフルに使用してリポジトリを共有する方法は次のとおりです。
6人の開発者のチームにGitHubを使用しています。
Gitリポジトリのホスティングについては gitolite も参照してください。グリトーシスはもう開発されていないようです。
共有リポジトリの権限を修正して、ユーザーがプッシュするときに権限の問題が発生しないようにする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
新しいリポジトリの設定に関する他のさまざまな回答やコメントからの良いアドバイスの断片を集めるには:
グループ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
と同じ):repoディレクトリとその中に後で作成されるすべてのディレクトリは、mygroup
の読み取り、書き込み、および実行権限を許可するためにgitによって管理されます(sgidビットを使用)同様に設定-mygroup
がプライマリグループではないユーザーと連携するため)receive.denyNonFastforwards = 1
:リポジトリへの早送り以外のプッシュを拒否しますユーザー、グループ、または他のユーザーの権限を微調整する場合は、--shared=0NNN
を使用します。ここで、NNN
はfilesの標準ユーザー、グループ、およびその他のビットです=(directoriesの実行ビットと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
コマンドを実行してください(すべての初期ファイルとサブディレクトリの正しい所有者でリポジトリが初期化されていることを確認してください)。
これを正確に行うことは、既存のリポジトリに対して私にとってうまくいきました。これは、前にいくつかの回答とコメントからアドバイスを受け取ります:
サーバーのリポジトリの親ディレクトリから:
chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
@stevek_mccの回答は、この質問をググったときに探していたものです
git clone --config core.sharedRepository=true