[英]how to match a hidden ref using git describe
从 git 存储库派生版本号似乎是匹配版本号的一个很好的解决方案,但我的情况有点不同。
我生成的版本号我想为其创建隐藏的引用(因此默认情况下它们不会传递给其他客户端)。 我不希望客户在他们的获取中看到一堆版本流失。
问题是, --match 仅适用于标签,即使您使用 --all 标志。
例子:
git update-ref refs/_v.master.0.1 c2897c8338e02b99644640f3afb829c04cb48439
这将创建隐藏的参考
git describe --all c2897c8338e02b99644640f3afb829c04cb48439
_v.master.0.1 [显示出来]
但这不会返回任何内容:
git 描述 --match _v* --all c2897c8338e02b99644640f3afb829c04cb48439
致命:未找到名称,无法描述任何内容。
我在文档中看到 --match “只考虑匹配给定 glob(7) 模式的标签”,但这似乎很蹩脚,匹配应该适用于任何 ref 类型,假设其他修饰符(-all --tags 等)限制引用类型的范围。
我还有其他方法可以做到这一点吗? 我想到的一种方法是在一个客户端上创建标签,并将它们(在推送和获取时间)映射到来自/来自源的隐藏引用,但这似乎需要很多额外的工作。 如果不是客户端,我上面提到的 ref 匹配是否可以从 API 获得?
提前致谢!
您必须使用 Git 2.14.x/2.15(2017 年第四季度)进行检查
“
git describe --match <pattern>
”已被教导与“--all
”选项配合得很好。
请参阅Max Kirillov ( max630
) 提交的 6d68b2a (2017 年 9 月 20 日) 。
(由Junio C gitster
合并gitster
提交 8c1bc7c ,2017 年 9 月 29 日)
describe
: 教--match
处理分支和遥控器当
git describe
使用--match
,它只匹配标签,基本上忽略--all
参数,即使它被指定。通过匹配分支名称和
$remote_name/$remote_branch_name
来修复它,用于远程跟踪引用,具有指定的模式。
相应地更新文档并添加测试。
它还处理负面模式:
例如,假设您希望找到包含某个提交的第一个官方发布标签。 如果我们假设官方发布标签的形式为“
v*
”,并且预发布候选的名称中包含“*rc*
”,我们现在可以找到第一个引入提交abcdef
发布标签:
git describe --contains --match="v*" --exclude="*rc*" abcd
请注意,Git 2.16.x/2.17(2018 年第一季度)将为“ git describe --all
”恢复正确的输出。
请参阅Daniel Knittl-Frank ( knittl
) 的commit 1bba001 (2017 年 12 月 11 日) 。
(由Junio C gitster
合并-- gitster
-- in commit fac64e0 ,2018 年 1 月 23 日)
describe
: 在描述带有嵌入名称的标签时,在前面加上“tags/
”“
git describe
”命令的手册页解释了使用--all
选项时的预期输出,即显示完整的参考路径,包括heads/
或tags/
前缀。当212945d (“Teach git-describe to verify annotated tag names before output”,2008 年 2 月 28 日,Git v1.5.5-rc0)使 Git 偏爱带注释的标签的嵌入名称时,它不小心更改了输出格式时
--all
给出了标志,只打印没有前缀的标签名称。检查是否指定了
--all
并为此特殊情况重新添加“tags/
”前缀以修复回归。
当“ git describe C
”发现带有标记名A
的注释标记是解释提交C
的最佳名称,并且该标记存储在refs/tags
层次结构中的“ wrong
”位置时,例如refs/tags/B
,命令给出了警告信息,但使用A
(不是B
)来描述C
。
如果C
正好在标签上,则描述输出将是“ A
”,但“ git rev-parse A^0
”将不等于“ git rev-parse C^0
”。
该命令的行为已在 Git 2.27(2020 年第 2 季度)中进行了更改,以使用“长”形式,即
A-0-gOBJECTNAME
,由rev-parse
正确解释。
请参阅Junio C gitster
( gitster
) 提交的 ff165f0 (2020 年 2 月 20 日) 。
(由Junio C gitster
合并-- gitster
-- in commit 0f0625a ,2020 年 3 月 27 日)
describe
:基于错误定位的标签强制使用长格式的名称帮助:马修斯·塔瓦雷斯
帮助:杰夫·金带注释的标签有两个名称:
- 它位于
refs/tags
层次结构中的位置和- 记录在对象本身的“
tag
”字段中的tag
。它们通常应该匹配。
自212945d4 (“Teach
git describe
to verify annotated tag names before output”, 2008-02-28, Git v1.5.5-rc0 -- merge )以来,使用带注释的标签描述的提交将其名称基于对象的标记名。虽然这是一个深思熟虑的设计决定,目的是让与他人更容易地谈论标签,即使标签碰巧被提取到与其创建者给的名称不同的名称,它也有一个缺点。
“
git describe
”的输出,至少在现代 Git 中,应该可以用作对象名称来命名给“git describe
”命令的确切提交。在描述由此类标记直接指向的提交时,当两个名称不同时,使用标记名会破坏此属性。
注释标签 Bob 制作为“
v1.0
”可能位于ref
层次结构中的“refs/tags/v1.0-bob
”,并且“git describe v1.0-bob^0
”的输出会说“v1.0
”,但“refs/tags/v1.0
”本地可能没有任何标签,或者可能有另一个标签指向不同的对象。请注意,如果所描述的提交不是由此类错误定位的标签直接指向的,则这不会成为问题。
在上一段的示例中,描述父项为
v1.0-bob
的提交将导致“v1.0
”(即取自标记对象的标记名)后跟“-1-gXXXXX
”,其中XXXXX
是缩写对象名,以“-g
”结尾的字符串是十六进制字符串开头的对象的对象名(只要是唯一的),所以前导部分是否为“v1.0
”或“v1.0-bob
”。以长格式显示名称,即带有“
-0-gXXXXX
”后缀,当我们给出的名称是基于错误定位的注释标签时,以确保输出可以用作最初提供给命令的对象的对象名称解决问题。在此过程中,删除过于谨慎的死代码以防止没有标记名的带注释的标记对象。
这样的标记在代码流中更早地被过滤掉,并且不会到达代码的这部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.