Gitでリモートリポジトリを後からグループ共有にする

# はじめに
私が日中の業務にて、ひとりチームとしてGitを使ってソース管理していたのですが、開発メンバーがひとり増えました。
私のアカウントで作成したリモートリポジトリからgit cloneして開発を進めていただいていたのですが、git push時にファイルの書き込みができないパーミッションエラーが発生しました。その解決手順を記録しておきます。

# 前提条件
- kuma （ユーザー:kuma　 グループ:kuma）・・・ 私
- hachi　（ユーザー:hachi　 グループ:hachi）・・・新規メンバー

私(kuma)が開発中のプロジェクトは

```
/home/kuma/work/somework/
```

ここから以下のコマンドでリモートリポジトリを作成して利用していました。

```
$ git clone --bare /home/kuma/work/somework/ /usr/local/git/somework.git/
```

新規メンバーhachiさんに以下のコマンドで開発環境を作成してもらいました。

```
$ cd /home/hachi/work/
$ git clone /usr/local/git/somework.git/
```

ですが、このままだとgit pushに失敗してしまいます。

# 解決の手順
## 1. 共通のグループを追加

kumaとhachiさんで共通のグループ　developerグループに所属させることにします。

```
# groupadd developer
```

kuma と hachiさんをグループに所属させます。

```
# usermod -aG developer kuma
# usermod -aG developer hachi
```

## 2. Gitレポジトリの書き込み権限を変更

レポジトリのディレクトリを developerグループのユーザーだったら書き込めるように変更します。

```
# chgrp -R developer /usr/local/git/somework.git
```

レポジトリ内の各ディレクトリについて、以下の権限に変更します。

```
# cd /usr/local/git/somework.git
# git config core.sharedRepository group
# chmod -R g+w HEAD
# chmod -R g+w config
# chmod -R g+w description
# chmod -R g+ws hooks
# chmod -R g+ws info
# chmod -R g+ws objects
# chmod -R g+ws refs
```

ls -lコマンドの結果は以下のようになるはずです。

```
# ls -l
total 36
drwxrwxr-x  2 kuma developer 4096 Nov 23 08:31 branches
-rw-rw-r--  1 kuma developer  143 Nov 23 09:29 config
-rw-rw-r--  1 kuma developer   73 Nov 23 08:31 description
-rw-rw-r--  1 kuma developer   23 Nov 23 08:31 HEAD
drwxrwsr-x  2 kuma developer 4096 Nov 23 10:03 hooks
drwxrwxr-x  2 kuma developer 4096 Nov 23 08:31 info
drwxrwxr-x 13 kuma developer 4096 Nov 23 09:37 objects
-rw-rw-r--  1 kuma developer   98 Nov 23 08:31 packed-refs
drwxrwxr-x  4 kuma developer 4096 Nov 23 08:31 refs
```

# スティッキービットって何？

上記の手順のなかには、通常の「グループで書き込み権限を与える命令」

```
# chmod -R g+w hooks
```

ではなく、"s"がついた

```
# chmod -R g+ws hooks 
```

が含まれています。何が違うのでしょうか。

試しに /tmp/ 以下に実験用のディレクトリを作成してみました（kumaユーザーで実施）。

```
$ mkdir /tmp/test/
$ mkdir /tmp/test2/
$ chgrp developer /tmp/test/
$ chgrp developer /tmp/test/
$ ls -l /tmp/
:
drwxrwxr-x 2 kuma     developer 4096 Nov 23 11:13 test
drwxrwsr-x 2 kuma     developer 4096 Nov 23 11:19 test2
:
```

/tmp/test2/ ディレクトリにて、グループの実行権限が「x」ではなく「s」になっています。

それぞれのディレクトリにて、ファイルを作成してみます。

```
$ cd /tmp/test/
$ touch test.txt
$ ls -l
total 0
-rw-rw-r-- 1 kuma kuma 0 Nov 23 11:13 test.txt
```

作成されたファイルのグループがkumaになっています。

```
$ cd /tmp/test2/
$ touch test.txt
$ ls -l
total 0
-rw-rw-r-- 1 kuma developer 0 Nov 23 11:19 test.txt
```

スティッキービット付きのディレクトリでは、グループがdeveloperとして作成されました。

スティッキー(sticky)とは、「ねばねばする」「べとつく」といった意味があるようです。

- [stickeyの意味・使い方](https://ejje.weblio.jp/content/sticky)

ディレクトリに対してスティッキービットを立てた場合、そのディレクトリの下で作られるファイルは、ディレクトリの所有グループで作られます。グループ設定がそのディレクトリの下に「べとべとと・・」継承される、といったイメージでしょうか。

Gitのリポジトリ内のディレクトリに対しては、新しいファイルがkumaで作られることもhachiで作られることもありそうですが、どちらの場合でもdeveloperグループに所属しているので、両方のユーザーで編集できるようにこの設定が生かされます。

# 参考URL
- [Gitをはじめからていねいに](https://github.com/Shinpeim/introduction-to-git)
Gitでリモートリポジトリを作成するときに参考にしました。
Gitコマンドを知らない方が新しく使いはじめる場合は、このドキュメント全体に目を通すとよいと思います。

- [[git] リポジトリを後から共有できるようにする。](http://d.hatena.ne.jp/kuma8/20110115/1295100616)
手順はほぼこの記事からの引用させていただきました。
ちなみに私の記事では落語の（熊さん・ハッつあん）をイメージしてこのユーザー名にしてみましたが、こちらの方のユーザー名もそうだったのでしょうか・・

- [Linux: SUID、SGID、スティッキービットまとめ](https://qiita.com/aosho235/items/16434a490f9a05ddb0dc)
グループ以外の位置にスティッキービットをつけたときの挙動が参考になります。