LoginSignup
64
59

More than 5 years have passed since last update.

gitコミット時にデバッグコードが含まれていないかをチェックする

Last updated at Posted at 2013-01-06

すべてのgitユーザーにおすすめのhook

debuggerconsole.logなどコミットするべきではないものをコミットすることはありませんか?
もしくは他のメンバーがコミットしていてイラッとしたことはありませんか?

そんな時はgitのhook(pre-commit)を使います。

以下はこのhookを使うための準備です。
gitのhooksを管理する(自分用テンプレートを使う)
git hookでできること

pre-commitのコードは以下の通り(ruby)

checkesの内容を変えて、自分のチェックしたいコードを追加できます。

pre-commit
#!/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のせいで動かなかったことがあります。(特定のレガシーブラウザで起こった)

個人的にはデバッグコードをあまりに頻繁にコミットしてプッシュまでしてしまう人は、不注意だったりコードの読みやすさ・コミットの作り方の意識が低いのかなと思う。(それだけバグも作りやすい人)

64
59
2

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
64
59