web-dev-qa-db-ja.com

UNIXグループで共有される既存のgitリポジトリを構成する方法

私は既存のgitリポジトリ(裸のリポジトリ)を持っていますが、これまでは自分でしか書き込みできませんでした。 fooのすべてのメンバーがプッシュできるように、UNIXユーザーグループfooにそれを開きたいです。私はnew gitリポジトリを簡単に設定できることを知っています:

git init --bare --shared=group repodir
chgrp -R foo repodir

しかし、existing repo dirに対して同等の操作が必要です。

87
Pistos

これを試して、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")
104
David Underhill

Repo dirで次のコマンドを実行します。

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

編集:頻繁な混乱に対処するため、groupは実際のキーワードです。これをグループの名前に置き換える必要はありません。

44
kixorz

@ 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)。
39
Andrea

これはおそらく必要ではありませんが、git init --bare --sharedは、denyNonFastForwardsオプションも設定します。

git config receive.denyNonFastForwards true

このオプションの意味は次のとおりです。

receive.denyNonFastForwards

既にプッシュしたコミットをリベースしてからもう一度プッシュしようとするか、リモートブランチが現在指しているコミットを含まないリモートブランチにコミットをプッシュしようとすると、拒否されます。これは一般的に良いポリシーです。しかし、リベースの場合、自分が何をしているかを知っていると判断し、プッシュコマンドに-fフラグを付けてリモートブランチを強制更新することができます。

http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration から)

3
nerfologist

グループに読み取り/書き込みを許可するという上記の回答に加えて、ユーザーをグループに追加する必要もあります(「foo」など)。

Sudo usermod -a -G [groupname] [username]

注:存在しない場合は、最初にユーザーを作成する必要があります

1
sarvagya kumar