On Fri, Apr 27 2018, Ævar Arnfjörð Bjarmason wrote: > On Tue, Apr 24, 2018 at 9:57 PM, Wink Saville <wink@xxxxxxxxxxx> wrote: >> If have a repository with a tag "v1.0.0" and I add a remote repository >> which also has a tag "v1.0.0" tag is overwritten. > > I feel like this thread has gotten somewhat side-tracked by the valid > discussion about whether we should have remote tracking tags, but the > much easier thing to fix is that the "+" prefix for refs/tags/* means > nothing. > [...] This patch series implements that simpler way of digging ourselves out of the immediate hole that we're clobbering tags by default without the --force option. I'm not 100% happy about this, but I think sans stuff that comes up in review it's in principle ready for inclusion, stuff I wished I'd done but have left for later: * Write a gitrefspec(5) man page, now we have how they work, and how they work on push/pull scattered over two docs, which before this are in conflict with one another. * Have much more exhaustive tests, I started trying to integrate this with the much more exhaustive tag pruning tests in my https://github.com/avar/git/tree/refspec-support-+-in-tags but gave up because the various interaction with those tests is messy, e.g. if we fail a tag update we don't prune as the existing tests assert, because the whole ref transaction fails. * 05/08 notes how the semantics of whether something needs a --force are really confusing because the rules are different depending on the ref namespace you're pushing into. We should probably build on top of this and e.g. refuse to clobber tags outside of refs/tags/*. * Should we do better to mitigate this breaking stuff for existing users who really are expecting their tags to be clobbered? Maybe by adding a --force-tags option (which wouldn't clobber branches), or have some config option either enable the old behavior, or make this opt-in? Ævar Arnfjörð Bjarmason (8): push tests: remove redundant 'git push' invocation push tests: fix logic error in "push" test assertion push tests: add more testing for forced tag pushing push tests: assert re-pushing annotated tags push doc: correct lies about how push refspecs work fetch tests: correct a comment "remove it" -> "remove them" fetch tests: add a test clobbering tag behavior fetch: stop clobbering existing tags without --force Documentation/fetch-options.txt | 15 ++++-- Documentation/git-push.txt | 30 ++++++++--- Documentation/gitrevisions.txt | 7 +-- Documentation/pull-fetch-param.txt | 22 +++++--- builtin/fetch.c | 20 +++++--- t/t5510-fetch.sh | 2 +- t/t5516-fetch-push.sh | 82 ++++++++++++++++++++++-------- t/t5612-clone-refspec.sh | 4 +- 8 files changed, 130 insertions(+), 52 deletions(-) -- 2.17.0.290.gded63e768a