Skip to content
iwhurtafly edited this page Feb 6, 2013 · 5 revisions

Gitはパワフルなリビジョン管理システムです。 また、Herokuへアプリケーションをデプロイするための基本的な手段でもあります。 Herokuへコードをデプロイするために、Gitの達人になる必要はありませんが、 ソースコードをマネージするための素晴らしいツールの基礎を学ぶことの価値に気がつくことでしょう。

Gitでアプリケーションをトラッキングする

Herokuは、アプリケーションがリポジトリのルートに構成されることを期待しています。もし、アプリケーションがリポジトリの サブディレクトリにある場合、Herokuへプッシュしても機能しないでしょう。

Herokuへアプリケーションをプッシュする前に、ローカルのGitリポジトリをイニシャライズし、 ファイルをコミットする必要があります。例えば、もしアプリケーションがmyappというディレクトリにあった場合、 そのディレクトリへ新規リポジトリを作成します。

:::term
$ cd myapp
$ git init
Initialized empty Git repository in .git/
$ git add .
$ git commit -m "my first commit"
Created initial commit 5df2d09: my first commit
 44 files changed, 8393 insertions(+), 0 deletions(-)
 create mode 100644 README
 create mode 100644 Procfile
 create mode 100644 app/controllers/source_file
...

これがローカルのリポジトリとなり、.gitディレクトリの中に帰属することとなります。 この段階では、何かがどこかへ送られるようなことはありません。 そのため、Herokuへコードをデプロイするためには、リモートのリポジトリを作成し、プッシュする必要があります。

Herokuのリモートリポジトリを作成する

Gitリモートは、リモートリポジトリに関する参考文献です。 リモートリポジトリはいくつも管理することが出来ますが、今回は、Herokuへのリモートにフォーカスしてみたいと思います。 heroku createコマンドは、Heroku上に新規のアプリケーションを作成します。 その際、アプリケーションのソースを受信するために使われるGitリモートも実行されます。

:::term
$ heroku create
Creating falling-wind-1624... done, stack is cedar
http://falling-wind-1624.herokuapp.com/ | [email protected]:falling-wind-1624.git
Git remote heroku added

ローカルのGit設定内で、リモートリポジトリを確認することも可能です。:

:::term
$ git remote -v
heroku     [email protected]:falling-wind-1624.git (fetch)
heroku     [email protected]:falling-wind-1624.git (push)

既存のGitリポジトリから、アプリケーションをクリエートした際に、与えられるGitのURLを使うことで、 リモートリポジトリを追加することも出来ます。 Gitのリポジトリと実存するアプリケーションを連携させるためにも、これを実行する必要があるでしょう。 heroku git:remoteコマンドは、アプリケーションのGitのURLに基づいたリモートリポジトリを追加します。

:::term
$ heroku git:remote -a falling-wind-1624
Git remote heroku added.

この例では、リモートをherokuと命名していますが、-r other_remote_nameを実行することで、 リモートの名称を好きなように変更することが出来ます。異なる名称を使ってリモートを実行するより、 herokuを使ってリモートすることに慣れているのであれば、この例の通り実行する方が易しく感じると思います。

1つだけ特別なリモート名:originが存在します。プッシュ時のデフォルト値となります。 originをリモート名として使うことで、git push herokuの代わりに、git pushとだけ タイプすることが許可されます。ですが、我々としては、明示的にリモート名を指定することを推奨しています。

コードをディプロイする

アプリケーションを作成した当初は、空のリポジトリから始まることになります。 つまり、ブランチやコードが存在しない状態です。 最初のデプロイでは、リモートのブランチをプッシュする先を明示する必要があります。

:::term
$ git push heroku master
updating 'refs/heads/master'
...

このコマンドは、コードを初期段階で作成されたHerokuのリモートリポジトリへプッシュすることとなります。 Herokuへプッシュされるmaster以外のブランチは、このコマンドではプッシュの対象外となり、無視されます。 ローカルで別ブランチで作業中であれば、Herokuへプッシュする前にマージすることが出来ますし、 ローカルのブランチを明示的にリモートのmasterへプッシュすることも出来ます。 master以外のブランチをプッシュするためには、この構文をお使い下さい。:

:::term
$ git push heroku yourbranch:master
その他多くの依存関係を解決する戦略 に加えて、 git submoduleに依存しているアプリケーションに関しても、Herokuはサポートしています。

複数のリモートリポジトリと環境

開発用ブランチをHeroku上のステージングのアプリケーションへデプロイする際に使われる技術と同じものが、 プロダクション環境へのデプロイ時に使用されます。 詳細は、アプリケーションの複数環境を管理するにあります。

Subversionやその他リビジョン管理システムを使う

ソースコードをトラックするのに、既にSubversionやその他リビジョン管理システムをお使いでしたら、 どうすれば良いでしょうか?我々は、リビジョン管理としてGitがベストな選択肢であることを 信じてやみませんが、現在使用しているリビジョン管理システムの使用を止める必要はありません。 Gitは純粋にデプロイのメカニズムとなりうるだけで、その他ツールと共存することが可能です。

`.gitignore`については、この記事でより詳しく学ぶことが出来ます。

例えば、仮にSubversionをお使いでしたら、これまでの内容で上記したようにGitのリポジトリをイニシャライズして下さい。 その後で、Subversionのディレクトリを無視するよう.gitignoreファイルへその内容を追加して下さい。

:::term
$ git init
$ echo .svn > .gitignore
$ git add .
$ git commit -m "using git for heroku deployment"

次に、Gitを無視するようSubversionに伝えて下さい。:

:::term
$ svn propset svn:ignore .git .
property 'svn:ignore' set on '.'
$ svn commit -m "ignoring git folder (git is used for heroku deployment)"
他の開発者のプッシュとの競合を避けるために、`-f` (force flag)の使用が推奨されています。 転送することが目的で、リビジョン管理としてGitを使っていないのであれば、`-f` (force flag)の使用は、 合理的なやり方でしょう。

Herokuへデプロイしたい時はいつでも、下記のように実行します。:

:::term
$ git add -A
$ git commit -m "commit for deploy to heroku"
...

$ git push -f heroku

その他参考資料

Clone this wiki locally