LoginSignup
17
17

More than 5 years have passed since last update.

SourceTreeでのコミットを禁止する

Posted at

ことの発端はこの発言。

まあどういうことかと言うと、現在進行中のプロジェクトではコードの質を担保するため、Linter、この場合はphpcsに引っかかったものをprecommitを使うことで阻止していた。

ところが、PHP7.0+前提のコードを書いているため、Macにデフォルトで搭載されているPHP5.5(これはSierraでも変わらなかったのか)ではSyntax Errorを起こす。
具体的には、phpcsが走る際にcomposerのオートロードでLaravelのhelper関数をロードするときにエラーが発生する。PHP7関係ない。

そのため、.bash_profile.zshrcできちんとphp5.6+にPATHが通っていれば問題なようだが、そうでなかった場合に上記の理由によりSourceTreeからコミットできないメンバーが居た。

それをネタにツイートしたのだが、「嘘じゃん、コミットできるじゃん」と指摘されたので「ならば禁止してやろう」という事になった。

(誤字がガバガバ)

枕が長すぎたけどココからが本題。

まずprecommit

.git/hooks/pre-commitにコミット前に走らせたいスクリプト等を置いておけばそれが走り、0以外で終了すればコミットが中断される。

とは言え、.git以下は言うまでもなく共有が面倒なのでnpmモジュールpre-commitを利用してチーム全体で低品質なコードをコミットできないようにするの手法を使用している。

pre-commitのためだけにnpmを使っているが、どうせ全員の環境にあるしnpm installしといて〜だけで共有できてとても手軽である。もちろん、一度npm installを済ませれば後の変更にはいくらでも耐えれる。

pre-commmitでシェルスクリプトが走るようにしておけばいいだろう。

SourceTree からのコミットを検出

SourceTreeからのコミットを禁止するのだから、それを検出する必要がある。

きっと何かそれらしい環境変数(シェル変数)をSourceTreeが付けてるだろうという甘い考えでそれらを眺めてみたのだが、割とココが厄介だった。

まず、固有の変数というものが見当たらなかった。
ならばSourceTreeの文字列を含むものを、と探してみたのだが、それらしいものもなんというかイマイチ。
強いて言えばPYTHONPATHのようなPATHにSourceTree.appのパスが含まれているが、これを使うのはどうかという感想。

ただ一つ、SourceはGitのcredential.helperとしてsourcetreeというSourceTreeに内臓のものを利用しているらしいと言うことがわかった。
(ちなみに普段CLIの際、自分はosxkeychainを利用している。)

ならば、これを利用するしか無い。(これって設定で変えられたりしないよな?)

シェルスクリプトを書く

別にシェルスクリプトで書かなくてもいいのだが、正直これで済ませるのが一番手っ取り早いので上記の条件をシェルスクリプトにした。
ただ単にhelper見るだけだけど。

test.sh
if [[ `git config --get credential.helper` = "sourcetree" ]]
then
 echo "SourceTree でのコミットは認めていません。" ; exit 1
fi

これをpre-commitスクリプトに書くだけ。神。

スクリーンショット 2016-09-26 1.07.52.png

もちろんcliやその他のアプリからは問題なくコミット可能。神。


なおSourceTreeでのコミット禁止とかSourceTreeが嫌いみたいに見えるかもしれませんが毎度複雑になりすぎたツリー見るにはGUIさまさまです。

流石につらすぎる。まあSourceTreeにはつらい思い出もあるけど……

17
17
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
17
17