1

我正在使用此命令来获取项目的版本(标签)已发布的时间。

git log --tags --simplify-by-decoration --pretty="format:%ci %d"

输出是这样的:

2013-06-08 09:11:40 +0200  (2.1.4)   
2013-05-26 17:31:17 +0200  (2.1.3)  
2013-05-26 10:21:49 +0200  (2.1.2)  
2013-05-25 10:07:49 +0200  (2.1.1)  
2013-05-23 22:47:11 +0200  (2.1.0)   
2013-04-30 18:20:53 +0200  (2.0.11, origin/2.0_bugfix)   
2013-04-30 10:47:51 +0200  (2.0.10)   
2013-04-13 14:04:35 +0200  (2.0.9)   
2013-02-17 20:15:22 +0100  (2.0.8)

那么我应该怎么做才能获得他们在同一个月没有发布的版本呢?我想实现这个输出。

2013-06-08 09:11:40 +0200  (2.1.4)   
    2013-05-23 22:47:11 +0200  (2.1.0)   
    2013-04-13 14:04:35 +0200  (2.0.9)   
    2013-02-17 20:15:22 +0100  (2.0.8)
4

1 回答 1

1

[编辑添加:正如评论者所说,git中没有“发布”的概念;我假设你git log已经做了你想要的任何魔法,除了跳过给定月份的最后一行之外的所有内容。]

我怀疑 git 有什么内置的东西可以做到这一点,但在 awk 中很容易做到。我将您的git log输出保存在文件中log

$ awk -F- '$2 != prev { if (keep) print keep; keep = $0; prev = $2 } \
    END { print keep }' < log
2013-06-08 09:11:40 +0200  (2.1.4)   
2013-05-26 17:31:17 +0200  (2.1.3)  
2013-04-30 18:20:53 +0200  (2.0.11, origin/2.0_bugfix)   
2013-02-17 20:15:22 +0100  (2.0.8)

(请注意,我不知道您的缩进是什么意思,所以我没有尝试制作它)。

awk 命令是:

  • 将字段分隔符设置为'-'(即$1, 2013is$206
  • 对于每一行,如果$2与前一行不同$2
    1. 打印上一个保存的行(如果有)
    2. 保存行和$2
  • 最后,打印保存的行

这假设至少有一行;if (keep)如果需要为空git log输出添加。prev和的事情keep是确保我们只打印给定月份的最后一行,如您的示例输出所示。

再次编辑:哎呀,我打印了第一行而不是最后一行,这意味着这些keep位很傻,print我们遇到它时可以只写一行。您的示例输出打印最后一行,这意味着我们要替换keepwhen $2==prev

awk -F- '\
$2 == prev { keep = $0; } \
$2 != prev { if (keep) print keep; keep = $0; prev = $2 } \
END { print keep }'

无论如何,这是一般的想法:一旦你拥有了所有你想要的标签日志,用 awk 或类似的方法过滤它们。

于 2013-08-18T16:03:57.463 回答