[PATCH] builtin-remote: make rm operation safer in mirrored repository
- From
Jay Soffian <jaysoffian@gmail.com>
- Date
- Feb 2, 2009, 18:40 UTC
- Message-ID
- <1233600014-82346-1-git-send-email-jaysoffian@gmail.com>
- In-Reply-To
- <76718490902020536g6f4bcee2i76ee046a8dc7d46@mail.gmail.com>
"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@gmail.com> --- 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