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

Re: [PATCH] git-branch: deleting remote branches in new layout

From
Junio C Hamano <junkio@cox.net>
Date
Dec 18, 2006, 07:49 UTC
Message-ID
<7vodq11w49.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7vbqm13cm0.fsf@assigned-by-dhcp.cox.net>
How about this instead?
Because -r already means "remote" when listing, you can say:
	$ git branch -d -r origin/todo origin/html origin/man

I just twisted it not to do fast-forward check with the current branch, because remote tracking branches are more like tags than branches, and when you are removing them, most likely that is not because you are "done with" them (for a local branch, it usually means "you merged it up") but because you are not even interested in them.

--
Junio C Hamano <junkio@cox.net> writes:
Show 10 quoted lines
> Quy Tonthat <qtonthat@gmail.com> writes:
>
>> Now that remote branches are in refs/remotes/, branch -D needs to know
>> where to find them.
>>
>> Signed-off-by: Quy Tonthat <qtonthat@gmail.com>
>
> I recognize that giving end users a way to remove a "remote
> tracking branch" might be a worthy goal ("update-ref -d" _could_
> be used, but "branch -D" feels more natural).
 builtin-branch.c |   41 ++++++++++++++++++++++++++++-------------
 1 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/builtin-branch.c b/builtin-branch.c
index 560309c..7fb93e7 100644
--- a/builtin-branch.c
+++ b/builtin-branch.c
@@ -12,8 +12,12 @@
 #include "builtin.h"
 
 static const char builtin_branch_usage[] =
-  "git-branch (-d | -D) <branchname> | [-l] [-f] <branchname> [<start-point>] | (-m | -M) [<oldbranch>] <newbranch> | [-r | -a] [-v [--abbrev=<length>]]";
+  "git-branch [-r] (-d | -D) <branchname> | [-l] [-f] <branchname> [<start-point>] | (-m | -M) [<oldbranch>] <newbranch> | [-r | -a] [-v [--abbrev=<length>]]";
 
+#define REF_UNKNOWN_TYPE    0x00
+#define REF_LOCAL_BRANCH    0x01
+#define REF_REMOTE_BRANCH   0x02
+#define REF_TAG             0x04
 
 static const char *head;
 static unsigned char head_sha1[20];
@@ -89,25 +93,40 @@ static int in_merge_bases(const unsigned char *sha1,
 	return ret;
 }
 
-static void delete_branches(int argc, const char **argv, int force)
+static void delete_branches(int argc, const char **argv, int force, int kinds)
 {
 	struct commit *rev, *head_rev = head_rev;
 	unsigned char sha1[20];
 	char *name;
+	const char *fmt, *remote;
 	int i;
 
+	switch (kinds) {
+	case REF_REMOTE_BRANCH:
+		fmt = "refs/remotes/%s";
+		remote = "remote ";
+		force = 1;
+		break;
+	case REF_LOCAL_BRANCH:
+		fmt = "refs/heads/%s";
+		remote = "";
+		break;
+	default:
+		die("cannot use -a with -d");
+	}
+
 	if (!force) {
 		head_rev = lookup_commit_reference(head_sha1);
 		if (!head_rev)
 			die("Couldn't look up commit object for HEAD");
 	}
 	for (i = 0; i < argc; i++) {
-		if (!strcmp(head, argv[i]))
+		if (kinds == REF_LOCAL_BRANCH && !strcmp(head, argv[i]))
 			die("Cannot delete the branch you are currently on.");
 
-		name = xstrdup(mkpath("refs/heads/%s", argv[i]));
+		name = xstrdup(mkpath(fmt, argv[i]));
 		if (!resolve_ref(name, sha1, 1, NULL))
-			die("Branch '%s' not found.", argv[i]);
+			die("%sbranch '%s' not found.", remote, argv[i]);
 
 		rev = lookup_commit_reference(sha1);
 		if (!rev)
@@ -128,19 +147,15 @@ static void delete_branches(int argc, const char **argv, int force)
 		}
 
 		if (delete_ref(name, sha1))
-			printf("Error deleting branch '%s'\n", argv[i]);
+			printf("Error deleting %sbranch '%s'\n", remote,
+			       argv[i]);
 		else
-			printf("Deleted branch %s.\n", argv[i]);
+			printf("Deleted %sbranch %s.\n", remote, argv[i]);
 
 		free(name);
 	}
 }
 
-#define REF_UNKNOWN_TYPE    0x00
-#define REF_LOCAL_BRANCH    0x01
-#define REF_REMOTE_BRANCH   0x02
-#define REF_TAG             0x04
-
 struct ref_item {
 	char *name;
 	unsigned int kind;
@@ -435,7 +450,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 	head += 11;
 
 	if (delete)
-		delete_branches(argc - i, argv + i, force_delete);
+		delete_branches(argc - i, argv + i, force_delete, kinds);
 	else if (i == argc)
 		print_ref_list(kinds, verbose, abbrev);
 	else if (rename && (i == argc - 1))
Previous: Junio C HamanoNext: Quy Tonthat
Message 3 of 6 in “git-branch: deleting remote branches in new layout”
  1. git-branch: deleting remote branches in new layoutQuy Tonthat, Dec 18, 2006
  2. Junio C HamanoDec 18, 2006
  3. Junio C HamanoDec 18, 2006
  4. Quy TonthatDec 18, 2006
  5. Quy TonthatDec 18, 2006
  6. Quy TonthatDec 18, 2006

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.