Git v2.8.0からgit grepをリポジトリ外で実行した時の挙動が変わった
Git v2.8.0
Git v2.8.0が出た。そのリリースノートの中で少し気になった箇所があった。
- "git grep" by default does not fall back to its "--no-index" behavior outside a directory under Git's control (otherwise the user may by mistake end up running a huge recursive search); with a new configuration (set in $HOME/.gitconfig--by definition this cannot be set in the config file per project), this safety can be disabled.
適当訳: "git grep" をGit管理下でないディレクトリで実行した時に、"--no-index"を付けた振る舞いにフォールバックしないのがデフォルトになりました。でないと、誤って(Gitリポジトリ外で)git grepした際に、長ったらしい再帰的な検索が走ってしまうはめになるからです。新しく用意した設定項目で、この安全装置を解除できます(=以前の挙動に戻せます)。なお、動作の性質上、プロジェクトディレクトリ毎の.gitconfigにこの設定は適用できません。$HOME/.gitconfigに設定してください。
git grep --no-index
git grep
はそもそもGitで管理しているファイルのみを対象にgrepしてくれるコマンドだが、--no-index
を使うことでその制約を無視して全ファイルを対象にgrepするようになる。例えばGitリポジトリ内でgit grep --no-index
すると、.gitignore
で無視しているファイルや、まだgit add
していないファイルも含めてgrepしてくれる。
で、Git v2.7.4までは、Gitリポジトリ外でgit grepした際に、自動で--no-index
をつけてくれる仕様になっていた。つまり「今いる場所はどうやらGit管理下ではないようだけど、せっかくだからgrepするぜ〜」という動作になっていた。でもgit grep
は再帰的にファイルをサーチするため、上位のディレクトリにいる時に間違って実行した場合に凄く重たい動作になってしまう可能性がある。だからやめたんだろう。
Git v2.8.0でGitリポジトリ外でgit grep
を実行すると、以下のようにメッセージが出てgrepされない。
$ git grep hoge fatal: Not a git repository (or any of the parent directories): .git
grep.fallbackToNoIndex = true
でも自分は、git grepをGitリポジトリ外でも使ってたりしてたんですよね。。。ということで、以前の挙動に戻せる設定が作られたらしいので、 globalな.gitconfigに設定するために以下を実行する。
$ git config --global grep.fallbackToNoIndex true
これでv2.7.4以前の挙動に戻すことが出来た。
おまけ Git v2.8.0
Git v2.8.0で新しく入った要素については、GitHubの公式ブログで少し解説されている(全変更点の網羅ではない)。
Git 2.8 has been released · GitHub
GitHub公式ブログは、Gitの新バージョンがリリースされた時にたまにこうやって新機能などを解説してくれる。ありがたい。