使用 sed 仅打印 git commit sha 和模式

使用 sed 仅打印 git commit sha 和模式

我从 OSX 中的终端运行,并给出如下 git 日志格式:

* 58dbb08 Joe Blogs 5 weeks ago | [ABC-123] Commit message contents 
* 5a9c5e1 Jane Doe 3 weeks ago | Commit Contents with XYZ-987 jira ticket number
* 6070ee0 Some Person 3 weeks ago | Commit which references [MNO-456, MNO-999]

我想在 OSX 上的 CLI(使用 git log、grep、sort、sed)中生成一个列表,它将以以下格式打印日志:

  58dbb08 │ ABC-123
  5a9c5e1 │ XYZ-987
  6070ee0 │ MNO-456, MNO-999
──────────│──────────────────────
   ꜛ sha  │  ꜛ jira tickets

目的是让我们的 QA 可以提取 git 提交中引用的 Jira Ticket 列表,然后通过查看列表轻松找到关联的提交/票据

sed我在理解提取和替换模式然后仅打印匹配模式的方法方面经验很少,并且很难理解。我已经阅读了文档,但考虑到我很少接触 unix/regex,有些语言是不熟悉的,而且我无法破译如何提取多个模式并替换不匹配的字符串。


我目前正在做什么;

git log --oneline 7.2.0..HEAD | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -n "s/\([a-zA-Z0-9]\{2,7\}-[0-9]\{1,4\}\)/, \1 /pg"

这让我;

58dbb08 Joe Blogs 5 weeks ago | [, ABC-123
5a9c5e1 Jane Doe 3 weeks ago | Commit Contents with , XYZ-987 
6070ee0 Some Person 3 weeks ago | Commit which references [, MNO-456 , , MNO-999

很接近,但我无法摆脱我不需要的东西

答案1

所以,我惩罚了我的小脑袋,推动并想出了一个丑陋的解决方案

我不认为这是最好的,所以我仍然感谢/接受任何帮助和改进!

git log 7.2.0..HEAD --oneline | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -E $'s/([a-f0-9]{7}|[a-zA-Z0-9]{2,7}-[0-9]{1,4})/ \\\n\\1\\\n/g' | 
    grep -iEo "([a-f0-9]{7}|[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    tr '\n' ' ' | 
    sed -E $'s/([a-f0-9]{7})/\\\n\\1 →/g' | 
    sed -E 's/([a-zA-Z0-9]{2,7}-[0-9]{1,4})/\1,/g' | 
    sed -E 's/(..)$//'

sed该命令使用插入一些将匹配的表达式拆分为多行\n,然后它grep再次成为我需要的表达式,并且只保留它们。最后它返回并分别\n,字符替换它们,然后修剪最后一个,.

我最终得到:

58dbb08 → ABC-123
5a9c5e1 → XYZ-987
6070ee0 → MNO-456, MNO-999

我发现这对于小于 200 次提交的日志大小来说相当快...它的目的是帮助在发行说明中生成一些问题列表,所以它不应该比这更多。但再说一遍;任何速度/质量的改进都受到好评!

相关内容