繁体   English   中英

如何使用 git describe 匹配隐藏的 ref

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM