根据消息从 git 日志中获取任务编号列表

Get list of tasks numbers from git log based on message

任务号=JIRA问题号=****(例如:7600)

假设我有一个包含以下消息的提交列表:

PRJ-7600 - first message
PRJ-8283 - second message
PRJ-8283 - third message
PRJ-1001 - fourth message
PRJ-8283 - fifth message
PRJ-7600 - sixth message

第一个是最旧的提交。

想要输出:

1001
7600
8283

我使用以下命令列出了我的提交:

git log --author="First Last" --oneline --grep=PRJ --pretty=format:"%s" | sort

哪里

实际输出:

PRJ-1001 - fourth message
PRJ-7600 - first message
PRJ-7600 - sixth message
PRJ-8283 - fifth message
PRJ-8283 - second message
PRJ-8283 - third message

是否可以提取那些只显示一次的数字(可能使用正则表达式或子字符串之类的东西)?

详情:

这将在 bash 或 git bash:

中完成
git log --author="First Last" --oneline --grep=PRJ --pretty=format:"%s" | sort | cut --delimiter='-' --fields=2 | uniq

所以在问题中发布的第一部分的基础上,额外的是:

| cut --delimiter='-' --fields=2 | uniq

这会将排序后的输出通过管道传输到 cut,后者提取由连字符“-”分隔的第二个字段,然后将结果通过管道传输到 uniq 以显示不同的值。

此解决方案在用于 cut 的定界符形式上存在弱点 - 如果日志消息的格式发生变化,则可能会中断。 更好的解决方案是使用正则表达式搜索(而不是 cut)来查找问题键(“/PRJ-.+\s/”我认为...)并输出数字部分。

编辑

所以经过一番挖掘,可以使用 grep 找到项目键(在本例中为 PRJ )来更可靠地做到这一点:

git log ... | grep -oP --regexp="PRJ-\K\d+" | uniq

-o 告诉 grep 只输出行的匹配部分
-P 使用正则表达式的 PCRE (perl/PHP) 风格,从而使我们能够使用
\K 导致之前(在那一点之前)匹配项被排除的选项