All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>,
	Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH v3 0/6] fetch: add fetch.pruneBranches config
Date: Tue, 05 May 2026 07:22:21 +0000	[thread overview]
Message-ID: <pull.2285.v3.git.git.1777965747.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2285.v2.git.git.1777919250.gitgitgadget@gmail.com>

 * s/remote-tracking refs/remote-tracking branches/g

Harald Nordgren (6):
  branch: add --forked <remote>
  branch: let delete_branches warn instead of error on bulk refusal
  branch: add --prune-merged <remote>
  fetch: add --prune-merged
  branch: add branch.<name>.pruneMerged opt-out
  branch: add --all-remotes flag

 Documentation/config/branch.adoc |   7 +
 Documentation/fetch-options.adoc |   8 +
 Documentation/git-branch.adoc    |  32 ++++
 builtin/branch.c                 | 247 +++++++++++++++++++++++++++++--
 builtin/fetch.c                  |  20 +++
 t/t3200-branch.sh                | 215 +++++++++++++++++++++++++++
 t/t5510-fetch.sh                 |  31 ++++
 7 files changed, 549 insertions(+), 11 deletions(-)


base-commit: 94f057755b7941b321fd11fec1b2e3ca5313a4e0
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2285%2FHaraldNordgren%2Ffetch-prune-local-branches-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2285/HaraldNordgren/fetch-prune-local-branches-v3
Pull-Request: https://github.com/git/git/pull/2285

Range-diff vs v2:

 1:  e9f8d06a2b ! 1:  77e67d4b8b branch: add --forked <remote>
     @@ Commit message
      
          List local branches whose configured upstream falls within any of
          the given <remote> arguments. <remote> may be either a configured
     -    remote name (matching all of its remote-tracking refs) or a single
     -    remote-tracking ref. Multiple <remote> arguments are unioned.
     +    remote name (matching all of its remote-tracking branches) or a
     +    single remote-tracking branch. Multiple <remote> arguments are
     +    unioned.
      
          This is the building block for --prune-merged, which deletes the
          listed branches.
     @@ Documentation/git-branch.adoc: This option is only applicable in non-verbose mod
      +	List local branches that fork from any of the given _<remote>_
      +	arguments, that is, those whose configured upstream
      +	(`branch.<name>.merge`) is one of those remotes' remote-tracking
     -+	refs.
     ++	branches.
      ++
      +Each _<remote>_ may be either the name of a configured remote
      +(e.g. `origin`, meaning any branch tracking a
     -+`refs/remotes/origin/*` ref) or a specific remote-tracking ref
     ++`refs/remotes/origin/*` ref) or a specific remote-tracking branch
      +(e.g. `origin/master`). Multiple _<remote>_ arguments are unioned.
      +
       `-v`::
     @@ builtin/branch.c: static void copy_or_rename_branch(const char *oldname, const c
      +		free(full_ref);
      +
      +		die(_("'%s' is neither a configured remote nor a "
     -+		      "remote-tracking ref"), arg);
     ++		      "remote-tracking branch"), arg);
      +	}
      +}
      +
     @@ t/t3200-branch.sh: test_expect_success 'errors if given a bad branch name' '
      +	test_cmp expect actual
      +'
      +
     -+test_expect_success '--forked <remote-tracking-ref> lists only matching branches' '
     ++test_expect_success '--forked <remote-tracking-branch> lists only matching branches' '
      +	git -C forked branch --forked origin/one >actual &&
      +	echo local-one >expect &&
      +	test_cmp expect actual
     @@ t/t3200-branch.sh: test_expect_success 'errors if given a bad branch name' '
      +
      +test_expect_success '--forked rejects unknown remote/ref' '
      +	test_must_fail git -C forked branch --forked nope 2>err &&
     -+	test_grep "neither a configured remote nor a remote-tracking ref" err
     ++	test_grep "neither a configured remote nor a remote-tracking branch" err
      +'
      +
      +test_expect_success '--forked requires at least one <remote>' '
 2:  cd4a7e47af = 2:  807c9f981f branch: let delete_branches warn instead of error on bulk refusal
 3:  c0a5f69eb6 ! 3:  49dc853403 branch: add --prune-merged <remote>
     @@ Commit message
      
          Delete the local branches that --forked <remote> would list,
          refusing any whose tip is not reachable from its upstream
     -    remote-tracking ref. With --force, delete unconditionally. The
     -    currently checked-out branch in any worktree is always preserved.
     +    remote-tracking branch. With --force, delete unconditionally.
     +    The currently checked-out branch in any worktree is always
     +    preserved.
      
          Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
      
     @@ Documentation/git-branch.adoc: git branch (-c|-C) [<old-branch>] <new-branch>
       DESCRIPTION
       -----------
      @@ Documentation/git-branch.adoc: Each _<remote>_ may be either the name of a configured remote
     - `refs/remotes/origin/*` ref) or a specific remote-tracking ref
     + `refs/remotes/origin/*` ref) or a specific remote-tracking branch
       (e.g. `origin/master`). Multiple _<remote>_ arguments are unioned.
       
      +`--prune-merged`::
      +	Delete the local branches that `--forked` would list for
      +	the same _<remote>_ arguments, but only when the branch's
     -+	push destination remote-tracking ref (the ref `git push`
     ++	push destination remote-tracking branch (the branch `git push`
      +	would update; see `branch_get_push` semantics) no longer
      +	resolves locally. In other words: the branch was pushed
      +	under some name on _<remote>_, and that name has since
      +	been pruned upstream.
      ++
      +By default, the local tip must also be reachable from the
     -+upstream remote-tracking ref (see `--no-merged`); branches with
     ++upstream remote-tracking branch (see `--no-merged`); branches with
      +unpushed commits are refused. With `--force` (or `-f`), delete
      +them regardless. The currently checked-out branch in any worktree
      +is always preserved.
 4:  e979fd238b ! 4:  938bf7c794 fetch: add --prune-merged
     @@ Documentation/fetch-options.adoc: See the PRUNING section below for more details
      +	After a successful fetch, run `git branch --prune-merged
      +	<remote>` for the fetched remote, deleting local branches
      +	that fork from this remote and whose tip is reachable from
     -+	their upstream remote-tracking ref. See linkgit:git-branch[1]
     ++	their upstream remote-tracking branch. See linkgit:git-branch[1]
      +	for the exact selection rules. The currently checked-out
      +	branch is always preserved.
      +
 5:  0bc5ebbe68 ! 5:  b2e7c97298 branch: add branch.<name>.pruneMerged opt-out
     @@ Documentation/git-branch.adoc
      @@ Documentation/git-branch.adoc: Each _<remote>_ may be either the name of a configured remote
       	Delete the local branches that `--forked` would list for
       	the same _<remote>_ arguments, but only when the branch's
     - 	push destination remote-tracking ref (the ref `git push`
     + 	push destination remote-tracking branch (the branch `git push`
      -	would update; see `branch_get_push` semantics) no longer
      -	resolves locally. In other words: the branch was pushed
      -	under some name on _<remote>_, and that name has since
     @@ Documentation/git-branch.adoc: Each _<remote>_ may be either the name of a confi
      +	that name has since been pruned upstream.
       +
      -By default, the local tip must also be reachable from the
     --upstream remote-tracking ref (see `--no-merged`); branches with
     +-upstream remote-tracking branch (see `--no-merged`); branches with
      -unpushed commits are refused. With `--force` (or `-f`), delete
      -them regardless. The currently checked-out branch in any worktree
      -is always preserved.
      +The local tip must also be reachable from the upstream
     -+remote-tracking ref; branches with unpushed commits are refused.
     ++remote-tracking branch; branches with unpushed commits are refused.
      +With `--force` (or `-f`), delete them regardless. The currently
      +checked-out branch in any worktree is always preserved, as is
      +any branch with `branch.<name>.pruneMerged` set to `false`.
 6:  66dac97626 ! 6:  6462642cd0 branch: add --all-remotes flag
     @@ t/t3200-branch.sh: test_expect_success '--forked requires at least one <remote>'
      +
      +test_expect_success '--forked --all-remotes still validates explicit <remote>' '
      +	test_must_fail git -C forked branch --forked nope --all-remotes 2>err &&
     -+	test_grep "neither a configured remote nor a remote-tracking ref" err
     ++	test_grep "neither a configured remote nor a remote-tracking branch" err
      +'
      +
      +test_expect_success '--all-remotes alone is rejected' '

-- 
gitgitgadget

  parent reply	other threads:[~2026-05-05  7:22 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-01 21:35 [PATCH] fetch: add fetch.pruneLocalBranches config Harald Nordgren via GitGitGadget
2026-05-03 22:39 ` Junio C Hamano
2026-05-04 18:28   ` [PATCH] checkout: add --autostash option for branch switching Harald Nordgren
2026-05-10  1:01     ` Junio C Hamano
2026-05-05  7:14   ` [PATCH] fetch: add fetch.pruneLocalBranches config Johannes Sixt
2026-05-04 18:27 ` [PATCH v2 0/6] fetch: add fetch.pruneBranches config Harald Nordgren via GitGitGadget
2026-05-04 18:27   ` [PATCH v2 1/6] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-04 23:25     ` Kristoffer Haugsbakk
2026-05-04 18:27   ` [PATCH v2 2/6] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-04 18:27   ` [PATCH v2 3/6] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-04 18:27   ` [PATCH v2 4/6] fetch: add --prune-merged Harald Nordgren via GitGitGadget
2026-05-04 18:27   ` [PATCH v2 5/6] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-04 18:27   ` [PATCH v2 6/6] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-05  7:22   ` Harald Nordgren via GitGitGadget [this message]
2026-05-05  7:22     ` [PATCH v3 1/6] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-05  7:22     ` [PATCH v3 2/6] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-05  7:22     ` [PATCH v3 3/6] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-05  7:22     ` [PATCH v3 4/6] fetch: add --prune-merged Harald Nordgren via GitGitGadget
2026-05-05  7:22     ` [PATCH v3 5/6] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-05  7:22     ` [PATCH v3 6/6] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-05 19:23     ` [PATCH v4 0/6] fetch: add fetch.pruneBranches config Harald Nordgren via GitGitGadget
2026-05-05 19:23       ` [PATCH v4 1/6] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-05 19:23       ` [PATCH v4 2/6] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-05 19:23       ` [PATCH v4 3/6] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-05 19:23       ` [PATCH v4 4/6] fetch: add --prune-merged Harald Nordgren via GitGitGadget
2026-05-05 20:48         ` Johannes Sixt
2026-05-05 22:07           ` [PATCH] fetch: add fetch.pruneLocalBranches config Harald Nordgren
2026-05-11  2:59             ` Junio C Hamano
2026-05-11  6:56               ` Harald Nordgren
2026-05-05 19:23       ` [PATCH v4 5/6] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-05 19:23       ` [PATCH v4 6/6] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-07 20:14       ` [PATCH v4 0/6] fetch: add fetch.pruneBranches config Harald Nordgren
2026-05-11  6:58       ` [PATCH v5 0/5] branch: prune-merged Harald Nordgren via GitGitGadget
2026-05-11  6:58         ` [PATCH v5 1/5] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-11  6:58         ` [PATCH v5 2/5] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-11  8:18           ` Junio C Hamano
2026-05-11  8:44             ` [PATCH] fetch: add fetch.pruneLocalBranches config Harald Nordgren
2026-05-11  6:58         ` [PATCH v5 3/5] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-11  6:58         ` [PATCH v5 4/5] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-11  6:58         ` [PATCH v5 5/5] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-11  9:44         ` [PATCH v6 0/5] branch: prune-merged Harald Nordgren via GitGitGadget
2026-05-11  9:44           ` [PATCH v6 1/5] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-11  9:44           ` [PATCH v6 2/5] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-11  9:44           ` [PATCH v6 3/5] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-11  9:44           ` [PATCH v6 4/5] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-11  9:44           ` [PATCH v6 5/5] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-11 23:20           ` [PATCH v6 0/5] branch: prune-merged Junio C Hamano
2026-05-12  7:35             ` [PATCH] fetch: add fetch.pruneLocalBranches config Harald Nordgren
2026-05-12  8:23           ` [PATCH v7 0/5] branch: prune-merged Harald Nordgren via GitGitGadget
2026-05-12  8:23             ` [PATCH v7 1/5] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-12  8:23             ` [PATCH v7 2/5] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-12  8:23             ` [PATCH v7 3/5] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-12 13:53               ` Junio C Hamano
2026-05-12 17:00                 ` [PATCH] fetch: add fetch.pruneLocalBranches config Harald Nordgren
2026-05-12  8:23             ` [PATCH v7 4/5] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-12  8:23             ` [PATCH v7 5/5] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-12 17:07             ` [PATCH v8 0/5] branch: prune-merged Harald Nordgren via GitGitGadget
2026-05-12 17:07               ` [PATCH v8 1/5] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-12 17:07               ` [PATCH v8 2/5] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-12 17:07               ` [PATCH v8 3/5] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-12 17:07               ` [PATCH v8 4/5] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-12 17:07               ` [PATCH v8 5/5] branch: add --all-remotes flag Harald Nordgren via GitGitGadget
2026-05-13 13:46               ` [PATCH v8 0/5] branch: prune-merged Junio C Hamano
2026-05-13 18:57                 ` [PATCH] fetch: add fetch.pruneLocalBranches config Harald Nordgren
2026-05-13 19:34               ` [PATCH v9 0/5] branch: prune-merged Harald Nordgren via GitGitGadget
2026-05-13 19:34                 ` [PATCH v9 1/5] branch: add --forked <remote> Harald Nordgren via GitGitGadget
2026-05-13 19:34                 ` [PATCH v9 2/5] branch: let delete_branches warn instead of error on bulk refusal Harald Nordgren via GitGitGadget
2026-05-13 19:34                 ` [PATCH v9 3/5] branch: add --prune-merged <remote> Harald Nordgren via GitGitGadget
2026-05-13 19:34                 ` [PATCH v9 4/5] branch: add branch.<name>.pruneMerged opt-out Harald Nordgren via GitGitGadget
2026-05-13 19:34                 ` [PATCH v9 5/5] branch: add --all-remotes flag Harald Nordgren via GitGitGadget

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=pull.2285.v3.git.git.1777965747.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=haraldnordgren@gmail.com \
    --cc=kristofferhaugsbakk@fastmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.