我正在使用read-tree来克服裸仓库在推送到服务器部署时不能使用子模块问题,但现在我有点卡在我正在使用的两个repos有标记版本号的地方.我需要的是一些树形方式来引用包含远程名称的标签,但我看不到任何明显的东西.就像是:
git read-tree --prefix=api/framework/ -u framework/1.6.5
框架是其中一个遥控器.但只有这样才有效:
git read-tree --prefix=api/framework/ -u 1.6.5
然而另一个远程我有相同的标签...而git标签列出了一个列表中的所有标签
任何想法,将不胜感激.
这里问题的根源是标签没有像分支那样的"远程标签名称空间".
当你运行时git fetch
,它会查询遥控器并根据线路引入参考.通常只有一个:git config --get-all remote.name.fetch
$ git config --get-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
因此,git fetch
带来refs/heads/master
但安装它refs/remotes/origin/master
.
Git总是知道在remotes/
名称空间中寻找"远程分支".
当你运行时git fetch --tags
,这会增加:
refs/tags/*:refs/tags/*
作为refspec(并且还绕过该remote.origin.fetch
部分),但它将所有标签带入(单个)refs/tags/
名称空间.换句话说,遥控器不是名称的一部分; 您和远程都使用单个全局"标记"名称空间.
您可以以不同方式配置您的仓库,添加额外的行:
git config --add remote.origin.fetch '+refs/tags/*:refs/rtags/origin/*'
这将创建一个新的本地引用名称空间refs/rtags/
.由于您已将遥控器的名称作为顶级条目rtags
,因此您可以为另一个遥控器配置不同的子空间:
git config --add remote.rmt2.fetch '+refs/tags/*:refs/rtags/rmt2/*'
现在,当你运行git fetch origin
它时会将原始标签带入as rtags/origin/
,git fetch rmt2
并将这些rmt2的标签带入rtags/rmt2/
.
Git的没有不知道rtags
(我们只是做它在这里!),所以你必须把这些作为rtags/origin/foo
,等等,甚至refs/rtags/origin/foo
在一些(罕见)病例.
(略去+
,以防止标签强制更新.这不是一般应该发生的,用户不应该从一个SHA-1移动标签到另一个,但+
在fetch
行的意思是"如果他们改变了它,利用新的一个".既然你现在把它们放到了一个"远程标签"空间,我想你可能希望它们强制更新一个远程分支名称.注意这些也会自动修剪,就像远程分支一样,如果你跑git fetch -p
或git remote prune
.那是独立的+
.)