.gitignoreに記載したのにnode_modulesがいつまでもpushされてしまう。


はじめまして、Yuiです。

私は現在Vue.jsを使って受託開発を行っているのですが、そこで詰まったことを紹介します。

何が起こったか

Vueで書いたコードをBitbucketにpushした際、node_modulesが.gitignoreに書かれてあるにも関わらず、まとめてpushされていた。

.gitignoreを見直してもきちんとnode_modulesの記載があり、しばらく原因がわからなかった。

原因

どうやらキャッシュが原因だった。

7/22追記 kmdkukさんよりコメントを頂き、原因がキャッシュではないことがわかりました。すでにgitの追跡対象になっているファイルはどんだけignoreしようとしても追跡対象から外さないとコミット履歴が残ってしまうようです。私はその部分をまとめてキャッシュと呼んでいました・・・・。すみません!

試したこと

とりあえず、いかなる条件でもignoreするように .gitignoreに

*node_modules/

と記載した。

そしてその後

$ git add .gitignore
$ git commit -m "comment"
$ git push origin hoge_branch

これで解決!
と思いきやまだ残ったままだった・・・。

解決法

$ git rm -r --cached node_modules

ここにたどり着くまでの経緯は以下

*node_modules/

こう書いても消えないということは、キャッシュの可能性が高いと思い、キャッシュを全削除してみた。

7/22追記 kmdkukさんのコメントより引用

すでにgitの追跡対象になっているファイルはどんだけignoreしようとしても追跡対象から外さないと変更履歴を永遠と追跡してコミット履歴に残ってしまいます.
その追跡対象から外すコマンドがgit rmコマンドです.
これにrオプションを付けることで再帰的にフォルダ以下のファイルを対象から外してくれます.
cachedオプションは,追跡対象から外したときに,ファイルをそのまま残してくれるようにしてくれるオプションです.

つまり、下記のように消すと今まで追跡するべくして追跡してたファイル郡までaddし直す羽目になるそうなので、きちんとファイル名を明示する必要があるらしいです。
(この辺もざっくりとは認識していたのですが、もう一回addすればよいかと思い、あまり重要視していませんでした。)

ですので、

$ git rm -r --cached .

ではなく、

$ git rm -r --cached node_modules

とファイル名を明示的に指定する方が良いです。

感想

なにか挙動がおかしいときはキャッシュをチェックするということを忘れないようにしたい。
kmdkukさん、本当にありがとうございました。