git - 根据消息从 git log 中获取任务编号列表

标签 git git-log

任务号=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

在哪里

  • 提交者 = 作者(在本例中)
  • --grep=PRJ 指定忽略自动生成的注释(“Merge branch ...”)(替代--no - merge )
  • --pretty=format:"%s" 仅显示消息(删除散列)

实际输出:

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

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

详细信息:

  • Windows 7
  • git 1.9.5 (msysgit) -> 从 cmd 使用,而不是从 Git Bash 控制台使用

最佳答案

这将在 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 选项导致之前(该点之前)的匹配项被排除

关于git - 根据消息从 git log 中获取任务编号列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30185916/

相关文章:

git - SourceTree git "clone from url"给我 fatal error

regex - 如何配置 Jenkins 去除 git branch 参数中的前导 "origin/"?

git - git 奇怪的彩色终端响应

git - Git日志的-r选项有什么作用?

git - 需要在 `git log` 上设置哪些标志才能使其具有与 `git whatchanged` 相似的输出?

Git:列出所有最近最少更改的文件

git - vsts 扩展 Git Rest 客户端未经授权

Git:计算自标记以来的提交

git log 不列出自某个日期以来的提交

git - 列出两个日期之间提交到 master 分支的 git