M Hickford <mirth.hickford@xxxxxxxxx> writes: >> Besides, in the above examples, is d4e6038a something the user >> immediately recognises as the same as v1.9.5 or the object existing >> v1.9.5 tag points at? I somehow doubt it. So after getting the >> error, there needs some digging to figure out how v1.9.5 and >> existing hello are related to each other _anyway_, I would think. > > Good point. How about just changing the second error message? > >>git tag hello v1.9.5 > >>git tag hello v1.9.5 > fatal: tag 'hello' already exists > >>git tag hello v2.0.0 > fatal: tag 'hello' already exists but points at a different commit Or simply something like this. I am not convinced (yet) that this is a good idea; I merely is showing that the implementation would look like this. ----- >8 ----- Subject: tag: allow idempotent "git tag" without "--force" When "git tag T O" is told to create a tag pointing at an object O without the "--force" option, it refuses with "tag T already exists", even when T points at O (which makes it a no-op). Let's allow this "idempotent" case by special casing. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- builtin/tag.c | 2 +- t/t7004-tag.sh | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git c/builtin/tag.c w/builtin/tag.c index 4742b27d16..5380a46494 100644 --- c/builtin/tag.c +++ w/builtin/tag.c @@ -660,7 +660,7 @@ int cmd_tag(int argc, if (refs_read_ref(get_main_ref_store(the_repository), ref.buf, &prev)) oidclr(&prev, the_repository->hash_algo); - else if (!force) + else if (!force && (create_tag_object || !oideq(&object, &prev))) die(_("tag '%s' already exists"), tag); opt.message_given = msg.given || msgfile; diff --git c/t/t7004-tag.sh w/t/t7004-tag.sh index 10835631ca..9a253a44a8 100755 --- c/t/t7004-tag.sh +++ w/t/t7004-tag.sh @@ -126,7 +126,7 @@ test_expect_success 'annotated tag with --create-reflog has correct message' ' ' test_expect_success '--create-reflog does not create reflog on failure' ' - test_must_fail git tag --create-reflog mytag && + test_must_fail git tag --create-reflog mytag no-such-object && test_must_fail git reflog exists refs/tags/mytag ' @@ -183,8 +183,14 @@ test_expect_success 'listing tags using a non-matching pattern should output not # special cases for creating tags: -test_expect_success 'trying to create a tag with the name of one existing should fail' ' - test_must_fail git tag mytag +test_expect_success 'recreating a tag without --force' ' + # light-weight tag pointing at the same thing + # now succeeds + git tag mytag HEAD && + # light-weight tag pointing at a different thing + test_must_fail git tag mytag HEAD: && + # creating annotated tag, pointing at the same object. + test_must_fail git tag -a -m anno mytag $taggedobject ' test_expect_success 'trying to create a tag with a non-valid name should fail' '