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