私は既存のgitリポジトリ(裸のリポジトリ)を持っていますが、これまでは自分でしか書き込みできませんでした。 fooのすべてのメンバーがプッシュできるように、UNIXユーザーグループfooにそれを開きたいです。私はnew gitリポジトリを簡単に設定できることを知っています:
git init --bare --shared=group repodir
chgrp -R foo repodir
しかし、existing repo dirに対して同等の操作が必要です。
これを試して、repodir
内の既存のリポジトリをグループfoo
内のユーザーに対して機能させます。
chgrp -R foo repodir # set the group
chmod -R g+rw repodir # allow the group to read/write
chmod g+s `find repodir -type d` # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")
Repo dirで次のコマンドを実行します。
git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir
編集:頻繁な混乱に対処するため、group
は実際のキーワードです。これをグループの名前に置き換える必要はありません。
@ David Underhill と @ kixorz の回答をマージして、独自の(決定的な)ソリューションを作成しました。
これは、bareリポジトリおよびnon-bareリポジトリ用です。それらの間にはわずかな違いしかありませんが、この方法ではより明確です。
ベアリポジトリ
cd <repo.git>/ # Enter inside the git repo
git config core.sharedRepository group # Update the git's config
chgrp -R <group-name> . # Change files and directories' group
chmod -R g+w . # Change permissions
chmod g-w objects/pack/* # Git pack files should be immutable
find -type d -exec chmod g+s {} + # New files get directory's group id
どこ:
<repo.git>
は、通常はサーバー上のベアリポジトリディレクトリです(例:my_project.git/
)。<group-name>
はgitユーザーのグループ名です(例:users)。ノンベアリポジトリ
cd <project_dir>/ # Enter inside the project directory
git config core.sharedRepository group # Update the git's config
chgrp -R <group-name> . # Change files and directories' group
chmod -R g+w . # Change permissions
chmod g-w .git/objects/pack/* # Git pack files should be immutable
find -type d -exec chmod g+s {} + # New files get directory's group id
どこ:
<project_dir>
は、.git
フォルダーを含むプロジェクトディレクトリです。<group-name>
はgitユーザーのグループ名です(例:users)。これはおそらく必要ではありませんが、git init --bare --shared
は、denyNonFastForwardsオプションも設定します。
git config receive.denyNonFastForwards true
このオプションの意味は次のとおりです。
receive.denyNonFastForwards
既にプッシュしたコミットをリベースしてからもう一度プッシュしようとするか、リモートブランチが現在指しているコミットを含まないリモートブランチにコミットをプッシュしようとすると、拒否されます。これは一般的に良いポリシーです。しかし、リベースの場合、自分が何をしているかを知っていると判断し、プッシュコマンドに-fフラグを付けてリモートブランチを強制更新することができます。
( http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration から)
グループに読み取り/書き込みを許可するという上記の回答に加えて、ユーザーをグループに追加する必要もあります(「foo」など)。
Sudo usermod -a -G [groupname] [username]
注:存在しない場合は、最初にユーザーを作成する必要があります