web-dev-qa-db-ja.com

リポジトリ内のすべてのGitおよびMercurialコミットで特定の文字列を検索する方法は?

Gitリポジトリにはブランチがほとんどなく、コミットがぶら下がります。特定の文字列のリポジトリでこのようなすべてのコミットを検索したいと思います。

履歴内のすべてのコミットのログを取得する方法は知っていますが、これらにはブランチやぶら下がりの塊は含まれず、HEADの履歴のみが含まれます。置き忘れた特定のコミットを見つけるために、それらすべてを取得したい。

スイッチを検討しているので、Mercurialでこれを行う方法も知りたいと思います。

287
Josip

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)

そして、その検索機能を使用して、置き忘れたファイルを探します。これらのすべての作業は、欠落しているコミットが「期限切れ」ではなく、ガベージコレクションされていることを前提としています。

327
richq

Mercurialでは、hg log --keywordを使用してコミットメッセージ内のキーワードを検索し、hg log --userを使用して特定のユーザーを検索します。ログを制限する他の方法については、hg help logを参照してください。

54
Martin Geisler

richq answergit log -g --grep=<regexp>またはgit grep -e <regexp> $(git log -g --pretty=format:%h)の使用に加えて、現在のgitメンテナーであるJunio C Hamanoによる次のブログ投稿をご覧ください。


概要

git grepgit log --grep は、指定されたパターンに一致する行を探すという点で、行指向です。

git log --grep=<foo> --grep=<bar>(または内部で2つのgit log --author=<foo> --grep=<bar>に変換される--grep)を使用して、パターンのeitherに一致するコミットを見つけることができます(暗黙的またはセマンティック)。

行指向であるため、有用なおよびセマンティックは、git log --all-match --grep=<foo> --grep=<bar>を使用してcommitbothのいずれかが最初に一致し、2番目に一致する行がどこかにあります。

git grepを使用すると、複数のパターン(すべてが-e <regexp>形式を使用する必要があります)を--or(デフォルト)、--and--not(および)と組み合わせることができます。 grepの場合、--all-matchは、fileが各選択肢に一致する行を持たなければならないことを意味します。

22
Jakub Narębski

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コマンドに含まれるニースのオプションであることに同意する人はいますか?

11
Sam Hiatt

引数として参照を取るコマンドは、次のように--allのマニュアルページに記載されている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に言及し、ブランチまたはタグからアクセス可能なすべてのコミットを表示します(ダングリングコミットには少なくともタグで名前が付けられていると仮定しています)。

5
adl

Mercurialを使用すると、

$ hg grep "search for this" [file...]

検索されるリビジョンの範囲を絞り込む他のオプションがあります。

5
Yawar

Gitについては知りませんが、Mercurialでは、hgログの出力をsed/Perl/whateverスクリプトにパイプして、探しているものを検索します。テンプレートまたはスタイルを使用してhgログの出力をカスタマイズし、必要に応じて検索しやすくすることができます。

これには、リポジトリ内のすべての名前付きブランチが含まれます。 Mercurialには、ぶら下がっている塊のようなものはありません。

2

まだ言及されていないソリューションをもう1つ追加するには、gitgのグラフィカルな検索ボックスを使用することが最も簡単なソリューションであると言わざるを得ませんでした。最初の出現箇所が選択され、Ctrl-Gで次の出現箇所を見つけることができます。

1
icarito

vimユーザーの場合、tigをインストールし(apt-get install tig)、/を使用して同じコマンドをvimで検索できます

https://blogs.atlassian.com/2013/05/git-tig/

1
jacktrade

文字列を見つける方がはるかに簡単だと思うgitの1つのコマンド:

git log --pretty=oneline --grep "string to search"

git 2.0.4で動作します

1
Adriano Rosa