プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

gitリポジトリの切り替えについて

いま、Pla!Frameworkでアプリを作って、herokuであれこれ試しています。

こちらの記事『[Play!Framework] アップデートしてみました。2.1.1 -> 2.1.5』を書いてから、heroku へ変更を反映しようとした際にgitリポジトリに不要なファイルがたくさん含まれていることに気づきました。たとえば、もともとのソースファイルをSubversionで管理しているので、.svn ディレクトリが入っていたりします。

 

このままでは気持ち悪いので、gitリポジトリをきれいにして、それをherokuへ反映させてみました。

とはいえ、単に heroku 上のアプリケーションを再構築するといろいろ手間がかかる(heroku で使ってるDBとかはheroku のアプリケーションに紐付けられている)ので、再構築なしで出来る方法を探しました。

 

結論

gitに慣れていないのであれこれ試しましたが、最終的に今回やった方法は、

  1. ローカルにある、既存のgitリポジトリを削除します(rm -rf .git とかでOK)
  2. .gitignore を編集します。
  3. 新たにgitリポジトリを作ります。(git init; git add .; git commit -m "init"; )
  4. heroku 上のリポジトリをリモートリポジトリとして登録します(heroku git:remote --app APP_NAME)
  5. ローカルリポジトリの内容をリモートリポジトリに反映します(git push heroku master --force)

という方法です。

ただ、この方法の場合、heroku 上のリポジトリの内容が本来のリポジトリ(ローカルリポジトリ再作成前のもの)の情報を持たなくなる(辿れなくなる、と言った方がいいのかな?)ので、その点だけ注意が必要です。

 

リポジトリを再作成したのは、リポジトリから削除しても、履歴は残るのがちょっといやだったためなのと、取り除きたいファイルがあちこちに散らばっていて面倒だったためです。

 

開発が一段落したら、もう一度ローカルリポジトリもheroku上のアプリケーションも作成しなおす予定なのでとりあえずはこれでよいかと思っています。

 

(参考)

[play-framework] [2.x] what should be in a .gitignore / .hgignore file

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

ブランチ/タグや別リポジトリからの強制再デプロイ

 

雑感

まあ、上記で一応出来ましたが、いろいろと考えると、ローカルリポジトリを削除せずに、不要ファイルを調べて git rm --cached に渡すようなスクリプトを作ったほうが確実だったような気がします。

 

いろいろ試している最中の一つにこんなのがありました。

ローカルリポジトリを再作成後、

heroku git:remote --app APP_NAME

として、

git push heroku master

とだけすると、当然gitリポジトリが異なるので、起こられます。仕方ないので、

git pull heroku master

とすればよいように思いきや、今度は.gitignoreに追記したファイルがローカルリポジトリに登録されていないのでそれで起こられました。

.gitignoreを元に戻して、再度ローカルリポジトリを作り直して、git pull heroku master を行うと、今度はheroku側に未反映の箇所があったため、conflictが起こってしまいました。

まあ、それをなんとか直したら、

git push heroku master

が通りました。

でも、よくよく考えてみると、これって.gitignore 修正前に、git push heroku master をやったのと同じです。遠回りしてなにやってるんだろうか・・・

 

結局のところ、Subversionにしろgitにしろ、一度リポジトリにファイルを登録してしまうと、明示的にそれをリポジトリから取り除く必要がある、というところですね。で、リポジトリの過去の履歴には残り続けると。

今更ですが、.gitignore の設定って意外と重要ですね。

 

.gitignoreの内容(2013/10/8追記)

忘れないうちに、一応、.gitignoreの内容も載せておきます。

logs
project/project
project/target
target
tmp
.history
dist
/.idea
/*.iml
/out
/.idea_modules
/.classpath
/.project
/RUNNING_PID
/.settings
.target
.svn/

 最後の2行が今回追加したものになります。