.gitignoreの範囲の指定方法

過去に書いた記事をそのまま移行します。

前提

$HOMEディレクトリ上でドットファイルをgitを管理している。 .gitignoreはホワイトリスト方式で記述している。

やりたかったこと

$HOME
└── .vim
     ├── bundle
     ├── snippet
     ├── syntax
     ├── template
     └── userautoload

上記の構造になっているvimの設定ファイルのbundleディレクトリ以外をgitの管理下に置きたい。 (bundleディレクトリだけはgitで管理したくない)

やったこと

ホワイトリスト方式で.gitignoreを設定したが、階層構造をとっている時の設定でつまずいた。

ダメだったパターン

以下のように記述したら$HOME/.vim/以下のディレクトリ内部のファイルが読み込まれなかった。

# all file ignore
/*
/.*

# target not ignore
!/.gitignore
!/.vimrc
!/.vim/template/template.*
!/.vim/userautoload/*.vim
!/.vim/snippet/*.vim
!/.vim/syntax/*.vim

よく考えると、上の3行ですべてのファイルとディレクトリを場外しているため、 $HOME/.vimディレクトリがそもそもgitから見えない。 そのため、!/.vim/userautoload/*.vimのようにファイルを指定しても、 !/存在しないディレクトリ/userautoload/*.vimとなっているので、 読み込まれることがなかった。

成功したパターン

以下のように記述したら成功した。

# all file ignore
/*
/.*

# target not ignore
!/.gitignore
!/.vimrc

# .vim directry
!/.vim/
/.vim/*

!/.vim/template/
!template.*

!/.vim/syntax/
!*.vim

!/.vim/snippet/
!*.vim

!/.vim/userautoload/
!*.vim

やっていることは、

  1. !/.vim/$HOME/.vim/ディレクトリをホワイトリストに追加
  2. /.vim/*$HOME/.vim/以下のファイルとディレクトリを除外
  3. !/.vim/userautoload/で該当のディレクトリをホワイトリストに追加
  4. !*.vim*.vimファイルをホワイトリストに追加

という感じ。

ただ、一つのファイルで管理すると見栄えが悪かったので以下のように分割。

# $HOME/.gitignore
# all file ignore
/*
/.*

# target not ignore
!/.gitignore
!/.vimrc
!/.vim/
# $HOME/.vim/.gitignore
# all file ignore
/*
/.*

!/.gitignore

# target not ignore
!/template/
!template.*

!/syntax/
!*.vim

!/snippet/
!*.vim

!/userautoload/
!*.vim

これで管理しやすくなった。