GitDay 5

Heroku にある Git リポジトリを楽に remote に設定する

More than 5 years have passed since last update.

Heroku Advent Calendar (がもしもあったらそちら) に投稿するような内容だと思いますが,無かったので Git ネタということで.


複数マシンから 1 つの Heroku で動くアプリを開発する

まず,何かしらのアプリをある 1 台のマシン (例えばデスクトップ PC) で作成します.

それを Git リポジトリとして Heroku のサーバに push します.それにより deploy が行えるのが Heroku の大きな特徴の一つだと言えます.

さて,最初に push する人は,Heroku 上にアプリを作る作業を行いますから,

heroku create APPNAME

を行うと思います.するとこのコマンドが自動的にリモートリポジトリとして heroku という名前で git@heroku.com:APPNAME.git を登録してくれます.なので,この後は

git push heroku master

としてやるだけで deploy が出来るのですね.この辺りは Heroku 入門的なチュートリアルでよく見るところだと思います.

ここで,別のマシン (例えばノート PC) でこのアプリの開発と deploy を引き続き行いたくなったとします.

まず,先ほどのマシンを参照するなり Github や Bitbucket や自前の gitosis 等を参照したりするなりして,リポジトリを clone してくると思います.すると,リモートリポジトリとして heroku が登録されていません.なので

git remote add heroku git@heroku.com:APPNAME.git

をする必要があります.これが面倒だからと言って

git clone git@heroku.com:APPNAME.git

すると,今度は origingit@heroku.com:APPNAME.git になって何だか変な気分です.


いちいちリポジトリの URI を打ち込むのは面倒だ

今まで自分はずっと git remote add heroku ... をしていたのですが,先日こんなことをしなくてもいいんだと heroku help を見ていて気付きました.

サブコマンド git です.

heroku git:remote --app APPNAME

Github なり何なりから clone してきたリポジトリ内で,このコマンドを走らせるだけでリモートリポジトリ heroku が登録されます.

また,Heroku からまず第一に clone するのであれば,

heroku git:clone APPNAME

すると,APPNAME ディレクトリが作られそれがリポジトリになっていて,やはりリモートリポジトリ heroku が登録されています.origin はありません.

これは楽でいいですね.


heroku git のその他機能


  • clone するときにディレクトリ名を変えたい → heroku git:clone APPNAME DIRNAME

  • リモートリポジトリ名を heroku 以外 (例えば staging) にしたい → heroku git:remote APPNAME -r staging

まぁ,

heroku help git

heroku help git:remote
heroku help git:clone

を見れば大体分かります.


実装はどうなっているのか

いちいち git remote add heroku ... しなくてよくなったのはいいですが,実際このコマンドはどうやって実現されているのでしょうか?


  • git:clone の方

https://github.com/heroku/heroku/blob/2b67489173464420248c61c88ee98ee628067988/lib/heroku/command/git.rb#L31


  • git:remote の方

https://github.com/heroku/heroku/blob/2b67489173464420248c61c88ee98ee628067988/lib/heroku/helpers.rb#L110

…普通に git コマンドの文字列を作って実行しているだけですね.安心です.

ここのソースコードを読んで勉強するべきなのは,むしろ git:clone, git:remoteheroku コマンドの引数で与えると,どのようにして関数を呼び出すところに到達するか,だと思います.


バージョン情報

今回確認に使った環境・ツールのバージョンは以下の通りです.


  • Ruby 1.9.3-p194

  • Heroku Toolbelt 2.33.6

  • OS


    • Ubuntu 12.04 amd64 Desktop

    • Mac OS X 10.7.5




参考