はじめに
特定のリポジトリのファイル内で、自分しか使ってないツールの設定ファイルを書きたいことが多々あります。
しかし、そのためだけに既に存在している .gitignore
ファイルを変更するのは避けたいものです。
この記事では、.gitignore
ファイルを編集すること無く、自分の環境だけで、特定のファイルやディレクトリを git の管理から除外する方法を紹介します。
特定のディレクトリ内のファイルを管理から除外する
あるディレクトリ配下のもの全てを管理から除外するだけであれば、そのディレクトリ内で .gitignore
ファイルを作成するのが最もシンプルな方法です。
.gitignore
ファイルを編集すること無く
と最初に書きましたが、一応紹介しておきます。
ただし、あまりおすすめはしません。
例えば、hoge
というディレクトリ配下のもの全てを管理から除外する場合、hoge/.gitignore
ファイルを作成して、以下のように記述します。
*
これで、hoge
ディレクトリ配下のもの全てが管理から除外されるようになります。
この設定は、hoge
ディレクトリ内にのみ適用され、親ディレクトリや他のディレクトリに影響を与えることはありません。
git 管理されているディレクトリ内の特定のファイルを除外する
リポジトリ内で、既に作成されている .gitignore
ファイルに手を加えること無く、特定のファイルを個別に管理から除外したい場合があります。
例えば、自分専用の設定ファイルや、エディタ等によって自動生成される一時ファイルがこれに該当します。
gitignore
自体を管理から除外する方法
そのファイルが置かれている箇所に .gitignore
ファイルが存在していなくて、今後も存在することがないような場合に限り、
.gitignore
# 除外したいファイルが foo と bar の場合
foo
bar
のようにすることもできます。
ただ、そのような場合は限定的であり、あまり推奨されない方法なので、.gitignore
を使わない方法を紹介します。
.gitignore を使わずにファイルを除外する
gitignore のドキュメントを見てみると、
Patterns which are specific to a particular repository but which do not need to be shared with other related repositories (e.g., auxiliary files that live inside the repository but are specific to one user’s workflow) should go into the
$GIT_DIR/info/exclude
file.Patterns which a user wants Git to ignore in all situations (e.g., backup or temporary files generated by the user’s editor of choice) generally go into a file specified by
core.excludesFile
in the user’s~/.gitconfig
. Its default value is \$XDG_CONFIG_HOME/git/ignore. If \$XDG_CONFIG_HOME is either not set or empty, \$HOME/.config/git/ignore is used instead.
という記述があります。
つまり、特定のリポジトリ内でだけ除外させたいファイルの場合は、$GIT_DIR/info/exclude
ファイルに記述をし、どのリポジトリでも除外させたいようなファイルの場合は、core.excludesFile
に設定されているファイルに記述をすれば良いようです。
というわけでそれぞれ紹介します。
特定のリポジトリ内でのみファイルを除外する
上述の通り、レポジトリのルートから見た相対パスで $GIT_DIR/info/exclude
というファイルを作成し、.gitignore
と同じように記述をすれば良いです。
環境変数 $GIT_DIR
を特に設定していない場合は、.git
と置き換えれば良いです。
大抵の場合は設定されていないので、.git/info/exclude
ファイルを作成して記述するだけでよいはずです。
# 除外したいファイルが foo と bar の場合
foo
bar
このファイルに記述された内容は、そのリポジトリのみで有効になります。
全てのリポジトリ内でファイルを除外する
上述の通り、core.excludesFile
に設定されているファイルに、.gitignore
と同じように記述をすれば良いです。
git config
で特に設定をしていない場合は、$XDG_CONFIG_HOME/git/ignore
が記述するべきファイルになります。
また、環境変数 $XDG_CONFIG_HOME
も特に設定していない場合は、$HOME/.config/git/ignore
が記述するべきファイルになります。
大抵の場合は、どれも未設定だと思うので $HOME/.config/git/ignore
に記述をすればよいはずです。
# 除外したいファイルが foo と bar の場合
foo
bar
この設定は、グローバルな設定であるため、全ての Git リポジトリに影響を与えます。
全てのレポジトリで管理不要であり、かつ自分以外の環境では基本的に生成・利用されないファイルだけを追加するようにし、意図されず管理から除外されるような状況を最小限に抑えるのが好ましいです。
コマンドで除外するファイルを登録できるようにする
いちいちこんなファイル名覚えていられないですし、大量に登録することはないと思うので、コマンドにして呼び出せるようにします。
何でも良いですが、ここでは git のエイリアス機能を使ってコマンドを定義します。
特定のリポジトリ内でのみファイルを除外する
ここでは git ignore-local
として呼び出せるようにエイリアスを定義していきます。
上述した内容から、以下のようなスクリプトを書けばよいです。
# 引数が指定されていない場合
if [ $# -eq 0 ]; then
echo "Usage: git ignore-local <pattern1> [pattern2] [pattern3] ..."
exit 1
fi
# $GIT_DIR が設定されていない場合に .git を使用
GIT_DIR_PATH=${GIT_DIR:-.git}
EXCLUDE_FILE="$GIT_DIR_PATH/info/exclude"
# info ディレクトリが存在しない場合は作成
mkdir -p "$(dirname "$EXCLUDE_FILE")"
# すべての引数をループ処理
for pattern in "$@"; do
echo "$pattern" >> "$EXCLUDE_FILE"
echo "Added \"$pattern\"to $EXCLUDE_FILE"
done
これをワンライナーにして、エイリアスとして登録します。
$ git config --global alias.ignore-local '!bash -c '\''if [ $# -eq 0 ]; then echo "Usage: git ignore-local <pattern1> [pattern2] ..."; exit 1; fi; GIT_DIR_PATH=${GIT_DIR:-.git}; EXCLUDE_FILE="$GIT_DIR_PATH/info/exclude"; mkdir -p "$(dirname "$EXCLUDE_FILE")"; for pattern in "$@"; do echo "$pattern" >> "$EXCLUDE_FILE"; echo "Added \"$pattern\" to $EXCLUDE_FILE"; done'\'' --'
これによってコマンドを打つだけで、レポジトリ内でファイルが除外されるようになります。
$ git ignore-local foo bar/ *.baz "hoge fuga"
Added "foo" to .git/info/exclude
Added "bar/" to .git/info/exclude
Added "*.baz" to .git/info/exclude
Added "hoge fuga" to .git/info/exclude
全てのリポジトリ内でファイルを除外する
ここでは git ignore-global
として呼び出せるようにエイリアスを定義していきます。
上述した内容から、以下のようなスクリプトを書けばよいことが分かります。
# 引数が指定されていない場合
if [ $# -eq 0 ]; then
echo "Usage: git ignore-global <pattern1> [pattern2] [pattern3] ..."
exit 1
fi
EXCLUDE_FILE=$(git config --get core.excludesFile)
if [ -z "$EXCLUDE_FILE" ]; then
if [ -n "$XDG_CONFIG_HOME" ]; then
EXCLUDE_FILE="$XDG_CONFIG_HOME/git/ignore"
else
EXCLUDE_FILE="$HOME/.config/git/ignore"
fi
fi
# ディレクトリが存在しない場合は作成
mkdir -p "$(dirname "$EXCLUDE_FILE")"
# すべての引数をループ処理
for pattern in "$@"; do
echo "$pattern" >> "$EXCLUDE_FILE"
echo "Added \"$pattern\"to $EXCLUDE_FILE"
done
これをワンライナーにして、エイリアスとして登録します。
$ git config --global alias.ignore-global '!bash -c '\''if [ $# -eq 0 ]; then echo "Usage: git ignore-global <pattern1> [pattern2] ..."; exit 1; fi; EXCLUDE_FILE=$(git config --get core.excludesFile); if [ -z "$EXCLUDE_FILE" ]; then if [ -n "$XDG_CONFIG_HOME" ]; then EXCLUDE_FILE="$XDG_CONFIG_HOME/git/ignore"; else EXCLUDE_FILE="$HOME/.config/git/ignore"; fi; fi; mkdir -p "$(dirname "$EXCLUDE_FILE")"; for pattern in "$@"; do echo "$pattern" >> "$EXCLUDE_FILE"; echo "Added \"$pattern\" to $EXCLUDE_FILE"; done'\'' --'
これで、コマンドを打つだけで、任意のレポジトリ内でファイルが除外されるようになります。
$ git ignore-global foo bar/ "*.baz" "hoge fuga"
Added "foo" to $HOME/.config/git/ignore
Added "bar/" to $HOME/.config/git/ignore
Added "*.baz" to $HOME/.config/git/ignore
Added "hoge fuga" to $HOME/.config/git/ignore
(ホームディレクトリのパスを $HOME
に置き換えています)
おわりに
この記事では、個人環境のみでの Git の除外設定についての解説、特に共有の .gitignore
を汚すことなく設定する方法を解説しました。
また、紹介したようなエイリアスを活用することで、ファイルパスを覚える手間を省くことができます。
記載したスクリプトはシンプルな実装であるため、重複の削除や、#
のエスケープに対応させるなど、改良の余地があります。
多くの場合、それに対応しないことで困ることはないと思いますが、もし必要な場合は、ぜひスクリプトを改良してみてください。