Git: distinguish between local and remote tags
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)
精彩评论