はじめに
私が日中の業務にて、ひとりチームとして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)とは、「ねばねばする」「べとつく」といった意味があるようです。
ディレクトリに対してスティッキービットを立てた場合、そのディレクトリの下で作られるファイルは、ディレクトリの所有グループで作られます。グループ設定がそのディレクトリの下に「べとべとと・・」継承される、といったイメージでしょうか。
Gitのリポジトリ内のディレクトリに対しては、新しいファイルがkumaで作られることもhachiで作られることもありそうですが、どちらの場合でもdeveloperグループに所属しているので、両方のユーザーで編集できるようにこの設定が生かされます。
参考URL
-
Gitをはじめからていねいに
Gitでリモートリポジトリを作成するときに参考にしました。
Gitコマンドを知らない方が新しく使いはじめる場合は、このドキュメント全体に目を通すとよいと思います。 -
[git] リポジトリを後から共有できるようにする。
手順はほぼこの記事からの引用させていただきました。
ちなみに私の記事では落語の(熊さん・ハッつあん)をイメージしてこのユーザー名にしてみましたが、こちらの方のユーザー名もそうだったのでしょうか・・ -
Linux: SUID、SGID、スティッキービットまとめ
グループ以外の位置にスティッキービットをつけたときの挙動が参考になります。