灰いじり

This blog's posts are licensed under CC-BY 4.0.

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の新バージョンがリリースされた時にたまにこうやって新機能などを解説してくれる。ありがたい。