7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自分だけの設定ファイル等を Git の管理下から除外する方法

Posted at

はじめに

特定のリポジトリのファイル内で、自分しか使ってないツールの設定ファイルを書きたいことが多々あります。
しかし、そのためだけに既に存在している .gitignore ファイルを変更するのは避けたいものです。

この記事では、.gitignore ファイルを編集すること無く、自分の環境だけで、特定のファイルやディレクトリを git の管理から除外する方法を紹介します。

特定のディレクトリ内のファイルを管理から除外する

あるディレクトリ配下のもの全てを管理から除外するだけであれば、そのディレクトリ内で .gitignore ファイルを作成するのが最もシンプルな方法です。

.gitignore ファイルを編集すること無く

と最初に書きましたが、一応紹介しておきます。
ただし、あまりおすすめはしません。

例えば、hoge というディレクトリ配下のもの全てを管理から除外する場合、hoge/.gitignore ファイルを作成して、以下のように記述します。

hoge/.gitignore
*

これで、hoge ディレクトリ配下のもの全てが管理から除外されるようになります。
この設定は、hoge ディレクトリ内にのみ適用され、親ディレクトリや他のディレクトリに影響を与えることはありません。

git 管理されているディレクトリ内の特定のファイルを除外する

リポジトリ内で、既に作成されている .gitignore ファイルに手を加えること無く、特定のファイルを個別に管理から除外したい場合があります。
例えば、自分専用の設定ファイルや、エディタ等によって自動生成される一時ファイルがこれに該当します。

gitignore 自体を管理から除外する方法

そのファイルが置かれている箇所に .gitignore ファイルが存在していなくて、今後も存在することがないような場合に限り、

hoge/.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.

ref: https://git-scm.com/docs/gitignore

という記述があります。
つまり、特定のリポジトリ内でだけ除外させたいファイルの場合は、$GIT_DIR/info/exclude ファイルに記述をし、どのリポジトリでも除外させたいようなファイルの場合は、core.excludesFile に設定されているファイルに記述をすれば良いようです。

というわけでそれぞれ紹介します。

特定のリポジトリ内でのみファイルを除外する

上述の通り、レポジトリのルートから見た相対パスで $GIT_DIR/info/exclude というファイルを作成し、.gitignore と同じように記述をすれば良いです。

環境変数 $GIT_DIR を特に設定していない場合は、.git と置き換えれば良いです。
大抵の場合は設定されていないので、.git/info/exclude ファイルを作成して記述するだけでよいはずです。

.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 に記述をすればよいはずです。

$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 を汚すことなく設定する方法を解説しました。
また、紹介したようなエイリアスを活用することで、ファイルパスを覚える手間を省くことができます。

記載したスクリプトはシンプルな実装であるため、重複の削除や、# のエスケープに対応させるなど、改良の余地があります。
多くの場合、それに対応しないことで困ることはないと思いますが、もし必要な場合は、ぜひスクリプトを改良してみてください。

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?