我需要使用Git log命令来提取提交ID,提交主题,其中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'
,
我得到了整个提交机构 - 我不需要。
有关如何获取所需信息的任何建议?
答案 0 :(得分:1)
将标题行标记为管理员:
git log --pretty=format:$'\001%H\n\001%s\n%b' --grep='CRs-Fixed' \
| sed $'/^\001\\|Crs-Fixed/s/^\001//'
答案 1 :(得分:0)
Elegance说必须有更好的方法,但现在我能看到的唯一解决方案是使用标准awk
和grep
。
以下awk脚本会将哈希添加到所有额外的主体行:
if ($1 ~ /[0-9a-f]{40}/) { h=$1 } else { printf h } print
然后,我们可以只使用我们想要的行:
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'
答案 2 :(得分:0)
不是很优雅,但您可以在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
答案 3 :(得分:0)
cbuckley答案的变化:
(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。