我正在使用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标签列出了一个列表中的所有标签
任何想法都会受到赞赏。
答案 0 :(得分:5)
问题的根源在于标签没有像分支那样的“远程标签名称空间”。
当您运行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
时,它会将原始代码标记为rtags/origin/
,而git fetch rmt2
会将这些rmt2标记带入rtags/rmt2/
。
Git不会 知道rtags
(我们刚刚在这里做了!)所以你必须将它们称为rtags/origin/foo
等,甚至是{{ 1}}在某些(罕见)情况下。
(省略refs/rtags/origin/foo
以防止强制更新标签。这通常不会发生 - 用户不应该将标签从一个SHA-1移动到另一个 - 而是+
in +
行意味着“如果他们改变了它,就拿新的”。由于你现在将它们粘贴到一个“远程标签”空间,我想你可能希望它们强制更新,一个远程分支请注意,如果您运行fetch
或git fetch -p
,这些也会自动修剪,就像远程分支一样。这与git remote prune
无关。)
答案 1 :(得分:1)
我刚刚找到了部分答案,虽然它并不像引用标签本身那样好:
git ls-remote --tags framework
然后查看所需标签的sha并使用它。很高兴接受有关更好方法的教育。