`git branch --edit-description`. Branch description is
automatically added to the `format-patch` cover letter or
`request-pull` summary.
+
+`branch.<name>.deleteMerged`::
+ If set to `false`, branch _<name>_ is exempt from
+ `git branch --delete-merged`. Useful for a topic branch you
+ intend to develop further after an initial round has been
+ merged upstream. Defaults to true. Explicit deletion via
+ `git branch -d` is unaffected.
+
--
* its configured upstream ref no longer exists,
-* it is checked out in any worktree, or
+* it is checked out in any worktree,
* pushing it by name to the remote configured by
`branch.<name>.remote` would update its upstream, so it cannot be
distinguished from a branch that just looks "fully merged" right
- after a pull.
+ after a pull, or
+* `branch.<name>.deleteMerged` is set to `false`.
--
+
A branch whose work has not yet been merged into its upstream is
struct ref_array candidates = { 0 };
struct strset deletable_branch_names = STRSET_INIT;
struct strvec branches_to_delete = STRVEC_INIT;
+ struct strbuf key = STRBUF_INIT;
struct hashmap_iter iter;
struct strmap_entry *entry;
int ret = 0;
const char *branch_name;
struct branch *branch;
const char *upstream_refname;
+ int opt_out;
if (!skip_prefix(branch_refname, "refs/heads/", &branch_name))
BUG("filter returned non-branch ref '%s'", branch_refname);
FILTER_REFS_BRANCHES, DELETE_BRANCH_SKIP_UNMERGED))
continue;
+ strbuf_reset(&key);
+ strbuf_addf(&key, "branch.%s.deletemerged", branch_name);
+ if (!repo_config_get_bool(the_repository, key.buf, &opt_out) &&
+ !opt_out) {
+ if (!(flags & DELETE_BRANCH_QUIET))
+ fprintf(stderr,
+ _("Skipping '%s' (branch.%s.deleteMerged is false)\n"),
+ branch_name, branch_name);
+ continue;
+ }
+
strset_add(&deletable_branch_names, branch_name);
}
DELETE_BRANCH_NO_HEAD_FALLBACK |
flags);
+ strbuf_release(&key);
strvec_clear(&branches_to_delete);
strset_clear(&deletable_branch_names);
ref_array_clear(&candidates);
test_must_fail git -C forked branch --delete-merged 2>err &&
test_grep "requires a value" err
'
+
+test_expect_success '--delete-merged honours branch.<name>.deleteMerged=false' '
+ setup_repo_for_delete_merged &&
+ create_merged_branch deleted &&
+ create_merged_branch kept &&
+ (
+ cd repo &&
+ git config branch.kept.deleteMerged false &&
+ git checkout --detach &&
+
+ git branch --delete-merged origin/next 2>err &&
+
+ test_grep "Skipping .kept." err &&
+ check_branches <<-\EOF
+ kept
+ main
+ EOF
+ )
+'
+
+test_expect_success "branch -d still deletes a deleteMerged=false branch" '
+ setup_repo_for_delete_merged &&
+ create_merged_branch kept &&
+ (
+ cd repo &&
+ git config branch.kept.deleteMerged false &&
+ git checkout --detach &&
+
+ git branch -d kept &&
+
+ check_branches <<-\EOF
+ main
+ EOF
+ )
+'
+
test_done