いくつかのブランチとダングリング コミットを含む 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 を期限切れにするか、それらを期限切れにするコマンドを実行した場合に発生する可能性があります。
Mercurialhg log --keyword
では、コミット メッセージ内のキーワードhg log --user
を検索したり、特定のユーザーを検索したりするために使用します。hg help log
ログを制限するその他の方法については、 を参照してください。
orの使用に関する richq の回答に加えて、現在の git メンテナーである Junio C Hamano による次のブログ投稿をご覧ください。git log -g --grep=<regexp>
git grep -e <regexp> $(git log -g --pretty=format:%h)
git grepとgit log --grepはどちらも行指向であり、指定されたパターンに一致する行を探します。
git log --grep=<foo> --grep=<bar>
(またはgit log --author=<foo> --grep=<bar>
、内部的に two に変換される) を使用して、いずれかのパターン (暗黙またはセマンティック)--grep
に一致するコミットを見つけることができます。
行指向であるため、便利なANDセマンティックは、どこかで最初に一致する行と 2 番目に一致する行の両方を持つコミットgit log --all-match --grep=<foo> --grep=<bar>
を見つけるために使用することです。
を使用すると、複数のパターン (すべてフォームを使用する必要があります) を(デフォルト)、、、および とgit grep
組み合わせることができます。for grepは、ファイルに各選択肢に一致する行が必要であることを意味します。-e <regexp>
--or
--and
--not
(
)
--all-match
rqの答えに基づいて、私はこの行が私が望むことをすることを発見しました:
git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")
次のように、コミット ID、ファイル名を報告し、一致する行を表示します。
91ba969:testFile:this is a test
...これが標準の git grep コマンドに含まれる良いオプションであることに同意する人はいますか?
Mercurialを使用すると、
$ hg grep "search for this" [file...]
検索されるリビジョンの範囲を絞り込む他のオプションがあります。
参照を引数として取るコマンドは、次のよう--all
に man ページに記載されているオプションを受け入れます。git rev-list
--all
Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
command line as <commit>.
したがって、たとえばgit log -Sstring --all
、言及し、ブランチまたはタグからアクセスできるすべてのコミットが表示さstring
れます (ぶら下がっているコミットには、少なくともタグで名前が付けられていると想定しています)。
git については知りませんが、Mercurial では、hg ログの出力を sed/perl/whatever スクリプトにパイプして、探しているものを検索します。必要に応じて、テンプレートまたはスタイルを使用して hg log の出力をカスタマイズして、検索を容易にすることができます。
これには、リポジトリ内のすべての名前付きブランチが含まれます。Mercurial には、ぶら下がっているブロブのようなものはありません。
まだ言及されていない解決策をもう 1 つ追加するには、gitg のグラフィカルな検索ボックスを使用することが、私にとって最も簡単な解決策であると言わざるを得ませんでした。最初に出現したものが選択され、Ctrl-G で次を見つけることができます。
vim ユーザーの場合は、tig をインストールし (apt-get install tig)、同じコマンドで vim を検索できます。