4

git logプロジェクトで使用して、コミットメッセージに複数の行がある(つまり、より長い説明がある)コミットのみを表示したいと思います。これを行うための最良の方法は何ですか?

試してみgit log --grep='\n\n'たところ、複数行のコミットのリストが表示されましたが、完全なリストではありませんでした。(完全なログの一部を手動で調べたところ、コマンドで出力されなかった複数行のメッセージを含むコミットがすぐに見つかりました。)

次にgit log --grep='\n\r\?\n'、一部のコミットにWindowsスタイルの行末がある場合に備えて(使用してmsysgitいるので、可能かもしれません)、試してみましたが、上記と同じ出力が得られました。

4

2 に答える 2

6

これは私にとってはうまくいくようです(Linuxの場合):

git log --pretty=format:'%H<msgst>%b<msge>' \
| fgrep -v '<msgst><msge>' | fgrep '<msgst>' | cut -b1-40 \
| git log --stdin --no-walk

基本的に:いくつかの珍しい文字列でラップされたコミットハッシュとコミットメッセージ本文(件名を除く)を印刷し、そのような本文が空の行を除外し(たとえば、メッセージに改行がないコミット)、最初の行だけを取得します(コミットハッシュが最初)、ハッシュのみを印刷します。

于 2012-08-06T14:02:55.617 に答える
0

いくつかの追加のコンテキストの場合:

あなたが使用するときに起こっていること--grep='\n\n'はそれ\nが特別ではないのでそれは単に意味しnます:

と同じ結果が得られ--grep='nn'ます。


あなたの実際の質問に関して:

--grepコミットメッセージを改行で分割し、パターンを各サブストリングと個別に照合することに注意してください。--grepつまり、最初の行とは異なる行と一致しているかどうかを判断できるパターンを作成することはできません。

さらに、すべてのコミットメッセージは改行で終わるため、分割すると常に少なくとも1つの完全に空のサブストリングが生成されます。これは、すべてのコミットが一致することを意味し--grep='^$'ます。

したがって、の出力を複数行メッセージでのコミット--grepに制限するために使用する方法はまったくありません。git log


したがって、それを行う唯一の方法は、 cheの回答で与えられたアプローチを使用することです。私がそこでコメントしたように、私はこの特定の形式を提案します:

git log --format='%H%x09%x09%x09%b' \
| egrep '^[0-9a-f]{40}\t\t\t.' \
| cut -f1 \
| git log --stdin --no-walk   # or whatever

このバージョンでgrepは、コミットIDで始まり、3つのタブが続き、その後に任意の文字が続く行を保持します(つまり、何も続かない、つまり、これらは対象のコミットです)。grepこのパターンがコミットメッセージ本文に表示される可能性は非常に低く、コミットメッセージ本文の行を除外するのに1秒も必要ありません。また、タブ文字もデフォルトのフィールド区切り文字でcutあるため、これも短くなります。

于 2021-11-27T05:05:05.093 に答える