.gitignoreを自動的に作る（gibo, gitignore.io を使う）

# .gitignoreを自動的に作る（gibo, gitignore.io を使う）

.gitignore は自動生成して、自分で削った方が絶対楽なので、少し調べた結果をまとめておく。

どちらを使ってもいいとは思うけど、個人的には

* gibo
    * gitリポジトリをたくさん作ってたくさん.gitignore作るとか、Macとか
* gitignore.io
    * 普段からgitリポジトリあまり作らない、Windows環境だったり、いろいろインストールするのがめんどくさい（または出来ない）

って使い分けができそうだなと感じた。

## .gitignore自動生成サービス

ザクっと調べた所、下記の2つが見つかる。

- gibo (ツール)
- gitignore.io (webサイト)


## gibo

- コマンドラインツール
    - githubでソースコード公開されてる
    - https://github.com/simonwhitaker/gibo
- macならbrew導入して `brew install gibo` 
- [windows でも使えるらしいことを最近知った（試してない）](http://qiita.com/spiegel-im-spiegel/items/45a4619aafcacc161521)
    - scoop導入していけるみたいですね
    - リポジトリ引っ張ってきてパス通せばwindowsでもmacでもいけそう

- 言語名、環境名での指定が可能
    - `gibo java` とか `gibo xcode` とか
    - 組み合わせも可能。 `gibo vim python` とか
- 実際使うときは .gitignore ファイルにへの書き出しが必要
    - `gibo vim go > .gitignore` って感じ

- デメリットとしては `gibo -u` をしないと最新版の.gitignoreが導入されないことと、brewとかインストールしないといけないところでしょうか？
    - githubでリポジトリのzipを持ってこれるけど、そのタイミングでの最新版しか持ってこられないので… 微妙かなあ（git入れてgit cloneすれば良いけど、それならbrew入れれば良くないですかって話になりそう）
    - gibo自体のアップデートと、.gitignoreのテンプレートリポジトリをアップデートするっていう2つのアップデートがあるのが若干罠かも。

### 余談

公開されているコードを見た感じだと、github公式のgitignoreリポジトリを引っ張ってきて、該当するものをローカルで探すみたいな形になっている。

ローカルに.gitignoreのリストがあるので、オフラインで使えるというのはメリットなのかもしれない。

## gitignore.io

- webサイト
- https://www.toptal.com/developers/gitignore
- 文字列を選択して入れると良さそう。
- 検索ワードは複数使えます

![gitignore_io_-_Create_Useful__gitignore_Files_For_Your_Project.png](https://qiita-image-store.s3.amazonaws.com/0/72473/23259b1b-b013-1676-d5cf-68ba0b660c3d.png)

- githubでソースコード公開されてる（今知った）
    - https://github.com/joeblau/gitignore.io
    - gitsubmodulesがあるので、どっかのgitignore集めたリポジトリ参照してるっぽい
- githubのリポジトリにも書いてあるけど、`curl -L -s https://www.toptal.com/developers/gitignore/api/java` みたいな形で持ってこれる
- bashrcとかに関数用意しておくのが無難かなあ

- デメリットとしてはWebに接続していないと使えないことでしょうかね。Webに表示されているものをコピペするのはめんどくさいので、curlとかで持って来なきゃならないのもめんどくさそう。

ちょっとだけ頑張って shell の関数を書いてみた。 `.zshrc` に書き込んだので、シバンは省略している。 `create_gitignore python pycharm` とかで使えるはず。当方はMacOS上でzshを利用しているので、他のOSを使っている方はオプション等の動作の違いにご注意を。

```shell
create_gitignore() {
    # argv length check
    if [ -z $1 ]; then
        echo 'Usage: git_ignore arg1 arg2 arg3 ...'
        return
    fi

    # overwrite check
    flag='y'
    if [ -e '.gitignore' ]; then
        printf 'Are you overwrite .gitignore ? [y/N]: '
        read flag;
    fi

    # download .gitignore
    if [ $flag = 'y' ]; then
        s=$(echo $@ | tr ' ' ',')
        curl -f https://www.toptal.com/developers/gitignore/api/$s -o .gitignore
        echo "create .ignore file for: ${s}"
    fi
    echo 'finish.'
}
```

### 余談
検索後の結果を見てもパット見なぜリダイレクトしているのかわからなかったので、curlコマンドで調べてみる。

```
[08/05 16:27:27] $ curl -L --max-redirs 0 -D - https://www.gitignore.io/api/java
HTTP/1.1 200 OK
Date: Sat, 05 Aug 2017 07:28:38 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 378
Connection: keep-alive
Set-Cookie: __cfduid=dec3a3a3464c007b70d8e098d0b9647c11501918117; expires=Sun, 05-Aug-18 07:28:37 GMT; path=/; domain=.gitignore.io; HttpOnly
Via: 1.1 vegur
Server: cloudflare-nginx
CF-RAY: 38980a689f452e15-NRT

（後略）
```

普通に取れている？
プロトコルをhttpsからhttpに変更してみる。

```
[08/05 16:31:49] $ curl -L --max-redirs 1 -D - http://www.gitignore.io/api/java
HTTP/1.1 301 Moved Permanently
Date: Sat, 05 Aug 2017 07:31:54 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Sat, 05 Aug 2017 08:31:54 GMT
Location: https://www.gitignore.io/api/java
Server: cloudflare-nginx
CF-RAY: 38980f37f6ab2e0f-NRT

HTTP/1.1 200 OK
Date: Sat, 05 Aug 2017 07:31:55 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 378
Connection: keep-alive
Set-Cookie: __cfduid=d8be36077fc78404ce4b267050b14f09c1501918314; expires=Sun, 05-Aug-18 07:31:54 GMT; path=/; domain=.gitignore.io; HttpOnly
Via: 1.1 vegur
Server: cloudflare-nginx
CF-RAY: 38980f3b2a2e2e27-NRT

（後略）
```

どうやらhttpsに移行してるらしい？
qiitaの過去記事を見てみるとhttpとなっているものへアクセスしているものも見られた。

httpsを指定した場合はリダイレクトしてないけど、将来的にドメイン変わる可能性とかも考慮して、githubのREADMEにはそう書いてあるんだろうか。

ローカルにインストール不要なのはいいかなと思う。giboみたいにローカルでリポジトリを持つ必要性もないので、不要なファイルを持たなくてもいいのは良いかも。

### 追記 (2021/01/10)

久々に見たら gitignore.io の URL が変わっていたため、再度同じように試した。やはりリダイレクトされている。

```sh
❯ curl -L --max-redirs 1 -D - https://www.gitignore.io/api/java
HTTP/2 301
date: Sun, 10 Jan 2021 07:40:19 GMT
cache-control: max-age=3600
expires: Sun, 10 Jan 2021 08:40:19 GMT
location: https://www.toptal.com/developers/gitignore/api/java
cf-request-id: 078cd634da0000ef811d2d9000000001
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report?s=8WUhUSuwuzB8izfeql2zTYx47xgFipxF1gO2AOt2SRozdx%2BJOPGS%2BudjhuNtGC1imIF24X9KyPYWuc6pg0XmZ75%2FQndmW0kBjzJV7k4PiQdE"}],"group":"cf-nel","max_age":604800}
nel: {"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 60f4bfce2f3aef81-NRT

HTTP/2 200
date: Sun, 10 Jan 2021 07:40:19 GMT
content-type: text/plain; charset=utf-8
content-length: 491
set-cookie: __cfduid=da6e1777494ac5203c3fc40c4500e954b1610264419; expires=Tue, 09-Feb-21 07:40:19 GMT; path=/; domain=.toptal.com; HttpOnly; SameSite=Lax; Secure
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
strict-transport-security: max-age=31536000
via: 1.1 google
cf-cache-status: DYNAMIC
cf-request-id: 078cd6353e0000f903009cd000000001
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 60f4bfcec997f903-NRT
```

## 参考資料

qiitaの記事を読んで、書いてみようという気持ちになったので、偉大な先人の皆様に感謝しています。

- 気付いたら.gitignoreはgiboで自動生成する時代になっていた
    - http://qiita.com/tmknom/items/c4bcebe17d25381fa45d
- gitignore.ioのススメ
    - http://qiita.com/dhun/items/adcae139b5ba1da56c81
- gibo (gitignore-boilerplates) による .gitignore 生成（Windows でもできるよ）
    - http://qiita.com/spiegel-im-spiegel/items/45a4619aafcacc161521
- リダイレクト先URLの取得方法いろいろ - 大石の雑記帳-
    - http://d.hatena.ne.jp/oishikazuo/20110929/1317274415


## 未検証

さっきググったら、こんなのも見つけたって話。

- npm  generate-gitignore
    - https://www.npmjs.com/package/generate-gitignore
    - npmのパッケージ、指定がちょっと冗長かなあという気持ち
- .ignore
    - https://plugins.jetbrains.com/plugin/7495--ignore
    - JetBrainsのプラグイン。関連商品使ってる人的には良さげなのかもしれないですね。


## 終わりに

メモ書き程度ですが、両方について書いているものが少なかったので書いてみた。
どうしてgitignore.ioにcurlコマンド使ったときにリダイレクトが必要なのはなぜか、とか考える機会にもなり、curlコマンドに関しての知見を良い機会にもなった。

初投稿終わり。

## 最近思うこと

giboで以前は入れていたが、最近はGithubならデフォルトで使用する言語を選んで作ってしまうので、コマンド自体をあまり使わないようになってきた感じがする。

それとWebページで `gitignore.io` を調べて、必要そうなものをコピペしてカスタマイズ… みたいなことをやるようになった。


そもそもよく使う言語と開発環境は、自分の環境であればglobalの .gitignore に入れてしまうとか、それをチームで共有しとくとかの解決になりそう。


なので、インストールするのってどうなんだろうなという気持ちになりつつある。