Git の .gitignore ファイルで追跡対象外のファイルを賢く管理する方法


Git の .gitignore ファイルで追跡対象外のファイルを賢く管理する方法

Git でバージョン管理を行う際、すべてのファイルをコミットする必要はありません。例えば、コンパイル済みファイル、エディタの設定ファイル、OS に依存する一時ファイルなどは、バージョン管理の対象から除外したいものです。

そこで活躍するのが .gitignore ファイルです。このファイルに記述することで、特定のファイルやディレクトリを Git の追跡対象から除外することができます。

本記事では、Git の .gitignore ファイルの書き方と、便利なテクニックについて詳しく解説します。

.gitignore ファイルとは?

.gitignore ファイルは、Git リポジトリ内の ルートディレクトリ に配置される隠しファイル (. で始まるファイル) です。このファイルに、Git で 追跡対象から除外したいファイルやディレクトリ をパターンを用いて記述することで、効率的にバージョン管理をが行えます。

.gitignore ファイルには、以下の形式で記述します。

# 行頭の # はコメントです。無視されます。
# パターン
#
# ファイル名の完全一致
*.txt
# 特定の拡張子を持つすべてのファイル
*.tmp
# ディレクトリ
docs/
# 特定のディレクトリ以下にあるすべてのファイル
vendor/bin/*
# 空白で区切られた複数のパターン
node_modules/cache node_modules/logs

便利テクニック

  • ワイルドカード:

    • *: 任意の文字列
    • ?: 1 文字のみ
    • [ ]: 範囲内の任意の 1 文字 ([abc]a または b または c のいずれか)
    • { }: 複数のパターンのいずれか ({doc,docx}doc または docx のいずれか)
  • 否定パターン:

  • グローバル .gitignore:



# 行頭の # はコメントです。無視されます。
# ファイル名の完全一致
*.txt
# 特定の拡張子を持つすべてのファイル
*.tmp
# ディレクトリ
docs/
# 特定のディレクトリ以下にあるすべてのファイル
vendor/bin/*
# 空白で区切られた複数のパターン
node_modules/cache node_modules/logs

応用例

Node.js プロジェクト

# Node.js 関連のファイルを無視
node_modules/
npm-debug.log
.DS_Store

Java プロジェクト

# Java のターゲットバイトコードファイルを無視
target/classes/

Python プロジェクト

# 仮想環境ディレクトリとビルド済みファイルを無視
venv/
__pycache__/
.pyc

C/C++ プロジェクト

# コンパイル済みファイルとデバッグ情報ファイルを無視
*.o
*.obj
*.exe
*.elf
*.dSYM

Git リポジトリ全体

# ローカル環境に依存するファイルを無視
*~
*.psd
*.xcf
  • 上記の例はあくまで基本的なものです。プロジェクトに合わせて適宜追加や修正を行ってください。
  • .gitignore ファイルのパターンは、複数行に記述することができ、コメントを記述することもできます。


Gitにおける「.gitignore」の代替方法

個別コミットの除外

  • git add コマンドで個別にコミット対象を指定することで、不要なファイルを意図的にコミットから除外できます。
git add <コミットしたいファイル> -- <コミットしたくないファイル>
  • 小規模なプロジェクトや一時的に追跡対象から除外したいファイルの場合に有効です。
  • ただし、毎回個別にファイルを指定する必要があり、煩雑になる可能性があります。

サブモジュール

  • 独立した Git リポジトリとして管理したいディレクトリを、親リポジトリのサブモジュールとして取り込む方法です。
git submodule add <サブモジュールのURL> <サブモジュールを配置するディレクトリ名>
  • サブモジュール内の変更は、個別にコミットとプッシュを行う必要があり、親リポジトリとの整合性管理が複雑になります。
  • 大規模なディレクトリや外部ライブラリなどを扱う場合に適しています。

カスタムスクリプト

  • Git フックと呼ばれる仕組みを利用して、コミット前後にカスタムスクリプトを実行し、不要なファイルを自動的に処理する方法です。
# pre-commit フック例
#!/bin/bash

# 不要なファイルを削除
rm -rf .gitignore で除外したいファイル

# コミット続行
git add .
  • 高度な柔軟性と自動化が可能ですが、スクリプト作成やメンテナンスの手間がかかります。
  • 複雑な処理や高度な自動化が必要な場合に適しています。

LFS (Git Large File Storage)

  • 大容量ファイルを効率的に管理するための Git 拡張機能です。
git lfs add <LFS で管理したいファイル>
  • ファイル自体は Git リポジトリではなく LFS サーバーに保存され、Git リポジトリにはポインタのみが保存されます。
  • 大容量ファイルの取り扱いを簡略化できますが、LFS サーバーのセットアップや運用が必要になります。
  • 非常に大きなファイルを扱うプロジェクトに適しています。
  • 特定の IDE やエディタでは、 .gitignore ファイルと同様の機能を提供している場合があります。
  • プロジェクトの規模や目的に応じて、最適な方法を選択することが重要です。

注意事項

上記で紹介した代替手段は、それぞれ一長一短があります。 .gitignore ファイルと比較して、機能が限定されていたり、複雑な設定や運用が必要になる場合もあります。

代替手段を使用する前に、それぞれの特性と制約をよく理解し、プロジェクトに適しているかどうかを判断することが重要です。