Git:区分本地和远程标签

Posted

技术标签:

【中文标题】Git:区分本地和远程标签【英文标题】:Git: distinguish between local and remote tags 【发布时间】:2011-07-26 15:59:36 【问题描述】:

如果远程存储库中有标签,我通常会在拉取时自动获取它们。当我删除创建的本地标签(git tag -d <tag-name>)并拉取时,将重新创建已删除的标签。我可以删除远程分支/标签 (git push <remote-branch/tag-name>:<branch/tag-name>),但如何检测到本地标签是通过获取远程标签创建的

【问题讨论】:

如果你在一个友好的地方,标签会被注释,而你从其他地方获取的标签通常会有不是你的作者。 【参考方案1】:

如果您对运行git pull 时重新创建这些标签感到恼火,您可以使用remote.<remote-name>.tagopt 配置设置默认关闭标签获取。例如如果遥控器是origin,那么你可以这样做:

git config remote.origin.tagopt --no-tags

更新: 为了解决您的评论,我建议这样做的原因是没有一种明显的方法来区分本地创建的标签和从远程获取的标签之间的区别。标签也没有reflog。因此,我的建议是禁止自动获取标签 - 然后您可以自己将它们获取到不同的命名空间中。例如,您可以这样做:

git fetch origin +refs/tags/*:refs/tags/origin/*

... 并且可能为此创建一个别名。然后,当您要获取标签时,它们将被命名,例如,refs/tags/origin/tag1 而不是 refs/tags/tag1


如果您希望这种情况自动发生,您可以更改您的 .git/config 以列出多个用于获取的 refspec,例如:

 [remote "origin"]
      url = whoever@whereever:whatever.git
      fetch = +refs/heads/*:refs/remotes/origin/*
      fetch = +refs/tags/*:refs/tags/origin/*

...这是suggested in Pro Git。

【讨论】:

@mklhmnn:我的想法是您可以禁止自动获取标签,然后当您需要远程标签时,将它们提取到不同的命名空间中。我已经用一个例子更新了我的答案。 @Mark:我发现这种方法比我的方法更重要,在获取时按名称空间分隔标签。我会 +1,但在你编辑之前我已经这样做了;) 或者,您可以简单地在不同的命名空间中创建本地标签。 谢谢,马克和 VonC。所以答案是:不,我们无法区分本地创建的标签和远程创建的标签,不是吗? 有没有办法在 .git/config 中添加该 fetch 行,而无需手动编辑 .git/config 文件?我正在寻找类似“git remote set-branches --add ...”之类的东西,但它总是在引用/标题之前。此外,Pro Git 书似乎根本没有在您链接的页面中提及标签......当时最好也引用相关位:)【参考方案2】:

标签不是“本地”或“远程”:它与提交相关联,该提交可以是多个分支的一部分,包括远程命名空间中的分支。

获取标签引用的提交的标签SHA1

git show -s 'TAG_NAME^commit' --format='%H'

,然后做一个:

git branch -a --contains SHA1

如果你看到

 remotes/aRemoteRepoName/aBranch

您知道标签引用了您从远程仓库获取的提交。

正如Chris 提到的:

git branch -a --contains TAGNAME

将取消引用标签并一次性给出答案。

【讨论】:

为什么不能在一个命令中执行所有操作:git branch -a --contains 'TAG_NAME^commit 再想一想,--contains 会自动取消引用命名对象,所以也不需要手动指定取消引用。只需 git branch -a --contains TAG_NAME 即可按预期工作。 我不想知道一个标签是否位于一个分支的历史中,我想知道这个标签是通过fetch创建的还是手动创建的。 +1 表示第一句话,它回答了问题。谢谢你。 (我同意@Mot,我不想知道历史,我想知道标签是在本地创建的还是从远程拉出来的。所以没有半破坏性的解决方案,比如删除所有标签并重新获取,没有办法。)【参考方案3】:

只要你当前可以访问远程仓库,就可以比较结果

git ls-remote --tags

git show-ref --tags -d

注意:

遥控器当前必须可用 如果标签已从远程删除,您将无法判断“本地”标签最初是从远程提取的 这将允许您查看远程和本地何时具有相同的标签名称但引用不同的提交或独立创建/更新(对于带注释的标签,即使提交哈希相同,标签哈希也会不同)

【讨论】:

以上是关于Git:区分本地和远程标签的主要内容,如果未能解决你的问题,请参考以下文章

git远程仓库操作

删除不再在远程存储库上的本地 git 标签

Git(0x02)-git远程仓库的使用

删除本地git的远程分支和远程删除git服务器的分支

git学习GitLab中如何批量删除本地以及远程的TAG标签

git学习GitLab中如何批量删除本地以及远程的TAG标签