]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
19 hours agoMerge branch 'hn/history-squash' into seen seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:42 +0000 (10:44 -0700)] 
Merge branch 'hn/history-squash' into seen

The experimental 'git history' command has been taught a new 'squash'
subcommand to fold a range of commits into a single commit, with any
descendants replayed on top.

* hn/history-squash:
  history: re-edit a squash with every message
  sequencer: share the squash message marker helpers and flags
  history: add squash subcommand to fold a range
  history: give commit_tree_ext a message template
  history: extract helper for a commit's parent tree

19 hours agoMerge branch 'hn/branch-delete-merged' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:42 +0000 (10:44 -0700)] 
Merge branch 'hn/branch-delete-merged' into seen

The 'git branch' command has been taught the '--delete-merged' option
to remove local branches that are already merged into their tracked
remote-tracking branches.

* hn/branch-delete-merged:
  branch: add --dry-run for --delete-merged
  branch: add branch.<name>.deleteMerged opt-out
  branch: add --delete-merged <pattern>
  branch: prepare delete_branches for a bulk caller
  branch: let delete_branches skip unmerged branches on bulk refusal
  branch: convert delete_branches() to a flags argument
  branch: add --forked filter for --list mode

19 hours agoMerge branch 'hn/bisect-reset-when-found' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:41 +0000 (10:44 -0700)] 
Merge branch 'hn/bisect-reset-when-found' into seen

The 'git bisect' command has been taught a
'--reset-when-found[=<where>]' option that tells the command to
automatically run 'git bisect reset' to jump back to the original
state or to the found culprit.

* hn/bisect-reset-when-found:
  bisect: add --reset-when-found to leave when done
  bisect: let bisect_reset() optionally check out quietly

19 hours agoMerge branch 'mm/diff-process-hunks' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:41 +0000 (10:44 -0700)] 
Merge branch 'mm/diff-process-hunks' into seen

A new 'diff.<driver>.process' configuration has been introduced to
allow a long-running external process to act as a hunk provider,
enabling external tools to control which lines Git considers changed
while leaving all output formatting (word diff, color, blame, etc.) to
Git's standard pipeline.

* mm/diff-process-hunks:
  line-log: consult diff process for range tracking
  diff: consult diff process for --stat counts
  blame: consult diff process for no-hunk detection
  diff: bypass diff process with --no-ext-diff and in format-patch
  diff: add long-running diff process via diff.<driver>.process
  sub-process: separate process lifecycle from hashmap management
  userdiff: add diff.<driver>.process config
  xdiff: support external hunks via xpparam_t
  gitattributes: document how external diff drivers relate to diff features

19 hours agoMerge branch 'tb/pack-with-duplicates' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:41 +0000 (10:44 -0700)] 
Merge branch 'tb/pack-with-duplicates' into seen

The handling of packfiles with duplicate object entries has been
hardened.  Specifically, reverse index lookup, delta cycle
recovery, multi-pack-index verification, and pack reuse paths have
been updated to correctly handle or gracefully reject duplicate
entries.

* tb/pack-with-duplicates:
  pack-bitmap: handle duplicate pack entries during MIDX reuse
  test-tool bitmap: reject packs with duplicate objects
  midx: verify duplicate pack entries by OID and offset
  packfile: recover delta cycles through duplicate entries
  t5308: test reverse indexes with duplicate objects

19 hours agoMerge branch 'ps/cat-file-remote-object-info-type' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:40 +0000 (10:44 -0700)] 
Merge branch 'ps/cat-file-remote-object-info-type' into seen

The 'remote-object-info' command for 'git cat-file --batch-command'
has been extended to support the '%(objecttype)' placeholder.

* ps/cat-file-remote-object-info-type:
  cat-file: unify default format
  serve: advertise type capability
  fetch-object-info: request all supported options dynamically
  fetch-object-info: parse type from server response
  protocol-caps: add type support to object-info

19 hours agoMerge branch 'tn/packfile-uri-concurrency' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:40 +0000 (10:44 -0700)] 
Merge branch 'tn/packfile-uri-concurrency' into seen

Concurrent downloads of packfiles via packfile URIs and dumb HTTP have
been made safer by avoiding concurrent appends to the staging file.
Opening the file in read-write mode and maintaining separate file
offsets prevents corruption while preserving resumability.  The
'fetch-pack' command has also been updated to tolerate pre-existing
'.keep' files.

* tn/packfile-uri-concurrency:
  fetch-pack: accept "pack" output for packfile URIs
  http: permit unlinking partial packs on Windows
  http: avoid concurrent appends to partial packs
  http: accept HTTP 416 for complete partial packs
  http: avoid closing index-pack input twice
  http-fetch: correct --index-pack-arg documentation

19 hours agoMerge branch 'sk/test-commit-body-helper' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:39 +0000 (10:44 -0700)] 
Merge branch 'sk/test-commit-body-helper' into seen

A new test helper commit_body() has been introduced to print the
message body of a commit, and various tests have been updated to use
it instead of spelling out the command pipeline manually and losing
the exit status of the 'git cat-file' command on the upstream of the
pipe.

* sk/test-commit-body-helper:
  t: use commit_body to extract commit message bodies
  test-lib-functions: add commit_body helper

19 hours agoMerge branch 'pz/fetch-submodule-errors-config' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:39 +0000 (10:44 -0700)] 
Merge branch 'pz/fetch-submodule-errors-config' into seen

The 'git fetch' command has been updated to allow configuring how
submodule fetch errors are handled.  A new configuration variable
'fetch.submoduleErrors' and a corresponding '--submodule-errors'
command-line option have been introduced, allowing users to make
submodule fetch errors non-fatal (warn instead of fail).
Additionally, a premature failure during recursive submodule fetches
has been fixed by deferring the error until the OID-based retry phase
also fails.

* pz/fetch-submodule-errors-config:
  fetch: add fetch.submoduleErrors to make submodule fetch errors non-fatal
  submodule: fix premature failure in recursive submodule fetch

19 hours agoMerge branch 'ps/odb-make-creation-pluggable' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:39 +0000 (10:44 -0700)] 
Merge branch 'ps/odb-make-creation-pluggable' into seen

The creation of the on-disk data structures for the object database
has been made pluggable, allowing future backends to customize their
setup.  As part of this, the initialization of the object database
has been deferred, and the loading of the loose-object map has been
detangled from repository initialization.

* ps/odb-make-creation-pluggable:
  odb: make creation of on-disk structures pluggable
  odb/source: introduce function to map source type to name
  setup: defer object database creation
  setup: detangle loading of loose object maps
  loose: load loose object map for the correct source

19 hours agoMerge branch 'td/fsmonitor-darwin-cookie-flush' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:39 +0000 (10:44 -0700)] 
Merge branch 'td/fsmonitor-darwin-cookie-flush' into seen

The 'fsmonitor' daemon on macOS has been updated to flush pending
FSEvents before waiting for the cookie file, to avoid premature
timeouts on busy systems.

* td/fsmonitor-darwin-cookie-flush:
  fsmonitor: flush pending FSEvents before cookie wait

19 hours agoMerge branch 'hs/rebase-continue-edit' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:38 +0000 (10:44 -0700)] 
Merge branch 'hs/rebase-continue-edit' into seen

Support for skipping the editor when continuing a rebase after
conflict resolution has been added with the '--no-edit' option, and
forcing it with '--edit'.  A new configuration variable
'rebase.noEdit' can be used to set the default behavior.

* hs/rebase-continue-edit:
  rebase: add --[no-]edit to --continue

19 hours agoMerge branch 'ja/doc-synopsis-style-yet-more' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:38 +0000 (10:44 -0700)] 
Merge branch 'ja/doc-synopsis-style-yet-more' into seen

Synopsis and options in the documentation for 'git format-patch',
'git imap-send', 'git send-email', and 'git request-pull' have been
updated to the modern style.

* ja/doc-synopsis-style-yet-more:
  doc: convert git-request-pull synopsis and options to new style
  doc: convert git-send-email synopsis and options to new style
  doc: convert git-format-patch synopsis and options to new style
  doc: convert git-imap-send synopsis and options to new style

19 hours agoMerge branch 'tc/last-modified-bloom' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:38 +0000 (10:44 -0700)] 
Merge branch 'tc/last-modified-bloom' into seen

The 'git last-modified' command has been optimized by using Bloom
filters.  It now reuses revision walk filtering logic from 'git log'
to pre-filter commits, and maintains per-path Bloom filters even when
wildcard pathspecs are used.

* tc/last-modified-bloom:
  last-modified: keep per-path Bloom filters for wildcard pathspecs
  last-modified: check pathspec against Bloom filter first
  revision: expose check for paths maybe changed in Bloom filter
  revision: move bloom keyvec precondition into function

19 hours agoMerge branch 'kj/repo-info-more-path-keys' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:37 +0000 (10:44 -0700)] 
Merge branch 'kj/repo-info-more-path-keys' into seen

The 'git repo info' command has been taught more keys to output
paths of various repository components (such as the working tree
root, superproject working tree, object database, etc.), supporting
both absolute and relative path formats.

* kj/repo-info-more-path-keys:
  repo: add path.git-prefix path key
  repo: add path.grafts with absolute and relative suffix formatting
  repo: add path.index with absolute and relative suffix formatting
  repo: add path.hooks with absolute and relative suffix formatting
  repo: add path.objects with absolute and relative suffix formatting
  repo: add path.superproject-working-tree with absolute and relative suffixes
  repo: add path.toplevel with absolute and relative suffix formatting

19 hours agoMerge branch 'cc/fast-import-usage' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:37 +0000 (10:44 -0700)] 
Merge branch 'cc/fast-import-usage' into seen

The usage string of 'git fast-import' has been updated to use the
parse_options() API for displaying help, and its SYNOPSIS in the
documentation has been standardized to match.

* cc/fast-import-usage:
  fast-import: use struct option for usage string
  fast-import: move command state globals into 'struct fast_import_state'
  fast-import: introduce 'struct fast_import_state'
  fast-import: localize 'i' into the 'for' loops using it
  api-parse-options.adoc: document hidden and OPT_*_F option macros
  api-parse-options.adoc: document per-option flags
  parse-options: introduce OPT_HIDDEN_GROUP

19 hours agoMerge branch 'ps/writev' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:37 +0000 (10:44 -0700)] 
Merge branch 'ps/writev' into seen

A compatibility wrapper for writev(3p) has been reintroduced,
including fixes for CMake build and 'MAX_IO_SIZE' limits on NonStop.
Calls to write(3p) in send_sideband() and cat_blob() have been
refactored to use writev(3p) wrappers to reduce syscall overhead.

* ps/writev:
  fast-import: use writev(3p) to send cat-blob responses
  sideband: use writev(3p) to send pktlines
  wrapper: properly handle MAX_IO_SIZE in writev(3p)
  wrapper: introduce writev(3p) wrappers
  compat/posix: introduce writev(3p) wrapper

19 hours agoMerge branch 'ds/trace2-tolerate-failed-timestamp' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:37 +0000 (10:44 -0700)] 
Merge branch 'ds/trace2-tolerate-failed-timestamp' into seen

The 'trace2' telemetry library has been updated to tolerate failures
from system calls like gettimeofday() and datetime formatting
functions, replacing potential program crashes with blank placeholder
timestamps in the traces.

* ds/trace2-tolerate-failed-timestamp:
  trace2: tolerate failed timestamp formatting

19 hours agoMerge branch 'tb/send-pack-no-ref-delta' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:36 +0000 (10:44 -0700)] 
Merge branch 'tb/send-pack-no-ref-delta' into seen

'git send-pack' has been taught to refrain from sending 'REF_DELTA'
encoded packfiles when the other side asks it to.

* tb/send-pack-no-ref-delta:
  send-pack: honor `no-ref-delta` capability
  pack-objects: support reuse with `--no-ref-delta`
  pack-objects: introduce `--no-ref-delta`
  t/helper: teach pack-deltas to list delta entries

19 hours agoMerge branch 'kk/merge-base-exhaustion' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:36 +0000 (10:44 -0700)] 
Merge branch 'kk/merge-base-exhaustion' into seen

The merge-base computation has been optimized by stopping the walk
early when one side's exclusive commits in the queue are exhausted,
yielding significant speedups for queries with one-sided histories.

* kk/merge-base-exhaustion:
  commit-reach: remove commit-date ordering fallback
  commit-reach: move min_generation check into paint_queue_get()
  commit-reach: terminate merge-base walk when one paint side is exhausted
  commit-reach: introduce struct paint_state with per-side counters
  t6600: add clock-skew topologies and step counts for edge cases
  commit-reach: add trace2 instrumentation to paint_down_to_common()
  t6099, t6600: add side-exhaustion regression tests
  t6600: add test cases for side-exhaustion edge cases
  test-lib-functions: improve diagnostic output for trace2 data assertions
  Documentation/technical: add paint-down-to-common doc

19 hours agoMerge branch 'gr/add-e-use-apply-api' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:36 +0000 (10:44 -0700)] 
Merge branch 'gr/add-e-use-apply-api' into seen

The application of the edited patch in 'git add -e' has been
refactored to use the internal apply API directly, avoiding the need
to spawn a 'git apply' subprocess.

* gr/add-e-use-apply-api:
  builtin/add.c: replace run_command() with direct apply_all_patches() call

19 hours agoMerge branch 'js/pack-objects-delta-size-t' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:35 +0000 (10:44 -0700)] 
Merge branch 'js/pack-objects-delta-size-t' into seen

The 'pack-objects' and delta-encoding code paths have been updated to
use 'size_t' instead of 'unsigned long' for object sizes and offset
limits, avoiding potential truncation issues on 64-bit Windows.

* js/pack-objects-delta-size-t:
  git-zlib: widen `git_deflate_bound()` to `size_t`
  t/helper/test-pack-deltas: widen `do_compress()`'s maxsize local to `size_t`
  http-push: widen `start_put()`'s size local from `ssize_t` to `size_t`
  diff: widen `deflate_it()`'s bound local from int to `size_t`
  archive-zip: widen `zlib_deflate_raw()`'s maxsize local to `size_t`
  packfile, git-zlib: widen `use_pack()` and zstream avail fields to `size_t`
  delta: widen `create_delta()` and `diff_delta()` to `size_t`
  pack-objects: widen `mem_usage` and `try_delta()`'s out-param to `size_t`
  pack-objects: widen `free_unpacked()` return to `size_t`
  pack-objects: widen delta-cache accounting to `size_t`
  delta: widen `create_delta_index()` parameter to `size_t`
  diff-delta: widen `struct delta_index`' size fields to `size_t`

19 hours agoMerge branch 'zy/apply-abandoned-header-fix' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:35 +0000 (10:44 -0700)] 
Merge branch 'zy/apply-abandoned-header-fix' into seen

A candidate 'git diff' header parsed by 'git apply' has been isolated
in a temporary structure, preventing any partially parsed state from
polluting the main patch structure and causing assertions to trip if
the header is ultimately rejected.

* zy/apply-abandoned-header-fix:
  apply: avoid leaking abandoned git-header state

19 hours agoMerge branch 'tb/repack-geometric-cruft' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:35 +0000 (10:44 -0700)] 
Merge branch 'tb/repack-geometric-cruft' into seen

'git repack' has been taught to accept '--geometric' and '--cruft'
together.  When both are given, non-cruft packs are rolled up by the
geometric repack as usual, while a separate cruft pack is written to
collect unreachable objects.

* tb/repack-geometric-cruft:
  SQUASH??? bare grep !???
  repack: support combining '--geometric' with '--cruft'
  pack-objects: support '--refs-snapshot' with 'follow-reachable'
  pack-objects: introduce '--stdin-packs=follow-reachable'
  pack-objects: extract `stdin_packs_add_all_pack_entries()`
  repack-geometry: drop unused redundant-pack removal
  repack: delete geometric packs via existing_packs
  repack: teach MIDX retention about geometric rollups
  repack: mark geometric progression of packs as retained
  repack: extract `locate_existing_pack()` helper
  repack: unconditionally exclude non-kept packs

19 hours agoMerge branch 'mm/line-log-limited-ops' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:34 +0000 (10:44 -0700)] 
Merge branch 'mm/line-log-limited-ops' into seen

The 'git log -L<range>:<path>' command has been taught to limit
various 'diff' operations, such as '--stat', '--check', and '-G', to
the specified range and path.

* mm/line-log-limited-ops:
  diffcore-pickaxe: scope -G to the -L tracked range
  diff: support --check with -L line ranges
  line-log: support diff stat formats with -L
  diff: extract a line-range diff helper for reuse
  diff: emit -L hunk headers via xdiff's formatter
  diff: simplify the line-range filter by classifying removals immediately
  diff: rename and group the line-range filter for clarity

19 hours agoMerge branch 'tb/midx-incremental-custom-base' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:34 +0000 (10:44 -0700)] 
Merge branch 'tb/midx-incremental-custom-base' into seen

The 'git multi-pack-index write --incremental' command has been
corrected to properly honor the '--base' option.  Previously, the
custom base was ignored by the normal write path; packs from layers
above the selected base were incorrectly skipped by the pack exclusion
logic, and reachability closure for bitmaps was broken.

* tb/midx-incremental-custom-base:
  midx-write: include packs above custom incremental base
  midx: pass custom '--base' through incremental writes
  t5334: expose shared `nth_line()` helper

19 hours agoMerge branch 'sn/rebase-update-refs-symrefs' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:33 +0000 (10:44 -0700)] 
Merge branch 'sn/rebase-update-refs-symrefs' into seen

'git rebase --update-refs' has been taught to resolve local branch
symrefs to their referents before queuing updates, ensuring aliases of
the current branch are skipped and duplicate updates are avoided to
prevent failures when branch aliases are present.

* sn/rebase-update-refs-symrefs:
  rebase: guard non-branch symref targets
  rebase: skip branch symref aliases

19 hours agoMerge branch 'ec/commit-fixup-options' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:33 +0000 (10:44 -0700)] 
Merge branch 'ec/commit-fixup-options' into seen

Support for '-m', '-F', '-c', or '-C' options to supply a commit log
message from outside the editor has been added for all 'git commit
--fixup' variations.

* ec/commit-fixup-options:
  commit: allow -c/-C for all kinds of --fixup
  commit: allow -m/-F for all kinds of --fixup

19 hours agoMerge branch 'hn/checkout-track-fetch' into seen
Junio C Hamano [Thu, 30 Jul 2026 17:44:33 +0000 (10:44 -0700)] 
Merge branch 'hn/checkout-track-fetch' into seen

The 'git checkout --track=...' command has been taught to optionally
fetch the branch from the remote that the new branch will work with.

* hn/checkout-track-fetch:
  checkout: extend --track with a "fetch" mode to refresh start-point
  branch: expose helpers for finding the remote owning a tracking ref

19 hours agoMerge branch 'hn/checkout-m-autostash-refine' into jch jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:48 +0000 (10:40 -0700)] 
Merge branch 'hn/checkout-m-autostash-refine' into jch

The autostash fallback in 'git checkout -m' has been refined to only
retry when there are local changes.  Additionally, a blank line now
visually separates autostash conflict advice from the subsequent
branch-switch message.

* hn/checkout-m-autostash-refine:
  checkout -m: refine autostash fallback
  sequencer: teach autostash apply to report conflicts

19 hours agoMerge branch 'ns/merge-base-is-ancestor-tests' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:48 +0000 (10:40 -0700)] 
Merge branch 'ns/merge-base-is-ancestor-tests' into jch

Tests for 'git merge-base --is-ancestor' have been added to cover
exit codes (0 for success, 1 for non-ancestor, 128 for errors) and
to ensure it cannot be combined with '--all'.

* ns/merge-base-is-ancestor-tests:
  merge-base: add tests for --is-ancestor

19 hours agoMerge branch 'cl/regexec-macos-leak' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:47 +0000 (10:40 -0700)] 
Merge branch 'cl/regexec-macos-leak' into jch

A compatibility workaround has been introduced for macOS to address
a memory leak in the system regex engine when it encounters invalid
multibyte sequences.  The workaround segments the input buffer at
invalid byte boundaries and searches each valid segment separately
using regexec(), avoiding the leaking path.

* cl/regexec-macos-leak:
  SQUASH???
  regexec: work around macOS TRE leak on invalid UTF-8

19 hours agoMerge branch 'tc/replay-linearize' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:47 +0000 (10:40 -0700)] 
Merge branch 'tc/replay-linearize' into jch

The 'git replay' command has been taught the '--linearize' option to
drop merge commits and linearize the replayed history, mimicking 'git
rebase --no-rebase-merges'.

* tc/replay-linearize:
  replay: offer an option to linearize the commit topology
  replay: resolve the replay base outside pick_regular_commit()
  replay: add helper to put entry into replayed_commits

19 hours agoMerge branch 'lo/mv-missing-dest-dir-check' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:47 +0000 (10:40 -0700)] 
Merge branch 'lo/mv-missing-dest-dir-check' into jch

'git mv' has been updated to check for a missing destination
leading directory during the checking phase, allowing 'git mv -n'
to report the failure.  The error message when the rename(2)
syscall fails has also been improved to name both the source and
the destination.

* lo/mv-missing-dest-dir-check:
  mv: reject a destination whose leading path is missing or a symlink
  mv: name both source and destination when rename fails

19 hours agoMerge branch 'js/coverity-unchecked-returns-fix' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:46 +0000 (10:40 -0700)] 
Merge branch 'js/coverity-unchecked-returns-fix' into jch

A handful of code paths have been corrected to check return values
from functions like curl_easy_duphandle(), deflateInit(), lseek(),
dup(), and strbuf_getline_lf(), resolving several Coverity warnings
about unchecked returns.

* js/coverity-unchecked-returns-fix:
  bisect: handle dup() failure when redirecting stdout
  bisect: check get_terms return at all call sites
  bisect: check strbuf_getline_lf return when reading terms
  transport-helper: warn when export-marks file cannot be finalized
  transport-helper: check dup() return in get_exporter
  compat/pread: check initial lseek for errors
  last-modified: handle repo_parse_commit() failures
  reftable tests: check reftable_table_init_ref_iterator() return
  reftable/block: check deflateInit() return value
  config: propagate launch_editor() failure in show_editor()
  http: die on curl_easy_duphandle failure in get_active_slot

19 hours agoMerge branch 'mm/lib-httpd-cgi-safe' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:46 +0000 (10:40 -0700)] 
Merge branch 'mm/lib-httpd-cgi-safe' into jch

CGI helper scripts used by HTTP-related test scripts have been updated
to use atomic filesystem operations, preventing race conditions when
Apache handles concurrent requests.

* mm/lib-httpd-cgi-safe:
  t/README: document writing concurrency-safe helpers
  t/lib-httpd: make http-429 first-request check atomic
  t/lib-httpd: fix apply-one-time-script race under concurrent requests

19 hours agoMerge branch 'ij/subtree-reject-v2-config' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:46 +0000 (10:40 -0700)] 
Merge branch 'ij/subtree-reject-v2-config' into jch

The shell script implementation of 'git subtree' has been updated to
check for the presence of the configuration file of the new Rust
implementation, preventing users from accidentally running the old
script on repositories already managed by the new tool.

* ij/subtree-reject-v2-config:
  git-subtree: Bail out if we find output from Rust rewrite (test)
  git-subtree: Bail out if we find output from Rust rewrite

19 hours agoMerge branch 'ds/sparse-index-ita-crash' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:46 +0000 (10:40 -0700)] 
Merge branch 'ds/sparse-index-ita-crash' into jch

A crash in the 'sparse-index' collapse code when encountering an
invalidated cache-tree node (due to an intent-to-add path) has been
fixed by avoiding collapsing such subtrees.

* ds/sparse-index-ita-crash:
  sparse-index: avoid crash on intent-to-add entry outside the cone

19 hours agoMerge branch 'kh/doc-trailers' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:46 +0000 (10:40 -0700)] 
Merge branch 'kh/doc-trailers' into jch

Documentation for 'git interpret-trailers' has been updated to explain
the format of trailer keys (alphanumeric characters and hyphens),
replace outdated terminology, define key terms upfront, and document
how comment lines in the input are treated.

* kh/doc-trailers:
  doc: interpret-trailers: document comment line treatment
  doc: interpret-trailers: rewrite new-trailers paragraphs
  doc: interpret-trailers: commit to “trailer block” term
  doc: interpret-trailers: join new-trailers again
  doc: interpret-trailers: add key format example
  doc: interpret-trailers: explain key format
  doc: interpret-trailers: explain the format after the intro
  doc: interpret-trailers: not just for commit messages
  doc: interpret-trailers: use “metadata” in Name as well
  doc: interpret-trailers: replace “lines” with “metadata”
  doc: interpret-trailers: stop fixating on RFC 822

19 hours agoMerge branch 'za/completion-hide-dotfiles' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:45 +0000 (10:40 -0700)] 
Merge branch 'za/completion-hide-dotfiles' into jch

Path completion for commands like 'git rm' and 'git mv' has been
updated to hide dotfiles by default unless the user explicitly starts
the path with a dot, matching standard shell-completion behavior.

* za/completion-hide-dotfiles:
  completion: hide dotfiles by default for path completion
  completion: hide dotfiles for selected path completion

19 hours agoMerge branch 'kh/doc-replay-config' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:45 +0000 (10:40 -0700)] 
Merge branch 'kh/doc-replay-config' into jch

Documentation for 'git replay' has been updated to refer to its
configuration variables.

* kh/doc-replay-config:
  doc: replay: move “default” to the right-hand side
  doc: replay: use a nested description list
  doc: replay: improve config description
  doc: link to config for git-replay(1)

19 hours agoMerge branch 'bl/t7412-use-test-path-helpers' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:45 +0000 (10:40 -0700)] 
Merge branch 'bl/t7412-use-test-path-helpers' into jch

The test script 't7412' that tests 'git submodule absorbgitdirs' has
been modernized to use test_path_is_file(), test_path_is_dir(), and
test_path_is_missing() helper functions instead of raw 'test -[fde]'
commands.

* bl/t7412-use-test-path-helpers:
  submodule absorbgitdirs tests: use test_* helper functions

19 hours agoMerge branch 'jm/t0213-skip-emulated-ancestry-tests' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:45 +0000 (10:40 -0700)] 
Merge branch 'jm/t0213-skip-emulated-ancestry-tests' into jch

The 'TRACE2_ANCESTRY' prerequisite in the 't0213' test script has been
refined to avoid failures under user-mode emulation by verifying that
the ancestry collector reports the expected process names rather than
the emulator binary name.

* jm/t0213-skip-emulated-ancestry-tests:
  t0213: skip ancestry tests under user-mode emulation

19 hours agoMerge branch 'jc/add-resolved' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:44 +0000 (10:40 -0700)] 
Merge branch 'jc/add-resolved' into jch

'git add' has been taught a new '--resolved' option to stage
conflict-resolved paths, while leaving unrelated local changes
unstaged. It scans the unmerged paths for leftover conflict markers
and aborts if any are found.

* jc/add-resolved:
  add: introduce '--resolved' option
  read-cache: add remove_file_from_index_with_flags()
  merge-ll: consolidate conflict marker scanning logic
  read-cache: reindent

19 hours agoMerge branch 'dl/pack-bitmap-position-zero' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:44 +0000 (10:40 -0700)] 
Merge branch 'dl/pack-bitmap-position-zero' into jch

A boundary case check in reachability bitmap traversal has been
corrected to properly handle the object at position zero, which was
previously skipped, leading to redundant bitmap loading.

* dl/pack-bitmap-position-zero:
  pack-bitmap: handle objects at bitmap position zero

19 hours agoMerge branch 'tc/merge-default-to-upstream-leakfix' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:44 +0000 (10:40 -0700)] 
Merge branch 'tc/merge-default-to-upstream-leakfix' into jch

Leakfix.

* tc/merge-default-to-upstream-leakfix:
  merge: fix leak with merge.defaultToUpstream

19 hours agoMerge branch 'jk/cat-file-batch-wo-type-fix' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:43 +0000 (10:40 -0700)] 
Merge branch 'jk/cat-file-batch-wo-type-fix' into jch

"git cat-file --batch-command" that asked for 'contents' without
'type' segfaults, which has been corrected.

* jk/cat-file-batch-wo-type-fix:
  cat-file: handle content request for --batch-command without type

19 hours agoMerge branch 'mm/revision-pure-get-commit-action' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:43 +0000 (10:40 -0700)] 
Merge branch 'mm/revision-pure-get-commit-action' into jch

The get_commit_action() function has been refactored to be a pure
predicate by moving the side-effecting line-level log range folding to
simplify_commit().  This ensures that evaluating a commit's action
before the walk reaches it does not prematurely mutate its tracked
line ranges, making it safer for potential lookahead evaluations.

* mm/revision-pure-get-commit-action:
  revision: make get_commit_action() a pure predicate

19 hours ago### match next
Junio C Hamano [Thu, 30 Jul 2026 17:40:43 +0000 (10:40 -0700)] 
### match next

19 hours agoMerge branch 'jk/diff-relative-cached-unmerged-more' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:43 +0000 (10:40 -0700)] 
Merge branch 'jk/diff-relative-cached-unmerged-more' into jch

The code path that deals with relative paths in the diff-lib has
been cleaned up.

* jk/diff-relative-cached-unmerged-more:
  diff-lib: skip paths outside prefix in oneway_diff()
  diff-lib: drop stale comment about advancing o->pos

19 hours agoMerge branch 'js/mingw-symlink-net-share-leak' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:43 +0000 (10:40 -0700)] 
Merge branch 'js/mingw-symlink-net-share-leak' into jch

Git for Windows has been updated to avoid auto-detecting the symlink
type if the target path starts with a slash, preventing NTLM
credential leaks when checking out repositories with crafted
symbolic links pointing to network shares.

* js/mingw-symlink-net-share-leak:
  mingw: skip symlink type auto-detection for network share targets

19 hours agoMerge branch 'jk/t0014-dynamic-deprecated-cmds' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:42 +0000 (10:40 -0700)] 
Merge branch 'jk/t0014-dynamic-deprecated-cmds' into jch

The alias tests in t/t0014-alias.sh have been updated to dynamically
query the list of deprecated commands using 'git
--list-cmds=deprecated' to avoid test failures when running with
WITH_BREAKING_CHANGES in a build directory that contains stale
executables of formerly deprecated commands.

* jk/t0014-dynamic-deprecated-cmds:
  t0014: generate deprecated command names dynamically
  t0014: factor out choice of deprecated commands

19 hours agoMerge branch 'jk/ci-static-analysis-image-bump' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:42 +0000 (10:40 -0700)] 
Merge branch 'jk/ci-static-analysis-image-bump' into jch

The image version used by the static-analysis CI job has been bumped
to ubuntu-latest (Ubuntu 24.04), which brings in a newer Coccinelle
version that resolves a severe performance regression.  A false
positive warning from the CHECK_ASSERTION_SIDE_EFFECTS build with
GCC 15 in the Bloom filter code has also been silenced to facilitate
the image upgrade.

* jk/ci-static-analysis-image-bump:
  ci: bump ubuntu image version for static-analysis job
  bloom: silence CHECK_ASSERTION_SIDE_EFFECTS false positive

19 hours agoMerge branch 'rs/branch-delete-bisect-warning' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:42 +0000 (10:40 -0700)] 
Merge branch 'rs/branch-delete-bisect-warning' into jch

'git branch -d' has been taught to report when a branch cannot be
deleted because it is being used in an active bisect run.

* rs/branch-delete-bisect-warning:
  branch: report active bisect run when rejecting delete

19 hours agoMerge branch 'ps/odb-pluggable-housekeeping' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:42 +0000 (10:40 -0700)] 
Merge branch 'ps/odb-pluggable-housekeeping' into jch

Object database housekeeping in 'git gc' and 'git maintenance' has
been refactored to be pluggable.  The files-backend-specific logic,
including incremental and geometric repacking as well as object
pruning, has been moved out of the command implementation and into the
files object database source, enabling future alternative object
database backends to implement their own housekeeping services.

* ps/odb-pluggable-housekeeping:
  odb: make optimizations pluggable
  builtin/gc: fix signedness issues in ODB-related functionality
  builtin/gc: refactor ODB optimizations to operate on "files" source
  builtin/gc: introduce `odb_optimize_required()`
  builtin/gc: move geometric repacking into `odb_optimize()`
  builtin/gc: introduce object database optimization options
  builtin/gc: inline config values specific to the "files" backend
  builtin/gc: make repack arguments self-contained
  builtin/gc: extract object database optimizations into separate function
  builtin/gc: move worktree and rerere tasks before object optimizations
  odb: run "pre-auto-gc" hook for all maintenance tasks
  t7900: simplify how we check for maintenance tasks

19 hours agoMerge branch 'pw/rebase-fixup-fixes' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:41 +0000 (10:40 -0700)] 
Merge branch 'pw/rebase-fixup-fixes' into jch

Two bugs in how 'git rebase' handles skipped 'fixup' and 'squash'
commands have been fixed.  One bug caused an incorrect commit count to
be shown in the template message when multiple commands were skipped,
and another prevented the editor from opening when the final command
in a chain containing 'fixup -c' was skipped.

* pw/rebase-fixup-fixes:
  rebase: remember fixup -c after skipping fixup/squash
  rebase -i: fix counting of fixups after rebase --skip

19 hours agoMerge branch 'en/submodule-insteadof-remote-match' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:41 +0000 (10:40 -0700)] 
Merge branch 'en/submodule-insteadof-remote-match' into jch

The remote-matching logic for submodules has been corrected to
resolve 'url.*.insteadOf' aliases before comparing the inventoried
URL from '.gitmodules' with the URLs of configured remotes.

* en/submodule-insteadof-remote-match:
  submodule: resolve insteadOf aliases when matching remote

19 hours agoMerge branch 'jc/remote-insteadof-leakfix' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:41 +0000 (10:40 -0700)] 
Merge branch 'jc/remote-insteadof-leakfix' into jch

rewrites_release() in 'remote.c' has been updated to free 'struct
rewrite' instances, their '.instead_of' arrays, and their contents.

* jc/remote-insteadof-leakfix:
  remote: plug memory leaks

19 hours agoMerge branch 'af/clone-revision-v0-segfault-fix' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:41 +0000 (10:40 -0700)] 
Merge branch 'af/clone-revision-v0-segfault-fix' into jch

A segfault when 'git clone --revision' talks to a server that does not
support protocol v2 (falling back to protocol v0) has been corrected.

* af/clone-revision-v0-segfault-fix:
  builtin/clone: fix segfault when using --revision with protocol v0

19 hours agoMerge branch 'jk/diff-relative-cached-unmerged' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:41 +0000 (10:40 -0700)] 
Merge branch 'jk/diff-relative-cached-unmerged' into jch

'git diff --relative' running with '--cached' has been corrected to
avoid a segfault when encountering unmerged paths outside the
prefix.

* jk/diff-relative-cached-unmerged:
  diff-lib: add idx/tree sanity check to oneway_diff
  diff: ignore unmerged paths outside prefix with --relative --cached

19 hours agoMerge branch 'jc/exclude-first-parent-seen' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:40 +0000 (10:40 -0700)] 
Merge branch 'jc/exclude-first-parent-seen' into jch

Traversals with '--exclude-first-parent-only' have been corrected to
properly stop after the first parent even when it has already been
marked as SEEN.

* jc/exclude-first-parent-seen:
  revision: honor --exclude-first-parent-only with SEEN first parent

19 hours agoMerge branch 'hn/url-push-tracking' into jch
Junio C Hamano [Thu, 30 Jul 2026 17:40:40 +0000 (10:40 -0700)] 
Merge branch 'hn/url-push-tracking' into jch

When the push remote is specified as a URL, the fetch refspec of a
uniquely matching configured remote is now used to find and update
the remote-tracking branch (e.g., '@{push}').

* hn/url-push-tracking:
  remote: find tracking branches for URL push destinations
  remote: pass repository to push tracking helper

20 hours agoThe 9th batch main master
Junio C Hamano [Thu, 30 Jul 2026 17:31:52 +0000 (10:31 -0700)] 
The 9th batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agoMerge branch 'ps/odb-move-loose-object-writing'
Junio C Hamano [Thu, 30 Jul 2026 17:32:04 +0000 (10:32 -0700)] 
Merge branch 'ps/odb-move-loose-object-writing'

The logic to write loose objects has been refactored and moved from
'object-file.c' to the loose backend source file 'odb/source-loose.c',
making the loose backend more self-contained.  This is achieved by
first refactoring force_object_loose() to use generic ODB write
interfaces instead of loose-backend internals.

* ps/odb-move-loose-object-writing:
  object-file: move logic to write loose objects
  object-file: move `force_object_loose()`
  object-file: force objects loose via generic interface
  object-file: fix memory leak in `force_object_loose()`
  odb: support setting mtime when writing objects
  odb: lift object existence check out of the "loose" backend
  odb: compute object hash in `odb_write_object_ext()`
  t/u-odb-inmemory: implement wrapper for writing objects
  odb: compute compat object ID in `odb_write_object_ext()`

20 hours agoMerge branch 'tl/gitweb-shorten-hashes-with-modes'
Junio C Hamano [Thu, 30 Jul 2026 17:32:04 +0000 (10:32 -0700)] 
Merge branch 'tl/gitweb-shorten-hashes-with-modes'

The object ID shortening and linking in the 'commitdiff' view of
'gitweb' has been corrected to work even when the index line carries
a trailing file mode.

* tl/gitweb-shorten-hashes-with-modes:
  gitweb: shorten index hashes with trailing file modes

20 hours agoMerge branch 'ps/cat-file-remote-object-info'
Junio C Hamano [Thu, 30 Jul 2026 17:32:04 +0000 (10:32 -0700)] 
Merge branch 'ps/cat-file-remote-object-info'

The 'remote-object-info' command has been added to 'git cat-file
--batch-command', allowing clients to request object metadata
(currently size) from a remote server via protocol v2 without
downloading the entire object.  Format placeholders are dynamically
filtered on the client based on server-advertised capabilities,
returning empty strings for inapplicable or unsupported fields.

* ps/cat-file-remote-object-info:
  cat-file: make remote-object-info allow-list adapt to the server
  cat-file: add remote-object-info to batch-command
  transport: add client support for object-info
  serve: advertise object-info feature
  protocol-caps: check object existence regardless of the attributes requested
  fetch-pack: move fetch initialization
  connect: make write_fetch_command_and_capabilities() more generic
  fetch-pack: move write_fetch_command_and_capabilities() to connect.c
  fetch-pack: use unsigned int for hash_algo variable
  fetch-pack: drop the static advertise_sid variable
  t1006: extract helper functions into new 'lib-cat-file.sh'
  cat-file: declare loop counter inside for()
  transport-helper: fix memory leak of helper on disconnect

20 hours agoMerge branch 'jt/config-lock-timeout'
Junio C Hamano [Thu, 30 Jul 2026 17:32:04 +0000 (10:32 -0700)] 
Merge branch 'jt/config-lock-timeout'

Configuration file locking has been updated to retry for a short
period, avoiding failures when multiple processes attempt to update
the configuration simultaneously.

* jt/config-lock-timeout:
  config: retry acquiring config.lock, configurable via core.configLockTimeout

20 hours agoMerge branch 'tn/stash-avoid-sparse-index-expansion'
Junio C Hamano [Thu, 30 Jul 2026 17:32:03 +0000 (10:32 -0700)] 
Merge branch 'tn/stash-avoid-sparse-index-expansion'

The 'git stash push' command has been optimized to avoid unnecessary
sparse index expansion when pathspecs are wholly inside the
sparse-checkout cone.  Also, a potential out-of-bounds read in the
sparse-index expansion check helper pathspec_needs_expanded_index()
has been fixed by consistently using the parsed, prefixed path.

* tn/stash-avoid-sparse-index-expansion:
  stash: avoid sparse-index expansion for in-cone paths
  pathspec: use match for sparse-index expansion checks

20 hours agoMerge branch 'sk/userdiff-swift'
Junio C Hamano [Thu, 30 Jul 2026 17:32:03 +0000 (10:32 -0700)] 
Merge branch 'sk/userdiff-swift'

Userdiff patterns for Swift have been added, with support for
Swift-specific constructs such as attributes, modifiers, failable
initializers, and generics.

* sk/userdiff-swift:
  userdiff: add support for Swift

20 hours agoMerge branch 'ty/migrate-excludes-file'
Junio C Hamano [Thu, 30 Jul 2026 17:32:03 +0000 (10:32 -0700)] 
Merge branch 'ty/migrate-excludes-file'

The 'excludes_file' and various other global configuration variables
(including 'editor_program', 'pager_program', 'askpass_program', and
'push_default') have been migrated into the per-repository structure.

* ty/migrate-excludes-file:
  repository: adjust the comment of config_values_private_
  environment: move object_creation_mode into repo_config_values
  environment: move autorebase into repo_config_values
  environment: move push_default into repo_config_values
  environment: migrate apply_default_whitespace and apply_default_ignorewhitespace
  environment: move askpass_program into repo_config_values
  environment: move pager_program into repo_config_values
  environment: move editor_program into repo_config_values
  environment: move excludes_file into repo_config_values
  repository: introduce repo_config_values_clear()

20 hours agoMerge branch 'ty/migrate-trust-executable-bit'
Junio C Hamano [Thu, 30 Jul 2026 17:32:02 +0000 (10:32 -0700)] 
Merge branch 'ty/migrate-trust-executable-bit'

The 'trust_executable_bit' (coming from the 'core.filemode'
configuration) has been migrated into 'struct repo_config_values' to
tie it to a specific repository instance.

* ty/migrate-trust-executable-bit:
  environment: move has_symlinks into repo_config_values
  environment: move trust_executable_bit into repo_config_values
  read-cache: pass 'repo' to 'ce_mode_from_stat()'
  read-cache: remove redundant extern declarations

20 hours agoMerge branch 'rs/tempfile-wo-the-repository'
Junio C Hamano [Thu, 30 Jul 2026 17:32:02 +0000 (10:32 -0700)] 
Merge branch 'rs/tempfile-wo-the-repository'

The tempfile and lockfile APIs have been refactored to stop depending
on the 'the_repository' global variable, and their callers have been
updated to use the repository-aware variants.

* rs/tempfile-wo-the-repository:
  use repo_hold_lock_file_for_update{,_mode,_timeout}() with custom repos
  tempfile: stop using the_repository
  lockfile: add repo_hold_lock_file_for_update{,_timeout}{,_mode}()
  refs/packed: use repo_create_tempfile()
  tempfile: add repo_create_tempfile{,_mode}()

20 hours agobranch: add --dry-run for --delete-merged
Harald Nordgren [Thu, 30 Jul 2026 13:58:36 +0000 (13:58 +0000)] 
branch: add --dry-run for --delete-merged

"git branch --dry-run --delete-merged ..." prints one line per ref that
would be deleted without modifying refs or branch configuration.

--dry-run is only meaningful together with --delete-merged and is
rejected otherwise.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agobranch: add branch.<name>.deleteMerged opt-out
Harald Nordgren [Thu, 30 Jul 2026 13:58:35 +0000 (13:58 +0000)] 
branch: add branch.<name>.deleteMerged opt-out

Setting branch.<name>.deleteMerged=false exempts that branch from
"git branch --delete-merged", which is useful for a topic you want
to keep developing after an early round of it has been merged
upstream. Unless --quiet is given, each skip is reported so the
user knows why their topic was kept.

Explicit deletion with "git branch -d" still uses the normal merge
check and ignores this setting.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agobranch: add --delete-merged <pattern>
Harald Nordgren [Thu, 30 Jul 2026 13:58:34 +0000 (13:58 +0000)] 
branch: add --delete-merged <pattern>

    git branch (--delete-merged <pattern>)... [<branch-pattern>...]

deletes local branches matching the optional branch patterns when their
configured upstream matches one of the --delete-merged arguments and
their tip is reachable from that upstream. The work has already landed
on the upstream they track, so the local copy is no longer needed.

Each <pattern> may name a ref, a remote, or a shell glob. The option can
be repeated to widen the upstream match. Keeping the candidate patterns
as positional arguments lets users bound the set of local branches that
may be deleted independently of the upstream selection.

A branch is not deleted when:

  * it is checked out in any worktree
  * its configured upstream ref no longer exists, since a missing
    upstream is not by itself a sign of integration
  * pushing it to the remote configured by branch.<name>.remote would
    update its upstream, as determined by that remote's configured push
    and fetch refspecs. For example, a local "main" that tracks
    "origin/main" is kept even when remote.pushDefault names a fork.
    Right after a pull it merely looks fully merged.
  * it is the local upstream of a branch that is not being deleted, so
    no branch is deleted out from under stacked work.

A branch whose work is not yet merged into its upstream is silently
skipped, so one unmerged topic does not abort the whole sweep.

Collect protected local upstreams without changing the candidate set
during ref iteration, then remove them after iteration. This makes the
result independent of ref iteration order. If a protected branch's own
upstream is deleted by the same sweep, clear its upstream configuration.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agobranch: prepare delete_branches for a bulk caller
Harald Nordgren [Thu, 30 Jul 2026 13:58:33 +0000 (13:58 +0000)] 
branch: prepare delete_branches for a bulk caller

Teach delete_branches() a new mode for the upcoming --delete-merged
caller that checks whether a branch is merged into its upstream without
falling back to HEAD when there is no upstream. Existing callers keep
their current behavior.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agobranch: let delete_branches skip unmerged branches on bulk refusal
Harald Nordgren [Thu, 30 Jul 2026 13:58:32 +0000 (13:58 +0000)] 
branch: let delete_branches skip unmerged branches on bulk refusal

Add a skip-unmerged mode to delete_branches() and check_branch_commit()
so a bulk caller can silently skip branches that are not fully merged
and carry on, rather than erroring with the "use 'git branch -D'"
advice that the plain "git branch -d" path emits. Existing callers are
unaffected.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agobranch: convert delete_branches() to a flags argument
Harald Nordgren [Thu, 30 Jul 2026 13:58:31 +0000 (13:58 +0000)] 
branch: convert delete_branches() to a flags argument

delete_branches() takes separate force and quiet parameters, while
check_branch_commit() takes force. The next commits would grow this
collection further. Replace them with a single unsigned flags argument
and an enum.

Test the FORCE and QUIET bits directly from flags at each use site so
that mutating or forwarding flags cannot leave cached values stale.

No change in behavior.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
20 hours agobranch: add --forked filter for --list mode
Harald Nordgren [Thu, 30 Jul 2026 13:58:30 +0000 (13:58 +0000)] 
branch: add --forked filter for --list mode

Add a --forked option to "git branch" list mode that lists only
branches whose configured upstream matches <branch>. The argument
can be a ref (e.g. "origin/main", "master"), a remote name like
"origin" for the branch its origin/HEAD points at, or a shell glob
(e.g. "origin/*"), and may be repeated to widen the filter.

It is an ordinary list filter, so it combines with the others:

    git branch --merged origin/main --forked 'origin/*'

lists branches forked from origin that are already merged into
origin/main, and --no-merged inverts the question.

This is the building block for --delete-merged, which deletes the
listed branches once they have landed on their upstream.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agomv: reject a destination whose leading path is missing or a symlink
Lucas Zamboni Orioli [Thu, 30 Jul 2026 11:28:04 +0000 (11:28 +0000)] 
mv: reject a destination whose leading path is missing or a symlink

When moving a file, if any leading directory in the destination path
is missing or is not a real directory, the problem is detected only
later when rename() is called. Furthermore, if a leading directory
component is a symbolic link, the issue is not detected at all.

Three cases reach rename(2) unchecked today:

  - A leading directory is missing: rename(2) fails with ENOENT,
    reported against the source (misleading), and "git mv -n" does not
    detect it since the dry run never reaches the syscall.

  - A leading component is a non-directory ("git mv x a/b" with 'a' a
    file): rename(2) fails with ENOTDIR, again only at the syscall.

  - A leading component is a symbolic link: "git mv" follows it. Since
    Git tracks symlinks, the destination is really occupied by a
    tracked object, and following it is wrong regardless of the link
    target. The move is done on disk at the resolved location while the
    index records the literal path, leaving the index describing a
    worktree that does not exist. A later "git add" can reconcile it,
    but "git mv" alone has already corrupted the state.

Detect all three in the checking phase. Reject a destination that goes
through a symlink with has_symlink_leading_path(), which uses lstat()
and never follows the link, so the refusal is independent of the
target. Then lstat() the leading directory: report "destination
directory does not exist" for ENOENT/ENOTDIR and "destination is not a
directory" for a non-directory. Other errors fall through to rename().
Guard the directory check with the same condition under which rename(2)
runs, so directory moves and sparse/out-of-cone destinations are not
flagged incorrectly.

This changes behavior: a move through a tracked symlink that previously
"succeeded" while corrupting the index is now refused. The other two
cases only change when the failure is diagnosed.

Signed-off-by: Lucas Zamboni Orioli <lucaszam0@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agomv: name both source and destination when rename fails
Lucas Zamboni Orioli [Thu, 30 Jul 2026 11:28:03 +0000 (11:28 +0000)] 
mv: name both source and destination when rename fails

When "git mv" fails at the rename(2) syscall, the error is reported
with die_errno() using only the source path:

    fatal: renaming 'src' failed: No such file or directory

rename(2) returns ENOENT both when the source does not exist and when
a directory component of the destination does not exist, and errno
does not distinguish the two. Reporting only the source therefore
misleads the user in the latter case: for

    git mv a/file b/no-such-dir/file

the message blames 'a/file', which exists, and gives no hint that
'b/no-such-dir/' is the missing part.

Inspecting the paths again after the failure to determine which one is
at fault would be racy, since either could appear or disappear between
the rename(2) and the follow-up check. Instead, simply name both the
source and the destination in the message and let the reader see which
one is wrong:

    fatal: renaming 'a/file' to 'b/no-such-dir/file' failed:
    No such file or directory

Signed-off-by: Lucas Zamboni Orioli <lucaszam0@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: replay: move “default” to the right-hand side
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:57:16 +0000 (11:57 +0200)] 
doc: replay: move “default” to the right-hand side

This is now a description list (see previous commit) and parentheticals
like this do not go on the left-hand side. Moving it to the other side
makes it stand out just as much and is also more consistent with the
rest of the documentation.

Let’s also do the same for the `replay.refAction` description list.
That makes the two desc. lists identical in the first sentence. Let’s
add a comment about that for future editors.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: replay: use a nested description list
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:57:15 +0000 (11:57 +0200)] 
doc: replay: use a nested description list

This bullet list for `--ref-action` introduces a term with a colon.
This is exactly what a description list is, structurally. Let’s be
stylistically consistent and use the desc. list markup construct.

In short, just transform this unordered list in the same way that we
did for `replay.refAction` in the previous commit.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: replay: improve config description
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:57:14 +0000 (11:57 +0200)] 
doc: replay: improve config description

First of all, this unordered list for `replay.refAction` introduces
a term with a colon. This is exactly what a description list is,
structurally. Let’s be stylistically consistent and use the desc.
list markup construct. Let’s also drop the harmless but unneeded
indentation.

We can reuse the `::` delimiter since we use an open block.
But for consistency use the typical nested description list
delimiter, namely `;;`.

Second, let’s replace the inline-verbatim `git replay` with a link
to git-replay(1), since we are naming the command. But make that
conditional so that we avoid a self-link inside git-replay(1).[1]

† 1: See e.g. e7b3a768 (doc: git-init: rework config item
     init.templateDir, 2024-03-10) for another example of
     avoiding self-linking

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: link to config for git-replay(1)
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:57:13 +0000 (11:57 +0200)] 
doc: link to config for git-replay(1)

This config doc was added in 336ac90c (replay: add replay.refAction
config option, 2025-11-06) but never included anywhere. Include it in
git-replay(1) and git-config(1).

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: document comment line treatment
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:24 +0000 (11:18 +0200)] 
doc: interpret-trailers: document comment line treatment

Comment lines have always been ignored but this is not documented.

The primary motivation here is to reasonably complete in the
documentation of how trailers are parsed; this is after all the only
documentation page that documents this format. However, and going beyond
that point, we could imagine that someone would want to use this format
outside a commit (or tag) message context, like say in Git notes.

On the other hand, it seems far-fetched that someone would be caught
off guard by this considering that comment characters/strings are not
likely to be alphanumeric,[1] which would mean that these comment lines
would be treated as non-trailer lines if they were *not* detected and
removed as comment lines.

† 1: A notable exception is that Jujutsu VCS uses `JJ:` as
     the comment string

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: rewrite new-trailers paragraphs
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:23 +0000 (11:18 +0200)] 
doc: interpret-trailers: rewrite new-trailers paragraphs

Two commits ago we moved new-trailers paragraph next to each other.
But there is something curious about two of them:

    By default the new trailer will appear at the end of the trailer
    block. [...]

Then a source block and a paragraph later:

    By default, a `<key>=<value>` or `<key>:<value>` argument given
    using `--trailer` will be appended after the existing trailers only
    if [...]

Why are there two paragraphs that talk about how “By default” a trailer
will be appended?

We can make these paragraphs flow better, and with a more distinct
character each, by dividing the flow like this:

1. Declare that we are about to talk about `--trailer` appending
2. Explain the default behavior
3. Explain how this affects the trailer block
4. Then discuss what each trailer line will look like

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: commit to “trailer block” term
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:22 +0000 (11:18 +0200)] 
doc: interpret-trailers: commit to “trailer block” term

We chose to introduce the term “trailer block” into the documentation a
few commits ago.[1] It is used in the code though, so it is not a newly
invented term.

That term was useful to explain where the trailers are found (they
*trail* the message). But it is also useful here, where we explain
how trailers are added to existing messages, how trailer blocks are
found (beyond the simple case in the introduction), and how the end
of the message is found.

Also note that we simplify the “blank line” point. The text says:

    A blank line will be added before the new trailer if there isn't one
    already.

But this isn’t quite coherent. The previous sentence says “If there is
no existing trailer”, so we are in one of these modes:

1. discussing trailer blocks in general; or
2. discussing creating a new trailer block in particular.

If (1), then we shouldn’t add a blank line before the new trailer if
there exists a trailer block already. And if (2), then the “if there
isn’t one already” is redundant.[2] So just talking about the higher-
level “trailer block” simplifies the text, since we don’t have to worry
about the different contexts that *trailers* can find themselves in.

† 1: in commit “explain the format after the intro”
† 2: Note that non-trailer lines don’t matter here; if you have a
     trailer block consisting of `(cherry picked from commit <commit>)`,
     then you still shouldn’t insert a blank line before the new trailer
     since that would create a new trailer block

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: join new-trailers again
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:21 +0000 (11:18 +0200)] 
doc: interpret-trailers: join new-trailers again

There are three paragraphs that talk about how a new trailer is added.
But the first one is separated from the other two by two paragraphs
about how `key-alias` can make using `--trailer` more convenient. This
short how-to does not follow thematically from the previous paragraph,
and can wait until we have fully described how a new trailer is
added. So let’s move the three paragraphs about the new-trailer topic
together and move the how-to paragraphs after that.

***

Let’s now review the history of the document. Even if the document
is not quite correct in its current state, just doing the apparently
obvious edit without considering the history does not respect the
effort that went into changing the document in the past.

These three paragraphs were originally next to each other, in the first
version of the doc.[1] But extra sentences about this how-to topic was
added to the first paragraph nine years later:[2]

    [...]
    `': '` (one colon followed by one space). For convenience, the
    <token> can be a shortened string key (e.g., "sign") instead of the
    full string which should [...]

And then it was split into it’s own paragraph a little later.[3]

This evolution shows, in my opinion, that this how-to never followed
thematically from the existing topic. Which means that there is nothing
that was potentially lost to time that we need to restore or respect.

† 1: dfd66ddf (Documentation: add documentation for 'git
     interpret-trailers', 2014-10-13)
† 2: eda2c44c (doc: trailer: mention 'key' in DESCRIPTION, 2023-06-15)
† 3: 6ccbc667 (trailer doc: <token> is a <key> or <keyAlias>, not both,
     2023-09-07)

Suggested-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: add key format example
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:20 +0000 (11:18 +0200)] 
doc: interpret-trailers: add key format example

All of the examples speak of the Happy Path where everything works
as intended. But failure examples can also be instructive. Especially
for explaining again, by example, the key format (see previous commit).

This also allows us to demonstrate trailer block detection with a
concrete example.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: explain key format
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:19 +0000 (11:18 +0200)] 
doc: interpret-trailers: explain key format

A trailer key must consist of ASCII alphanumeric characters and
hyphens *only*. Let’s document it explicitly instead of relying on
readers being conservative and only basing their trailer keys on the
documentation examples.[1]

The previous commit provided us with an appropriate paragraph to
describe the key format.

† 1: Technically they would then miss out on using digits in them since
     all of the example keys just use letters and hyphens

Reported-by: Brendan Jackman <jackmanb@google.com>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: explain the format after the intro
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:18 +0000 (11:18 +0200)] 
doc: interpret-trailers: explain the format after the intro

You need to read the entire “Description” section in order to understand
the full trailer format. But there are many nuances, so that’s fine.
As a starter though we have an introductory example.[1] That turns out
to be crucial; the rest of this section talks about the mechanics of the
command and only incidentally the format itself.

Now, although the example might arguably be self-explanatory, we can
add a little preamble which defines the format in its simplest form as
well as define the most important terms.

Note that we name the “blank line” rule since I want to use that term
every time it comes up. It gets very mildly obfuscated if you call it
a “blank line” in one place[2] and “empty (or whitespace-only) ...” in
another one.[3]

We will define the format of the *key* in the next commit.

† 1: from d57fa7fc (doc: trailer: add more examples in DESCRIPTION,
     2023-06-15)
† 2: `Documentation/git-interpret-trailers.adoc:86` in
     5361983c (The 22nd batch, 2026-03-27)
† 3: `Documentation/git-interpret-trailers.adoc:93` in
     5361983c (The 22nd batch, 2026-03-27)

Suggested-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: not just for commit messages
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:17 +0000 (11:18 +0200)] 
doc: interpret-trailers: not just for commit messages

This command doesn’t interface with commits directly. You can
interpret or modify any kind of text, even though commit messages
are the most relevant.

The git(1) suite also isn’t restricted to only direct commit support
since git-tag(1) learned `--trailer` in 066cef77 (builtin/tag: add
--trailer option, 2024-05-05)

Now, we already introduce the command in the “Name” section as dealing
with commit messages as well. That is fine since that intro line needs
to remain pretty short.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: use “metadata” in Name as well
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:16 +0000 (11:18 +0200)] 
doc: interpret-trailers: use “metadata” in Name as well

We now since the previous commit introduce the format as “trailer
metadata”. We can replace “structured information” with “metadata”
in the “Name” section to be consistent.

While “structured information” does emphasize that the data is not
loosely structured, we also say that this command adds to or parses
this format. I don’t think that we need to emphasize that it is
structured since clearly there is some structure there.

Both “metadata” and “structured information” can convey the same
information. But “metadata” is shorter and easier to deploy since
it’s just one word.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: replace “lines” with “metadata”
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:15 +0000 (11:18 +0200)] 
doc: interpret-trailers: replace “lines” with “metadata”

We removed the initial comparison to email headers in the previous
commit. Now the introduction paragraph just says “trailer lines”, and
the only hint that this is metadata/structured information is the
“otherwise free-form” phrase.

Let’s replace “lines” with “metadata” since that is their purpose.
This also makes the introduction more consistent with how I chose
to define trailers in the glossary:[1] “Key-value metadata”. (We will
introduce “key–value” in the upcoming commit “explain the format after
the intro”.)

† 1: 68e3c69e (Documentation/glossary: describe "trailer", 2024-11-17)

Let’s not emphasize “trailer” here since we are going to define the term
in the upcoming commit “explain the format after the intro”.

Let’s call it “trailer metadata” rather than “trailers metadata”.
At first it seemed better to use the latter:

1. We’re introducing the jargon, and the format is often discussed as
   plural “trailers”, with its constituent parts being singular
   “trailer”
2. What this replaces uses “trailer”, but it rescues the plural mood
   with “lines”
3. This is very soon going to go into the constituent parts, including
   each trailer, so we’re contrasting the concept name (trailers) with
   its parts

But:

1. The former reads better (most important)
2. “Trailer *metadata*” suggests plurality, similar to “trailer *lines*”

Helped-by: Matt Hunter <m@lfurio.us>
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agodoc: interpret-trailers: stop fixating on RFC 822
Kristoffer Haugsbakk [Thu, 30 Jul 2026 09:18:14 +0000 (11:18 +0200)] 
doc: interpret-trailers: stop fixating on RFC 822

This command handles the trailer metadata format. But the command
isn’t introduced as such; it is instead introduced by stating that
these trailer lines look similar to RFC 822 email headers.

This is overwrought; most people do not deal directly with email
headers, and certainly not email RFCs.

Trailers are just key–value pairs that, like email headers, use colon
as the separator. The format in its simplest form is easy to describe
directly without comparing it to anything else; we will do that in the
upcoming commit “explain the format after the intro”.

For now, let’s:

• remove the first mention of email headers;
• keep the second, innocuous comparison with email line folding in the
  middle; and
• remove the now-unneeded disclaimer that trailers do not share many of
  the features of RFC 822 email headers—there is no invitation to
  speculate that trailers would follow any other email format rules
  since we do not compare them directly any more.

***

Talking about trailers as an RFC 822/2822-like format seems to go back
to the `--fixes`/`Fixes:` trailer topic,[1] the thread that precipitated
this command and in turn the first trailer support in git(1) beyond
adding s-o-b lines.

† 1: https://lore.kernel.org/all/20131027071407.GA11683@leaf/

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
21 hours agomerge-base: add tests for --is-ancestor
Nikolaus Schuetz [Thu, 30 Jul 2026 06:19:09 +0000 (06:19 +0000)] 
merge-base: add tests for --is-ancestor

`git merge-base --is-ancestor A B` is used a lot in scripts but has no
tests. Add some to t6010 covering its exit codes: 0 when A is an
ancestor of B, 1 when it is not, and 128 (not 1) when given a bad
argument. Also check that --is-ancestor and --all can't be combined,
and that the resulting error names both options.

Signed-off-by: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
39 hours agoadd: introduce '--resolved' option
Junio C Hamano [Wed, 29 Jul 2026 17:25:24 +0000 (10:25 -0700)] 
add: introduce '--resolved' option

During a conflicted merge, rebase, or cherry-pick, 'git add -u' is a
handy way to add modified paths to the index.  However, '-u'
indiscriminately adds all modified tracked paths, including unmerged
paths that may still contain unresolved conflict markers.  It also
adds tracked files modified in the worktree that are not involved in
the ongoing merge.

The latter is not a huge problem for "git rebase", which refuses to
start with any local changes, but is a problem for "git merge",
which is often run with local changes in maintainer workflows.

Introduce 'git add --resolved' to add only unmerged paths, limited
by an optional pathspec, where no conflict markers remain in the
working tree.

Before modifying the index, scan unmerged regular files for leftover
conflict markers using a new helper, has_conflict_markers(), defined
in merge-ll.c in terms of the is_conflict_marker_line() helper we
introduced earlier.  If any unmerged path still contains conflict
markers, show an error listing the conflicted paths and abort
without updating the index.  Otherwise, add these unmerged paths
that do not have conflict markers to the index.

Note that unmerged paths without conflict markers (such as binary
files and deletions) are added as resolved using add_file_to_index()
and remove_file_from_index_with_flags().  Tracked files that were
not in a conflicted state are ignored by '--resolved'.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
42 hours agobisect: add --reset-when-found to leave when done
Harald Nordgren [Mon, 20 Jul 2026 09:10:19 +0000 (09:10 +0000)] 
bisect: add --reset-when-found to leave when done

When a bisection finishes, "git bisect" reports the first bad commit
but leaves the session active until "git bisect reset" is run by hand.

Add a "--reset-when-found[=<where>]" option, accepted by both "git
bisect start" and "git bisect run", that resets as soon as the first
bad commit is found. The "original" value returns to the commit checked
out before "git bisect start", while "found" leaves the first bad commit
checked out; omitting the value defaults to "original".

Persist the selected target in a BISECT_RESET_WHEN_FOUND state file
and perform the reset quietly.

For "git bisect run", defer the reset until after the captured output
is printed and BISECT_RUN is closed. This lets cleanup remove the file
on systems that cannot unlink an open file.

Reject this option together with "--no-checkout", since that mode must
not check out either target.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
42 hours agobisect: let bisect_reset() optionally check out quietly
Harald Nordgren [Mon, 20 Jul 2026 09:10:18 +0000 (09:10 +0000)] 
bisect: let bisect_reset() optionally check out quietly

Add a "quiet" parameter to bisect_reset() that passes "--quiet" to the
checkout restoring the original HEAD, suppressing its progress and
branch-status output.

No caller sets the flag yet, so behavior is unchanged.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>