git ですでに管理されているファイルの変更を無視する
.gitignoreとは違い、既に管理されているファイルの変更を無視したい。
環境依存の関係でどうしても変更したいが、全体には影響させたくないときに使う。
1git update-index --skip-worktree [ファイル名]
git update-index はインデックスを更新する。インデックスはワーキングツリーとリポジトリの中間に位置するステージングエリアのこと。
これの--skip-worktreeオプションでファイルの変更を無視する。
この操作を取り消すには --no-skip-worktree を使う
1git update-index --no-skip-worktree [ファイル名]
注意点
--no-skip-worktree を使うと、変更を検知することができなくなる。そのため、変更を取り込めないことによる別のトラブルが発生する場合がある。後述する--assume-unchangedの方が目的に合っている場合もある。
--assume-unchangedオプション
似たようなオプションで、--assume-unchangedがある。--skip-worktreeがファイルの変更を無視するのに対して、--assume-unchangedはローカルでのファイル変更が無いと仮定するように指示する。
使用目的としては、自動生成されるファイルなど、頻繁に更新されるけど頻繁に変更を追跡しなくても良いものに対して使う。ファイル変更の監視をしなくて良くなるので、パフォーマンスが向上する。
1git update-index --assume-unchanged [ファイル名]
この操作を取り消すには--no-assume-unchangedを使う
1git update-index --no-assume-unchanged [ファイル名]
--skip-worktreeと--assume-unchangedの違い
ローカルとリポジトリでそれぞれファイルの更新が行われ、マージされたときの挙動が異なる
assume-unchanged:ローカルの変更は破棄。リポジトリが取り込まれる
skip-worktree:ローカルの変更を維持。リポジトリの変更は取り込まれない。
設定ファイルにおける軽微な調整を無視したいときなどは、将来の変更が取り込まれる--assume-unchangedの方が向いていそう。
無視したファイルを確認する
1git ls-files -v | grep '^[Ssh]'
git ls-files -vで先頭にSがついているものが--no-skip-worktree指定したもの。--assume-unchangedを指定したものについては小文字のsがつく。マージ中にコンフリクトしたものは小文字のhで表示される。grepでそれらを抽出している。