我怎样才能获得他们在同一个月没有发布的版本?

时间:2013-08-18 15:15:08

标签: git github

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

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)

1 个答案:

答案 0 :(得分: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命令是:

  • 将字段分隔符设置为'-'$12013$206等)
  • 如果$2与之前的$2不同,则每行
    1. 打印以前保存的行(如果有)
    2. 保存该行和$2
  • 最后,打印保存的行

这假设至少有一条线;如果需要空if (keep)输出,请添加git logprevkeep的内容是确保我们只打印给定月份的 last 行,如示例输出中所示。

再次编辑:哎呀,我打印了第一个行而不是最后一行,这意味着keep位是愚蠢的,当我们遇到时我们只能print这一行它。您的示例输出打印 last 行,这意味着我们要在keep时替换$2==prev

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

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