📚

.gitignoreはサブディレクトリに作ってもよい

2022/10/13に公開

.gitignoreはサブディレクトリに作ってもいいんです

ご存じでした??僕は知りませんでした!


説明

ちょっとわかりにくいと思いますので説明しますと、例えば以下のようなディレクトリ構造で、複数言語の開発を1つのgitリポジトリで行っていたとします。("モノリポ"って言うんでしょうか)

.
├── .git
├── README.md
├── api  # GoでAPIなんかを作っている
│   ├── Dockerfile
│   ├── entity
│   │   └── ....
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── web  # WebでUIを作っている
│   ├── Dockerfile
│   ├── ....
├── tools  # Pythonでちょっとしたスクリプトなんか作っている
│   ├── ....
│   ├── ....
└── docker-compose.yml

こういうとき、VSCodeなんかでコーディングしているとルートディレクトリに.vscodeとかできて、それを無視するために同じ階層に.gitignoreを作って、リポジトリに含めたくないファイルなどを管理したりすると思います。

ところがそれぞれの実装ディレクトリは言語もバラバラ、お作法もバラバラなので、無視したいファイル群やルールがそれぞれ異なります。でもルートディレクトリにある.gitignoreにまとめて書こうとすると、

# VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets

*.code-workspace

# Go - api以下に配置
/api/*.test
/api/*.out

# Web - web以下に配置
/web/vendor/
/web/node_modules/
....

このように、それぞれのサブディレクトリを意識しなければいけなくなって、可読性も低ければ再利用性も悪い、イマイチな.gitignoreができあがってしまいます。

こんなときは、それぞれのサブディレクトリごとに.gitignoreを分けて作ってスッキリさせましょう。
最初のtreeに書き加えると、こんな感じです。

.
├── .git
├── README.md
├── api
│   ├── .gitignore <- ここに置く
│   ├── Dockerfile
│   ├── entity
│   │   └── ....
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── web
│   ├── .gitignore <- ここに置く
│   ├── Dockerfile
│   ├── ....
├── tools
│   ├── .gitignore <- ここに置く
│   ├── ....
│   ├── ....
├── .gitignore <- もちろんここにも置く
└── docker-compose.yml

こうすると、サブディレクトリを意識しなくてよくなったり、各.gitignoreに言語ごとのルールを閉じ込められるので別のリポジトリでも活用できたりして、良いことずくめです!

gitリポジトリはルートディレクトリ直下にあるので、勝手に.gitignoreも同じ階層に置かなきゃいけないと思い込んでいたんですが、そんなことはありませんでした。思い込みって怖いですね!

ではまた!

おまけ

言語や環境を入力すると、いい感じの.gitignoreを作ってくれます。便利!

Discussion