gitの管理対象外にしたい場合は.gitignoreを使いますが、個人的に追加/変更したファイルを共有の.gitignoreに追加するのは憚れます。そうした場合に使えるコマンドを調べました。
個人的に追加したファイルを無視したい
既にgitで管理されているファイルへの個人的な変更を無視したい
- ユースケース: 設定用のファイルがgit管理されている時。
- 方法:
git update-index --skip-worktree [ファイル名]
- 管理対象に戻したい場合は
git update-index --no-skip-worktree [ファイル名]
- この設定が適用されているかを知るには
git ls-files -v
を使う。管理下のファイルにはH、skipされているファイルはSが付与される。
- 管理対象に戻したい場合は
補足
変更を無視する方法として、git update-index --assume-unchanged
もあります。
参考にしたページによると以下のような違いがあるらしいです。
- assume-unchanged : そのファイルが作業ツリー上で変更されているときでも、git はその変更を無視して変更されていないとみなします。
- skip-worktree : そのファイルが作業ツリー上で変更されているときには、git はその変更を保ちます。
上で挙げたユースケースの場合、リモートリポジトリの変更をpullした時は以下のような要求があります。
- ローカルの変更を勝手に上書きされたくない(個人のconfigが消えると戻すのが面倒)
- リモートリポジトリの同ファイルが変更されたことに気づきたい(自分だけ古いconfig使ってると困る)
一見するとどちらのコマンドも両方の要求を満たせないように思えたので、実際に試してみました。
実験
手順:
- git管理されているファイルをローカルで変更し、
assume-unchanged
あるいはskip-worktree
で管理外にする。 - リモートリポジトリでそのファイルを変更。
- git pullでリモートの変更をローカルに取り込もうとする。
結果: どちらの方法でも以下のようなエラーが出るので勝手に上書きされない。
error: Your local changes to the following files would be overwritten by merge: config Please commit your changes or stash them before you merge.
ということでどちらのコマンドでもやりたいことは満たせていそうなので、取り敢えず多くのページで推奨されているskip-worktree
を使って使用感を見ていこうと思います。