1. ホーム
  2. ギット

[解決済み】リポジトリ内のすべてのGitとMercurialのコミットで、特定の文字列を検索するには?

2022-03-29 12:39:14

質問

Gitリポジトリにいくつかのブランチとダングリングコミットがあります。このようなコミットに対して、特定の文字列で検索をかけたいのですが。

履歴にあるすべてのコミットのログを取得する方法は知っていますが、これにはブランチやダングリングブロブは含まれず、HEADの履歴だけが含まれます。私はそれらをすべて取得し、誤って配置された特定のコミットを見つけたい。

また、乗り換えを検討しているため、Mercurialで行う方法も教えていただきたいです。

どのように解決するのですか?

ダングリングコミットを確認するには 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 を期限切れにしていたり、期限切れコマンドを実行した場合に起こる可能性があります。