回答:
でダングリングコミットを確認できます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を期限切れにするか、期限切れにするコマンドを実行した場合に発生する可能性があります。
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
Mercurial hg log --keyword
では、コミットメッセージでキーワードhg log --user
を検索し、特定のユーザーを検索するために使用します。hg help log
ログを制限する他の方法については、を参照してください。
hg log -k
検索は、チェンジセット内のユーザー名とファイル名もコミットします(commands.py:logで確認できます)。これは、hgで理解できない数少ないものの1つです。コミットメッセージとファイル名を検索するための個別のオプションが必要です。以下のように思えるhg log --template '{desc}\n'|grep
の確実な方法です。
hg grep --all <term>
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>
内部的に2に変換して--grep
)、いずれかのパターン(暗黙的ORセマンティック)に一致するコミットを見つけることができます。
行指向であることのなので、便利とセマンティックが使用することですgit log --all-match --grep=<foo> --grep=<bar>
見つけるためにコミットことがあり、両方の最初の行マッチングをし、ライン二どこかにマッチします。
ではgit grep
、あなたが複数のパターン(使用しなければならないすべて組み合わせることができ-e <regexp>
て、フォームを)--or
(デフォルト)、 、、--and
と。grepの場合、ファイルにはそれぞれの選択肢と一致する行が必要です。--not
(
)
--all-match
引数として参照を受け取るコマンドはすべて、次のように--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
れ、アクセスできるすべてのコミットが表示されます(私は、ダングリングコミットに少なくともタグが付けられていると想定しています)。
git grep
、--all
として使用する/変換されますように見えます--all-match
。これは私にはバグのようです。Git1.7.2.3を使用しています($(git rev-list --all)
works を使用)。
gitについてはわかりませんが、Mercurialでは、hgログの出力をパイプしてsed / perl / whateverスクリプトに送り、探しているものを検索します。必要に応じて、テンプレートまたはスタイルを使用してhgログの出力をカスタマイズし、検索しやすくすることができます。
これには、リポジトリ内のすべての名前付きブランチが含まれます。Mercurialには、ぶら下がっているブロブのようなものはありません。
vimユーザーの場合は、tigをインストールし(apt-get install tig)、/と同じコマンドを使用してvimを検索できます。
文字列を見つける方がはるかに簡単だと思うgitの1つのコマンド:
git log --pretty=oneline --grep "string to search"
Git 2.0.4で動作します