ファイルの一部分だけをgitの追跡対象外にする方法


経緯

intelephenseというPHPの言語サーバのライセンスキーをcoc-settings.jsonに記述する必要があるが、coc-settings.json自体は.dotfiles上で公開したい。 当然ライセンスキーをGitHub上に公開するわけにはいかないので、該当部分だけ追跡しないようにしたい。

やりたいこと

つまり

ひみつ // gitignore

// gitignore_start
ひみつ
ひみつ
ひみつ
// gitignore_end

と書くことで、git addしても秘密情報だけステージングされないようにしたい。

方法

.gitconfigに以下のように書く

.gitconfig
[filter "gitignore"]
  smudge = cat
  clean = "sed -e '/gitignore$/'d -e '/gitignore_start/,/gitignore_end/'d"

cleanフィルタの内容がミソ。ここで記述した内容がgitでステージングを行ったときに行われるので、 gitで追跡したくない箇所の前後にコメントとしてgitignore_start,gitignore_endを記述しておけば、 そこだけgit ignoreしているような挙動になる。

coc-settings.json
...
  // gitignore_start
  "intelephense.licenceKey": "~~~~~",
  // gitignore_end
...

めでたしめでたし

上記ファイルは、実際にはjsoncというコメント可能なフォーマットで、コメントが書けない普通のjson等、ファイルの種類によってはこの方法では対処しきれないことに注意が必要。

参考文献

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7