]> git.ipfire.org Git - thirdparty/git.git/commitdiff
branch: allow deleting dangling branches with --force
authorRené Scharfe <l.s.r@web.de>
Fri, 27 Aug 2021 18:35:35 +0000 (20:35 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 27 Aug 2021 22:11:18 +0000 (15:11 -0700)
git branch only allows deleting branches that point to valid commits.
Skip that check if --force is given, as the caller is indicating with
it that they know what they are doing and accept the consequences.
This allows deleting dangling branches, which previously had to be
reset to a valid start-point using --force first.

Reported-by: Ulrich Windl <Ulrich.Windl@rz.uni-regensburg.de>
Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-branch.txt
builtin/branch.c
t/t3200-branch.sh

index 94dc9a54f2d7269bb9b8a4de718b8da54c62c02e..5449767121103299e442560775a54bce5b371a9f 100644 (file)
@@ -118,7 +118,8 @@ OPTIONS
        Reset <branchname> to <startpoint>, even if <branchname> exists
        already. Without `-f`, 'git branch' refuses to change an existing branch.
        In combination with `-d` (or `--delete`), allow deleting the
-       branch irrespective of its merged status. In combination with
+       branch irrespective of its merged status, or whether it even
+       points to a valid commit. In combination with
        `-m` (or `--move`), allow renaming the branch even if the new
        branch name already exists, the same applies for `-c` (or `--copy`).
 
index b23b1d1752afd724d76b263ef8253036d331a078..03c7b7253a5861ebc759fca876fa231e4ad4cf6d 100644 (file)
@@ -168,7 +168,7 @@ static int check_branch_commit(const char *branchname, const char *refname,
                               int kinds, int force)
 {
        struct commit *rev = lookup_commit_reference(the_repository, oid);
-       if (!rev) {
+       if (!force && !rev) {
                error(_("Couldn't look up commit object for '%s'"), refname);
                return -1;
        }
index cc4b10236e2c8335465185cff84105208b807aa9..e575ffb4ffb4c2d9c69da9b83706a7eecd01a6ef 100755 (executable)
@@ -1272,6 +1272,19 @@ test_expect_success 'attempt to delete a branch merged to its base' '
        test_must_fail git branch -d my10
 '
 
+test_expect_success 'branch --delete --force removes dangling branch' '
+       git checkout main &&
+       test_commit unstable &&
+       hash=$(git rev-parse HEAD) &&
+       objpath=$(echo $hash | sed -e "s|^..|.git/objects/&/|") &&
+       git branch --no-track dangling &&
+       mv $objpath $objpath.x &&
+       test_when_finished "mv $objpath.x $objpath" &&
+       git branch --delete --force dangling &&
+       git for-each-ref refs/heads/dangling >actual &&
+       test_must_be_empty actual
+'
+
 test_expect_success 'use --edit-description' '
        write_script editor <<-\EOF &&
                echo "New contents" >"$1"