"git remote rm <repo>" is happy to remove non-remote branches (and their reflogs). This may be okay if the repository truely is a mirror, but if the user had done "git remote add --mirror <repo>" by accident and was just undoing their mistake, then they are left in a situation that is difficult to recover from. After this commit, "git remote rm" skips over non-remote branches and instead advises the user on how to remove such branches using "git branch -d", which itself has nice safety checks wrt to branch removal lacking from "git remote rm". Signed-off-by: Jay Soffian <jaysoffian@xxxxxxxxx> --- This version adds a test case. I also noticed that the check I'd added to add_branch_for_removal() was generating spurious warnings because I'd added it in the wrong place; this version moves the check below the remote_find_tracking() checks. builtin-remote.c | 7 +++++++ t/t5505-remote.sh | 9 +++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) diff --git a/builtin-remote.c b/builtin-remote.c index abc8dd8..571caff 100644 --- a/builtin-remote.c +++ b/builtin-remote.c @@ -323,6 +323,13 @@ static int add_branch_for_removal(const char *refname, return 0; } + /* don't delete non-remote branches */ + if (prefixcmp(refname, "refs/remotes")) { + warning("not removing non-remote branch; use git branch -d %s to remove", + abbrev_branch(refname)); + return 0; + } + /* make sure that symrefs are deleted */ if (flags & REF_ISSYMREF) return unlink(git_path("%s", refname)); diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index 1f59960..80d40ea 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -107,6 +107,15 @@ test_expect_success 'remove remote' ' ) ' +test_expect_success 'remove remote protects non-remote branches' ' +( + cd test && + git config --add remote.oops.fetch "+refs/*:refs/*" && + git remote rm oops 2>stderr && + grep "not removing non-remote branch.* master " stderr +) +' + cat > test/expect << EOF * remote origin URL: $(pwd)/one -- 1.6.1.2.308.gd57ba -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html