リポジトリを後から共有できるようにする。

はじめに

リポジトリを共有モードにするのを忘れていてトラブったので、解決した際の方法を紹介します。

今回は、 ssh経由でアクセスことが前提です。
http/https を利用する場合は別途手順がありますので、機会があれば後日紹介します。

解決方法

まず、 Git リポジトリをチームで共有する際には、 --shared オプションを付与し、リポジトリを初期化します。次に、チームのメンバーの umask を 002 もしくは 007 に変更します。
手順さえ間違えなければ、リポジトリの共有は簡単です。

--shared を忘れた場合はどうなるのかというと、正しく共有できる状態となっていないため、Permission denied が発生します。
この状態は、次の手順で解消できます。

$ cd /your/git/repository
$ git config core.sharedRepository group
$ chmod -R g+ws hooks
$ chmod -R g+ws info
$ chmod -R g+ws objects
$ chmod -R g+ws refs

一連の手順の説明をしていくと、

git config core.sharedRepository group

で、 config ファイルに、リポジトリの共有設定を追加しています。

chmod では、各ディレクトリのアクセス権を変更しています。
--shared 付きで初期化されたリポジトリは、ディレクトリにグループからの書き込みとスティッキービットが付与されています。

    • shared なし
$ git init --bare test.git
$ ls -l test.git
-rw-r--r--  1 kuma8  staff   23  1 15 22:42 HEAD
-rw-r--r--  1 kuma8  staff   66  1 15 22:42 config
-rw-r--r--  1 kuma8  staff   73  1 15 22:42 description
drwxr-xr-x  2 kuma8  staff  408  1 15 22:42 hooks
drwxr-xr-x  2 kuma8  staff  102  1 15 22:42 info
drwxr-xr-x  4 kuma8  staff  136  1 15 22:42 objects
drwxr-xr-x  4 kuma8  staff  136  1 15 22:42 refs
    • shared あり
$ git init --bare --shared
$ ls -l test.git
-rw-rw-r--  1 kuma8  staff   23  1 15 22:43 HEAD
-rw-rw-r--  1 kuma8  staff  126  1 15 22:43 config
-rw-rw-r--  1 kuma8  staff   73  1 15 22:43 description
drwxrwsr-x  2 kuma8  staff  408  1 15 22:43 hooks
drwxrwsr-x  2 kuma8  staff  102  1 15 22:43 info
drwxrwsr-x  4 kuma8  staff  136  1 15 22:43 objects
drwxrwsr-x  4 kuma8  staff  136  1 15 22:43 refs

chmod を利用して、--shared と同じ状態にしています。