Capistranoで、:deploy_via => :remote_cacheのときに、git pushせずにdeployしてしまうのを防ぐ

https://gist.github.com/1111375

namespace :git do
  namespace :ensure do
    desc "Check if your local branch is synched with remote branch"
    task :pushed do  
      local = `git rev-parse #{branch}`.chomp
      remote = `git rev-parse remotes/origin/#{branch}`.chomp
      
      unless local == remote
        abort "ABORTING:: You have local commits\n\t#{branch} => #{local}\n\tremotes/origin/#{branch} => #{remote}"
      end
    end
  end
end

before :deploy, "git:ensure:pushed" 

git-rev-parseで、ブランチの最新のコミットを取得して、remoteとlocalを比較している。本当にこれで大丈夫かちょっと自信がないけど、

  1. cap deployする
  2. バグってた!!
  3. 直してcommitする
  4. cap deployし直す
  5. 完了まで待つ
  6. 直ってない
  7. push忘れてた!

という良くあるワークフローのミスについては改善されるはずである。

あ、コミット忘れるパターンもありそうだな。あんまり私はやった記憶がないけど。