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