Capistranoの設定でGitのブランチを指定していない時の挙動

deploy.rbの中で:branchにブランチを書くと指定できるが指定してない場合
なにが起きてるのか知りたくてすこし中身みた

環境

  • Capistrano 2.9.0

本題

まず、branchオプションが設定されているかどうかをみてなかったら代わりにHEADにする

# capistrano-2.9.0/lib/capistrano/recipes/deploy/scm/git.rb
114       class Git < Base
115         # Sets the default command name for this SCM on your *local* machine.
116         # Users may override this by setting the :scm_command variable.
117         default_command "git"
118
119         # When referencing "head", use the branch we want to deploy or, by
120         # default, Git's reference of HEAD (the latest changeset in the default
121         # branch, usually called "master").
122         def head
123           variable(:branch) || 'HEAD'
124         end

これはどこで呼ばれてるかというと下記で呼ばれており以後revisionとして扱われる

# capistrano-2.9.0/lib/capistrano/recipes/deploy.rb
29 _cset(:revision)  { source.head }

gitの方に戻りgit-ls-remote(226行目)で該当リビジョンのハッシュ値をとってきている模様

# capistrano-2.9.0/lib/capistrano/recipes/deploy/scm/git.rb
221         # Getting the actual commit id, in case we were passed a tag
222         # or partial sha or something - it will return the sha if you pass a sha, too
223         def query_revision(revision)
224           raise ArgumentError, "Deploying remote branches is no longer supported.  Specify the remote branch as a local branch for the git repository you're deploying from (ie: '#{revision.gsub    ('origin/', '')}' rather than '#{revision}')." if revision =~ /^origin\//
225           return revision if revision =~ /^[0-9a-f]{40}$/
226           command = scm('ls-remote', repository, revision)

git-ls-remoteでHEADを見るとorigin/HEADが参照されるはずでorigin/HEADはデフォルトだとorigin/masterのHEADを指しているから
origin/masterのHEADがデプロイされるということなんだと思う