LINEで現役エンジニアに直接質問してみよう!登録無料

gitignore書き方入門 除外ディレクトリ/ファイルの反映方法

アキ

独学でプログラミングを勉強しながらWeb制作会社で働き、プログラミングのエンジニア講師も勤めた経験がある、アキです。

  • gitignoreって何をするもの?
  • gitignoreはどうやって書けばいいの?
  • gitignoreのベストプラクティスは?

こんな疑問に答えます。

.gitignoreを使うと、gitで管理するファイル、しないファイルを指定することが出来ます。

.gitignoreの基本的な書き方

ファイルを追跡対象から除外する

これは、.gitignore書き方の超基本形です。.gitignoreに、追跡対象から除外したいファイルのパスを記述することです。

.gitignoreには、行の先頭に「/」を付ける書き方と付けない書き方があります。先頭に「/」を付けると、.gitignoreの存在するディレクトリのファイル又はディレクトリという意味が付けられます。

.gitignoreのコメント
# どのディレクトリ内のファイルかは問わず、
# すべてのディレクトリのindex.htmlを除外する設定
index.html

# .gitignoreの存在するディレクトリのindex.htmlのみを除外する設定
/index.html

ディレクトリを追跡対象から除外する

ディレクトリを追跡対象から除外するには、行の最後(末尾)に「/」を付けます。「/」を付けると、「そのディレクトリとその配下をすべて対象外にする」という意味になります。

もし、同名のファイルがあった場合、それはディレクトリではないので除外対象にはなりません。

/」を付けなかった場合、ディレクトリ又はファイルが除外対象となります。次にgitignoreを編集する人が、ディレクトリかファイルかわからなくなり、混乱させる元になるので、「ディレクトリは末尾に/、ファイルは付けない」というルールで運用したほうがうまくいきます。

.gitignoreのコメント
# hogehoge という名前のディレクトリ、又はファイルが除外対象になります。
hogehoge

# hogehoge という名前のディレクトリが除外対象になります。
hogehoge/
MEMO

gitでは、パフォーマンス上の理由から、ディレクトリ内の一部のファイルやサブディレクトリだけを無視することは出来ないという制限があります。そのため、hogehoge/という書き方よりもhogehoge/*の方がより柔軟性の富みおすすめです。

パターンマッチについては次章で解説します。

ワイルドカードを使って「パターンマッチ」

ワイルドカードを使うと、1行で複数のファイルを表現することが出来ます。 1つずつファイルやディレクトリを指定するよりもスッキリと書け見やすくなります。

.gitignoreのパターンマッチには3種類使うことが出来ます。

ただし、このパターンマッチには日本語は適用出来ません。なぜなら、ascii(英文字)は1バイトで表せますが、日本語は殆ど3バイト以上(UTF-8)ないとあらわせないためです。

  • * – 0文字以上の文字列にマッチ
  • ? – 1文字にマッチ
  • [ ] – 範囲内の1文字にマッチ

* – 0文字以上の文字列にマッチ

ワイルドカード「*」は0文字以上の文字列にマッチします。「.htaccess」と「.htpasswd」など、.ht で始まるファイルにマッチするので、それらを追跡対象から除外したい時に使います。

.gitignoreのコメント
# 次のようなファイル名にマッチ
# .htaccess
# .htpasswd
# .hthogehoge

.ht*

? – 1文字にマッチ

ワイルドカード「?」は1文字の文字にマッチします。このパターンが使われることはあまりありません。

.gitignoreのコメント
# 次のようなファイル名にマッチ
# file-1
# file-2
# file-a
# file-z

file-?

[ ] – 範囲マッチ

範囲内の文字、1文字にマッチします。連番で管理されたファイルを.gitignoreに追加したい時に使われます。

.gitignoreのコメント
# 次のようなファイル名にマッチ
# 1.html
# 2.html
# 9.html

[1-9].html

否定を使って 特定のファイルを除外対象から外す

パターンマッチを使って複数のファイルを除外対象にした後、その中ある1ファイルのみを追跡対象に変更したい場合があると思います。そのような時は!を使うことで、除外対象の無効化を行うことが出来ます。

.gitignoreのコメント
# 「.ht」から始まるファイルは除外
# ただし、「.htaccess」は除外しない
.ht*
!.htaccess

否定を使って 特定のディレクトリを除外対象から外す

特定のディレクトリを除外対象から外すには、!と末尾の/を組み合わせて使います。

.gitignoreのコメント
# hogehogeディレクトリは除外
# ただし、hogehoge/deep/ は除外対象にしない
/hogehoge/*
!/hogehoge/deep/

否定を使って 指定したファイルやディレクトリを追跡

!」を使うと、除外対象の無効化が出来ることを先程解説しました。 これを応用すると、「.gitignoreで指定したファイルやディレクトリのみを追跡対象にする」といった事が出来るようになります。

例えば、railsアプリケーションのgitignoreはこのようにします。

.gitignoreのコメント
/*
!/Gemfile
!/README.md
!/Rakefile
!/app/
!/bin/
!/config/
!/config.ru
!/db/
!/lib/
!/log/
!/package.json
!/public/
!/storage/
!/test/
!/tmp/

コメントアウトの書き方

#」以降の文字はコメントとして扱われ、無視されます。

.gitignoreはGitで長い間管理され、使っているうちに長くなっていくものです。コメントでどのような場合に適用されるものか、なぜ追加したのかをしっかり書いてわかりやすく管理しておきましょう。

.gitignoreのコメント
# この行はコメントです

エスケープで特殊文字をファイル名やディレクトリ名に使う

もし、ディレクトリやファイル名に*? (スペース)などの特殊文字が使いたい場合、エスケープ文字「\」を文字の前に付けて使います。

.gitignoreのコメント
\*.hogehoge.txt
\!.hogehoge.txt

.gitignoreのよく使うパターンはglobalで設定しておくのがおすすめ

MacOSでは、「XXXX~」「.DS_Store」などはgitで管理対象外にしたいファイルが多くの頻度で登場します。gitで「間違って、これらをgitの追跡に追加してしまう」なんてこともあるのでは無いでしょうか?

リポジトリごとに.gitignoreを設定するのもありなのですが、よく使う除外パターンは「global」でPC全体の設定で登録しておくと便利です。

.gitignoreのglobal設定は、「~/.config/git/inore」で行います。古いgitバージョンでは、~/.gitignore_globalになっていることもあります。

MacOSの場合、このファイルの内容を下記のように編集しましょう。

MacOS gitignore global
*~
.DS_Store

その他にglobalで追加したいものがあれば、ここに追加しておくと良いでしょう。

.gitignoreのベストプラクティス紹介と例

最適化された .gitignore がたくさんネット上に公開されているのことはご存知でしょうか? 一番有名なのが、GitHub社がオープンソースで公開している「github/gitignore」です。

使っている言語から、ここに乗っているgitignoreを流用して運用していくのが、ベストプラクティスです。運用していて、足りなくなったり余計と感じた部分があれば都度編集していきましょう。「とりあえずパパッとgitignoreを使いたい」とおもっている時に特に重宝します。

github/gitignoreでは、「C言語、C++言語、Ruby、Python、SCSS」など主要な言語だけでなく、Rails、Laravel、Unityなどのフレームワーク用や、Wordpressなどのアプリケーション用も用意されています。

gitiginore実装例1: wordpress

wordpressの .gitignore
# ignore everything in the root except the "wp-content" directory.
!wp-content/

# ignore everything in the "wp-content" directory, except:
# "mu-plugins", "plugins", "themes" directory
wp-content/*
!wp-content/mu-plugins/
!wp-content/plugins/
!wp-content/themes/

# ignore these plugins
wp-content/plugins/hello.php

# ignore specific themes
wp-content/themes/twenty*/

# ignore node dependency directories
node_modules/

# ignore log files and databases
*.log
*.sql
*.sqlite

gitiginore実装例2: Ruby on Rails

Ruby on Railsの .gitignore
*.rbc
capybara-*.html
.rspec
/db/*.sqlite3
/db/*.sqlite3-journal
/db/*.sqlite3-[0-9]*
/public/system
/coverage/
/spec/tmp
*.orig
rerun.txt
pickle-email-*.html

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# TODO Comment out this rule if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/master.key

# Only include if you have production secrets in this file, which is no longer a Rails default
# config/secrets.yml

# dotenv
# TODO Comment out this rule if environment variables can be committed
.env

## Environment normalization:
/.bundle
/vendor/bundle

# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc

# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json

# Ignore pow environment settings
.powenv

# Ignore Byebug command history file.
.byebug_history

# Ignore node_modules
node_modules/

# Ignore precompiled javascript packs
/public/packs
/public/packs-test
/public/assets

# Ignore yarn files
/yarn-error.log
yarn-debug.log*
.yarn-integrity

# Ignore uploaded files in development
/storage/*
!/storage/.keep

gitiginore実装例3: node

nodeの .gitignore
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# TypeScript v1 declaration files
typings/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache

# next.js build output
.next

# nuxt.js build output
.nuxt

# gatsby files
.cache/
public

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

まとめ

gitignoreには、追跡ファイルの指定方法には色々な表現があります。 パターンマッチをうまく使うと、gitignoreがぐんと見やすくなるので、積極的に使っていきましょう。

この記事を書いた人

自身がプログラミングを独学で勉強し始めて躓いた経験を元に、これから勉強をする人に向けに「イラスト多めでわかりやすい記事」にこだわって情報を発信しています。

現在はフルスタックエンジニアとしてサービス開発などのお仕事をしています。