git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/3] Make "git-remote prune" delete refs according to fetch specs

From
Shawn O. Pearce <spearce@spearce.org>
Date
Jun 1, 2008, 03:58 UTC
Message-ID
<20080601035805.GB32176@spearce.org>

A remote may be configured to fetch into tracking branches that do not match the remote name. For example a user may have created extra remotes that will fetch to the same tracking branch namespace, but from different URLs:

  [remote "origin"]
	url = git://git.kernel.org/pub/scm/git/git.git
    fetch = refs/heads/*:refs/remotes/origin/*
  [remote "alt"]
	url = git://repo.or.cz/alt-git.git
    fetch = refs/heads/*:refs/remotes/origin/*

When running `git remote prune alt` we expect stale branches to be removed from "refs/remotes/origin/*" and not from the unused namespace of "refs/remotes/alt/*".

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 builtin-remote.c  |   21 ++-------------------
 t/t5505-remote.sh |   18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/builtin-remote.c b/builtin-remote.c
index c76fe2e..e5cfc88 100644
--- a/builtin-remote.c
+++ b/builtin-remote.c
@@ -419,27 +419,10 @@ static int show_or_prune(int argc, const char **argv, int prune)
 					states.remote->name);
 
 		if (prune) {
-			struct strbuf buf;
-			int prefix_len;
-
-			strbuf_init(&buf, 0);
-			if (states.remote->fetch_refspec_nr == 1 &&
-					states.remote->fetch->pattern &&
-					!strcmp(states.remote->fetch->src,
-						states.remote->fetch->dst))
-				/* handle --mirror remote */
-				strbuf_addstr(&buf, "refs/heads/");
-			else
-				strbuf_addf(&buf, "refs/remotes/%s/", *argv);
-			prefix_len = buf.len;
-
 			for (i = 0; i < states.stale.nr; i++) {
-				strbuf_setlen(&buf, prefix_len);
-				strbuf_addstr(&buf, states.stale.items[i].path);
-				result |= delete_ref(buf.buf, NULL);
+				const char *refname = states.stale.items[i].util;
+				result |= delete_ref(refname, NULL);
 			}
-
-			strbuf_release(&buf);
 			goto cleanup_states;
 		}
 
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index a37b6f5..0d7ed1f 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -164,6 +164,24 @@ test_expect_success 'add --mirror && prune' '
 	 git rev-parse --verify refs/heads/side)
 '
 
+test_expect_success 'add alt && prune' '
+	(mkdir alttst &&
+	 cd alttst &&
+	 git init &&
+	 git remote add -f origin ../one &&
+	 git config remote.alt.url ../one &&
+	 git config remote.alt.fetch "+refs/heads/*:refs/remotes/origin/*") &&
+	(cd one &&
+	 git branch -m side side2) &&
+	(cd alttst &&
+	 git rev-parse --verify refs/remotes/origin/side &&
+	 ! git rev-parse --verify refs/remotes/origin/side2 &&
+	 git fetch alt &&
+	 git remote prune alt &&
+	 ! git rev-parse --verify refs/remotes/origin/side &&
+	 git rev-parse --verify refs/remotes/origin/side2)
+'
+
 cat > one/expect << EOF
   apis/master
   apis/side
-- 
1.5.6.rc0.158.g7c7a1
Message 1 of 1 in “Make "git-remote prune" delete refs according to fetch specs”
  1. 2/3 Make "git-remote prune" delete refs according to fetch specsShawn O. Pearce, Jun 1, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.