带有版本号的 Git 日志

Posted

技术标签:

【中文标题】带有版本号的 Git 日志【英文标题】:Git log with version numbers 【发布时间】:2019-02-15 22:02:48 【问题描述】:

我正在尝试生成如下所示的自述文件:

not released yet
30c9474 myname 2018-08-23   Feature 1337

v1.0.76
420368f myname 2018-08-22   Changed Jenkinsfile.groovy again

v1.0.75
be05539 myname 2018-08-16   Feature 2833
838c158 myname 2018-08-16   Fixed bug 9128
6fa061a myname 2018-08-14   Feature 8832

v1.0.74
21903f2 myname 2018-08-11   Some stuff
57f1a2f myname 2018-08-05   Changed Jenkinsfile.groovy

这就是我目前使用 jenkins 生成自述文件的方式:

node('master') 
    def artifactConfig = [
        version: '1.0.'+env.BUILD_NUMBER,
    ]

    try 
        // ######################################## Commit stage ######################################
        stage('Create Changelog stage') 
            // needs to be checked out again, because by default on master the sources are checkout out to $WORKSPACE@script in scripted pipeline
            checkout scm

            // the Changelog will be created here
            sh 'git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%d%h%x09%an%x09%ad%x09%s" --date=short --all | sed "s/^ *([^)]*)/\\n&\\n/;1i (not released yet)" > releasenotes.md'

            sh 'git config --global --unset-all core.editor && git config --global core.editor $(which vim)'

            sh 'git add releasenotes.md &&' +
                'git tag -a version/' + artifactConfig.version + ' -m "Version version/' + artifactConfig.version + ' created" &&' +
                'git commit -C HEAD --amend --no-edit &&' +
                'git push -f origin version/' + artifactConfig.version
        
     catch (exception) 
        currentBuild.result = 'FAILED'
        throw exception
    

这会在版本化分支中创建一个自述文件。 我的问题是我不知道如何将该文件放在一起作为我的示例。我想出的只是如何生成一个自述文件,如:

30c9474 myname 2018-08-23   Feature 1337
420368f myname 2018-08-22   Changed Jenkinsfile.groovy again
be05539 myname 2018-08-16   Feature 2833
838c158 myname 2018-08-16   Fixed bug 9128
6fa061a myname 2018-08-14   Feature 8832
21903f2 myname 2018-08-11   Some stuff
57f1a2f myname 2018-08-05   Changed Jenkinsfile.groovy

编辑: 这是我的网络图的样子: 在 jthill 的帮助下,我将 git log 行更改为:

sh 'git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%h%x09%an%x09%ad%x09%s" --date=short | sed "s/^ *([^)]*)/\\n&\\n/;1i (not released yet)" > releasenotes.md'

但结果现在看起来像这样:

(not released yet)
30c9474 myname 2018-08-23   Feature 1337
420368f myname 2018-08-22   Changed Jenkinsfile.groovy again
be05539 myname 2018-08-16   Feature 2833
838c158 myname 2018-08-16   Fixed bug 9128
6fa061a myname 2018-08-14   Feature 8832
21903f2 myname 2018-08-11   Some stuff
57f1a2f myname 2018-08-05   Changed Jenkinsfile.groovy

看起来更好,但仍然不是我需要的。

【问题讨论】:

【参考方案1】:

你可以按照你需要的顺序获取你需要的数据

git log --date=short --pretty='%d%h %an %ad   %s'

从那里可以直接使用您最喜欢的工具处理文本。如果你不需要它太漂亮,通过管道它

sed 's/^ *([^)]*)/\n&\n/;1i (not released yet)'

会的。

【讨论】:

感谢您的回答。我尝试如下使用它: sh 'git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%h%x09%an%x09%ad%x09%s" --日期=短 | sed "s/^ ([^)])/\n&\n/;1i (尚未发布)" > releasenotes.md' --- 但是詹金斯说:sed: -e expression # 1,字符 13:未终止的 `s' 命令 谢谢!这有帮助,但我担心结果不是我所期望的。我编辑了我的问题以提供更多信息。 由于您的候选标签在侧分支上,因此您的日志命令根本不会列出它们,因为它们不在任何列出的提示中(您仅列出,您只是在搜索从HEAD) 祖先回来。告诉 log 还要查看您感兴趣的候选标签,蛮力将是 --all --since= 您的基本提交日期。 当我添加 --all 时,会包含侧分支,但所有内容仍列在“(尚未发布)”下。我不明白 sed 's/^ ([^)])/\n&\n/;1i (not release yet)' 的作用。【参考方案2】:

另一种方法是将该标签/版本号包含在 git log --format=... 本身中。

使用 Git 2.32(2021 年第二季度,7 年后)是可能的,“git log --format=...(man)”学习了“%(describe)”占位符。

参见commit 9609972、commit 273c990、commit 09fe8ca(2021 年 2 月 28 日)和 commit b081547、commit 15ae82d(2021 年 2 月 14 日)René Scharfe (rscharfe)。(由 @987654329 合并@in commit 25f9326,2021 年 3 月 22 日)

pretty: 添加 %(describe)

推荐人:Eli Schwartz签名人:René Scharfe

为描述输出添加格式占位符。

通过实际调用git describe(man) 来实现,既简单又保证正确性。 它旨在与属性为 export-substgit archive 的文件中的 $Format:...$ 一起使用。 它也可以与git log(man) 等一起使用,即使由于每次提交的分叉会很慢。

还有:

pretty:向%(describe) 添加合并和排除选项

签字人:René Scharfe

允许使用匹配和排除选项限制占位符 %(describe) 使用的标签。 例如 以下命令使用官方版本标签描述当前提交,不包括候选版本:

$ git log -1 --format='%(describe:match=v[0-9]*,exclude=*rc*)'

pretty-formats 现在包含在其man page 中:

'%(describe[:options])':: 人类可读的名称,例如 git describe;无法描述的提交的空字符串。describe 字符串后面可以跟一个冒号和零个或多个 逗号分隔的选项。

'match=<pattern>':只考虑匹配给定的标签 glob(7) 模式,不包括“refs/tags/”前缀。 'exclude=<pattern>':不考虑匹配给定的标签 glob(7) 模式,不包括“refs/tags/”前缀。

警告:

pretty: 文档多个 %(describe) 不一致

报告人:Ævar Arnfjörð Bjarmason签字人:René Scharfe

每个%(describe) 占位符都使用单独的git describe(man) 调用进行扩展。 它们的输出取决于当时存在的标签,因此没有一致性保证。 记录这一事实。

pretty-formats 现在包含在其man page 中:

在添加或删除标签时,描述可能会不一致 同一时间。


使用 Git 2.35(2022 年第一季度),扩展“git log --format=%(describe)(man)”占位符以允许将选定的命令行选项传递给底层的“git describe (man) 命令。

参见Eli Schwartz (eli-schwartz) 的commit eccd97d、commit 1d517ce、commit 3c6eb4e(2021 年 10 月 31 日)。(由 Junio C Hamano -- gitster -- 合并到 commit 6ba65f4,2021 年 12 月 15 日)

pretty:将abbrev 选项添加到%(describe)

签字人:Eli Schwartz

%(describe) 默认占位符,如git describe(man),使用七个字符的缩写提交对象名称。 这可能不足以完全描述给定存储库中的所有提交,导致占位符替换更改其长度,因为存储库的大小增加了。 这可能会导致 git-archive(man) 的输出发生变化。

--abbrev 选项添加到git describe 到占位符界面,以便为用户提供工具来微调项目默认值并确保可重现的存档。

另一种选择是始终指定--abbrev=40,但这可能有点过于偏颇......

pretty-formats 现在包含在其man page 中:

** 'abbrev=<number>': 不使用默认的十六进制位数 (这将根据存储库中的对象数量而有所不同 默认为 7) 的缩写对象名称,使用数字,或尽可能多 所需的数字以形成唯一的对象名称。

例子:

git log -1 --format="%(describe:abbrev=15)"

【讨论】:

以上是关于带有版本号的 Git 日志的主要内容,如果未能解决你的问题,请参考以下文章

自动发布带有版本号的新代码 Angular 4

在 MSBuild 中生成版本号

修订号的 Git 等价物是啥?

怎样启动JDBC Debug模式,打印JDBC诊断日志

Git 常用命令

Git命令学习之旅——日志和穿梭版本号