はじめに
glitchを用いてDiscordのbotを作ろうとしたんだけど、glitchって基本的にはブラウザ上で開発?デプロイ?する感じで作られているので、できればgitと連携できてソース管理とかはそっちでできないかなぁと思っていたんだけど、そもそもglitch自身がgit機能持っているので、そっちでソース管理する方法を調べてみた。
glitchとは
glitchを最初に知った時は、どこぞの怪しいサービスかと思ったけども、実はStack OverflowやTrelloを作っている会社だと知って、怪しんでごめんなさい。glitchは簡単に言えばNode.jsのアプリケーションや静的Webページをブラウザ上で編集、公開することができるサービス。
Import from GitLab
はじめにやりたかった事は、他のgitサービスからglitchへインポート、同期設定ができないかということ。特にfreeでもunlimited collaboratorsなGitLabと連携したかった。glitchのヘルプを見ていたら、GitLabからインポートできるとあるのでやってみた。
https://glitch.com/help/how-to-sync-a-glitch-project-with-a-git-repo-on-gitlab/
………………
でも失敗する。何度やっても失敗する。
ちなみにGitHubからインポートしてみると、ちゃんとインポートできる。glitchのTerminalからcurlでGitLabにアクセスしてみると、https://gitlab.com にはアクセスできないんだけど、https://about.gitlab.com/ にはアクセスできることが分かった。どうやらレスポンスコードが302だとアクセスできないっぽい。できるって書いてるのにー...。でもGitHubは大人数でソース管理するには有料になっちゃうし...。かといってGitLab → GitHub → glitchとかするのもバカバカしいし。
local master -push-> remote master
いろいろと調べていると、glitchはそもそもgitで構成されていることが分かったので、cloneして直接pushできないか試してみた。でもまたもや失敗した。どうやらglitchのmasterブランチはノンベアなリポジトリらしく、直接pushすることはできないらしい。一応masterに直接pushする方法はある様子。
https://nju33.com/glitch/git%20push%20%E3%81%A7%E8%87%AA%E5%8B%95%E5%8F%8D%E6%98%A0
でも次のヘルプを見ると、glitchとしてはmasterリポジトリは直接触らず、他のブランチからマージする方法を説明している。個人的にも開発でmasterを直接いじるのは微妙だと思うので、こっちの方法でソース管理するようにしたい。
https://support.glitch.com/t/possible-to-code-locally-and-push-to-glitch-with-git/2704/2
glitchのローカルリポジトリをリモートのmasterに反映する方法
1. git clone
まずglitchのgitをcloneする。
Tools -> Import and ExportからURLをコピーし、cloneする。
2. 適当なブランチを作って、そのブランチでソースを修正する。
仮にdevelopブランチを作ることにする。ブランチを作成したら、ソースを修正してpush。
3. Terminalを開く
Tools -> Terminal でTerminalを開く。
4. masterブランチにマージする
Terminalで次のコマンドを叩いてみる(※これは飛ばしてOK)
$ git diff ..develop
次に、mergeコマンドを実行する。
$ git merge develop
これでソースがマージされ、アプリに反映される。
↓ちゃんと反映されている
でも、glitchのソースブラウザには修正が反映されていないので、次のコマンドを実施する
$ refresh
5. merge時に自動更新させる
mergeの際に毎回refreshするのは面倒なので、hooksで自動refreshするような設定をする。
/app/.git/hooks/配下にpost-mergeというファイルを作成し、以下の内容を追記する。
#!/bin/sh
cd /app;
git --git-dir=.git reset --hard
refresh
post-mergeファイルにchmod +xで実行権を与えれば、masterブランチにソースをマージしたら自動的にrefreshが実行されるようになる。