Gitリポジトリ全体で同じスクリプトを実行する

Gitリポジトリ内のコードが全て動くかどうか気になって、こんなRakefileを書いてみました。なぜコードが動くか調べたかったかというと、"git bisect run"するとき、実行できないコードが混ざっていると混乱するからです(最後にruns, failuresに-1してるのは、失敗するのが自明なコミットが、ぼくのリポジトリ内に1つあるからです。スキップすれば良いか。。今気付いた)。

task :run do
  sh "git tag -d tmp" if `git tag -l`.split.member? "tmp"
  sh "git tag tmp"
  failures = 0
  runs = 0
  hashes = commits.keys
  hashes.each do |hash|
    begin
      sh "git checkout #{hash}"
      runs += 1
      sh "<script>"
    rescue Exception => e
      puts e.message
      failures += 1
    end
  end
  puts "%d runs, %d failures" % [runs-1, failures-1]
  #sh "git checkout tmp"
  #sh "git tag -d tmp"
end
def commits
  ret = {}
  `git log --reverse --format="%H,%s"`.split("\n").each do |commit|
    hash, subject = commit.split(",")
    ret[hash[0..7]] = subject
  end
  ret
end