tohokuaikiのチラシの裏

技術的ネタとか。

gitignoreでハマる

単にファイル名単位でgitにignoreさせるのは簡単だったんだけど、ディレクトリ単位っていうのが難しいっていうか何となくハマったのでメモ。

とりあえず、ファイル単位

git で特定ファイルをグローバルに無視する - × - ogijunグループ
とかでユーザーのホームディレクトリの~/.gitignoreをいじればO.K。

あと、gitリポジトリ毎にやりたかったら(ようするにnon-globalで)、リポジトリの.git/info/excludeを自分で書き書きすればO.K

ディレクトリ単位

よーわからんかった。原因は、

  1. 最初にGitにコミットしてしまった
  2. .gitignoreを設定
  3. ignore対象のディレクトリの中のファイルを変更してCommit
  4. あれー、無視されないでCommitされるじゃーん???

というもの。Gitってば、一度コミットしたファイルは.gitignoreに記述しても監視対象にするのね。そこんところわかんなかったよ・・・・。だから、空ディレクトリを作りたい時って、一度適当なファイルを置いておくのか。そのファイルはもう触らんからね。


ちなみに、ディレクトリ単位の場合、
[間違いを訂正].gitignoreでディレクトリの中身だけをignoreする書き方 - Hello, world! - s21g
を参考にしてたんだけど、

gitignore(5)
を見てみたら

If the pattern ends with a slash, it is removed for the purpose of the following description, but it would only find a match with a directory. In other words, foo/ will match a directory foo and paths underneath it, but will not match a regular file or a symbolic link foo (this is consistent with the way how pathspec works in general in git).

んー、

.gitignore何かの指定でスラッシュで終わっているパターンの場合、スラッシュを除いた記述が使用され、「ディレクトリでかつ」そのパターンにマッチするものがignore対象になります。言い換えると、foo/というのは、ディレクトリのfooとそれ以下のパスのものが対象になります。ただし、普通のファイルやシンボリックファイルのfooは対象になりません。(これは、Gitのパスの取扱いに矛盾する方針ではありません)

って感じか?じゃあ、単純にfoo/でいいじゃんねってことで。