irohiroki's blog

Ruby, Rails, and Web technologies

Gitの新機能を使ってHerokuへのpushを軽くする

HerokuRack専用のホスティングサービスで、Gitでpushすることでデプロイできるという特長があります。

ところが、git pushはブランチのヒストリを全て転送するため、実際のデプロイメントに必要ない過去のファイルも転送されてしまい、無駄です(バックアップとして使えるという考え方もあると思いますが、その目的であれば他にもっと効率的な方法があります)。

ここではGit 1.7.2の新しい機能を使って、実際のデプロイメントに必要なファイルだけをpushする方法を説明します。

Git 1.7.2では、checkoutコマンドに--orphanというオプションが追加されました。

* "git checkout --orphan newbranch" is similar to "-b newbranch" but prepares to create a root commit that is not connected to any existing commit.

つまり、--orphanを付けて新しいブランチを作ることで、ヒストリから切り離されたコミットを作ることができます。例えば以下のようにdeployというブランチを作ると、checkoutしたファイル(ここではREADMEのみ)が全てnew fileとしてステージされた状態になります。

$ git checkout --orphan deploy
Switched to a new branch 'deploy'
$ git status
# On branch deploy
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
#       new file:   README
#

ここでcommitすればdeployブランチ唯一のコミットができます。

$ git commit -m 'for deployment.'
[deploy (root-commit) 38bbc6b] for deployment.
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README

show-branchすることで、既存のブランチから完全に切り離されていることが分かります。

$ git show-branch
* [deploy] for deployment.
 ! [master] initial commit.
--
*  [deploy] for deployment.
 + [master] initial commit.

このdeployブランチをherokuへpushするには、以下のようにします:

$ git push heroku deploy:master

転送するオブジェクトは最小で済むはずです。

Published on 02/08/2010 at 01h40 under . Tags , ,

Powered by Typo – Thème Frédéric de Villamil | Photo L. Lemos