带有版本号的 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-subst
和git 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 日志的主要内容,如果未能解决你的问题,请参考以下文章