首页 > 解决方案 > Refspec 消除本地和远程标签以及同名分支的歧义?

问题描述

假设我有一个带有标签1.2.3和两个遥控器origin以及每个fork标签的工作副本1.2.3,但所有三个实际上都指向不同的提交。此外,它们都有一个分支1.2.3

是否有一个完全限定的路径(refspec)允许您引用(或同样)1.2.3已知的标签?forkorigin

git checkout 1.2.3将切换到本地1.2.3分支,并切换到git checkout tags/1.2.3本地1.2.3标签。但是有可能以某种方式签出远程标签1.2.3fork?我尝试了git checkout fork/tags/1.2.3git checkout refs/remotes/fork/tags/1.2.3(路径规范错误)之类的方法,git checkout refs/remotes/fork/1.2.3但是它检查了该名称的分支,而不是标签。

获取标签失败:

git fetch --tags
From https://...
 ! [rejected]          1.2.3      -> 1.2.3  (would clobber existing tag)

这是暗示 Git 不支持它吗?

标签: gitgit-checkoutgit-tag

解决方案


与分支不同,Git 不会为每个遥控器命名空间标签。如果您从任何远程获取标签,它们将存储在refs/tags/命名空间中,类似于refs/heads/您的本地分支。没有等效refs/remotes/<remote>/于远程分支的命名空间。

使用标签的所有包含的工具都直接使用refs/tags/,因此即使您决定手动将一些远程标签获取到不同的命名空间(如您问题的评论之一中所述),实际使用它们也会相当不舒服。但是,如果您想签出一些遥控器的标签,但实际上没有将它们用作适当的标签,您可以这样做。

有点假设人们在标记事物时会一起工作。如果您无法避免多人创建具有不同内容的相同标签,您可能需要就标签命名方案达成一致(例如 foo-1.1.2 和 bar-1.1.2)或根本不使用标签。


推荐阅读