gitでローカルからpushして自動で公開されるようにする。
バージョン管理しつつ複数人でサーバー上のアプリを開発できるようにgitを導入しました。
まずGitの基本であるcommit, clone, push, pull等については博多弁を喋るおサルさんに教えていただきました(サルでも分かるGit入門)。 とてもわかり易いです。 これを見れば複数人で同時に編集し、競合が起きた場合の対処まであっさり導入できました。
友人・俺「こんな簡単やったら最初からやっとけばよかったな」
意気揚々と試しに友人と一緒にに更新してみました
しかし、ここで問題発生!
リモートにpushはできてgitのlogも残るけど、サーバー上で公開しているファイルが更新されない。 どうやら大きな勘違いをしていたようです。 gitはバージョン管理ツールであって、webに公開するのはまた別の話でした。
この時点ではサーバー上のこれまで開発していたアプリのディレクトリ内でgit initして、それをローカルにcloneしました。 サーバー上のgit initしたディレクトリに向けてpushすると.git内にバージョンの情報は蓄積されるけど、ファイルは更新されませんでした。
gitのmasterの最新バージョンをサーバー上のファイルに直接反映させたい場合は別の手続きが必要でした。
ローカルからpushして自動で公開する方法
1. もし既に開発しているファイル(app/)があればそのディレクトリ内でgit initして全ファイルをadd、commitしておく。
cd app/へのパス git init git add . git commit
2. サーバー上のどこかにapp.gitという名前のディレクトリを作る(中身は空)。その中でgit --bare initを実行。--bareする時は慣例としてディレクトリ名に.gitをつけるらしい。
mkdir app.git cd app.gitへのパス git --bare init
3. 1.でgit initしてたらそこからapp.gitにpushします。
cd app/へのパス git push app.git/へのパス master
pushしたら1.のディレクトリは不要です。削除して問題ありません。 1.がなく1から開発を行う場合は何もする必要はありません。 READMEでも作ってadd,commitしてみましょう。
4. app.gitから製作者が各々ローカルにクローンを作ります。 これに関してはおサルさんの言うとおりにすればできるハズ!
5. サーバー内でapp.gitからドキュメントルート上にクローンを作っておきます。
git clone app.git/へのパス 公開するディレクトリのパス
これで指定したパス内にクローンのディレクトリが出来上がります。
6. app.git/hooks/post-receive.sampleをコピーしてpost-receiveという名前でその場に保存。中はshellスクリプトになっていて、1番下に
cd app.git/hooks cp post-receive.sample post-receive
コピーしたpost-receiveの1番下に以下の文を追加
cd /var/www/html/app/ git --git-dir=.git pull
ここを参考にしました。 post-receiveはプッシュを受け付けたら実行するファイルらしいです。 つまり、プッシュがあれば自動で公開しているアプリ内でpullして更新してくれます。
これでローカルからpushしたらサーバーで公開してるファイルも自動で更新されます。
補足
3.で最初のgit initしたapp/は削除しました。 これを残しておいてwebに公開し、ここで自動pullするようにしたらいいと思ったのですが、それはどうやらダメらしい。 pullするのはクローンを作ったとこでってことらしい。