glitchのgitにローカルリポジトリを反映する

# はじめに
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する。
![src01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/97a625da-8f37-b6fb-d4de-2b6b8169bef1.png)

### 2. 適当なブランチを作って、そのブランチでソースを修正する。
仮にdevelopブランチを作ることにする。ブランチを作成したら、ソースを修正してpush。

### 3. Terminalを開く
Tools -> Terminal でTerminalを開く。
![src02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/54e7b38d-407d-22c8-bb50-2fb56d338068.png)
<img width="960" alt="src03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/da69cf31-6837-fdd1-4c45-33aae12df713.png">


### 4. masterブランチにマージする
Terminalで次のコマンドを叩いてみる（※これは飛ばしてOK）

```
$ git diff ..develop
```
すると、修正した内容がdiff表示される。
<img width="960" alt="src04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/6a7b8393-57d3-f7f9-fbb3-59964b485d50.png">

次に、mergeコマンドを実行する。

```
$ git merge develop
```
<img width="960" alt="src05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/3c7ae000-3e43-71d7-570f-493a392c08d3.png">

これでソースがマージされ、アプリに反映される。
![src06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/01440c69-67ff-eb74-d656-e1e5cd926db9.png)
↓ちゃんと反映されている
![src07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/25cff6de-89b2-587c-c26a-ada8be385984.png)

でも、glitchのソースブラウザには修正が反映されていないので、次のコマンドを実施する

```
$ refresh
```
<img width="960" alt="src08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82651/3ca80d28-1e09-b909-6ed7-4ad38ae699ad.png">
これで完了。

### 5. merge時に自動更新させる
mergeの際に毎回refreshするのは面倒なので、hooksで自動refreshするような設定をする。
/app/.git/hooks/配下にpost-mergeというファイルを作成し、以下の内容を追記する。

```sh
#!/bin/sh

cd /app;
git --git-dir=.git reset --hard
refresh
```
post-mergeファイルにchmod +xで実行権を与えれば、masterブランチにソースをマージしたら自動的にrefreshが実行されるようになる。