Skip to contentSkip to conversation

remote does not support deleting refs

DISCUSSION Martin 4 participants 6 messages Jun 15, 2016

lore
Share & tools
lore

Martin

author
#0 lore raw

Hi,

I tried to setup a central git repository. Access is via ssh. How do I delete a remote branch? If I try it using

Quoted 2 lines

git branch -d -r origin/testbranch
git push origin :refs/heads/testbranch

I get the error

To ssh://myserver.com/my/path/to/repository
! [rejected] testbranch (remote does not support deleting refs)
error: failed to push some refs to 'ssh://myserver.com/my/path/to/repository'

So how do I setup my remote repository to allow deleting remote branches?

Thanks,
Martin

#1 lore raw
Quoted 3 lines · Martin

To ssh://myserver.com/my/path/to/repository
! [rejected] testbranch (remote does not support deleting refs)

What version of Git do you use on the server? I think Git before v1.5 does not support deleting remote refs. You have to upgrade Git on your server.

Dmitry

author
#2 lore raw

error: unlink(.git/refs/remotes/origin/testbranch) failed: was remote does not support deleting refs

In reply to Martin

Hi,

it seems that an old verison on the remote site was the problem:
On debian/etch git seems to be too old. I upgraded git to the testing version and now I can delete remote branches.

But I get another error:

$ git push origin :testbranch
To ssh://myserver.com/my/path/to/repository
 - [deleted]         testbranch
error: unlink(.git/refs/remotes/origin/testbranch) failed: No such file or directory
error: Failed to delete

Any idea?

Thanks,
Martin

Quoted 21 lines · Martin

Hi,

I tried to setup a central git repository. Access is via ssh. How do I delete a remote branch? If I try it using

Quoted 2 lines

git branch -d -r origin/testbranch
git push origin :refs/heads/testbranch

I get the error

To ssh://myserver.com/my/path/to/repository
! [rejected] testbranch (remote does not support deleting refs)
error: failed to push some refs to 'ssh://myserver.com/my/path/to/repository'

So how do I setup my remote repository to allow deleting remote branches?

Thanks,
Martin

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#3 lore raw

Re: error: unlink(.git/refs/remotes/origin/testbranch) failed: was remote does not support deleting refs

Hi,

[please do not top post]

Quoted 10 lines · Martin

_
But I get another error:

$ git push origin :testbranch
To ssh://myserver.com/my/path/to/repository
 - [deleted]         testbranch
error: unlink(.git/refs/remotes/origin/testbranch) failed: No such file_
or directory
error: Failed to delete
_
Any idea?

It is harmless. It is just that "git push origin :refs/heads/testbranch" cannot remove your local reference to that branch because you already have removed it by running "git branch -d -r origin/testbranch"

Normally you just run "git push origin :refs/heads/testbranch" without "git branch -d -r origin/testbranch" and then you will not have this error.

Dmitry

#4 lore raw

Re: error: unlink(.git/refs/remotes/origin/testbranch) failed: was remote does not support deleting refs

Quoted 11 lines · Dmitry Potapov
Quoted 9 lines · Martin

But I get another error:

$ git push origin :testbranch
To ssh://myserver.com/my/path/to/repository
 - [deleted]         testbranch
error: unlink(.git/refs/remotes/origin/testbranch) failed: No such file_
or directory
error: Failed to delete
_
Any idea?
Quoted 3 lines

It is harmless. It is just that "git push origin :refs/heads/testbranch" cannot remove your local reference to that branch because you already have removed it by running "git branch -d -r origin/testbranch"

It is harmless, but it still feels a little wrong to scare the user with that message, especially since "Failed to delete" is ambiguous; it looks like the main operation, deleting the remote ref, failed. But it didn't; the operation that failed was something not even explicitly asked for.

How about this cleanup:

-- >8 --
make deleting a missing ref more quiet

If git attempts to delete a ref, but the unlink of the ref file fails, we print a message to stderr. This is usually a good thing, but if the error is ENOENT, then it indicates that the ref has _already_ been deleted. And since that's our goal, it doesn't make sense to complain to the user.

This harmonizes the error reporting behavior for the unpacked and packed cases; the packed case already printed nothing on ENOENT, but the unpacked printed unconditionally.

Additionally, send-pack would, when deleting the tracking ref corresponding to a remote delete, print "Failed to delete" on any failure. This can be a misleading message, since we actually _did_ delete at the remote side, but we failed to delete locally. Rather than make the message more precise, let's just eliminate it entirely; the delete_ref routine already takes care of printing out a much more specific message about what went wrong.

---
 builtin-send-pack.c          |    3 +--
 refs.c                       |    2 +-
 t/t5404-tracking-branches.sh |    7 +++++++
 3 files changed, 9 insertions(+), 3 deletions(-)
builtin-send-pack.c +1 -2
index d76260c..a708d0a 100644
@@ -226,8 +226,7 @@ static void update_tracking_ref(struct remote *remote, struct ref *ref)
 		if (args.verbose)
 			fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst);
 		if (ref->deletion) {
-			if (delete_ref(rs.dst, NULL))
-				error("Failed to delete");
+			delete_ref(rs.dst, NULL);
 		} else
 			update_ref("update by push", rs.dst,
 					ref->new_sha1, NULL, 0, 0);
refs.c +1 -1
index 6c6e9e5..39a3b23 100644
@@ -925,7 +925,7 @@ int delete_ref(const char *refname, const unsigned char *sha1)
 		i = strlen(lock->lk->filename) - 5; /* .lock */
 		lock->lk->filename[i] = 0;
 		err = unlink(lock->lk->filename);
-		if (err) {
+		if (err && errno != ENOENT) {
 			ret = 1;
 			error("unlink(%s) failed: %s",
 			      lock->lk->filename, strerror(errno));
t/t5404-tracking-branches.sh +7 -0
index 1493a92..64fe261 100755
@@ -10,6 +10,7 @@ test_expect_success 'setup' '
 	git commit -m 1 &&
 	git branch b1 &&
 	git branch b2 &&
+	git branch b3 &&
 	git clone . aa &&
 	git checkout b1 &&
 	echo b1 >>file &&
@@ -50,4 +51,10 @@ test_expect_success 'deleted branches have their tracking branches removed' '
 	test "$(git rev-parse origin/b1)" = "origin/b1"
 '
 
+test_expect_success 'already deleted tracking branches ignored' '
+	git branch -d -r origin/b3 &&
+	git push origin :b3 >output 2>&1 &&
+	! grep error output
+'
+
 test_done
Signature · 1 line
1.5.6.2.381.ga86b
#5 lore raw

Re: error: unlink(.git/refs/remotes/origin/testbranch) failed: was remote does not support deleting refs

Quoted 6 lines · Jeff King

It is harmless, but it still feels a little wrong to scare the user with that message, especially since "Failed to delete" is ambiguous; it looks like the main operation, deleting the remote ref, failed. But it didn't; the operation that failed was something not even explicitly asked for.

How about this cleanup:

Ack.