git
ってたまに難しい。毎日使っていればpull
だのpush
は既に親友同然、status
あたりは頼れる兄貴感覚。しかしちょっとイレギュラーなことを行おうとした場合、急にやつはつっかかってきたりする。やめて欲しい。
今回はタイトルにもある通り、一度インデックスにあげてしまったファイルを、.gitignore
に後から追加した場合に、なんか思った通りにいかない時の話。
事象
一度インデックスに挙げたり(要はgit add
済)、コミットしたファイル(git commit
済み)を、あとから.gitignore
に追加した時に、なかなか追跡対象から外れないことがある。
パスも間違っていないのになぜだーと叫ぶ私。
相も変わらずしれっと追跡対象にファイルを提示し続けるgit
。
仁義なき戦いとは、きっとこういうことを言うのだろう。知らないけれど1。
原因
.gitignore
に追記した削除対象のファイルのキャッシュが、インデックスに残り続けているため。これは.gitignore
がリポジトリーに対し、これから追加されるファイルを追跡対象からはずすように伝えるファイルであるため。
従って、キャッシュがある=新規追加されたファイルとみなされない=追跡対象であるという判断がされてしまって、いつまで経っても追跡対象から外れてくれないことになる。
解決法
.gitignore
に追記後、キャッシュを消す。
git rm --cached <file-name>
git rm -r --cached . // ファイル内の全キャッシュを削除
解決法2?
ちょっとリサーチしたら、こんなコマンドも出てきた。
まだ試してみていないが、こちらの方が追跡対象にする/しないを、柔軟に対応できそうな感じがする。
git update-index --assume-unchanged <filename> //ファイルを追跡対象にする
git update-index --no-assume-unchanged <filename> //ファイルを追跡対象に戻す
余談
.gitignore
の他にも、.git/info/exclude
下に記述する方法もあるそうで。ここに記述されたルールはコミットされない。よって、完全に自分にしか関係していないファイルはこちらの記述でもよさそう。例えば、他の人と絶対共有しなくていい個人的なメモだとポエムだとかは、こちらに記述して管理もありかもしれない。
# .git/info/exclude 内での書き方(参照ページからそのまま拝借)
# ‘.project’と‘.classpath’は追跡対象外
.project
.classpath
ただ、他の人も設定を共有した方がいい場合(共通で使っているエディタ固有のファイルなど)は、.gitignore
の方がよさそうだ。
-
最近部署内に関西の方が増えてきたので、ちょっと寄せてみている。知らんけどって、いい言葉ですね。知らんけど。 ↩