summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 8336afa)
raw | patch | inline | side by side (parent: 8336afa)
author | Junio C Hamano <junkio@cox.net> | |
Mon, 18 Dec 2006 07:58:16 +0000 (23:58 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Tue, 19 Dec 2006 00:28:12 +0000 (16:28 -0800) |
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 check fast-forwardness with the current
branch when you are removing a tracking branch. Most likely,
removal of a tracking branch is not because you are "done with"
it (for a local branch, it usually means "you merged it up"),
but because you are not even interested in it. In other words,
remote tracking branches are more like tags than branches.
Signed-off-by: Junio C Hamano <junkio@cox.net>
$ git branch -d -r origin/todo origin/html origin/man
I just twisted it not to check fast-forwardness with the current
branch when you are removing a tracking branch. Most likely,
removal of a tracking branch is not because you are "done with"
it (for a local branch, it usually means "you merged it up"),
but because you are not even interested in it. In other words,
remote tracking branches are more like tags than branches.
Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-branch.c | patch | blob | history |
diff --git a/builtin-branch.c b/builtin-branch.c
index 560309cb154504a8d280f12e3d9d2d3d6d715d7c..7fb93e77967041491ab1ed921ec3e25c12bcbe1d 100644 (file)
--- a/builtin-branch.c
+++ b/builtin-branch.c
#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];
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)
}
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;
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))