开发者

Git: distinguish between local and remote tags

开发者 https://www.devze.com 2023-02-20 18:33 出处:网络
If there are tags in the remote repository, I\'m usually getting them automatically when pulling. When I delete the created loca开发者_JAVA技巧l tag (git tag -d <tag-name>) and pull, the deleted

If there are tags in the remote repository, I'm usually getting them automatically when pulling. When I delete the created loca开发者_JAVA技巧l tag (git tag -d <tag-name>) and pull, the deleted tag will be recreated. I can delete remote branches/tags (git push <remote-branch/tag-name>:<branch/tag-name>), but how can I detect that the local tag was created by fetching a remote tag?


If you're annoyed about these tags being recreated when you run git pull, you turn off the fetching of tags by default with the remote.<remote-name>.tagopt config setting. e.g. if the remote is origin, then you can do:

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

Update: to address your comment, the reason that I suggest this is that there's not an obvious way to tell the difference between a tag that was created locally and one that was fetched from a remote. There's also no reflog for tags. So, my suggestion is to suppress automatic fetching of tags - you can then fetch them yourself into a different namespace. For example, you could do:

git fetch origin +refs/tags/*:refs/tags/origin/*

... and perhaps create an alias for that. Then when you want to fetch tags, they'll be named, for example, refs/tags/origin/tag1 instead of refs/tags/tag1.


If you want this to happen automatically, you could change your .git/config to list multiple refspecs for fetching, e.g.:

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

... which is suggested in Pro Git.


a tag isn't "local" or "remote": it is associated to a commit, which can part of multiple branches, including ones in the remotes namespace.

Get tag SHA1 of the commit referenced by a tag

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

, and do a :

git branch -a --contains SHA1

If you see

 remotes/aRemoteRepoName/aBranch

you know that tag references a commit you have fetched from a remote repo.

As Chris mentions:

git branch -a --contains TAGNAME

will dereference the tag and gives the answer in one go.


As long as you currently have access to the remote repository, you can compare the results of

git ls-remote --tags

with

git show-ref --tags -d

Note:

  • The remote must currently be available
  • If the tag was deleted from the remote, you wouldn't be able to tell that the "local" tag was originally pulled from the remote
  • This will allow you to see when the remote and local have the same tag name but either reference different commits or were created/updated independently (for annotated tags, the tag hashes would be different even if the commit hash was the same)
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号