Git:区分本地和远程标签

Mot*_*Mot 24 tags git git-tag

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

Mar*_*air 28

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

git config remote.origin.tagopt --no-tags
Run Code Online (Sandbox Code Playgroud)

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

git fetch origin +refs/tags/*:refs/tags/origin/*
Run Code Online (Sandbox Code Playgroud)

...也许为此创建一个别名.然后,当你想要获取标签时,它们将被命名,例如,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/*
Run Code Online (Sandbox Code Playgroud)

... 在Pro Git中建议.


Von*_*onC 10

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

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

git show -s 'TAG_NAME^{commit}' --format='%H'
Run Code Online (Sandbox Code Playgroud)

,做一个:

git branch -a --contains SHA1
Run Code Online (Sandbox Code Playgroud)

如果你看到

 remotes/aRemoteRepoName/aBranch
Run Code Online (Sandbox Code Playgroud)

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

由于克里斯提到:

git branch -a --contains TAGNAME
Run Code Online (Sandbox Code Playgroud)

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

  • 我不想知道标记是否位于分支的历史记录中,我想知道标记是通过提取还是手动创建的. (3认同)
  • 为什么不在一个命令中:`git branch -a --contains'TAG_NAME ^ {commit}`? (2认同)