giboを使っていい感じにgitignoreの設定をする

みなさんはGitリポジトリを作成したら、きちんと`.gitignore`を設定していますか？

`.gitignore`を適切に設定していないと、開発中のログファイルやビルドキャッシュ、果てはクラウドサービスのキーファイルやクレデンシャルといった**コミットに含めるべきではないもの**をうっかりコミットしてしまう事故が起きたりします。

そうならないように、また、コミット作業時に神経をすり減らさないためにも、`.gitignore`を設定しておきましょう。

## giboコマンドを使う

さて、`.gitignore`を設定することが大事なのはわかりましたが、どんな内容を書けばいいのか考えるのも、毎回手で書くのも大変ですね。

そこで登場するのが[gibo](https://github.com/simonwhitaker/gibo)というコマンドです。

`gibo`は[github/gitignore](https://github.com/github/gitignore)というGitHubが管理している`.gitignore`のテンプレート集を使って`.gitignore`を生成してくれるコマンドラインツールです。
似たようなツールやサービスは他にもあるのですが、`gibo`が比較的有名だと思います。

macOSであれば`brew install gibo`、Windowsであれば`scoop install gibo`などでインストールできます。

`gibo`を使うと、例えばこんな風にして`.gitignore`ファイルを生成できます。

```sh
gibo dump macos rust >> .gitignore
```

<details>
<summary>生成された.gitignoreの中身</summary><div>

```text:.gitignore
### https://raw.github.com/github/gitignore/991e760c1c6d50fdda246e0178b9c58b06770b90/Global/macOS.gitignore

# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk


### https://raw.github.com/github/gitignore/991e760c1c6d50fdda246e0178b9c58b06770b90/Rust.gitignore

# Generated by Cargo
# will have compiled files and executables
debug/
target/

# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock

# These are backup files generated by rustfmt
**/*.rs.bk

# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb
```

</div></details>

（長いので折り畳んであります）

このように、`gibo`の引数にテンプレート名（複数可）を渡してやると、それらに対応する内容を並べて出力してくれます。
自分で思っていた以上に色々な項目が入っていますね。

テンプレート集は大勢のコントリビュートによって成り立っているので、自分で考えて設定するよりも適切な設定が行えるというのもメリットです。
中には状況に応じてコメントアウトしたりコメント解除する必要のある項目が含まれていたりするので、ざっと目を通しておきましょう（上の例でいうと`Cargo.lock`の部分がそうですね）。

どんなテンプレートがあるのか、どのような内容なのかは[github/gitignore](https://github.com/github/gitignore)を見てください。

リポジトリを新しく作ったら、まずは`gibo`で`.gitignore`を生成して、それからプロジェクト固有の設定を付け足していけば良いでしょう。

## おすすめの使い方

前提として`.gitignore`ファイルはリポジトリにコミットして関係者全員に共有されるものなので、そのへんを踏まえて設定しましょう。

- 3大プラットフォームの設定をすべて入れておく。
    - 関係者がどのOSで作業するかわからないので、`linux`, `macos`, `windows`は入れておいたほうがよいでしょう。[^platforms]
- 昨今のメジャー開発環境かつプロジェクトで想定されそうな著名なIDEの設定を入れておく。
    - 関係者がどのようなエディタ、IDEを好むかもわからないので、プロジェクトにふさわしい環境をいくつか設定しておくとよいでしょう。
    - 例えば`visualstudiocode`, `jetbrains`とか。
- 個人的な設定は極力入れない。
    - 個人的な設定はグローバルな`gitignore`設定[^gitignore-global]や`.git/info/exclude`で設定しましょう。[^git-info-exclude]

「OS固有の設定やIDEの設定などは共有せずに自分個人で設定するべき」という意見もあります（自分もかつてはそうでした）が、最近は主要な環境の設定は最初から全部入っていたほうがいいかなと思っています。[^oss]
あまりGitに慣れていない新しいメンバーが入ってきた際にも事故率が減りますし。

以上を踏まえて、私はだいたいこんな感じで設定しています。

```sh
gibo dump linux macos windows visualstudiocode jetbrains プロジェクト固有の言語やツール... >> .gitignore
```

具体的にはこんな感じですね。

```sh
# KotlinでSpring Bootなど
gibo dump linux macos windows visualstudiocode jetbrains gradle kotlin >> .gitignore

# Node.jsプロジェクト
gibo dump linux macos windows visualstudiocode jetbrains node >> .gitignore
```

最近はプロジェクト作成時にGitリポジトリと`.gitignore`も自動生成してくれることも多いですが、その場合は内容を上書きしないように注意しましょう（追記でリダイレクトしましょう）。

## テンプレートの更新

`gibo`は`~/.gitignore-boilerplates`に`github/gitignore`のcloneを持っていて、そこから出力しているので、時々`gibo update`して最新化するとよいでしょう。

## gitignore.io

`gibo`と並んで有名な類似サービスとして[gitignore\.io](https://www.toptal.com/developers/gitignore)というサービスがあります。

こちらはWebインターフェースなのですが、テンプレートの指定時にインクリメンタルに検索できるのと、`github/gitignore`にはないエイリアス名でも指定できるのが特徴となっています。

例えば`intellij`とか`rubymine`でも出てきます（中身は`jetbrains`のもの）。

また`curl`を使ってテキスト形式で取得できるようにもなっているので、`gibo`の代わりに使うこともできます。
いい感じに使うための設定方法やAPIなんかのドキュメントがあるので目を通してみるとよいでしょう。

## おまけ

- KotlinテンプレートはJavaテンプレートへのシンボリックリンクになっています。
    - `gibo dump java kotlin`とかやると同じ内容が2回出力されてガッカリします。


[^gitignore-global]: `~/.config/git/ignore`とか`core.excludesFile`で指定するファイルです。
[^git-info-exclude]: ローカルリポジトリ固有の除外設定ファイルです。
[^platforms]: ターゲットOSも作業OSも明らかに固定である場合は、ひとつでもいいでしょう。
[^oss]: OSSだとまた思想や事情が異なってくるかもしれませんが、そのへんは状況に合わせて設定すればいいと思います。