腹が減ってはなんとやら

大学院博士課程から脱落しました。

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するのはクローンを作ったとこでってことらしい。

参考