けんごのお屋敷

2014-03-10

リモートリポジトリの master は破壊するべからず。git push できないようにしてみよう

会社で github で管理しているリポジトリがあるのですが、なるべくなら master に直接 push するのは避けたいものです(最近のフローとしては pull request から master にマージされることが多いですよね)。

最初は github 上に git のフックを仕掛けて master に push しようとする要求があればはじくようにしたいと思ってたのですが github ではそういったことは出来ないようなので、サーバー側ではなくローカル側にフックを仕掛けて master に push できないようにしてみました。

デザイナなど黒い画面が苦手な人でも最低限のコマンドで実現出来るように、インストール用のスクリプトを書いて gist に公開 してみました。

フックのインストール

ターミナルから以下のコマンドを実行すればOKです。

$ curl -s https://gist.githubusercontent.com/tkengo/9320008/raw/f19ce447307ce0f562d5b3ca834d09d22662b7f2/gistfile1.sh | sh
OK, all set.
All you need to do is that executing "git init" in your existing git project directory.

OK, all set と表示されれば正常に完了しています。これだけ。フックは ~/.git_template/hooks/pre-push にインストールされます。

新しいリポジトリの場合は自動的にフックが使われるし、既存のリポジトリの場合はリポジトリのディレクトリに移動してそこで git init するだけです。Source Tree 使ってる人は

  • リポジトリを選んで、ツールバーにある 端末 ボタンを押す
  • ターミナルが開いたらそこで git init を入力してエンター

で、いけそうですね。


※以下はちょっとした説明です。読まなくても上記だけやっておけばフックは使えるようになってるので、時間ある人向け。

使い方

新しく clone したリポジトリ

フックをインストールした後に git clone するリポジトリに対しては特に意識する必要はありません。インストールされたフックスクリプトが自動的にプロジェクトの .git ディレクトリ内にコピーされて機能しはじめます。

$ git clone git@github.com:tkengo/chromekey.git
$ cd chromekey
$ git push origin master
You cant push the master branch to the remote
error: failed to push some refs to 'git@github.com:tkengo/chromekey.git'

$ git checkout -b test-branch origin/master
$ git push origin test-branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:tkengo/chromekey.git
 * [new branch]      test-branch -> test-branch

このように master に対して push しようとした時だけ失敗します。

既存のリポジトリ

新規リポジトリは自動的にフックスクリプトがコピーされますが、既存のリポジトリに対してはプロジェクト毎の .git ディレクトリにフックスクリプトをコピーする必要があります。これには git init が使えます。git のフックはシステムグローバルに設定はできないんですね。

$ cd /path/to/existing-repository
$ git init
Reinitialized existing Git repository in /path/to/existing-repository

これで master へ push しようとした時は失敗するようになります。

特定のリポジトリは master へ push しても良い

master へ直接 push してもよいリポジトリがあればプロジェクトのフックを削除します。

$ cd /path/to/existing-repository
$ rm -f .git/hooks/pre-push

これで master へ push できるようになります。

フックのアンインストール

フックをコピーする設定を削除します。以下のコマンドを実行してください。

$ git config --global --unset init.templatedir

これで新しく git clone したプロジェクトも master へ push できるようになります。

※各プロジェクトに配置されたフックはそのままなので既存のリポジトリのフックは個別に削除してください。

  • このエントリーをはてなブックマークに追加