Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In git, how do I sync my tags against a remote server?

Tags:

git

git-tag

Is there a way to keep my local git tags in lockstep with a remote's tags? That is -- not only get new tags when created (as usual, when fetch-ing/pull-ing), but also prune tags no longer on a remote and also delete existing tags when someone else git push -f's a tag. I know I can git fetch remotename followed by git remote prune remotename to achieve similar behaviour for branches.

like image 671
mlb Avatar asked May 08 '12 00:05

mlb


People also ask

Can git tags be pushed to remote?

Pushing a tag in git to a remote is similar to pushing a branch to a git remote. The only difference is that you need to mention the tag name after the "git push" command as by default this command only pushed the branch.

How do I sync my git remote to the local repository?

To re-synchronize your local repository with the newly updated remote repository, simply run the git pull operation. When the pull is executed, the latest revision history will download from the remote repository and import to your local repository. Pull changes from a remote repository to your local repository.


2 Answers

...also prune tags no longer on a remote

git fetch gets with Git 2.17 (Q2 2018) an handy short-hand for getting rid of stale tags that are locally held.

See commit 6317972, commit 97716d2, commit e249ce0, commit 627a129, commit d0e0747, commit 2c72ed7, commit e1790f9, commit 59caf52, commit 82f34e0, commit 6fb23f5, commit ca3065e, commit bf16ab7, commit eca142d, commit 750d0da, commit 0711883, commit ce3ab21, commit aa59e0e (09 Feb 2018) by Ævar Arnfjörð Bjarmason (avar).
(Merged by Junio C Hamano -- gitster -- in commit c1a7902, 06 Mar 2018)

fetch: add a --prune-tags option and fetch.pruneTags config

Add a --prune-tags option to git-fetch, along with fetch.pruneTags config option and a -P shorthand (-p is --prune).
This allows for doing any of:

git fetch -p -P git fetch --prune --prune-tags git fetch -p -P origin git fetch --prune --prune-tags origin 

Or simply:

git config fetch.prune true && git config fetch.pruneTags true && git fetch 

Instead of the much more verbose:

git fetch --prune origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*' 

Before this feature it was painful to support the use-case of pulling from a repo which is having both its branches and tags deleted regularly, and have our local references to reflect upstream.

At work we create deployment tags in the repo for each rollout, and there's lots of those, so they're archived within weeks for performance reasons.

Without this change it's hard to centrally configure such repos in /etc/gitconfig (on servers that are only used for working with them). You need to set fetch.prune=true globally, and then for each repo:

git -C {} config --replace-all remote.origin.fetch "refs/tags/*:refs/tags/*" "^\+*refs/tags/\*:refs/tags/\*$" 

Now I can simply set fetch.pruneTags=true in /etc/gitconfig as well, and users running "git pull" will automatically get the pruning semantics I want.


Update Apr. 2021, Git for Windows 2.30.1 and GitHub Desktop 2.8

It works if you have set prune and pruneTags options:

cd C:\path\to\local\repo git config fetch.prune true git config fetch.pruneTags true 

Then click on Fetch origin in GitHub Deskop: the logs will show:

2021-04-28T20:25:21.244Z - info: [ui] Executing fetch:    git -c credential.helper= -c protocol.version=2 fetch --progress --prune origin (took 2.986s) 

... and any local tag not present in the remote will be gone!

like image 138
VonC Avatar answered Sep 27 '22 22:09

VonC


The following worked for me:

git fetch --prune --tags 
like image 20
Dominik Ehrenberg Avatar answered Sep 27 '22 21:09

Dominik Ehrenberg