2

在查看 Git 标签并了解它们是如何传播的以及有多少解决方法可以修剪它们之后,我得出结论,最好的解决方法是更改refs/remotes/origin/​​ . 那么,为什么 refs 被refs/remotes/origin/假定为分支?在远程引用下复制顶级结构也很容易:

refs/remotes/origin/heads/  <-- remote tracking branches
refs/remotes/origin/tags/   <-- remote tracking tags
refs/remotes/origin/notes/  <-- remote tracking notes

但是所有与 Git 一起工作的工具都假定 refs underrefs/remotes/origin/是分支。

这是否有实际原因,或者仅仅是一个意外?

编辑1:

在对此进行了更多研究后,我发现它会在轻量级标签git log --decorate正确显示带注释refs/remotes/origin/tags/*的标签,但会显示为分支。

配置文件:

[remote "origin"]
    url = ssh://git@github.com/test/example.git
    fetch = +refs/heads/*:refs/remotes/origin/heads/*
    fetch = +refs/tags/*:refs/remotes/origin/tags/*

轻量级标签:

commit e447ca1e2f3c765072c6bd783981619da3d6a090 (tag: v0.2, origin/tags/v0.2)
Author: Joanna Blogs <joanna@blogs.com>
Date:   Thu Aug 18 14:38:48 2016 -0500

    Testing out a light weight tag

注释标签:

commit 334d587e8f9bad1756665384056760c0cb798f32 (tag: v0.1, tag: origin/tags/v0.1)
Author: Joe Blogs <joe@blogs.com>
Date:   Fri Jul 1 09:24:25 2016 -0500

    Testing an annotated tag

但是,正如预期的那样,该git tag -l命令根本没有显示它们。

4

1 回答 1

4

[在回答后不到一天就进行了编辑:之前的回答是基于一个不同的、记错的问题。]

标签旨在成为全球/通用的。也就是说,在 Git 中没有“远程标签”这样的东西。

Git 不能有远程标签没有技术原因。事实上,它可以同时具有远程跟踪标签(总是强制更新)全局标签(非强制更新)。这是手动实现它们的一种方法:

[remote "R"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/R/*
    fetch = +refs/tags/*:refs/rtags/R/*
    fetch = refs/tags/*:refs/tags/*

现在git fetch R,如果您已经有一个标签blue并且他们有一个不相关的标签blue,您会得到refs/rtags/R/blue但不会更新您自己的标签refs/tags/blue

(这并不是那么方便,因为您必须拼出rtags/R/blue,但在发生碰撞的情况下,您无论如何都必须拼出它以避免歧义。)

如果你问:“远程标签而不是全局标签似乎是个好主意,为什么 Git 不这样做?”,我的回答是“历史、惯性、固执等”,但你当然会真的必须直接询问 Git 维护人员。(删除全局标签似乎不礼貌。:-))

如果您问“除了全局标签之外的远程标签似乎是个好主意,为什么 Git 不这样做?” 我的回答是“我不知道”。确实,我不得不把它放在下面,refs/rtags/R而不是refs/remotes/R/tags/因为refs/remotes/R除了树枝之外没有任何空间。如果 Git 人员完全采用这一点,也许您自己的暗示建议,简单地复制refs/*refs/remotes-new/*,然后自动将它们视为标签、注释等,将是最好的。

于 2016-09-08T21:11:00.550 回答