7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-23

はじめに

私が日中の業務にて、ひとりチームとして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、スティッキービットまとめ
    グループ以外の位置にスティッキービットをつけたときの挙動が参考になります。

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?