この記事のポイント
- 変更管理から除外する
.gitignoreの概要について説明しているYo -
.gitignoreの作り方についてまとめているYo -
.gitignoreを使ってみた時の疑問点をまとめているYo
はじめに
この記事ではGitの変更管理を設定する.gitignoreにフォーカスを当てて説明します。
※GitHubで使う際のTipsについても説明します。
誤りなどがありましたらご指摘いただけますと幸いです。
復習:.gitignoreってなんだっけ
.gitignoreの説明なんて言われなくてもわかっているYoっていう人が多いと思いますが
ここでは改めてどんなものかを振り返っていきましょう。
簡単に説明すると変更管理から除外するためのファイルのことです。実はGitHubのドキュメントに説明がされていたりします。GitHub公式ドキュメントでは以下のように説明されています。
GitHub にチェックインしたくないファイルを無視するように Git を構成することができます。
なお、.gitignoreはGitというシステム(ソフトウェア)の設定項目に過ぎないのでGitのドキュメンテーションにも記載があります。Git公式ドキュメントでは以下のように説明されています。
gitignore - 意図的に追跡しないファイルを指定する
引用:Git - gitignore Documentation
いずれにしてもバージョン管理からはずす機能として定義されています。
復習:.gitignoreの書き方
ご存知の方も多いと思いますが、書き方も簡単に振り返っていきましょう。
基本的なルールとしては以下のとおりです。
- 無視するファイル名のパターンを書くことでパターンマッチングを行い、無視する
- パターンを否定する場合は
!を書く - 空白行は認識されず、!などの意味を持つ文字を利用する場合はエスケープを利用する
※それ以外の細かいルールについてはGitの公式ドキュメントを読んでください。
.gitignoreの作り方
書き方がわかったところで.gitignoreの作り方を見ていきましょう。結論先に説明するとざっくりですが、3つあります。まずは1つ目の作り方としてプロジェクトに合わせて手書きする方法、GitHubの機能を使う方法、.gitignore.ioを使う方法です。
- 手書き
- GitHubの機能を使う(後述)
- .gitignore.ioを使う
※AIエージェントを使って生成する方法もありますが、人によってやり方が分かれるところなので割愛
.gitignoreを試す環境を構築
まずは.gitignoreを試すためにGitを使って、環境を構築してみましょう。
以下のコマンドをターミナルを起動してコピペして実行します。
mkdir git_test && cd git_test
git init
echo "Hello,.gitignore" > README.md
git add .
git commit -m "add README.md"
.gitignoreを作成します。
touch .gitignore
次に.gitignoreを試すファイルを生成します。今回は10個の連番ファイルを作成します。
touch sample{1..10}.txt
変更管理のステータスを見てみましょう。
git status
実行結果としては合計で11個のファイルが出力されると思います。具体的には以下のとおりです。
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
sample1.txt
sample10.txt
sample2.txt
sample3.txt
sample4.txt
sample5.txt
sample6.txt
sample7.txt
sample8.txt
sample9.txt
nothing added to commit but untracked files present (use "git add" to track)
実際に変更を無視してみる
まずはsample.txtをすべて無視するパターンを試してみます。以下のテキストを.gitignoreに追記します。
sample*.txt
うまくいくと変更管理に含まれるファイルは.gitignoreだけになると思います。
では次に以下のパターンを試します。
# sample*.txt
sample1*.txt
上記のパターンではsample2からsample9までが変更管理の対象になります。
sample10.txtが変更管理から除外されます。
次のパターンを試してみましょう。
# sample*.txt
sample1*.txt
!sample10.txt
これでsample1.txtを除くファイルが変更管理の対象になりました。
.gitginoreを.gitignoreするとどうなる?
基本をおさらいしたところで.gitignoreを変更管理から除外するとどうなるのでしょうか。
また、多重で.gitignoreを実行した場合はどうなるのでしょうか。実際に試してみましょう。
.gitginoreを.gitignoreしてみる
結論から説明すると.gitignoreで.gitignoreを除外することは可能です。
以下のパターンを試してみましょう。
.gitignore
sample1*.txt
ということは「他に.gitignoreがあるとそれも無視できる!ということ?!」となったかもしれません。試してみましょう。
.gitignoreが複数存在する(多重.gitignore)
次は.gitignoreが複数ある場合を試してみましょう。同じディレクトリに同じファイル名が存在することは現代のファイルシステムでは許容されていないので別のディレクトリに.gitignoreを作成します。
mkdir ignore && cd ignore
touch .gitignore
これで親フォルダに.gitignore(以下、親.gitignore)、ignoreディレクトリに.gitignore(以下、子.gitignore)ができたと思います。
2つ以上.gitignoreがあるときどうなるのサ?
変更管理のファイルが2つある状況なのでどっちが何を管理するのかそして、優先順位はあるのかなど疑問があると浮かんできたと思います。実際に試してみましょう。
親.gitignore(.gitignore)
ignore/.gitignore
子.gitignore(ignore/.gitignore)
!.gitignore
上記の場合、打ち消しが発生します。つまり、親子ともに変更管理がなされます。
つまりは親が除外しているけど、子は変更管理してくれと言えば、変更管理がされるということです。
ということは子.gitignoreが変更管理を無視するようにすれば、親.gitignoreの設定は無視されるのか?ということでこれもやってみましょう。
親.gitignore(.gitignore)
ignore/.gitignore
sample*.txt
子.gitignore(ignore/.gitignore)
!.gitignore
!sample*.txt
結果は親子の.gitignoreが残るような形となるはずです。
これはどういうことかというと、.gitignoreは配置したフォルダを対象に変更管理を制御します。なお、子は親ディレクトリにあるファイルを制御できません。
ということは?
たとえば、プッシュしてはいけない代表格の.envをプッシュして事故を起こす例もあるのでは?
実際にやってみましょう。.envをignoreフォルダに作成します。
そして、以下のように.gitignoreを書き換えてみます。
親.gitignore
ignore/.gitignore
sample*.txt
.env
子.gitignore
!.gitignore
!sample*.txt
!.env
これで結果を見てみると、ignoreフォルダ紛れ込んだ.envが追跡されていることがわかると思います。
これは.gitignoreを使い始めた時の誤解として「常に親ルートが反映されるんでしょ」と思ってやっていたら実際には変更管理に入ってしまうということです。
余談:.envといったものをpushしないようにする対策
余談ではありますが、プッシュしてはいけない情報をプッシュしない方法としてはいくつか方法あります。具体的には以下のとおりです。
- .config/git/ignoreを設定する
- git Configを設定する(core.excludesfileを利用)
- GitHubの機能を利用する(後述)
GitHubの機能を使ってスマートに解決
ここまでGitのシステムを使ったgitignoreの話をしました。「プッシュしたくないものはignoreしておけば、問題ないんでしょ?」と簡単に思ったかもしれません。
ただなかなかそうもいきません。そもそも「リポジトリを作成するたびに.gitignoreを手書きしないといけないのか?何を含めて何を除くのか決めるのって面倒じゃね」ってそんなことが頭に浮かぶと思います。
また、.envといったいわゆるプッシュできないファイルについてはどう対策したら良いかなど課題もあると思います。順番に見ていきましょう。
GitHubを使った.gitignoreの作成方法
今回は3つ紹介します。
- リポジトリ作成時にセットする
- テンプレートリポジトリを活用する
- github/gitignore を参考に作成する
リポジトリ作成時にセットする
GitHubでリポジトリを作成できる状態であれば、検討できる方法です。
※あるいは新規にプロジェクトを立ち上げる場合など
新規のリポジトリ作成時にAdd .gitignoreがあります。ここでテンプレートのように指定して作成できます。
作成したら個々のプロジェクト用にカスタムしていくと良いでしょう。
テンプレートリポジトリを活用する
GitHubリポジトリにはテンプレート機能があります。
たとえば、社内標準のリポジトリを作成しておいて何か新しいものを開発するときに利用してもらうなどがあります。
このテンプレートリポジトリに.gitignoreを含めることができるのでリポジトリの作成を標準化できます。
github/gitignore を参考に作成する
GitHub公式リポジトリにっは.gitignoreの書き方がいくつか掲載されています。
内容をもとに自分で作成することも可能です。
余談:.gitignore.ioの利用
もう一つ、gitignore.ioを使った.gitignoreの作り方についてみていきましょう。
上記のURLにアクセスして利用言語などで検索するとその言語に沿った.gitignoreがWeb画面上に表示されます。
もちろん、汎用的な内容なので不要なものは自分で削除する必要があります。
.gitignoreもいいけど、プッシュ保護も使おう
これまで.gitignoreを使った変更管理について説明しましたが、それでも人間なのでつい.envなどをプッシュしてしまいそうになることもあると思います。
そういう場合はプッシュ保護を利用しましょう。
まとめ
今回は.gitignoreの使い方についてざっとチェックしました。
実はいろんな作り方があるということに気づくと思います。
ちなみに筆者はテンプレートリポジトリを活用しています。新しくリポジトリを作成する場合はGitHubの機能を積極的に利用しています。
実はなんですが、.gitignore.ioの存在はGitHub公式YouTubeで知りました。
