リポジトリ内のすべての Git および Mercurial コミットで特定の文字列を検索するにはどうすればよいでしょうか? 質問する

リポジトリ内のすべての Git および Mercurial コミットで特定の文字列を検索するにはどうすればよいでしょうか? 質問する

いくつかのブランチと未解決のコミットを含む Git リポジトリがあります。リポジトリ内のすべてのコミットで特定の文字列を検索したいと思います。

履歴内のすべてのコミットのログを取得する方法は知っていますが、これにはブランチやぶら下がっている BLOB は含まれず、HEAD の履歴のみが含まれます。間違った場所に置かれてしまった特定のコミットを見つけるために、すべてを取得したいと考えています。

切り替えを検討しているので、Mercurial でこれを行う方法も知りたいです。

ベストアンサー1

未解決のコミットは で確認できますgit log -g

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

したがって、コミット メッセージ内でぶら下がっている特定の文字列を見つけるには、次のようにします。

git log -g --grep=search_for_this

あるいは、特定の文字列の変更を検索する場合は、ピッケル検索オプション「-S」を使用できます。

git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)

Git 1.7.4は-Gオプションを追加するを使用すると、-G<regexp> を渡して、<regexp> を含む行が移動されたタイミングを見つけることができますが、これは -S では実行できません。-S は、文字列を含む行の合計数が変更されたタイミング (つまり、文字列の追加/削除) のみを通知します。

最後に、gitk を使用して、未解決のコミットを視覚化できます。

gitk --all $(git log -g --pretty=format:%h)

そして、検索機能を使用して、間違った場所にあるファイルを探します。これらはすべて、失われたコミットが「期限切れ」になっていない、ガベージ コレクションされていないことを前提として機能します。これは、コミットが 30 日間放置され、reflog を期限切れにするか、期限切れにするコマンドを実行すると発生する可能性があります。

おすすめ記事