If there are tags in the remote repository, I'm usually getting them automatically when pulling. When I delete the created local 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?
- 2If you're in a friendly place, the tags would be annotaed, and the ones you've fetched from elsewhere would generally have authors that aren't you.Cascabel– Cascabel2011-03-31 16:14:35 +00:00Commented Mar 31, 2011 at 16:14
3 Answers
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.
7 Comments
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.
4 Comments
git branch -a --contains 'TAG_NAME^{commit}?--contains will automatically dereference the named object, so there is no need to manually specify the dereferencing either. Simply git branch -a --contains TAG_NAME works as expected.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)