既に git 管理しているファイルをあえて無視したい

以下より転載まとめてくれた方に感謝
https://qiita.com/usamik26/items/56d0d3ba7a1300625f92

git でファイルを無視するには、通常は .gitignore  .git/info/exclude を使います。
しかし、既に git 管理下にあるファイルは、これらの設定があっても無視されません。

以下の方法を使えば、git 管理下にあるファイルをあえて無視することが可能です。

方法

次の2つの方法があります。どちらを使っても、ファイルの変更を無視できます。

方法(1) assume-unchanged

git update-index --assume-unchanged [ファイル名]

この設定を取り消すには次のようにします。

git update-index --no-assume-unchanged [ファイル名]

方法(2) skip-worktree

git update-index --skip-worktree [ファイル名]

この設定を取り消すには次のようにします。

git update-index --no-skip-worktree [ファイル名]

設定の確認

上記の設定がされているファイルを確認するには、次のようにします。

git ls-files -v
  • assume-unchanged 設定のファイルは、状態が小文字で表示されます。
  • skip-worktree 設定のファイルは、状態が S と表示されます。

assume-unchanged と skip-worktree の違い

この2つは、以下の点が違います。

  • assume-unchanged : そのファイルが作業ツリー上で変更されているときでも、git はその変更を無視して変更されていないとみなします。
  • skip-worktree : そのファイルが作業ツリー上で変更されているときには、git はその変更を保ちます。

これは、以下のような状況で動作の違いとしてあらわれます。

作業ツリー上でもリポジトリ上でもファイル更新があって、それをマージするとき

  • assume-unchanged : 作業ツリー上の更新は破棄されて、リポジトリの内容が取り込まれます。
  • skip-worktree : 作業ツリー上の更新は保持されて、リポジトリの内容は取り込まれません。

作業ツリー上でファイル更新があって、git reset --hard を実行したとき

  • assume-unchanged : 作業ツリー上の更新は破棄されます。
  • skip-worktree : 作業ツリー上の更新は保持されます。

何のために使うのか

そもそも、何のためにファイルを無視したいのでしょうか。

更新確認しなくていいファイルを無視することで git status などを高速化したい

例えば、ネットワークドライブを使っていてファイルアクセスが遅い場合などがそうです。

このために用意されたのが、assume-unchanged 設定です。
この設定がされていると、ファイルをチェックしなくなるので高速になるというわけです。

git 管理しているファイルがビルド時に更新されてしまうが普段は無視したい

開発環境によっては、こんな困ったファイルがあったりします。

  • ビルド時に自動生成するファイルではないので git 管理したい
  • ビルド時にそのファイルがあると日付だけ更新される

あるいは、ビルドで生成するファイルを git に入れている場合もあるかもしれません。

こういったファイルは、作業ツリー上では頻繁に更新しますが、git には触ってほしくありません。
このときには、skip-worktree 設定が使えます。

まとめ

git 管理下のファイルを無視する方法について書きました。

git は様々な細かいニーズに答えて開発されていると思います。