Git:区分本地和远程标签

时间:2011-03-31 07:12:40

标签: git tags git-tag

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

2 个答案:

答案 0 :(得分:28)

如果您在运行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以列出多个引用的引用,例如:

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

...这是suggested in Pro Git

答案 1 :(得分:10)

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

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

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

,并做一个:

git branch -a --contains SHA1

如果你看到

 remotes/aRemoteRepoName/aBranch

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

Chris所述:

git branch -a --contains TAGNAME

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