すべてのgitユーザーにおすすめのhook
debugger
やconsole.log
などコミットするべきではないものをコミットすることはありませんか?
もしくは他のメンバーがコミットしていてイラッとしたことはありませんか?
そんな時はgitのhook(pre-commit)を使います。
以下はこのhookを使うための準備です。
gitのhooksを管理する(自分用テンプレートを使う)
git hookでできること
pre-commitのコードは以下の通り(ruby)
checkes
の内容を変えて、自分のチェックしたいコードを追加できます。
#!/usr/bin/env ruby
class String
# colorization
# from http://stackoverflow.com/questions/1489183/colorized-ruby-output
def colorize(color_code)
"\e[#{color_code}m#{self}\e[0m"
end
def red ; colorize(31) ; end
def green ; colorize(32) ; end
def yellow ; colorize(33) ; end
def pink ; colorize(35) ; end
end
checks = %w{
debugger
byebug
logger
puts
binding.pry
save_and_open_page
console.log
}
errors = []
files_changed = `git diff --cached --name-only HEAD`
files_changed.each_line do |filename|
filename.chomp!
changes = `git diff --cached -U0 HEAD -- "#{filename}"`
checks.each do |check|
result = changes.split(/\n/).grep(/^\+.*\b#{check}\b/)
unless result.empty?
errors << {:name => check, :file => filename, :matches => result}
end
end
end
unless errors.empty?
errors.each do |error|
puts "'#{error[:name]}' found in file: #{error[:file]}".yellow
error[:matches].each {|m| puts " -> #{m}" }
end
puts "COMMIT REJECTED. Please remove them before commiting OR use --no-verify".red
exit 1
end
使うにはとにかく各プロジェクトの.git/hooks/
配下にpre-commit
を配置し、実行権限を与えれば動きます。(権限重要で実行権限が無いと、何も起きない)
$ cd rails_project
$ cp /somewhere/pre-commit .git/hooks/
(OR $ vi .git/hooks/pre-commit)
$ chmod 755 .git/hooks/pre-commit
デバッグコードを含むコードをコミットしようとすると
$ git commit
'debugger' found in file: app/controllers/posts_controller.rb
-> + debugger
'puts' found in file: app/controllers/posts_controller.rb
-> + #puts params.inspect
COMMIT REJECTED. Please remove them before commiting OR use --no-verify
のように出力されます。
一時的にチェックを無効にしてコミットしたい場合は
$ git commit -m "Commit without checks" --no-verify
たまにこのフックが原因でエラーになる
確認したかぎりでは、エンコーディングの違うソースを扱うとたまにエラーになる。
その時はそのプロジェクトではフックを諦めて削除。
rm .git/hooks/pre-commit
git hooksはプロジェクトごと.git/hooksにありますが、既存の数あるプロジェクトで有効にするには少し手間がかかります。
詳細はgitのhooksを管理する(自分用テンプレートを使う) 参照
デバッグコードはproduction環境であっても比較的無害な気はしますが、一度Javascriptのコードがconsole.logのせいで動かなかったことがあります。(特定のレガシーブラウザで起こった)
個人的にはデバッグコードをあまりに頻繁にコミットしてプッシュまでしてしまう人は、不注意だったりコードの読みやすさ・コミットの作り方の意識が低いのかなと思う。(それだけバグも作りやすい人)