公開日: | 最終更新日:
【IT用語】 .gitignoreの書き方を図解形式で理解しよう!
.gitignoreとは、Gitで管理しないファイルを指定することが出来るファイルの事です。
以下のように、.gitignore
ファイルにsample1.rb
と指定することで、sample1.rb
ファイルをGit管理下から除外することが出来ます。
.gitignore
で指定するファイルは、ローカル(自分のパソコン)だけに必要なファイルを指定します。
.gitignoreの基本的な使い方
この章では、.gitignoreについて基本的な使い方について解説します。
ファイルをGit管理下から除外する手順
sample1.rb
ファイルをGit管理下から除外する手順について1つ1つ確認していきます。
まずは、以下のようにgitignore_sample
ディレクトリにsample1.rb
とsample2.rb
のファイルを作成します。
次にgitignore_sample
ディレクトリの現在の状態を確認していきます。
Git管理の状態を確認しよう
ディレクトリにリポジトリが作成されていれば、以下のファイルの状態をgit status
コマンドで確認する事が出来ます。
- トラッキング状態:インデックスに登録したが、コミットされていないファイル
- アントラッキング状態:Git管理されていない、かつ
.gitignore
ファイルで指定されていないファイル - 既にGit管理されているファイルを変更した場合(再度、インデックスに登録する必要がある)
gitignore_sampleディレクトリでgit status
を実行すると、次の様に表示されます。
先ほど作成したsample1.rbとsample2.rbは、アントラッキング状態を意味するUntracked files
で表示されています。つまり2つのファイルは以下の状態にあります。
現時点ではsample1.rbとsample2.rbは、Git管理下にあると言えます。
.gitignoreファイルの作成とファイル指定
Git管理下にあるファイルを除外するには、.gitignoreファイルを作成して除外するファイルを指定する必要があります。先ほどのsample1.rbはGit管理下にあるファイルですが、.gitignoreファイルを使ってGit管理から除外していきます。
まずは、gitignore_sample
ディレクトリに、以下のように.gitignore
ファイルを作成してsample1.rb
を指定します。
次に、sample1.rbがGitで管理されていない事を確認するために、再度git status
を実行します。
上記の実行結果からアントラッキング状態にあるのは、Git管理から除外していないsample2.rb
と先ほど作成した.gitignore
の2つのファイルで、.gitignoreファイルで指定したsample1.rbはGit管理下から除外されます。
次に、ここまでのgitignore_sample
ディレクトリの作業内容を GitHub のリモートリポジトリにアップロードして確認していきましょう。
githubのリモートリポジトリで確認
以下の操作によって、Git管理下にあるワークツリーの作業内容をリモートリポジトリにアップロードします。
git add
インデックスへ登録するgit commit
ローカルリポジトリにコミットするgit push
リモートリポジトリにアップロードする
この操作の詳しい概要はコマンド操作の方法を参考にして下さい。
現在のgitignore_sample
ディレクトリのファイル状態は、以下の通りでした。
上記の状態からインデックスに登録する為に、addコマンドを実行して再度git status
でファイルの状態を表示させます。
2つのファイルは、コミット準備が整っている状態だと確認出来たので、以下のようにcommitコマンドを実行します。
これでローカルリポジトリに登録することが出来たので、Githubにあるリモートリポジトリに登録とアップロードする為に以下のコマンドを実行します。
リモートリポジトリのGithubを開くと、.gitignore
とsample2.rb
のアップロードを確認することが出来ました。
もちろん.gitignore
で指定したsample1.rb
はGit管理から除外されているので、アップロードされていないことも確認する事が出来ます。
.gitignoreファイルの指定方法
.gitignoreファイルの実際の指定方法について、先ほどのgitignore_sample
ディレクトリに以下のファイルを追加して確認します。
サッと確認だけしたい方は、.gitignoreファイル指定方法一覧へ
.gitignoreファイルのパス指定
.gitignoreでのファイルのパスは、「.gitignoreをカレントディレクトリ
とした相対パス
」で指定します。.gitignoreは、ファイルを絶対パスで指定する事が出来ません。
カレントディレクトリ
- 現在作業を行なっているディレクトリ相対パス
- 現在の作業している位置を基準に目的までの経路を表すパス絶対パス
- 最上位に位置するルートパスから目的までの経路を全て表すパス
つまり.gitignore
に記述するファイルのパスは、「.gitignoreから見たファイルの場所までの道筋」を記述します。
例えば、directory
配下にあるhoge3.png
を.gitignoreで除外したい場合は、以下のように指定します。
特定のファイルとディレクトリを除外で詳しく解説しますが、ディレクトリの最初につく/
は、絶対パスではなく.gitignoreファイルと同じ階層にあるファイルやディレクトリを指します。
その為、上記の/directory/hoge3.png
は、.gitignoreファイルと同じ階層にあるdirectory配下のhoge3.pngをGit管理下から除外する指定を行なっているのです。
同名のファイルとディレクトリを全て除外
同名のファイルとディレクトリを全てGit管理下から除外するには、「/」を含めないで指定します。
例えば、以下のようにsample1.rb
と指定すると、gitignore_sample
ディレクトリ直下にあるsample1.rbだけではなく、同名のdirectory/sample1.rbもGit管理下から除外されます。
ディレクトリも同様です。
以下のように/
を含めないでdirectory
と指定すると、gitignore_sample
ディレクトリ直下にあるdirectoryだけではなく、同名のdirectory2/directoryもGit管理下から除外されます。
そして、ディレクトリの場合はディレクトリ配下にあるファイルもGit管理下から除外されます。
特定のファイルとディレクトリを除外
特定のファイルとディレクトリをGit管理から除外するには、末尾以外に/を含めて指定します。
パス指定でも解説しましたが、最初に/
を含める事で.gitignoreファイルと同じ階層の相対パスで指定されたディレクトリやファイルを除外します。
例えば、.gitignoreファイルと同じ階層のsample1.rb
をGit管理下から除外する場合は、.gitignore
ファイルをカレントディレクトリとした相対パス/sample1.rb
を指定して除外します。
sample1.rb
の最初に/
が含まれているので、.gitignoreファイルと同じ階層のsample1.rb
が除外の対象となるので、同名のdirectory/sample1.rbは除外されません。
ディレクトリも同様に特定の箇所だけ除外する事が出来ます。.gitignoreファイルと同じ階層のdirectory
をGit管理下から除外する場合は、以下のように/directory
と指定します。
directory2/directory
は、.gitignoreファイルと同じ階層にないので除外されません。
同名のディレクトリを除外
同名のディレクトリを全て除外するには、冒頭の「指定するディレクトリ名に/を含めない」以外にも、ディレクトリ名の末尾に/を付ける事で除外する事が出来ます。
例えば、.gitignore
ファイルにdirectory/
と指定する事で、gitignore_sampleディレクトリ直下にあるdirectory
だけではなく、同名のdirectory2/directory
もGit管理下から除外されます。
もちろんdiectory
の配下にあるsample1.rb
やhoge.rb
ファイルもGit管理から除外されます。
以下のようにdirectory/
は、directory
と指定した場合と同様の結果が得られます。
特定ファイルとディレクトリだけ追跡
.gitignore
は、通常Git管理から除外するファイルを指定しますが、特定のファイルやディレクトリだけGit管理したい場合に、指定するファイル or ディレクトリの最初に!を付ける事で除外出来ます。
例えば、gitignoreファイルに*
を指定すると全てがGit管理下から除外されますが、sample2.rbだけGit管理したい場合は、以下のように!/sample2.rb
と指定する事でGit管理から除外されません。
しかし、!
を使う場合はいくつか注意点があります。
まず.gitignore
ファイルは上から読み込まれるので、最初の設定は後から追加した設定に上書きされます。
例えば、先ほどの!/sample2.rb
を以下のように*
の前に指定すると、*
に上書きされてしまい全てのディレクトリとファイルがGit管理下から除外されます。
また、Gitのパフォーマンス上の理由からディレクトリを除外した後に、ディレクトリ内の一部のファイルに対して「!」を使ってGit管理する事は出来ません。
例えば、以下のように/directory2/
のディレクトリを除外してから!directory2/hoge2.rb
を指定してもdirectory2/hoge2.rb
は除外されてGitで管理されません。
しかし、/directory2/
でディレクトリを除外するのではなく、/directory2/*
でディレクトリ内の全てのファイルやディレクトリを除外してから!/directory2/hoge2.rb
と指定すると、/directory2/hoge2.rb
はGit管理する事が出来ます。
コメントアウト
コメントアウトは、#
(ハッシュ記号)で指定します。
以下のファイルは、#
でコメントアウトされているので除外されません。
特定の拡張子の除外
特定の拡張子を*
を使って、* + 拡張子
と指定する事で場所に関係なく指定した拡張子を全てGit管理下から除外する事が出来ます。
例えば、以下のように*.png
と指定する事で、png拡張子のファイルが全てGit管理下から除外されます。
また、以下のように/*.png
と指定すると、ディレクトリ直下の.gitignore
ファイルをカレントディレクトリとした相対パスになります。
つまり、.gitignore
ファイルと同じ階層にあるpng拡張子のhoge.png
やhoge2.png
ファイルのみGit管理下から除外され、directory/hoge3.png
は除外されません。
.gitignoreファイル指定方法一覧
これまで解説した.gitignoreファイルの指定方法は、以下の一覧にまとまっています。
指定方法 | 意味 | 例 |
---|---|---|
/ を含めないで指定 |
同名のファイルとディレクトリを全て除外 | sample1.rb |
末尾以外に/ を含めて指定 |
特定のファイルとディレクトリを除外 | /sample1.rb |
ディレクトリ名の末尾に/ を指定 |
同名のディレクトリを除外 | directory/ |
ファイルやディレクトリの最初に! を指定 |
特定ファイルとディレクトリだけ追跡 | !/sample2.rb |
# (ハッシュ記号)で指定 |
コメントアウト | #sample1.rb |
* + 拡張子 と指定 |
特定の拡張子の除外 | *.png |
.gitignoreの優先順位
.gitignoreファイルは、以下のように複数作成する事が出来ます。
.gitignoreファイルが複数存在する場合は、深い階層にある.gitignoreファイルに指定された設定の方が優先度は高いです。gitignore_sample/directory/
に.gitignoreファイルを追加して確認します。
複数ディレクトリ
まず、gitignore_sample
直下にある.gitignoreファイルに*.png
と指定し、全てのpng拡張子のファイルをGit管理下から除外します。
.gitignoreファイルで*.png
と指定すると、以下のようにどの場所であっても全てのpng拡張子のファイルがGit管理下から除外されます。
これにdirectory/.gitignore
に、png拡張子だけGit管理させる!*.png
を指定したらどうなるでしょうか?
directory/.gitignore
は.gitignore
よりも深い階層に位置するので、directory/.gitignore
で指定した!*.png
が優先されてdirectory/hoge3.png
はGit管理されます。
gitignore_sample
ディレクトリ直下にあるhoge.png
とhoge2.png
は、Git管理下から除外されます。
Railsアプリケーションの場合
Railsアプリケーションでは、gemやRails独自のディレクトリ構成の関係で.gitignore
で除外しなければいけないファイル、逆に除外してはいけないファイルがあります。下記は代表的な例です。
除外するファイル
.env
/public/uploads
vendor/bundle
除外してはいけないファイル
Gemfile.lock
db/schema.rb
除外対象1 - [.env]
.env
は環境変数を管理するファイルで、gemのdotenv-railsを使う際に作成します。
隠したいデータを.env
に記述する為、.gitignoreでGit管理下から除外せずにリモートリポジトリで公開してしまうと非常に危険です。
例えば、carrierwaveのs3のaccess keyなどを.env
に記述して、.gitignoreでGit管理下から除外せずにあげると、悪意あるユーザーからs3を不正利用されてしまい多額の請求をされてしまいます。
実際にこの様なケースが起きているので.env
は必ずGit管理下から除外しましょう。
除外対象2 - [/public/uploads]
gemのCarrierWaveを使う場合に、デフォルトでアップロードしたファイルの情報が/public/uploads
に保存されます。
本番環境では、AWSのS3にアップロードしたファイルは保存する様に設定したりしますが、開発環境などで/public/uploads
にアップロードされる画像はGit管理してリモートリポジトリに上げる必要がないので、Git管理下から除外します。
除外対象3 - [vendor/bundle]
アプリケーションで利用しているgemは、デフォルトで~/.rbenv/versions/rubyバージョン/lib/ruby/gems/(x.x.0)/gems
に保存されます。(rbenv
利用時)
このgemをプロジェクト毎にアプリケーション内で管理したい場合、bundle install --path vendor/bundle
を実行すると、vendor/bundle
配下にプロジェクトのgemを保存する事が出来ます。しかし、vendor/bundle
配下のgemはリモートリポジトリに上げるものではないのでGit管理下から除外します。
vendor/bundle
について、詳しくはgemのインストール場所とは?からご確認ください。
その他のRailsアプリケーション独自に.gitignoreで指定した方が良いファイルなどは、Githubのgitignore/Rails.gitignoreを参考にして下さい。
非除外対象1 - [Gemfile.lock]
Gemfile.lock
は、gemの依存関係を管理するファイルです。Railsアプリケーションで利用するgemのバージョンをlockしているので、Gemfile.lock
をGit管理下から除外してしまうと、環境によってgemのバージョンがバラバラになってしまいます。
Gemfile.lock
は、.gitignoreファイルで除外してはいけないファイルです。
詳しくは、Gemfile.lockとはを参考にして下さい。
非除外対象2 - [db/schema.rb]
db/schema.rb
に書かれた情報を元にしてデータベースを操作をします。
このファイルをGit管理下から除外してしまうと、データベース系のコマンドが実行出来なくなります。
db/schema.rb
は、.gitignoreファイルで除外してはいけないファイルです。
gitignoreが適用されない場合の解決方法
この章では、gitignoreが適用されない場合の解決方法を解説します。
.gitignoreに指定するファイルは、インデックスに登録されていない状態のものが適用されます。既にインデックスに登録されているファイルに関しては、.gitignoreで指定しても適用されません。
例えば、gitignore_sample
ディレクトリ直下のsample1.rb
だけインデックスに登録します。
そして、以下のように.gitignore
でsample1.rb
を指定しても、先ほどのsample1.rb
はインデックス登録したので除外されていません。(directory/sample1.rb
は、インデックス登録されていないので除外が適用される)
一度インデックス登録したファイルをgitignoreするには、以下の状況で解決方法が異なります。
git add
まで実行した場合git commit
まで実行した場合- コミット履歴を残しても平気なファイルを
git push
まで実行した場合 - コミット履歴を残したくない重要なファイルを
git push
まで実行した場合
それでは、各状況の解決方法を1つ1つ解説します。
1. git add まで実行した場合
git add
コマンドでインデックス登録したファイルやディレクトリは、Git管理を解除する為に、以下のコマンドでキャッシュを削除する必要があります。
1
2
git rm -r --cached [ファイル名 or ディレクトリ名] # 特定ファイル(ディレクトリ)のキャッシュ削除
git rm -r --cached . #全てのキャッシュ削除
先ほどのsample1.rb
をgit status
で確認すると、以下の通りインデックスに登録した状態でした。
sample1.rb
をGit管理から解除するために、git rm -r --cached sample1.rb
を実行してgit status
で確認します。
上記は、sample1.rb
のキャッシュが削除されてインデックス登録が解除されましたが、ローカルにあるファイルが削除される訳ではありません。
インデックス登録を削除した状態で、以下の.gitignore
ファイルを確認します。
上記は、インデックス登録が解除されたので.gitignore
ファイルで指定したsample1.rb
が有効になり除外が適用されます。
2. git commit まで実行した場合
commitしたファイルをgitignoreしたい場合は、addと同様にgit rm -r --cached
でキャッシュを削除しますが、ファイル削除の変更点が加えられます。
1
2
git rm -r --cached [ファイル名 or ディレクトリ名] # 特定ファイル(ディレクトリ)のキャッシュ削除
git rm -r --cached . #全てのキャッシュ削除
この変更点を確認する為に、先ほどのsample1.rb
をcommitまで実行してgit status
します。以下のようにsample1.rb
はアントラッキング状態ではありません。
そしてcommitまで実行すると、以下のように.gitignore
ファイルにsample1.rb
と指定しても除外は適用されません。
除外を適用させる為に、git rm -r --cached sample1.rb
を実行してgit status
で確認すると、sample1.rb
を削除したという変更点が追加されます。
しかし、削除というのは実際にファイルが削除された訳ではなく、削除という形でGit管理から外す挙動になるので、ファイルはローカルに残ります。キャッシュを削除したsample1.rb
がローカルで確認できます。
そして、現在sample1.rb
はインデックスを解除したので、再びUntracking files
に出てくる状態です。ここから完全にGitの管理下から外すために以下のように.gitignore
でsample1.rb
を指定します。
これで、一度コミットしてしまったsample1.rb
をgitignoreを適用する事が出来ます。
3. git pushまで実行した場合(コミット履歴が残る)
git push
でGithubにアップロードしたファイルをgitignoreしたい場合に加え、ファイルが重要ではなくコミット履歴が残っても平気な場合は、以下の方法で解決することが出来ます。
git rm -r --cached [ファイル名]
を実行.gitignore
にファイルを指定- 再度
add, commit, push
を実行
git rm -r --cached [ファイル名]
の実行後に、対象ファイルを.gitignore
に指定して3番目のGitコマンドを実行すると、削除のコミットによってGithubにアップロードされたファイルが削除されます。(※最初のファイル追加のコミットは残る)
それでは、Railsアプリケーションのpublic/uploads
を例に実行内容を確認します。
まずは、以下のように.gitignore
に指定せずpublic/uploads
をgit push
まで実行します。
pushしたものをGithubで確認すると、以下のようにpublic/uploads以下
がアップロードされています。
pushした状態では.gitignoreでは適用外なので、以下のようにgit rm -r --cached ~
を実行してから.gitignore
に追加します。これで、キャッシュが削除され他ので適用されます。
そして、再度public/uploads
をadd ~ push
まで行います。この時Git管理から除外する為にファイル削除のコミットが発生します。(※ローカルのファイルが削除されている訳ではありません。)
pushしたものをGithubで確認すると、最初pushしたpublic/uploads/post/image
が削除されています。
コミット履歴を確認すると、一度pushしたpublic/uploads/post/image
は、先ほどのコミットによって削除されています。
しかし、このコミットはファイルを削除しただけなので、ファイル追加したコミット履歴はそのまま残っています。(下記参照)
このコミット履歴からファイルの中身を確認することが出来てしまうので、重要なファイルをアップロードした場合にはこの方法は適しません。あくまでも、コミット履歴を残しても平気なファイルに対して行う解決方法です。
4. git pushまで実行した場合(コミット履歴を残さない)
git push
でGithubにアップロードしたファイルをgitignoreしたい場合に加え、重要な情報が記述されたファイルをアップロードしてしまった場合は、以下の方法で解決することが出来ます。
-
git reset
でコミットを削除する .gitignore
にファイルを指定するgit push -f ブランチ名
で強制的に上書きする
上記は少し複雑なので、以下のサンプルで1つ1つ確認します。(初回コミットでREADME.md
を作成しpush済みですが、今回は省いています。)
.env
ファイルは、以下のように環境変数の記述された重要なファイルですが、.gitignore
で指定されていません。
この状態でgit add ~ push
まで実行すると、.env
ファイルがアップロードされるだけではなく、以下のようにコミット履歴からファイルの中身を見ることが出来てしまいます。
この状態でgit rm -r --cached
でキャッシュ削除して.gitignore
に指定し直しても、.env
ファイルが削除されるだけで「.env
を追加したコミット履歴」は削除されません。重要なファイルをpushした場合は、悪意あるユーザーがそれを不正利用して多額な請求をするケースも実際にあるので、コミット履歴まで削除する必要があります。
4-1. git resetでコミットを削除する
コミット履歴を削除するには、インデックスとコミット履歴(HEADの位置)を削除するgit reset [対象のコミット]
を実行します。
1
git reset [対象のコミット]
[対象のコミット]を確認する為にgit log
を実行すると、以下のような画面が表示されます。commit 長い文字列
の長い文字列部分はコミットIDになり、先ほどのGithubにアップロードしたコミット履歴のidと一致しています。(.env
ファイルを追加したコミット)
このコミットは直前のコミットになるので、以下のようにgit reset
で「直前のコミットの意味のHEAD^
」を指定して実行します。
1
git reset HEAD^
実行後に以下のようにgit log
で確認すると、README.md
を追加した最初のコミットのcf3a81e130ce2aa6cf86f8a0f7696c806f93ee1a
だけあり.env
ファイルを追加したbe646e266d20388bdae730fe6b0ffa9fdc40fb05
が削除されています。
またgit status
でも確認すると、.env
ファイルを追加したコミット履歴だけではなくインデックスからも削除されています。
次に.gitignore
に.env
ファイルを指定します。
4-2 .gitignoreファイルに.envを指定する
既に先ほどのgit reset HEAD^
でコミット履歴とインデックス削除する事ができたので、.env
ファイルを.gitignore
に指定しGit管理下から除外します。
以下のようにgit status
で確認すると、.env
ファイルがGit管理下から除外されている事がわかります。
4-3 git push -f ブランチ名で強制的に上書きする
.gitignore
ファイルは変更したので、そのままgit add
とgit commit
を実行して変更を追加します。しかしgit push
では、ローカルのコミットを削除したことによってリモートのコミットが進んだ状態になるのでpushしてもエラーが発生します。
以下のようにリモートリポジトリには、.env
ファイルを追加したコミット履歴が残ったままなので衝突が起きてしまいpush
する時エラーが発生してしまうのです。
ローカルの方のコミット履歴を優先させたいので、-f
オプションを使用して強制的にリモートリポジトリを上書きします。
1
git push -f origin master[ブランチ名]
上記を実行してGithubを確認すると、コミットが削除されたので.env
ファイルの情報が抜き取られる危険性がなくなりました。
この様に重要なファイルをリモートリポジトリにアップロードしてしまった場合は、コミット履歴まで削除する様にしましょう。
開発者の個人の設定と自動生成サービス
この章では、開発者の環境によって自動生成されてしまうファイルをGit管理下から除外する方法と.gitignoreファイルの中身を自動で生成してくれるサービスについて解説します。
開発者の個人の設定方法
これまで解説してきた.gitignore
ファイルはあくまでプロジェクトでGit管理下から除外したいファイル or ディレクトリを記録する場所です。
以下のような開発者の環境によって自動生成されるファイルは、~/.config/git/ignore
に指定する必要があります。
- Mac -
.DS_Store
[フォルダの表示位置設定を記述する隠しファイル] - Windows -
Thumbs.db
[フォルダの画像が縮小表示された際に記録する一時ファイル]
~/.config/git/ignoreの設定方法
~/.config/git/ignore
に指定した設定は、Gitリポジトリで最初に読み込まれるので開発者の環境によって自動生成されるファイルなどのGit管理下からの除外は、このファイルで設定しましょう。
viを使ってファイルを開きます。
1
$ vi ~/.config/git/ignore
上記のコマンドを実行すると、以下のようにファイルが開きます。
このファイルにGit管理下から除外したい自身の環境のファイルを指定します。
viで編集するには、まずi
を入力して編集モードにします。以下のようにファイル下部にINSERT
表記が出たら編集可能です。
設定を追加したらESC
で編集モードを終了して、:wq
でファイルを保存して閉じます。これでGit管理下から指定した設定は除外されます。
もし、.DS_Store
やThumbs.db
をGithubにあげている人がいたら~/.config/git/ignore
に設定しましょう。
~/.config/git/ignore
に設定する内容は、環境ごとに違うのでGithubのgitignore/Globalを参考に設定を追加してみて下さい。
自動生成サービス
今回は、.gitignoreファイルを自身で作成する方法を解説しましたが、.gitignoreファイルの中身を自動で生成するサービスがあります。
- gibo (ツール)
- gitignore.io (webサイト)
効率良くアプリケーションを作成するために、この様なサービスを使うのも良いでしょう。
この記事のまとめ
- .gitignoreとは、Gitで管理しないファイルを指定することが出来るファイルのこと
- Git管理下から除外できるのは、インデックスに登録・コミットしてないファイル(ディレクトリ)なので注意が必要!
- あくまでプロジェクトでGit管理下から除外したいファイルを記録する場所なので、開発者個人の除外したいファイルは
~/.config/git/ignore
に設定する