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)
そして、その検索機能を使用して、置き忘れたファイルを探します。これらのすべての作業は、欠落しているコミットが「期限切れ」ではなく、ガベージコレクションされていることを前提としています。
Mercurialでは、hg log --keyword
を使用してコミットメッセージ内のキーワードを検索し、hg log --user
を使用して特定のユーザーを検索します。ログを制限する他の方法については、hg help log
を参照してください。
richq answergit log -g --grep=<regexp>
またはgit grep -e <regexp> $(git log -g --pretty=format:%h)
の使用に加えて、現在のgitメンテナーであるJunio C Hamanoによる次のブログ投稿をご覧ください。
git grep と git 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が各選択肢に一致する行を持たなければならないことを意味します。
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コマンドに含まれるニースのオプションであることに同意する人はいますか?
引数として参照を取るコマンドは、次のように--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
に言及し、ブランチまたはタグからアクセス可能なすべてのコミットを表示します(ダングリングコミットには少なくともタグで名前が付けられていると仮定しています)。
Mercurialを使用すると、
$ hg grep "search for this" [file...]
検索されるリビジョンの範囲を絞り込む他のオプションがあります。
Gitについては知りませんが、Mercurialでは、hgログの出力をsed/Perl/whateverスクリプトにパイプして、探しているものを検索します。テンプレートまたはスタイルを使用してhgログの出力をカスタマイズし、必要に応じて検索しやすくすることができます。
これには、リポジトリ内のすべての名前付きブランチが含まれます。 Mercurialには、ぶら下がっている塊のようなものはありません。
まだ言及されていないソリューションをもう1つ追加するには、gitgのグラフィカルな検索ボックスを使用することが最も簡単なソリューションであると言わざるを得ませんでした。最初の出現箇所が選択され、Ctrl-Gで次の出現箇所を見つけることができます。
vimユーザーの場合、tigをインストールし(apt-get install tig)、/を使用して同じコマンドをvimで検索できます
文字列を見つける方がはるかに簡単だと思うgitの1つのコマンド:
git log --pretty=oneline --grep "string to search"
git 2.0.4で動作します