Git:区分本地标签和远程标签

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

2
如果您处于友好的环境中,那么标签将被注释,并且从其他地方获取的标签通常具有不是您自己的作者。 - Cascabel
3个回答

32
如果你对运行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文件,列出多个refspecs用于获取,例如:

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

... 这个建议来自于 《Pro Git》


1
@mklhmnn:我的想法是,你可以抑制自动获取标签,然后当你想要远程标签时,将它们获取到不同的命名空间中。我已经更新了我的答案,并提供了一个示例。 - Mark Longair
1
@Mark:我觉得你的方法比我的更加直接,通过命名空间在获取时分离标签。我本来想点赞的,但在你编辑之前我已经点过了 ;) - VonC
1
或者,您可以在不同的命名空间中创建本地标签。 - Cascabel
1
有没有办法在不手动编辑.git/config文件的情况下添加fetch行?我正在寻找类似于“git remote set-branches --add ...”的东西,但它总是在refs/heads之前添加。此外,在您链接的页面中,Pro Git书似乎根本没有提到标签...也许最好在当时也引用相关部分 :) - UncleZeiv
1
使用 git tag -l | xargs git tag -d 命令可以删除所有本地标签,然后使用 git fetch origin +refs/tags/*:refs/tags/*(不包括 origin/)命令可以恢复原始状态(我想要删除我本地添加的标签)。 - CodeManX
显示剩余2条评论

10

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

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

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

,并执行:

git branch -a --contains SHA1

如果你看到

 remotes/aRemoteRepoName/aBranch

你知道这个标签引用了一个你已经从远程仓库获取的提交。

Chris所提到的:

git branch -a --contains TAGNAME

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


2
为什么不使用一个命令:git branch -a --contains 'TAG_NAME^{commit}来完成所有操作? - Chris Johnsen
1
再仔细想一想,“-contains”将自动解引用命名对象,因此无需手动指定解引用。只需使用“git branch -a --contains TAG_NAME”即可按预期工作。 - Chris Johnsen
3
我不想知道标签是否位于一个分支的历史记录中,我想知道该标签是通过fetch还是手动创建的。 - Mot
我同意@Mot的观点,我不想了解历史记录,我想知道标签是在本地创建还是从远程拉取的。因此,除非使用半破坏性的解决方案(如删除所有标签并重新获取),否则没有其他方法。 - Wildcard

3
只要您目前可以访问远程仓库,就可以比较结果。
git ls-remote --tags

使用

git show-ref --tags -d

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接