我需要使用Git log命令提取Commit Id, Commit subject,其中Commit -body包含一个特定的单词。我还需要只打印提交体中包含该单词的行。
使用下面的命令,我能够获得相关的提交Id和主题,但我无法看到提交主体中包含"CRs-Fixed"一词的行。
git log --pretty=format:"%H,%s" AU_1..AU2 --no-merges --grep='CRs-Fixed'
如果我做git log --pretty=format:"%H,%s,%b" AU_1..AU2 --no-merges --grep='CRs-Fixed'
,我得到了我不需要的整个提交体。
关于如何只获得所需的信息有什么建议吗?
将标题行标记为keepers:
git log --pretty=format:$' 01%Hn 01%sn%b' --grep='CRs-Fixed'
| sed $'/^ 01\|Crs-Fixed/s/^ 01//'
不是很优雅,但是您可以在PowerShell脚本中这样做,如下所示:
function GitGrep {
param ([string]$range, [string]$grepThis)
git log --pretty=format:"%H" $range --no-merges --grep="$grepThis" | ForEach-Object {
$Body = git log -1 --pretty=format:"%b" $_ | Select-String "$grepThis"
if($Body) {
git log -1 --pretty=format:"%H,%s" $_
Write-Host $Body
}
}
}
然后GitGrep AU_1..AU2 CRs-Fixed
优雅说必须有一个更好的方法,但现在我能看到的唯一解决方案是使用标准的awk
和grep
。
下面的awk脚本将哈希添加到所有额外的正文行:
if ($1 ~ /[0-9a-f]{40}/) { h=$1 } else { printf h } print
这样我们就可以只grep我们想要的行:
git log --pretty='%H,%s,%b' AU_1..AU2 --no-merges --grep='CRs-Fixed'
| awk -F, --re-interval '{if($1~/[0-9a-f]{40}/){h=$1}else{printf h}print}'
| grep 'CRs-Fixed'
chbuckley回答的变化:
(echo '$VAR1 = [';
git log --pretty='[ q(%H), q(%s), q(%b) ],' ;
echo ']')
| perl -e '$/=undef; $str = <>; $data = eval $str;
foreach my $record (@$data) {
next unless $record->[2] =~ /Scrivener/;
print $record->[0], "t", $record->[1], "n" }'
在我的一个存储库中,这会产生如下结果:
e38e7dcd6e87ca08d4163aa7772a1559682b26ad Ignore unnecessary Scrivener files.
794ececb7643653b0d3920aa6f548a2a9f94c5d6 Add "The Fallen". Changes to "Wirehead".
我想这种技术有多优雅还有待商榷,但它确实允许您用您选择的语言构建任意的数据结构,并且更容易使用它。例如,您可以很容易地从git-log中构建JSON,不过我在上面使用了perl的引号结构来避免引号问题。您也可以创建XML或HTML