如何在两个提交之间创建git捆绑包,并包含它们之间的所有标签标签?

3
例如,这里我有一些在v0.5.1和v0.5.4之间的提交记录:
git log --pretty=oneline  v0.5.1..v0.5.4
ec7a6416580276d2f9975802f487c1216dcc540d (tag: v0.5.4) Release v0.5.4
64b2b14d3123c619db5bbfac718c579e8daa8da8 fix: decoding nested dicts with tuple keys (#297)
ccff0b51418b4c41b63ee48f31126435e5cfd2bd (tag: v0.5.3) Release v0.5.3
2e51315f0fd7e088a66346e67224f38eea0da4a3 (tag: 0.5.3) chore(deps): update Pipfile.lock
0d9d73ac9f8dd5dbe9712100ac977fa9bad51602 chore(deps): pin pytest to >=6.2.3 to bump its transitive dep py
3dc59e01ccdfec619ee4e4c3502b9759b67c3fa8 (tag: v0.5.2) Release v0.5.2
5aba46a417ce48137f16f0f7fd3cc51ccdfee8c3 Revert "refactor!: remove `encode_json` optional arg for `to_dict`"
da2f98104ae5722af5d57f0c0118f903f0f12a91 docs: formatting
f8ee0c04590cc31ebe039e7010a8a668a42f97fb Update README.md

我想导出一个包括这些提交的捆绑文件。
$ git bundle create ../notag-v0.5.4.bundle v0.5.1..v0.5.4
Enumerating objects: 44, done.
Counting objects: 100% (44/44), done.
Compressing objects: 100% (26/26), done.
Total 33 (delta 22), reused 17 (delta 7), pack-reused 0

$ git bundle list-heads ../notag-v0.5.4.bundle
ec7a6416580276d2f9975802f487c1216dcc540d refs/tags/v0.5.4

这里我们可以看到它不包括v0.5.2和v0.5.3。
然而,如果我添加--tags,它会包含更多的提交。
$ git bundle create ../v0.5.4.bundle --tags v0.5.1..v0.5.4
Enumerating objects: 432, done.
Counting objects: 100% (432/432), done.
Compressing objects: 100% (159/159), done.
Total 402 (delta 256), reused 363 (delta 220), pack-reused 0

从33个包变成了402个包,其中包括v0.5.1之后的所有标签。
到目前为止,唯一有效的方法是使用标签列表:
$ git bundle create ../v0.5.4.bundle v0.5.1..v0.5.4 v0.5.2 v0.5.3
Enumerating objects: 44, done.
Counting objects: 100% (44/44), done.
Compressing objects: 100% (26/26), done.
Total 33 (delta 22), reused 17 (delta 7), pack-reused 0

$ git bundle list-heads ../v0.5.4.bundle
ec7a6416580276d2f9975802f487c1216dcc540d refs/tags/v0.5.4
3dc59e01ccdfec619ee4e4c3502b9759b67c3fa8 refs/tags/v0.5.2
ccff0b51418b4c41b63ee48f31126435e5cfd2bd refs/tags/v0.5.3

但这真的很烦人,我必须手动查找那些提交之间有哪些标签。
在更复杂的情况下,它不仅仅是简单的版本标签。可能是 fix-issue-220、feature-merge 等等。它可以是任何用词,而且无法确定顺序。
有没有一种标准的方法来处理这个问题?

我认为你应该能够使用 git log 命令来获取范围内的标签 来生成列表(而不是手动完成),并将其附加到命令中(还可以创建一个包装器来自动化这个过程)。 - undefined
我猜这可能涉及到烦人的awk编程或其他命令来处理日志输出。因为git log不能直接给你标签,它包含了所有可能的描述符。我找到的最接近的是%D,但仍需要解析。 - undefined
我找到的最接近的是 git --no-pager log --simplify-by-decoration --decorate-refs='tags' --format='%D',但仍需要额外解析。因为每行都有 tag: xxx, tag: yyy - undefined
我链接的答案使用了grep/sed组合来去除不需要的垃圾,但实际上你可以直接运行git log --simplify-by-decoration --decorate-refs='tags' --format=format:'%(describe:tags=1)',只获取标签而无需额外的冗余信息。 - undefined
不是真的,$(describe:) 无法描述“未注释的标签”。在 git describe 中,你需要指定 --tags,但这个选项在最近的 git 版本中并不存在。至少在 2.34 版本中没有这个选项。 - undefined
对于支持它的版本(>=2.35),%(describe:tags) 应该可以工作,但是如果不支持的话,你可能只能解析输出结果了。 - undefined
1个回答

1
如果我理解你的要求正确的话:你想列出放在任何父级(任何父级)上的标签,这些父级包含v0.5.4,并且其历史记录包含v0.5.1
你可以直接使用git tag命令:
git tag --contains v0.5.1 --merged v0.5.4

检查git help tag以查看其他相关选项,例如:--list "v[0-9]*"将仅列出以"v"开头后跟数字的标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接