29

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

4

3 回答 3

30

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

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

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

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 中建议的

于 2011-03-31T07:37:16.777 回答
10

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

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

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

,然后做一个:

git branch -a --contains SHA1

如果你看到

 remotes/aRemoteRepoName/aBranch

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

正如克里斯所说:

git branch -a --contains TAGNAME

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

于 2011-03-31T07:25:56.247 回答
1

只要您当前可以访问远程存储库,就可以比较结果

git ls-remote --tags

git show-ref --tags -d

笔记:

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