Autogenerated HTML docs for v2.49.0-366-gc152a
diff --git a/RelNotes/2.50.0.adoc b/RelNotes/2.50.0.adoc
index 1023e61..38df46f 100644
--- a/RelNotes/2.50.0.adoc
+++ b/RelNotes/2.50.0.adoc
@@ -28,6 +28,26 @@
    this message has been turned into an advice message that can be
    turned off.
 
+ * "git rev-list" learns machine-parsable output format that delimits
+   each field with NUL.
+
+ * "git maintenance" learns a new task to expire reflog entries.
+
+ * Auth-related (and unrelated) error handling in send-email has been
+   made more robust.
+
+ * Updating multiple references have only been possible in all-or-none
+   fashion with transactions, but it can be more efficient to batch
+   multiple updates even when some of them are allowed to fail in a
+   best-effort manner.  A new "best effort batches of updates" mode
+   has been introduced.
+
+ * "git help --build-options" reports SHA-1 and SHA-256 backends used
+   in the build.
+
+ * "git cat-file --batch" and friends learned to allow "--filter=" to
+   omit certain objects, just like the transport layer does.
+
 
 Performance, Internal Implementation, Development Support etc.
 --------------------------------------------------------------
@@ -71,6 +91,19 @@
  * The object layer has been updated to take an explicit repository
    instance as a parameter in more code paths.
 
+ * Some warnings from "-Wsign-compare" for builtin/rm.c have been
+   squelched.
+
+ * A few traditional unit tests have been rewritten to use the clar
+   framework.
+
+ * Some warnings from "-Wsign-compare" for pathspec.c have been
+   squelched.
+
+ * "make test" used to have a hard dependency on (basic) Perl; tests
+   have been rewritten help environment with NO_PERL test the build as
+   much as possible.
+
 
 Fixes since v2.49
 -----------------
@@ -134,6 +167,21 @@
    which has been corrected..
    (merge d3b5832381 pw/custom-conflict-marker-size-for-merge-related-docs later to maint).
 
+ * Squelch false-positive from sparse.
+   (merge da87b58014 dd/sparse-glibc-workaround later to maint).
+
+ * Adjust to the deprecation of use of Ubuntu 20.04 GitHub Actions CI.
+   (merge 832d9f6d0b js/ci-github-update-ubuntu later to maint).
+
+ * Work around CI breakage due to fedora base image getting updated.
+   (merge 8a471a663b js/ci-fedora-gawk later to maint).
+
+ * A ref transaction corner case fix.
+   (merge b9fadeead7 jt/ref-transaction-abort-fix later to maint).
+
+ * Random build fixes.
+   (merge 85e1d6819f ps/misc-build-fixes later to maint).
+
  * Other code cleanup, docfix, build fix, etc.
    (merge 227c4f33a0 ja/doc-block-delimiter-markup-fix later to maint).
    (merge 2bfd3b3685 ab/decorate-code-cleanup later to maint).
diff --git a/git-cat-file.adoc b/git-cat-file.adoc
index 30359f5..fc4b92f 100644
--- a/git-cat-file.adoc
+++ b/git-cat-file.adoc
@@ -81,6 +81,25 @@
 	end-of-line conversion, etc). In this case, `<object>` has to be of
 	the form `<tree-ish>:<path>`, or `:<path>`.
 
+--filter=<filter-spec>::
+--no-filter::
+	Omit objects from the list of printed objects. This can only be used in
+	combination with one of the batched modes. Excluded objects that have
+	been explicitly requested via any of the batch modes that read objects
+	via standard input (`--batch`, `--batch-check`) will be reported as
+	"filtered". Excluded objects in `--batch-all-objects` mode will not be
+	printed at all. The '<filter-spec>' may be one of the following:
++
+The form '--filter=blob:none' omits all blobs.
++
+The form '--filter=blob:limit=<n>[kmg]' omits blobs of size at least n
+bytes or units.  n may be zero.  The suffixes k, m, and g can be used to name
+units in KiB, MiB, or GiB.  For example, 'blob:limit=1k' is the same as
+'blob:limit=1024'.
++
+The form '--filter=object:type=(tag|commit|tree|blob)' omits all objects which
+are not of the requested type.
+
 --path=<path>::
 	For use with `--textconv` or `--filters`, to allow specifying an object
 	name and a path separately, e.g. when it is difficult to figure out
@@ -340,6 +359,13 @@
 <object> SP missing LF
 ------------
 
+If a name is specified on stdin that is filtered out via `--filter=`,
+then `cat-file` will ignore any custom format and print:
+
+------------
+<object> SP excluded LF
+------------
+
 If a name is specified that might refer to more than one object (an ambiguous short sha), then `cat-file` will ignore any custom format and print:
 
 ------------
diff --git a/git-cat-file.html b/git-cat-file.html
index 2f7d4a9..582dd4e 100644
--- a/git-cat-file.html
+++ b/git-cat-file.html
@@ -546,6 +546,29 @@
 end-of-line conversion, etc). In this case, <em>&lt;object&gt;</em> has to be of
 the form <em>&lt;tree-ish&gt;</em><code>:</code><em>&lt;path&gt;</em>, or <code>:</code><em>&lt;path&gt;</em>.</p>
 </dd>
+<dt class="hdlist1">--filter=&lt;filter-spec&gt;</dt>
+<dt class="hdlist1">--no-filter</dt>
+<dd>
+<p>Omit objects from the list of printed objects. This can only be used in
+combination with one of the batched modes. Excluded objects that have
+been explicitly requested via any of the batch modes that read objects
+via standard input (<code>--batch</code>, <code>--batch-check</code>) will be reported as
+"filtered". Excluded objects in <code>--batch-all-objects</code> mode will not be
+printed at all. The <em>&lt;filter-spec&gt;</em> may be one of the following:</p>
+<div class="paragraph">
+<p>The form <em>--filter=blob:none</em> omits all blobs.</p>
+</div>
+<div class="paragraph">
+<p>The form <em>--filter=blob:limit=&lt;n&gt;[kmg]</em> omits blobs of size at least n
+bytes or units.  n may be zero.  The suffixes k, m, and g can be used to name
+units in KiB, MiB, or GiB.  For example, <em>blob:limit=1k</em> is the same as
+<em>blob:limit=1024</em>.</p>
+</div>
+<div class="paragraph">
+<p>The form <em>--filter=object:type=(tag|commit|tree|blob)</em> omits all objects which
+are not of the requested type.</p>
+</div>
+</dd>
 <dt class="hdlist1">--path=&lt;path&gt;</dt>
 <dd>
 <p>For use with <code>--textconv</code> or <code>--filters</code>, to allow specifying an object
@@ -912,6 +935,15 @@
 </div>
 </div>
 <div class="paragraph">
+<p>If a name is specified on stdin that is filtered out via <code>--filter=</code>,
+then <code>cat-file</code> will ignore any custom format and print:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>&lt;object&gt; SP excluded LF</pre>
+</div>
+</div>
+<div class="paragraph">
 <p>If a name is specified that might refer to more than one object (an ambiguous short sha), then <code>cat-file</code> will ignore any custom format and print:</p>
 </div>
 <div class="listingblock">
@@ -1014,7 +1046,7 @@
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2025-02-14 21:38:14 -0800
+Last updated 2025-04-16 14:42:40 -0700
 </div>
 </div>
 </body>
diff --git a/git-config.html b/git-config.html
index 39dc4e2..72094a4 100644
--- a/git-config.html
+++ b/git-config.html
@@ -6662,6 +6662,16 @@
 number of pack-files not in the multi-pack-index is at least the value
 of <code>maintenance.incremental-repack.auto</code>. The default value is 10.</p>
 </dd>
+<dt class="hdlist1">maintenance.reflog-expire.auto</dt>
+<dd>
+<p>This integer config option controls how often the <code>reflog-expire</code> task
+should be run as part of <code>git</code> <code>maintenance</code> <code>run</code> <code>--auto</code>. If zero, then
+the <code>reflog-expire</code> task will not run with the <code>--auto</code> option. A
+negative value will force the task to run every time. Otherwise, a
+positive value implies the command should run when the number of
+expired reflog entries in the "HEAD" reflog is at least the value of
+<code>maintenance.loose-objects.auto</code>. The default value is 100.</p>
+</dd>
 <dt class="hdlist1">man.viewer</dt>
 <dd>
 <p>Specify the programs that may be used to display help in the
diff --git a/git-maintenance.adoc b/git-maintenance.adoc
index c90b370..3a1e2a6 100644
--- a/git-maintenance.adoc
+++ b/git-maintenance.adoc
@@ -162,6 +162,10 @@
 	need to iterate across many references. See linkgit:git-pack-refs[1]
 	for more information.
 
+reflog-expire::
+	The `reflog-expire` task deletes any entries in the reflog older than the
+	expiry threshold. See linkgit:git-reflog[1] for more information.
+
 OPTIONS
 -------
 --auto::
diff --git a/git-maintenance.html b/git-maintenance.html
index d0b8d38..4674a47 100644
--- a/git-maintenance.html
+++ b/git-maintenance.html
@@ -653,6 +653,11 @@
 need to iterate across many references. See <a href="git-pack-refs.html">git-pack-refs(1)</a>
 for more information.</p>
 </dd>
+<dt class="hdlist1">reflog-expire</dt>
+<dd>
+<p>The <code>reflog-expire</code> task deletes any entries in the reflog older than the
+expiry threshold. See <a href="git-reflog.html">git-reflog(1)</a> for more information.</p>
+</dd>
 </dl>
 </div>
 </div>
@@ -1060,6 +1065,16 @@
 number of pack-files not in the multi-pack-index is at least the value
 of <code>maintenance.incremental-repack.auto</code>. The default value is 10.</p>
 </dd>
+<dt class="hdlist1">maintenance.reflog-expire.auto</dt>
+<dd>
+<p>This integer config option controls how often the <code>reflog-expire</code> task
+should be run as part of <code>git</code> <code>maintenance</code> <code>run</code> <code>--auto</code>. If zero, then
+the <code>reflog-expire</code> task will not run with the <code>--auto</code> option. A
+negative value will force the task to run every time. Otherwise, a
+positive value implies the command should run when the number of
+expired reflog entries in the "HEAD" reflog is at least the value of
+<code>maintenance.loose-objects.auto</code>. The default value is 100.</p>
+</dd>
 </dl>
 </div>
 </div>
@@ -1075,7 +1090,7 @@
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2025-04-15 14:25:08 -0700
+Last updated 2025-04-16 14:42:40 -0700
 </div>
 </div>
 </body>
diff --git a/git-rev-list.html b/git-rev-list.html
index 1b56a3c..eae633c 100644
--- a/git-rev-list.html
+++ b/git-rev-list.html
@@ -926,6 +926,35 @@
 <p>Show progress reports on stderr as objects are considered. The
 <em>&lt;header&gt;</em> text will be printed with each progress update.</p>
 </dd>
+<dt class="hdlist1">-z</dt>
+<dd>
+<p>Instead of being newline-delimited, each outputted object and its
+accompanying metadata is delimited using NUL bytes. Output is printed
+in the following form:</p>
+<div class="listingblock">
+<div class="content">
+<pre>&lt;OID&gt; NUL [&lt;token&gt;=&lt;value&gt; NUL]...</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Additional object metadata, such as object paths or boundary objects, is
+printed using the <em>&lt;token&gt;</em><code>=</code><em>&lt;value&gt;</em> form. Token values are printed as-is
+without any encoding/truncation. An OID entry never contains a <em>=</em> character
+and thus is used to signal the start of a new object record. Examples:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>&lt;OID&gt; NUL
+&lt;OID&gt; NUL path=&lt;path&gt; NUL
+&lt;OID&gt; NUL boundary=yes NUL
+&lt;OID&gt; NUL missing=yes NUL [&lt;token&gt;=&lt;value&gt; NUL]...</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This mode is only compatible with the <code>--objects</code>, <code>--boundary</code>, and
+<code>--missing</code> output options.</p>
+</div>
+</dd>
 </dl>
 </div>
 </div>
@@ -2989,7 +3018,7 @@
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2025-02-15 14:38:14 +0900
+Last updated 2025-02-14 21:38:14 -0800
 </div>
 </div>
 </body>
diff --git a/git-update-ref.adoc b/git-update-ref.adoc
index 9e6935d..9310ce9 100644
--- a/git-update-ref.adoc
+++ b/git-update-ref.adoc
@@ -7,8 +7,10 @@
 
 SYNOPSIS
 --------
-[verse]
-'git update-ref' [-m <reason>] [--no-deref] (-d <ref> [<old-oid>] | [--create-reflog] <ref> <new-oid> [<old-oid>] | --stdin [-z])
+[synopsis]
+git update-ref [-m <reason>] [--no-deref] -d <ref> [<old-oid>]
+git update-ref [-m <reason>] [--no-deref] [--create-reflog] <ref> <new-oid> [<old-oid>]
+git update-ref [-m <reason>] [--no-deref] --stdin [-z] [--batch-updates]
 
 DESCRIPTION
 -----------
@@ -57,6 +59,14 @@
 With `--create-reflog`, update-ref will create a reflog for each ref
 even if one would not ordinarily be created.
 
+With `--batch-updates`, update-ref executes the updates in a batch but allows
+individual updates to fail due to invalid or incorrect user input, applying only
+the successful updates. However, system-related errors—such as I/O failures or
+memory issues—will result in a full failure of all batched updates. Any failed
+updates will be reported in the following format:
+
+	rejected SP (<old-oid> | <old-target>) SP (<new-oid> | <new-target>) SP <rejection-reason> LF
+
 Quote fields containing whitespace as if they were strings in C source
 code; i.e., surrounded by double-quotes and with backslash escapes.
 Use 40 "0" characters or the empty string to specify a zero value.  To
diff --git a/git-update-ref.html b/git-update-ref.html
index 28553bf..5de8825 100644
--- a/git-update-ref.html
+++ b/git-update-ref.html
@@ -452,7 +452,9 @@
 <h2 id="_synopsis">SYNOPSIS</h2>
 <div class="sectionbody">
 <div class="verseblock">
-<pre class="content"><em>git update-ref</em> [-m &lt;reason&gt;] [--no-deref] (-d &lt;ref&gt; [&lt;old-oid&gt;] | [--create-reflog] &lt;ref&gt; &lt;new-oid&gt; [&lt;old-oid&gt;] | --stdin [-z])</pre>
+<pre class="content"><code>git</code> <code>update-ref</code> [<code>-m</code> <em>&lt;reason&gt;</em>] [<code>--no-deref</code>] <code>-d</code> <em>&lt;ref&gt;</em> [<em>&lt;old-oid&gt;</em>]
+<code>git</code> <code>update-ref</code> [<code>-m</code> <em>&lt;reason&gt;</em>] [<code>--no-deref</code>] [<code>--create-reflog</code>] <em>&lt;ref&gt;</em> <em>&lt;new-oid&gt;</em> [<em>&lt;old-oid&gt;</em>]
+<code>git</code> <code>update-ref</code> [<code>-m</code> <em>&lt;reason&gt;</em>] [<code>--no-deref</code>] <code>--stdin</code> [<code>-z</code>] [<code>--batch-updates</code>]</pre>
 </div>
 </div>
 </div>
@@ -515,6 +517,18 @@
 even if one would not ordinarily be created.</p>
 </div>
 <div class="paragraph">
+<p>With <code>--batch-updates</code>, update-ref executes the updates in a batch but allows
+individual updates to fail due to invalid or incorrect user input, applying only
+the successful updates. However, system-related errors—such as I/O failures or
+memory issues—will result in a full failure of all batched updates. Any failed
+updates will be reported in the following format:</p>
+</div>
+<div class="literalblock">
+<div class="content">
+<pre>rejected SP (&lt;old-oid&gt; | &lt;old-target&gt;) SP (&lt;new-oid&gt; | &lt;new-target&gt;) SP &lt;rejection-reason&gt; LF</pre>
+</div>
+</div>
+<div class="paragraph">
 <p>Quote fields containing whitespace as if they were strings in C source
 code; i.e., surrounded by double-quotes and with backslash escapes.
 Use 40 "0" characters or the empty string to specify a zero value.  To
@@ -715,7 +729,7 @@
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2025-02-14 21:38:14 -0800
+Last updated 2025-04-16 14:42:40 -0700
 </div>
 </div>
 </body>
diff --git a/git-version.adoc b/git-version.adoc
index 80fa775..9462043 100644
--- a/git-version.adoc
+++ b/git-version.adoc
@@ -22,6 +22,14 @@
 --build-options::
 	Include additional information about how git was built for diagnostic
 	purposes.
++
+The libraries used to implement the SHA-1 and SHA-256 algorithms are displayed
+in the form `SHA-1: <option>` and `SHA-256: <option>`. Note that the SHA-1
+options `SHA1_APPLE`, `SHA1_OPENSSL`, and `SHA1_BLK` do not use a collision
+detection algorithm and thus may be vulnerable to known SHA-1 collision
+attacks. When a faster SHA-1 implementation without collision detection is used
+for only non-cryptographic purposes, the algorithm is displayed in the form
+`non-collision-detecting-SHA-1: <option>`.
 
 GIT
 ---
diff --git a/git-version.html b/git-version.html
index b8d6aaa..fe862a6 100644
--- a/git-version.html
+++ b/git-version.html
@@ -477,6 +477,15 @@
 <dd>
 <p>Include additional information about how git was built for diagnostic
 purposes.</p>
+<div class="paragraph">
+<p>The libraries used to implement the SHA-1 and SHA-256 algorithms are displayed
+in the form <code>SHA-1:</code> <em>&lt;option&gt;</em> and <code>SHA-256:</code> <em>&lt;option&gt;</em>. Note that the SHA-1
+options <code>SHA1_APPLE</code>, <code>SHA1_OPENSSL</code>, and <code>SHA1_BLK</code> do not use a collision
+detection algorithm and thus may be vulnerable to known SHA-1 collision
+attacks. When a faster SHA-1 implementation without collision detection is used
+for only non-cryptographic purposes, the algorithm is displayed in the form
+<code>non-collision-detecting-SHA-1:</code> <em>&lt;option&gt;</em>.</p>
+</div>
 </dd>
 </dl>
 </div>
@@ -493,7 +502,7 @@
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2025-02-14 21:38:14 -0800
+Last updated 2025-04-16 14:42:40 -0700
 </div>
 </div>
 </body>
diff --git a/rev-list-options.adoc b/rev-list-options.adoc
index 1c403c1..d38875e 100644
--- a/rev-list-options.adoc
+++ b/rev-list-options.adoc
@@ -361,6 +361,30 @@
 --progress=<header>::
 	Show progress reports on stderr as objects are considered. The
 	`<header>` text will be printed with each progress update.
+
+-z::
+	Instead of being newline-delimited, each outputted object and its
+	accompanying metadata is delimited using NUL bytes. Output is printed
+	in the following form:
++
+-----------------------------------------------------------------------
+<OID> NUL [<token>=<value> NUL]...
+-----------------------------------------------------------------------
++
+Additional object metadata, such as object paths or boundary objects, is
+printed using the `<token>=<value>` form. Token values are printed as-is
+without any encoding/truncation. An OID entry never contains a '=' character
+and thus is used to signal the start of a new object record. Examples:
++
+-----------------------------------------------------------------------
+<OID> NUL
+<OID> NUL path=<path> NUL
+<OID> NUL boundary=yes NUL
+<OID> NUL missing=yes NUL [<token>=<value> NUL]...
+-----------------------------------------------------------------------
++
+This mode is only compatible with the `--objects`, `--boundary`, and
+`--missing` output options.
 endif::git-rev-list[]
 
 History Simplification