Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
60
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
60
Help us understand the problem. What are the problem?