会社で 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 できるようになります。
※各プロジェクトに配置されたフックはそのままなので既存のリポジトリのフックは個別に削除してください。