]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
6 weeks agoMerge branch 'je/doc-add'
Junio C Hamano [Fri, 12 Sep 2025 17:41:18 +0000 (10:41 -0700)] 
Merge branch 'je/doc-add'

Documentation for "git add" has been updated.

* je/doc-add:
  doc: rephrase the purpose of the staging area
  doc: git-add: simplify discussion of ignored files
  doc: git-add: clarify intro & add an example

6 weeks agoMerge branch 'master' of https://github.com/j6t/git-gui
Junio C Hamano [Wed, 10 Sep 2025 21:28:23 +0000 (14:28 -0700)] 
Merge branch 'master' of https://github.com/j6t/git-gui

* 'master' of https://github.com/j6t/git-gui:
  git-gui: sync Makefiles with git.git
  git-gui: fix error handling of Revert Changes command
  git-gui--askyesno (mingw): use Git for Windows' icon, if available
  git-gui--askyesno: allow overriding the window title
  git gui: set GIT_ASKPASS=git-gui--askpass if not set yet
  git-gui: provide question helper for retry fallback on Windows
  git-gui: simplify using nice(1)
  git-gui: simplify PATH de-duplication

6 weeks agoMerge branch 'master' of https://github.com/j6t/gitk
Junio C Hamano [Wed, 10 Sep 2025 21:27:52 +0000 (14:27 -0700)] 
Merge branch 'master' of https://github.com/j6t/gitk

* 'master' of https://github.com/j6t/gitk:
  gitk: add README with usage, build, and contribution details
  gitk: fix trackpad scrolling for Tcl/Tk 8.7+
  gitk: use <Button-3> for ctx menus on macOS with Tcl 8.7+

6 weeks agoThe seventh batch
Junio C Hamano [Mon, 8 Sep 2025 21:54:20 +0000 (14:54 -0700)] 
The seventh batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
6 weeks agoMerge branch 'tc/last-modified'
Junio C Hamano [Mon, 8 Sep 2025 21:54:35 +0000 (14:54 -0700)] 
Merge branch 'tc/last-modified'

A new command "git last-modified" has been added to show the closest
ancestor commit that touched each path.

* tc/last-modified:
  last-modified: use Bloom filters when available
  t/perf: add last-modified perf script
  last-modified: new subcommand to show when files were last modified

6 weeks agoMerge branch 'ds/ls-files-lazy-unsparse'
Junio C Hamano [Mon, 8 Sep 2025 21:54:34 +0000 (14:54 -0700)] 
Merge branch 'ds/ls-files-lazy-unsparse'

"git ls-files <pathspec>..." should not necessarily have to expand
the index fully if a sparsified directory is excluded by the
pathspec; the code is taught to expand the index on demand to avoid
this.

* ds/ls-files-lazy-unsparse:
  ls-files: conditionally leave index sparse

6 weeks agoMerge branch 'ds/path-walk-repack-fix'
Junio C Hamano [Mon, 8 Sep 2025 21:54:34 +0000 (14:54 -0700)] 
Merge branch 'ds/path-walk-repack-fix'

"git repack --path-walk" lost objects in some corner cases, which
has been corrected.

* ds/path-walk-repack-fix:
  path-walk: create initializer for path lists
  path-walk: fix setup of pending objects

6 weeks agoMerge branch 'am/xdiff-hash-tweak'
Junio C Hamano [Mon, 8 Sep 2025 21:54:34 +0000 (14:54 -0700)] 
Merge branch 'am/xdiff-hash-tweak'

Inspired by Ezekiel's recent effort to showcase Rust interface, the
hash function implementation used to hash lines have been updated
to the one used for ELF symbol lookup by Glibc.

* am/xdiff-hash-tweak:
  xdiff: optimize xdl_hash_record_verbatim
  xdiff: refactor xdl_hash_record()

6 weeks agoMerge branch 'da/cargo-serialize'
Junio C Hamano [Mon, 8 Sep 2025 21:54:33 +0000 (14:54 -0700)] 
Merge branch 'da/cargo-serialize'

Makefile tried to run multiple "cargo build" which would not work
very well; serialize their execution to work it around.

* da/cargo-serialize:
  Makefile: build libgit-rs and libgit-sys serially

7 weeks agogit-gui: sync Makefiles with git.git
Adam Dinwoodie [Sat, 15 Feb 2025 21:19:03 +0000 (21:19 +0000)] 
git-gui: sync Makefiles with git.git

In git.git, commit 5309c1e9fb39 (Makefile: set default goals in
makefiles, 2025-02-15) touched two Makefiles in the git-git/ directory.
Import these changes, so that the trees can converge again with the
next merge of this repository into git.git.

Reported-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
7 weeks agoMerge branch 'ml/misc-simplifications'
Johannes Sixt [Sat, 6 Sep 2025 09:59:19 +0000 (11:59 +0200)] 
Merge branch 'ml/misc-simplifications'

* ml/misc-simplifications:
  git-gui: simplify using nice(1)
  git-gui: simplify PATH de-duplication

7 weeks agoMerge branch 'js/ask-yesno'
Johannes Sixt [Sat, 6 Sep 2025 09:59:09 +0000 (11:59 +0200)] 
Merge branch 'js/ask-yesno'

* js/ask-yesno:
  git-gui--askyesno (mingw): use Git for Windows' icon, if available
  git-gui--askyesno: allow overriding the window title
  git gui: set GIT_ASKPASS=git-gui--askpass if not set yet
  git-gui: provide question helper for retry fallback on Windows

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
7 weeks agoThe sixth batch
Junio C Hamano [Tue, 2 Sep 2025 15:20:31 +0000 (08:20 -0700)] 
The sixth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
7 weeks agoMerge branch 'ds/doc-ggg-pr-fork-clarify'
Junio C Hamano [Tue, 2 Sep 2025 15:21:27 +0000 (08:21 -0700)] 
Merge branch 'ds/doc-ggg-pr-fork-clarify'

Update the instruction to use of GGG in the MyFirstContribution
document to say that a GitHub PR could be made against `git/git`
instead of `gitgitgadget/git`.

* ds/doc-ggg-pr-fork-clarify:
  doc: clarify which remotes can be used with GitGitGadget

7 weeks agoMerge branch 'js/doc-sending-patch-via-thunderbird'
Junio C Hamano [Tue, 2 Sep 2025 15:21:26 +0000 (08:21 -0700)] 
Merge branch 'js/doc-sending-patch-via-thunderbird'

Doc update.

* js/doc-sending-patch-via-thunderbird:
  doc/format-patch: adjust Thunderbird MUA hint to new add-on

7 weeks agoMerge branch 'kh/doc-config-typofix'
Junio C Hamano [Tue, 2 Sep 2025 15:21:26 +0000 (08:21 -0700)] 
Merge branch 'kh/doc-config-typofix'

Documentation typofix.

* kh/doc-config-typofix:
  doc: config: replace backtick with apostrophe for possessive

7 weeks agoMerge branch 'kh/doc-interpret-trailers-markup-fix'
Junio C Hamano [Tue, 2 Sep 2025 15:21:25 +0000 (08:21 -0700)] 
Merge branch 'kh/doc-interpret-trailers-markup-fix'

Fix missing single-quote pairs in a documentation page.

* kh/doc-interpret-trailers-markup-fix:
  doc: interpret-trailers: close all pairs of single quotes

7 weeks agoMerge branch 'ja/asciidoc-doctor-verbatim-fixes'
Junio C Hamano [Tue, 2 Sep 2025 15:21:25 +0000 (08:21 -0700)] 
Merge branch 'ja/asciidoc-doctor-verbatim-fixes'

Doc mark-up fix.

* ja/asciidoc-doctor-verbatim-fixes:
  doc: fix asciidoc format compatibility in pretty-formats.adoc

7 weeks agogit-gui: fix error handling of Revert Changes command
Johannes Sixt [Mon, 1 Sep 2025 18:20:08 +0000 (20:20 +0200)] 
git-gui: fix error handling of Revert Changes command

The command Revert Changes has two different erroneous behaviors
depending on the Tcl version used.

The command uses a "chord" facility where different "notes" are
evaluated asynchronously and any error is reported after all of them
have finished. The intent is that a private namespace is used where
the notes can store the error state. Tcl 9 changed namespace handling
in a subtle way, as https://www.tcl-lang.org/software/tcltk/9.0.html
summarizes under "Notable incompatibilities":

    Unqualified varnames resolved in current namespace, not global.
    Note that in almost all cases where this causes a change, the
    change is actually the removal of a latent bug.

And that's exactly what happens here.

- Under Tcl 9:

  - When the command operates without any errors, the variable `err`
    is never set. When the error handler wants to inspect `err` (in
    the correct private namespace), it does not find it and a Tcl
    error about an unset variable occurs. Incidentally, this is also
    the case when the user cancels the operation with the option
    "Do Nothing"!

    On the other hand, when an error occurs during the operation, `err`
    is set and found as intended.

  Check for the existence of the variable `err` before the attempt to
  read it.

- Under Tcl 8.6:

  The error handler looks up `err` in the global namespace, which is
  bogus and unintended. The variable is set due to the many
  `catch ... err` that occur during startup in the global namespace.

  - When the command operates without any errors, the error handler
    finds the global `err`, which happens to be the empty string at
    this point, and no error is reported.

    On the other hand, when an error occurs during the operation, the
    global `err` is set and found, so that an error is reported as
    desired.

    However, the value of `err` persists in the global namespace. When
    the command is repeated, an error is reported again, even if there
    was actually no error, and even "Do Nothing" was used to cancel
    the operation.

  Clear the global `err` before the operation begins.

The lingering error message is not a problem under Tcl 9, because a
prestine namespace is established every time the command is used.

This fixes https://github.com/j6t/git-gui/issues/21.

Helped-by: Igor Stepushchik
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
8 weeks agodoc: rephrase the purpose of the staging area
Julia Evans [Fri, 29 Aug 2025 11:55:02 +0000 (11:55 +0000)] 
doc: rephrase the purpose of the staging area

Git does not really "store the contents of the next commit"
anywhere; rather, you the user use the index to prepare it.

Signed-off-by: Julia Evans <julia@jvns.ca>
[jc; made the change relative to what is already in 'next']
Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agoThe fifth batch
Junio C Hamano [Fri, 29 Aug 2025 16:43:39 +0000 (09:43 -0700)] 
The fifth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agoMerge branch 'js/doc-gitk-history'
Junio C Hamano [Fri, 29 Aug 2025 16:44:38 +0000 (09:44 -0700)] 
Merge branch 'js/doc-gitk-history'

Manual page for "gitk" is updated with the current maintainer's
name.

* js/doc-gitk-history:
  doc/gitk: update reference to the external project

8 weeks agoMerge branch 'jk/describe-blob'
Junio C Hamano [Fri, 29 Aug 2025 16:44:37 +0000 (09:44 -0700)] 
Merge branch 'jk/describe-blob'

"git describe <blob>" misbehaves and/or crashes in some corner
cases, which has been taught to exit with failure gracefully.

* jk/describe-blob:
  describe: pass commit to describe_commit()
  describe: handle blob traversal with no commits
  describe: catch unborn branch in describe_blob()
  describe: error if blob not found
  describe: pass oid struct by const pointer

8 weeks agoMerge branch 'jk/no-clobber-dangling-symref-with-fetch'
Junio C Hamano [Fri, 29 Aug 2025 16:44:37 +0000 (09:44 -0700)] 
Merge branch 'jk/no-clobber-dangling-symref-with-fetch'

"git fetch" can clobber a symref that is dangling when the
remote-tracking HEAD is set to auto update, which has been
corrected.

* jk/no-clobber-dangling-symref-with-fetch:
  refs: do not clobber dangling symrefs
  t5510: prefer "git -C" to subshell for followRemoteHEAD tests
  t5510: stop changing top-level working directory
  t5510: make confusing config cleanup more explicit

8 weeks agoMerge branch 'ds/doc-community-discord'
Junio C Hamano [Fri, 29 Aug 2025 16:44:36 +0000 (09:44 -0700)] 
Merge branch 'ds/doc-community-discord'

Discord has been added to the first contribution documentation as
another way to ask for help.

* ds/doc-community-discord:
  doc: add discord to ways of getting help

8 weeks agoMerge branch 'ps/reftable-libgit2-cleanup'
Junio C Hamano [Fri, 29 Aug 2025 16:44:36 +0000 (09:44 -0700)] 
Merge branch 'ps/reftable-libgit2-cleanup'

Code clean-ups.

* ps/reftable-libgit2-cleanup:
  refs/reftable: always reload stacks when creating lock
  reftable: don't second-guess errors from flock interface
  reftable/stack: handle outdated stacks when compacting
  reftable/stack: allow passing flags to `reftable_stack_add()`
  reftable/stack: fix compiler warning due to missing braces
  reftable/stack: reorder code to avoid forward declarations
  reftable/writer: drop Git-specific `QSORT()` macro
  reftable/writer: fix type used for number of records

8 weeks agoMerge branch 'ad/t1517-short-help-tests-fix'
Junio C Hamano [Fri, 29 Aug 2025 16:44:35 +0000 (09:44 -0700)] 
Merge branch 'ad/t1517-short-help-tests-fix'

Test fix.

* ad/t1517-short-help-tests-fix:
  t/t1517: mark tests that fail with GIT_TEST_INSTALLED

8 weeks agolast-modified: use Bloom filters when available
Toon Claes [Tue, 5 Aug 2025 09:33:58 +0000 (11:33 +0200)] 
last-modified: use Bloom filters when available

Our 'git last-modified' performs a revision walk, and computes a diff at
each point in the walk to figure out whether a given revision changed
any of the paths it considers interesting.

When changed-path Bloom filters are available, we can avoid computing
many such diffs. Before computing a diff, we first check if any of the
remaining paths of interest were possibly changed at a given commit by
consulting its Bloom filter. If any of them are, we are resigned to
compute the diff.

If none of those queries returned "maybe", we know that the given commit
doesn't contain any changed paths which are interesting to us. So, we
can avoid computing it in this case.

Comparing the perf test results on git.git:

    Test                                        HEAD~             HEAD
    ------------------------------------------------------------------------------------
    8020.1: top-level last-modified             4.49(4.34+0.11)   2.22(2.05+0.09) -50.6%
    8020.2: top-level recursive last-modified   5.64(5.45+0.11)   5.62(5.30+0.11) -0.4%
    8020.3: subdir last-modified                0.11(0.06+0.04)   0.07(0.03+0.04) -36.4%

Based-on-patch-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agot/perf: add last-modified perf script
Toon Claes [Tue, 5 Aug 2025 09:33:57 +0000 (11:33 +0200)] 
t/perf: add last-modified perf script

This just runs some simple last-modified commands. We already test
correctness in the regular suite, so this is just about finding
performance regressions from one version to another.

Based-on-patch-by: Jeff King <peff@peff.net>
Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agolast-modified: new subcommand to show when files were last modified
Toon Claes [Tue, 5 Aug 2025 09:33:56 +0000 (11:33 +0200)] 
last-modified: new subcommand to show when files were last modified

Similar to git-blame(1), introduce a new subcommand
git-last-modified(1). This command shows the most recent modification to
paths in a tree. It does so by expanding the tree at a given commit,
taking note of the current state of each path, and then walking
backwards through history looking for commits where each path changed
into its final commit ID.

Based-on-patch-by: Jeff King <peff@peff.net>
Improved-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agogit-gui--askyesno (mingw): use Git for Windows' icon, if available
Johannes Schindelin [Thu, 28 Aug 2025 08:58:50 +0000 (08:58 +0000)] 
git-gui--askyesno (mingw): use Git for Windows' icon, if available

This provides a unified look-and-feel in Git for Windows.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
8 weeks agogit-gui--askyesno: allow overriding the window title
Johannes Schindelin [Thu, 28 Aug 2025 08:58:49 +0000 (08:58 +0000)] 
git-gui--askyesno: allow overriding the window title

"Question?" is maybe not the most informative thing to ask. In the
absence of better information, it is the best we can do, of course.

However, Git for Windows' auto updater just learned the trick to use
git-gui--askyesno to ask the user whether to update now or not. And in
this scripted scenario, we can easily pass a command-line option to
change the window title.

So let's support that with the new `--title <title>` option.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
8 weeks agogit gui: set GIT_ASKPASS=git-gui--askpass if not set yet
Johannes Schindelin [Thu, 28 Aug 2025 08:58:48 +0000 (08:58 +0000)] 
git gui: set GIT_ASKPASS=git-gui--askpass if not set yet

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
8 weeks agogit-gui: provide question helper for retry fallback on Windows
Heiko Voigt [Thu, 28 Aug 2025 08:58:47 +0000 (08:58 +0000)] 
git-gui: provide question helper for retry fallback on Windows

Make use of the new environment variable GIT_ASK_YESNO to support the
recently implemented fallback in case unlink, rename or rmdir fail for
files in use on Windows. The added dialog will present a yes/no question
to the the user which will currently be used by the windows compat layer
to let the user retry a failed file operation.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
8 weeks agoThe fourth batch
Junio C Hamano [Thu, 28 Aug 2025 18:28:26 +0000 (11:28 -0700)] 
The fourth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agoMerge branch 'bc/doc-compat-object-format-not-working'
Junio C Hamano [Thu, 28 Aug 2025 18:28:58 +0000 (11:28 -0700)] 
Merge branch 'bc/doc-compat-object-format-not-working'

The compatObjectFormat extension is used to hide an incomplete
feature that is not yet usable for any purpose other than
developing the feature further.  Document it as such to discourage
its use by mere mortals.

* bc/doc-compat-object-format-not-working:
  docs: note that extensions.compatobjectformat is incomplete

8 weeks agoMerge branch 'jk/fetch-check-graph-objects-fix'
Junio C Hamano [Thu, 28 Aug 2025 18:28:58 +0000 (11:28 -0700)] 
Merge branch 'jk/fetch-check-graph-objects-fix'

Under a race against another process that is repacking the
repository, especially a partially cloned one, "git fetch" may
mistakenly think some objects we do have are missing, which has
been corrected.

* jk/fetch-check-graph-objects-fix:
  fetch-pack: re-scan when double-checking graph objects

8 weeks agoMerge branch 'sg/line-log-merge-optim'
Junio C Hamano [Thu, 28 Aug 2025 18:28:57 +0000 (11:28 -0700)] 
Merge branch 'sg/line-log-merge-optim'

"git log -L..." compared trees of multiple parents with the tree of the
merge result in an unnecessarily inefficient way.

* sg/line-log-merge-optim:
  line-log: simplify condition checking for merge commits
  line-log: initialize diff queue in process_ranges_ordinary_commit()
  line-log: get rid of the parents array in process_ranges_merge_commit()
  line-log: avoid unnecessary tree diffs when processing merge commits

8 weeks agoMerge branch 'js/progress-delay-fix'
Junio C Hamano [Thu, 28 Aug 2025 18:28:57 +0000 (11:28 -0700)] 
Merge branch 'js/progress-delay-fix'

The start_delayed_progress() function in the progress eye-candy API
did not clear its internal state, making an initial delay value
larger than 1 second ineffective, which has been corrected.

* js/progress-delay-fix:
  progress: pay attention to (customized) delay time

8 weeks agoMerge branch 'je/doc-rebase'
Junio C Hamano [Thu, 28 Aug 2025 18:28:57 +0000 (11:28 -0700)] 
Merge branch 'je/doc-rebase'

Documentation for "git rebase" has been updated.

* je/doc-rebase:
  doc: git-rebase: update discussion of internals
  doc: git-rebase: move --onto explanation down
  doc: git rebase: clarify arguments syntax
  doc: git rebase: dedup merge conflict discussion
  doc: git-rebase: start with an example

8 weeks agogitk: add README with usage, build, and contribution details
Michael Rappazzo [Wed, 27 Aug 2025 22:59:56 +0000 (18:59 -0400)] 
gitk: add README with usage, build, and contribution details

Signed-off-by: Michael Rappazzo <rappazzo@gmail.com>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
8 weeks agols-files: conditionally leave index sparse
Derrick Stolee [Fri, 15 Aug 2025 16:12:53 +0000 (16:12 +0000)] 
ls-files: conditionally leave index sparse

When running 'git ls-files' with a pathspec, the index entries get
filtered according to that pathspec before iterating over them in
show_files().  In 78087097b8 (ls-files: add --sparse option,
2021-12-22), this iteration was prefixed with a check for the '--sparse'
option which allows the command to output directory entries; this
created a pre-loop call to ensure_full_index().

However, when a user runs 'git ls-files' where the pathspec matches
directories that are recursively matched in the sparse-checkout, there
are not any sparse directories that match the pathspec so they would not
be written to the output. The expansion in this case is just a
performance drop for no behavior difference.

Replace this global check to expand the index with a check inside the
loop for a matched sparse directory. If we see one, then expand the
index and continue from the current location. This is safe since the
previous entries in the index did not have any sparse directories and
thus would remain stable in this expansion.

A test in t1092 confirms that this changes the behavior.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
8 weeks agoMerge branch 'tk87-touchpad-scroll' of github.com:ZhongRuoyu/gitk
Johannes Sixt [Wed, 27 Aug 2025 18:52:35 +0000 (20:52 +0200)] 
Merge branch 'tk87-touchpad-scroll' of github.com:ZhongRuoyu/gitk

* 'tk87-touchpad-scroll' of github.com:ZhongRuoyu/gitk:
  gitk: fix trackpad scrolling for Tcl/Tk 8.7+

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2 months agogitk: fix trackpad scrolling for Tcl/Tk 8.7+
Ruoyu Zhong [Wed, 27 Aug 2025 02:12:19 +0000 (10:12 +0800)] 
gitk: fix trackpad scrolling for Tcl/Tk 8.7+

TIP 684 [1] introduced TouchpadScroll events in Tcl/Tk 8.7, separating
trackpad gestures from traditional MouseWheel events. This broke
trackpad scrolling in gitk where trackpads generate TouchpadScroll
events instead of MouseWheel events.

Fix that by adding TouchpadScroll event bindings for all scrollable
widgets following the TIP 684 specification. Implement a new
precisescrollval proc to handle the smaller delta values from
TouchpadScroll events, using appropriate scaling factors that seem
sensible on my MacBook.

Fixes https://github.com/j6t/gitk/issues/31.

[1]: https://core.tcl-lang.org/tips/doc/main/tip/684.md

Signed-off-by: Ruoyu Zhong <zhongruoyu@outlook.com>
2 months agoMakefile: build libgit-rs and libgit-sys serially
David Aguilar [Tue, 26 Aug 2025 23:35:25 +0000 (16:35 -0700)] 
Makefile: build libgit-rs and libgit-sys serially

"make -JN" with INCLUDE_LIBGIT_RS enabled causes cargo lock warnings
and can trigger ld errors during the build.

The build errors are caused by two inner "make" invocations getting
triggered concurrently: once inside of libgit-sys and another inside of
libgit-rs.

Make libgit-rs depend on libgit-sys so that "make" prevents them
from running concurrently. Apply the same logic to the test invocations.
Use cargo's "--manifest-path" option instead of "cd" in the recipes.

Signed-off-by: David Aguilar <davvid@gmail.com>
Acked-by: Kyle Lippincott <spectral@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'aqua-ctxbut' of github.com:ZhongRuoyu/gitk
Johannes Sixt [Tue, 26 Aug 2025 17:22:08 +0000 (19:22 +0200)] 
Merge branch 'aqua-ctxbut' of github.com:ZhongRuoyu/gitk

* 'aqua-ctxbut' of github.com:ZhongRuoyu/gitk:
  gitk: use <Button-3> for ctx menus on macOS with Tcl 8.7+

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2 months agodocs: note that extensions.compatobjectformat is incomplete
brian m. carlson [Mon, 25 Aug 2025 22:11:01 +0000 (22:11 +0000)] 
docs: note that extensions.compatobjectformat is incomplete

The compatibility object format is only implemented for loose objects,
not packed objects, so anyone attempting to push or fetch data into a
repository with this option will likely not see it work as expected.  In
addition, the underlying storage of loose object mapping is likely to
change because the current format is inefficient and does not handle
important mapping information such as that of submodules.

It would have been preferable to initially document that this was not
yet ready for prime time, but we did not do so.  We hinted at the fact
that this functionality is incomplete in the description, but did not
say so explicitly.  Let's do so now: indicate that this feature is
incomplete and subject to change and that the option is not designed to
be used by end users.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoprogress: pay attention to (customized) delay time
Johannes Sixt [Mon, 25 Aug 2025 19:16:12 +0000 (21:16 +0200)] 
progress: pay attention to (customized) delay time

Using one of the start_delayed_*() functions, clients of the progress
API can request that a progress meter is only shown after some time.
To do that, the implementation intends to count down the number of
seconds stored in struct progress by observing flag progress_update,
which the timer interrupt handler sets when a second has elapsed. This
works during the first second of the delay. But the code forgets to
reset the flag to zero, so that subsequent calls of display_progress()
think that another second has elapsed and decrease the count again
until zero is reached. Due to the frequency of the calls, this happens
without an observable delay in practice, so that the effective delay is
always just one second.

This bug has been with us since the inception of the feature. Despite
having been touched on various occasions, such as 8aade107dd84
(progress: simplify "delayed" progress API), 9c5951cacf5c (progress:
drop delay-threshold code), and 44a4693bfcec (progress: create
GIT_PROGRESS_DELAY), the short delay went unnoticed.

Copy the flag state into a local variable and reset the global flag
right away so that we can detect the next clock tick correctly.

Since we have not had any complaints that the delay of one second is
too short nor that GIT_PROGRESS_DELAY is ignored, people seem to be
comfortable with the status quo. Therefore, set the default to 1 to
keep the current behavior.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoThe third batch
Junio C Hamano [Mon, 25 Aug 2025 21:21:40 +0000 (14:21 -0700)] 
The third batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'lo/repo-info'
Junio C Hamano [Mon, 25 Aug 2025 21:22:03 +0000 (14:22 -0700)] 
Merge branch 'lo/repo-info'

A new subcommand "git repo" gives users a way to grab various
repository characteristics.

* lo/repo-info:
  repo: add the --format flag
  repo: add the field layout.shallow
  repo: add the field layout.bare
  repo: add the field references.format
  repo: declare the repo command

2 months agoMerge branch 'ps/commit-graph-wo-globals'
Junio C Hamano [Mon, 25 Aug 2025 21:22:03 +0000 (14:22 -0700)] 
Merge branch 'ps/commit-graph-wo-globals'

Remove dependency on the_repository and other globals from the
commit-graph code, and other changes unrelated to de-globaling.

* ps/commit-graph-wo-globals:
  commit-graph: stop passing in redundant repository
  commit-graph: stop using `the_repository`
  commit-graph: stop using `the_hash_algo`
  commit-graph: refactor `parse_commit_graph()` to take a repository
  commit-graph: store the hash algorithm instead of its length
  commit-graph: stop using `the_hash_algo` via macros

2 months agoMerge branch 'ds/doc-count-objects-fix'
Junio C Hamano [Mon, 25 Aug 2025 21:22:03 +0000 (14:22 -0700)] 
Merge branch 'ds/doc-count-objects-fix'

Docfix.

* ds/doc-count-objects-fix:
  count-objects: document count-objects pack

2 months agoMerge branch 'dk/t7005-editor-updates'
Junio C Hamano [Mon, 25 Aug 2025 21:22:02 +0000 (14:22 -0700)] 
Merge branch 'dk/t7005-editor-updates'

Test clean-up.

* dk/t7005-editor-updates:
  t7005: sanitize test environment for subsequent tests
  t7005: stop abusing --exec-path
  t7005: use modern test style

2 months agoMerge branch 'ja/doc-lint-sections-and-synopsis'
Junio C Hamano [Mon, 25 Aug 2025 21:22:01 +0000 (14:22 -0700)] 
Merge branch 'ja/doc-lint-sections-and-synopsis'

Doc lint updates to encourage the newer and easier-to-use
`synopsis` format, with fixes to a handful of existing uses.

* ja/doc-lint-sections-and-synopsis:
  doc lint: check that synopsis manpages have synopsis inlines
  doc:git-for-each-ref: fix styling and typos
  doc: check for absence of the form --[no-]parameter
  doc: check for absence of multiple terms in each entry of desc list
  doc: check well-formedness of delimited sections
  doc: test linkgit macros for well-formedness

2 months agoMerge branch 'tc/diff-tree-max-depth'
Junio C Hamano [Mon, 25 Aug 2025 21:22:00 +0000 (14:22 -0700)] 
Merge branch 'tc/diff-tree-max-depth'

"git diff-tree" learned "--max-depth" option.

* tc/diff-tree-max-depth:
  diff: teach tree-diff a max-depth parameter
  within_depth: fix return for empty path
  combine-diff: zero memory used for callback filepairs

2 months agoMerge branch 'dk/help-all'
Junio C Hamano [Mon, 25 Aug 2025 21:22:00 +0000 (14:22 -0700)] 
Merge branch 'dk/help-all'

"git cmd --help-all" now works outside repositories.

* dk/help-all:
  builtin: also setup gently for --help-all
  parse-options: refactor flags for usage_with_options_internal

2 months agodoc: config: replace backtick with apostrophe for possessive
Kristoffer Haugsbakk [Sun, 24 Aug 2025 19:46:51 +0000 (21:46 +0200)] 
doc: config: replace backtick with apostrophe for possessive

Revert back to “Git's” which was used before d30c5cc4592 (doc: convert
git-mergetool options to new synopsis style, 2025-05-25) accidentally
changed it.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agofetch-pack: re-scan when double-checking graph objects
Jeff King [Sun, 24 Aug 2025 05:00:40 +0000 (01:00 -0400)] 
fetch-pack: re-scan when double-checking graph objects

The fetch code tries to avoid asking the remote side for an object we
already have. It does this by traversing recent commits reachable from
our refs looking for matches. Commit 5d4cc78f72 (fetch-pack: die if in
commit graph but not obj db, 2024-11-05) introduced an extra check
there: if we think we have an object because it's in the commit graph,
we double-check that we actually have it in our object database with a
call to odb_has_object().

But that call does not pass any flags, and so the function won't call
reprepared_packed_git() if it does not find the object. That opens us up
to the usual race against some other process repacking the odb:

  1. We scan the list of packs in objects/pack but haven't yet opened them.

  2. Somebody else packs the object into a new pack (which we don't know
     about), and deletes the old pack it was in.

  3. Our odb_has_object() calls tries to open that old pack, but finds it
     is gone. We declare that we don't have the object.

And this causes us to erroneously complain and abort the fetch, thinking
our commit-graph and object database are out of sync. Instead, we should
pass HAS_OBJECT_RECHECK_PACKED, which will add a new step:

  4. We re-scan the pack directory again, find the new pack, and locate
     the object.

Often the fetch code tries to avoid these kinds of re-scans if it's
likely that we won't have the object. If the other side has told us
about object X and we want to know if we have it, we'll skip the re-scan
(to avoid spending a lot of effort when there are many such objects). We
can accept the racy false negative in that case because the worst case
is that we ask the other side to send us the object.

But this is not one of those cases. These are objects which are
accessible from _our_ refs, and which we already found in the commit
graph file. We should have them, and if we don't, we'll die()
immediately. So the performance impact is negligible, and getting the
right answer is important.

There's no test here because it's inherently racy. In fact, I had
trouble even developing a minimal test. The problem seen in the wild can
be produced like this:

  # Any git.git mirror which supports partial clones; I think this
  # should work with any repo that contains submodules, but note that
  # $obj below is specific to this repo
  url=https://github.com/git/git.git

  # This is a commit that is not at the tip of any branches (so after
  # we have it, we'll still have some commits to fetch).
  obj=cf6f63ea6bf35173e02e18bdc6a4ba41288acff9

  git init
  git fetch --filter=tree:0 $url $obj:refs/heads/foo
  git checkout foo
  git commit-graph write --reachable
  git fetch $url

What happens here is that the initial fetch grabs that older commit (and
its ancestors) but no trees or blobs, and the subsequent checkout grabs
the necessary trees and blobs just for that commit. The final fetch
spawns a long sequence of child fetches due to fetch_submodules(), which
wants to check whether there have been any gitlink modifications which
should trigger a fetch of the related submodule (we'll leave aside the
irony that we did not even check out any submodules yet).

That series of fetches causes us to accumulate packs, which eventually
triggers background maintenance to run. That repacks all-into-one, and
the pack containing $obj goes away in favor of a new pack. And then the
fetch eventually fails with:

  fatal: You are attempting to fetch cf6f63ea6bf35173e02e18bdc6a4ba41288acff9, which is in the commit graph file but
not in the object database.

In the scenario above, the race becomes likely because of the long
series of quick fetches. But I _think_ the bug is independent of partial
clones entirely, and you could run into the same thing with a single
fetch, some other process running "git repack" simultaneously, and a bit
of bad luck. I haven't been able to reproduce, though. I'm not sure if
that's because there's some mis-analysis above, or if the race window is
just small enough that it's hard to trigger.

At any rate, re-scanning here seems like an obviously correct thing to
do with no downside, and it does fix the partial-clone case shown above.

Reported-by: Дилян Палаузов <dilyan.palauzov@aegee.org>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc/format-patch: adjust Thunderbird MUA hint to new add-on
Johannes Sixt [Fri, 22 Aug 2025 18:52:24 +0000 (20:52 +0200)] 
doc/format-patch: adjust Thunderbird MUA hint to new add-on

There are three tips how to compose a non-line-wrapped patch with
Thunderbird. The first one suggests use of an add-on. The one
referenced has long been superseded by a different one. Update the
link to the new one. Mention that additional configuration is
required to make the add-on work.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: clarify which remotes can be used with GitGitGadget
Daniele Sassoli [Sat, 23 Aug 2025 09:12:11 +0000 (09:12 +0000)] 
doc: clarify which remotes can be used with GitGitGadget

The docs mostly point to using git/git as one's remote, however, when it
comes to Sending a PR to GitGitGadget section, the reader is told to use
gitgitgadget/git, with no mention of git/git, potentially leading to
some confusion.

Clarify that both gitgitgadget/git and git/git can be used, albeit with
some differences.

Signed-off-by: Daniele Sassoli <danielesassoli@gmail.com>
Acked-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agopath-walk: create initializer for path lists
Derrick Stolee [Mon, 25 Aug 2025 12:49:57 +0000 (12:49 +0000)] 
path-walk: create initializer for path lists

The previous change fixed a bug in 'git repack -adf --path-walk' that
was due to an update to how path lists are initialized and missing some
important cases when processing the pending objects.

This change takes the three critical places where path lists are
initialized and combines them into a static method. This simplifies the
callers somewhat while also helping to avoid a missed update in the
future.

The other places where a path list (struct type_and_oid_list) is
initialized is for the following "fixed" lists:

 * Tag objects.
 * Commit objects.
 * Root trees.
 * Tagged trees.
 * Tagged blobs.

These lists are created and consumed in different ways, with only the
root trees being passed into the logic that cares about the
"maybe_interesting" bit. It is appropriate to keep these uses separate.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agopath-walk: fix setup of pending objects
Derrick Stolee [Mon, 25 Aug 2025 12:49:56 +0000 (12:49 +0000)] 
path-walk: fix setup of pending objects

Users reported an issue where objects were missing from their local
repositories after a full repack using 'git repack -adf --path-walk'.
This was alarming and took a while to create a reproducer. Here, we fix
the bug and include a test case that would fail without this fix.

The root cause is that certain objects existed in the index and had no
second versions. These objects are usually blobs, though trees can be
included if a cache-tree exists. The issue is that the revision walk
adds these objects to the "pending" list and the path-walk API forgets
to mark the lists it creates at this point as "maybe_interesting". If
these paths only ever have a single version in the history of the repo
(including the current staged version) then the parent directory never
tries to add a new object to the list and mark the list as
"maybe_interesting". Thus, when walking the list later, the group is
skipped as it is expected that no objects are interesting. This happens
even when there are actually no UNINTERESTING objects at all! This is
based on the optimization enabled by the pack.useSparse=true config
option, which is the default.

Thus, we create a test case that demonstrates the many cases of this
issue for reproducibility:

 1. File a/b/c has only one committed version.
 2. Files a/i and x/y only exist as staged changes.
 3. Tree x/ only exists in the cache-tree.

After performing a non-path-walk repack to force all loose objects into
packfiles, run a --path-walk repack followed by 'git fsck'. This fsck is
what fails with the following errors:

  error: invalid object 100644 f2e41136... for 'a/b/c'

    This is the dropped instance of the single-versioned a/b/c file.

  broken link from    tree cfda31d8...
                to    tree 3f725fcd...

    This is the missing tree for the single-versioned a/b/ directory.

  missing blob 0ddf2bae... (a/i)
  missing blob 975fbec8... (x/y)
  missing blob a60d869d... (file)
  missing blob f2e41136... (a/b/c)

  missing tree 3f725fcd... (a/b/)

  dangling tree 5896d7e... (staged root tree)

Note that since the staged root tree is missing, the fsck output cannot
even report that the staged x/ tree is missing as well.

The core problem here is that the "maybe_interesting" member of 'struct
type_and_oid_list' is not initialized to '1'. This member was added in
6333e7ae0b (path-walk: mark trees and blobs as UNINTERESTING,
2024-12-20) in a way to help when creating packfiles for a small commit
range using the sparse path algorithm (enabled by pack.useSparse=true).

The idea here is that the list is marked as "maybe_interesting" if an
object is added that does not have the UNINTERESTING flag on it. Later,
this is checked again in case all objects in the list were marked
UNINTERESTING after that point in time. In this case, the algorithm
skips the list as there is no reason to visit it.

This leads to the problem where the "maybe_interesting" member was not
appropriately initialized when the list is created from pending objects.
Initializing this in the correct places fixes the bug.

To reduce risk of similar bugs around initializing this structure, a
follow-up change will make initializing lists use a shared method.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoline-log: simplify condition checking for merge commits
SZEDER Gábor [Sun, 24 Aug 2025 19:06:44 +0000 (21:06 +0200)] 
line-log: simplify condition checking for merge commits

In process_ranges_arbitrary_commit() the condition deciding whether
the given commit is not a merge, i.e. that it doesn't have more than
one parent, is head-scratchingly backwards, flip it.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoline-log: initialize diff queue in process_ranges_ordinary_commit()
SZEDER Gábor [Sun, 24 Aug 2025 19:06:43 +0000 (21:06 +0200)] 
line-log: initialize diff queue in process_ranges_ordinary_commit()

process_ranges_ordinary_commit() uses a local diff queue variable,
which it leaves uninitialized before passing its address to
queue_diffs().  This is not an issue, because at the end of that
function the contents of an other diff queue is moved into it by
simply overwriting whatever is in there, i.e. without reading any
uninitialized memory.

Still, seeing the uninitialized diff queue being passed around scared
me more than once, so out of caution let's make sure that it's
initialized.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoline-log: get rid of the parents array in process_ranges_merge_commit()
SZEDER Gábor [Sun, 24 Aug 2025 19:06:42 +0000 (21:06 +0200)] 
line-log: get rid of the parents array in process_ranges_merge_commit()

We can easily iterate through the parents of a merge commit without
turning the list of parents into a dynamically allocated array of
parents, so let's do so.  This way we can avoid a memory allocation
for each processed merge commit, though its effect on runtime seems to
be unmeasurable.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoline-log: avoid unnecessary tree diffs when processing merge commits
SZEDER Gábor [Sun, 24 Aug 2025 19:06:41 +0000 (21:06 +0200)] 
line-log: avoid unnecessary tree diffs when processing merge commits

In process_ranges_merge_commit(), the line-level log first creates an
array of diff queues by iterating over all parents of a merge commit
and computing a tree diff for each.  Then in a second loop it iterates
over those diff queues, and if it finds that none of the interesting
paths were modified in one of them, then it will return early.  This
means that when none of the interesting paths were modified between a
merge and its first parent, then the tree diff between the merge and
its second (Nth...) parent was computed in vain.

Unify these two loops, so when it iterates over all parents of a merge
commit, then it first computes the tree diff between the merge and
that particular parent and then processes the resulting diff queue
right away.  This way we can spare some tree diff computing, thereby
speeding up line-level log in repositories with mergy history:

  # git.git, 25.8% of commits are merges:
  Benchmark 1: ./git_v2.51.0 -C ~/src/git log -L:'lookup_commit(':commit.c v2.51.0
    Time (mean ± σ):      1.001 s ±  0.009 s    [User: 0.906 s, System: 0.095 s]
    Range (min … max):    0.991 s …  1.023 s    10 runs

  Benchmark 2: ./git -C ~/src/git log -L:'lookup_commit(':commit.c v2.51.0
    Time (mean ± σ):     445.5 ms ±   3.4 ms    [User: 358.8 ms, System: 84.3 ms]
    Range (min … max):   440.1 ms … 450.3 ms    10 runs

  Summary
    './git -C ~/src/git log -L:'lookup_commit(':commit.c v2.51.0' ran
      2.25 ± 0.03 times faster than './git_v2.51.0 -C ~/src/git log -L:'lookup_commit(':commit.c v2.51.0'

  # linux.git, 7.5% of commits are merges:
  Benchmark 1: ./git_v2.51.0 -C ~/src/linux.git log -L:build_restore_work_registers:arch/mips/mm/tlbex.c v6.16
    Time (mean ± σ):      3.246 s ±  0.007 s    [User: 2.835 s, System: 0.409 s]
    Range (min … max):    3.232 s …  3.255 s    10 runs

  Benchmark 2: ./git -C ~/src/linux.git log -L:build_restore_work_registers:arch/mips/mm/tlbex.c v6.16
    Time (mean ± σ):      2.467 s ±  0.014 s    [User: 2.113 s, System: 0.353 s]
    Range (min … max):    2.455 s …  2.505 s    10 runs

  Summary
    './git -C ~/src/linux.git log -L:build_restore_work_registers:arch/mips/mm/tlbex.c v6.16' ran
      1.32 ± 0.01 times faster than './git_v2.51.0 -C ~/src/linux.git log -L:build_restore_work_registers:arch/mips/mm/tlbex.c v6.16'

And since now each iteration computes a tree diff and processes its
result, there is no reason to store the diff queues for each merge
parent anymore, so replace that diff queue array with a loop-local
diff queue variable.  With this change the static free_diffqueues()
helper function in 'line-log.c' has no more callers left, remove it.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agogitk: use <Button-3> for ctx menus on macOS with Tcl 8.7+
Ruoyu Zhong [Sun, 24 Aug 2025 10:07:58 +0000 (18:07 +0800)] 
gitk: use <Button-3> for ctx menus on macOS with Tcl 8.7+

Commit d277e89f87fda01daa1e1a35fc1f7118678faa1f added special handling
on macOS (OS X) that makes button 2 the right mouse button. As per TIP
474 [1], Tcl 8.7 has swapped buttons 2 and 3 such that button 3 is made
the right mouse button as in other platforms. Therefore, the logic
should be updated to use button 3 on macOS with Tcl 8.7+.

[1]: https://core.tcl-lang.org/tips/doc/main/tip/474.md

Signed-off-by: Ruoyu Zhong <zhongruoyu@outlook.com>
2 months agodoc: git-rebase: update discussion of internals
Julia Evans [Sat, 23 Aug 2025 00:43:02 +0000 (00:43 +0000)] 
doc: git-rebase: update discussion of internals

- make it clearer that we're talking about a multistep process
- give a more technically accurate description how rebase works with the
  merge backend.
- condense the explanation of how git rebase skips commits with the same
  textual changes into a single bullet point and remove the explanatory
  diagram. Lots of things which are more complicated are already being
  explained without a diagram.
- remove the explanation of how exactly `--fork-point` and `--root`
  work since that information is in the OPTIONS section
- put all discussion of `ORIG_HEAD` inside the note

Signed-off-by: Julia Evans <julia@jvns.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: git-rebase: move --onto explanation down
Julia Evans [Sat, 23 Aug 2025 00:43:01 +0000 (00:43 +0000)] 
doc: git-rebase: move --onto explanation down

There's a very clear explanation with examples of using --onto which is
currently buried in the very long DESCRIPTION section. This moves it to
its own section, so that we can reference the explanation from the
`--onto` option by name.

Signed-off-by: Julia Evans <julia@jvns.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: git rebase: clarify arguments syntax
Julia Evans [Sat, 23 Aug 2025 00:43:00 +0000 (00:43 +0000)] 
doc: git rebase: clarify arguments syntax

Remove duplicate explanation of `git rebase <upstream> <branch>` which
is already explained above.

Signed-off-by: Julia Evans <julia@jvns.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: git rebase: dedup merge conflict discussion
Julia Evans [Sat, 23 Aug 2025 00:42:59 +0000 (00:42 +0000)] 
doc: git rebase: dedup merge conflict discussion

Previously there were two explanations, this combines them both into a
single explanation.

Signed-off-by: Julia Evans <julia@jvns.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: git-rebase: start with an example
Julia Evans [Sat, 23 Aug 2025 00:42:58 +0000 (00:42 +0000)] 
doc: git-rebase: start with an example

- Start with an example that mirrors the example in the `git-merge` man
  page, to make it easier for folks to understand the difference between
  a rebase and a merge.
- Mention that rebase can combine or reorder commits

Signed-off-by: Julia Evans <julia@jvns.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoThe second batch
Junio C Hamano [Fri, 22 Aug 2025 18:38:52 +0000 (11:38 -0700)] 
The second batch

2 months agoMerge branch 'ly/diff-name-only-with-diff-from-content'
Junio C Hamano [Fri, 22 Aug 2025 20:13:22 +0000 (13:13 -0700)] 
Merge branch 'ly/diff-name-only-with-diff-from-content'

Various options to "git diff" that makes comparison ignore certain
aspects of the differences (like "space changes are ignored",
"differences in lines that match these regular expressions are
ignored") did not work well with "--name-only" and friends.

* ly/diff-name-only-with-diff-from-content:
  diff: ensure consistent diff behavior with ignore options

2 months agoMerge branch 'kr/clone-synopsis-fix'
Junio C Hamano [Fri, 22 Aug 2025 20:13:22 +0000 (13:13 -0700)] 
Merge branch 'kr/clone-synopsis-fix'

Doc fix.

* kr/clone-synopsis-fix:
  docs: remove stray bracket from git-clone synopsis

2 months agoMerge branch 'ac/deglobal-fmt-merge-log-config'
Junio C Hamano [Fri, 22 Aug 2025 20:13:21 +0000 (13:13 -0700)] 
Merge branch 'ac/deglobal-fmt-merge-log-config'

Code clean-up.

* ac/deglobal-fmt-merge-log-config:
  builtin/fmt-merge-msg: stop depending on 'the_repository'
  environment: remove the global variable 'merge_log_config'

2 months agoMerge branch 'jc/diff-no-index-in-subdir'
Junio C Hamano [Fri, 22 Aug 2025 20:13:20 +0000 (13:13 -0700)] 
Merge branch 'jc/diff-no-index-in-subdir'

"git diff --no-index" run inside a subdirectory under control of a
Git repository operated at the top of the working tree and stripped
the prefix from the output, and oddballs like "-" (stdin) did not
work correctly because of it.  Correct the set-up by undoing what
the set-up sequence did to cwd and prefix.

* jc/diff-no-index-in-subdir:
  diff: --no-index should ignore the worktree

2 months agoMerge branch 'gh/git-jump-pathname-with-sp'
Junio C Hamano [Fri, 22 Aug 2025 20:13:20 +0000 (13:13 -0700)] 
Merge branch 'gh/git-jump-pathname-with-sp'

"git jump" (in contrib/) fails to parse the diff header correctly
when a file has a space in its name, which has been corrected.

* gh/git-jump-pathname-with-sp:
  git-jump: make `diff` work with filenames containing spaces

2 months agoMerge branch 'ms/refs-list'
Junio C Hamano [Fri, 22 Aug 2025 20:13:20 +0000 (13:13 -0700)] 
Merge branch 'ms/refs-list'

The "list" subcommand of "git refs" acts as a front-end for
"git for-each-ref".

* ms/refs-list:
  t: add test for git refs list subcommand
  t6300: refactor tests to be shareable
  builtin/refs: add list subcommand
  builtin/for-each-ref: factor out core logic into a helper
  builtin/for-each-ref: align usage string with the man page
  doc: factor out common option

2 months agodoc: interpret-trailers: close all pairs of single quotes
Kristoffer Haugsbakk [Fri, 22 Aug 2025 15:20:35 +0000 (17:20 +0200)] 
doc: interpret-trailers: close all pairs of single quotes

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoStart 2.52 cycle, the first batch
Junio C Hamano [Thu, 21 Aug 2025 20:44:52 +0000 (13:44 -0700)] 
Start 2.52 cycle, the first batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agoMerge branch 'ly/changed-path-traversal-with-magic-pathspec'
Junio C Hamano [Thu, 21 Aug 2025 20:47:02 +0000 (13:47 -0700)] 
Merge branch 'ly/changed-path-traversal-with-magic-pathspec'

Revision traversal limited with pathspec, like "git log dir/*",
used to ignore changed-paths Bloom filter when the pathspec
contained wildcards; now they take advantage of the filter when
they can.

* ly/changed-path-traversal-with-magic-pathspec:
  bloom: enable bloom filter with wildcard pathspec in revision traversal

2 months agoMerge branch 'en/ort-rename-fixes'
Junio C Hamano [Thu, 21 Aug 2025 20:47:02 +0000 (13:47 -0700)] 
Merge branch 'en/ort-rename-fixes'

Various bugs about rename handling in "ort" merge strategy have
been fixed.

* en/ort-rename-fixes:
  merge-ort: fix directory rename on top of source of other rename/delete
  merge-ort: fix incorrect file handling
  merge-ort: clarify the interning of strings in opt->priv->path
  t6423: fix missed staging of file in testcases 12i,12j,12k
  t6423: document two bugs with rename-to-self testcases
  merge-ort: drop unnecessary temporary in check_for_directory_rename()
  merge-ort: update comments to modern testfile location

2 months agoMerge branch 'ua/t1517-short-help-tests'
Junio C Hamano [Thu, 21 Aug 2025 20:47:01 +0000 (13:47 -0700)] 
Merge branch 'ua/t1517-short-help-tests'

Test shuffling.

* ua/t1517-short-help-tests:
  t5304: move `prune -h` test from t1517
  t5200: move `update-server-info -h` test from t1517
  t/t1517: automate `git subcmd -h` tests outside a repository

2 months agoMerge branch 'rj/t6137-cygwin-fix'
Junio C Hamano [Thu, 21 Aug 2025 20:47:01 +0000 (13:47 -0700)] 
Merge branch 'rj/t6137-cygwin-fix'

Test fix for breakage introduced in Git 2.50.

* rj/t6137-cygwin-fix:
  t6137-*.sh: fix test failure on cygwin

2 months agoMerge branch 'kh/doc-git-log-markup-fix'
Junio C Hamano [Thu, 21 Aug 2025 20:47:01 +0000 (13:47 -0700)] 
Merge branch 'kh/doc-git-log-markup-fix'

Doc update.

* kh/doc-git-log-markup-fix:
  doc: git-log: fix description list

2 months agoMerge branch 'dl/push-missing-object-error'
Junio C Hamano [Thu, 21 Aug 2025 20:47:00 +0000 (13:47 -0700)] 
Merge branch 'dl/push-missing-object-error'

"git push" had a code path that led to BUG() but it should have
been a die(), as it is a response to a usual but invalid end-user
action to attempt pushing an object that does not exist.

* dl/push-missing-object-error:
  remote.c: convert if-else ladder to switch
  remote.c: remove BUG in show_push_unqualified_ref_name_error()
  t5516: remove surrounding empty lines in test bodies

2 months agoMerge branch 'jc/strbuf-split'
Junio C Hamano [Thu, 21 Aug 2025 20:47:00 +0000 (13:47 -0700)] 
Merge branch 'jc/strbuf-split'

Arrays of strbuf is often a wrong data structure to use, and
strbuf_split*() family of functions that create them often have
better alternatives.

Update several code paths and replace strbuf_split*().

* jc/strbuf-split:
  trace2: do not use strbuf_split*()
  trace2: trim_trailing_newline followed by trim is a no-op
  sub-process: do not use strbuf_split*()
  environment: do not use strbuf_split*()
  config: do not use strbuf_split()
  notes: do not use strbuf_split*()
  merge-tree: do not use strbuf_split*()
  clean: do not use strbuf_split*() [part 2]
  clean: do not pass the whole structure when it is not necessary
  clean: do not use strbuf_split*() [part 1]
  clean: do not pass strbuf by value
  wt-status: avoid strbuf_split*()

2 months agoMerge branch 'jc/string-list-split'
Junio C Hamano [Thu, 21 Aug 2025 20:46:59 +0000 (13:46 -0700)] 
Merge branch 'jc/string-list-split'

string_list_split*() family of functions have been extended to
simplify common use cases.

* jc/string-list-split:
  string-list: split-then-remove-empty can be done while splitting
  string-list: optionally omit empty string pieces in string_list_split*()
  diff: simplify parsing of diff.colormovedws
  string-list: optionally trim string pieces split by string_list_split*()
  string-list: unify string_list_split* functions
  string-list: align string_list_split() with its _in_place() counterpart
  string-list: report programming error with BUG

2 months agoMerge branch 'rs/describe-with-prio-queue'
Junio C Hamano [Thu, 21 Aug 2025 20:46:58 +0000 (13:46 -0700)] 
Merge branch 'rs/describe-with-prio-queue'

"git describe" has been optimized by using better data structure.

* rs/describe-with-prio-queue:
  describe: use prio_queue_replace()
  describe: use prio_queue

2 months agoMerge branch 'ps/remote-rename-fix'
Junio C Hamano [Thu, 21 Aug 2025 20:46:58 +0000 (13:46 -0700)] 
Merge branch 'ps/remote-rename-fix'

"git remote rename origin upstream" failed to move origin/HEAD to
upstream/HEAD when origin/HEAD is unborn and performed other
renames extremely inefficiently, which has been corrected.

* ps/remote-rename-fix:
  builtin/remote: only iterate through refs that are to be renamed
  builtin/remote: rework how remote refs get renamed
  builtin/remote: determine whether refs need renaming early on
  builtin/remote: fix sign comparison warnings
  refs: simplify logic when migrating reflog entries
  refs: pass refname when invoking reflog entry callback

2 months agoMerge branch 'ps/reflog-migrate-fixes'
Junio C Hamano [Thu, 21 Aug 2025 20:46:57 +0000 (13:46 -0700)] 
Merge branch 'ps/reflog-migrate-fixes'

"git refs migrate" to migrate the reflog entries from a refs
backend to another had a handful of bugs squashed.

* ps/reflog-migrate-fixes:
  refs: fix invalid old object IDs when migrating reflogs
  refs: stop unsetting REF_HAVE_OLD for log-only updates
  refs/files: detect race when generating reflog entry for HEAD
  refs: fix identity for migrated reflogs
  ident: fix type of string length parameter
  builtin/reflog: implement subcommand to write new entries
  refs: export `ref_transaction_update_reflog()`
  builtin/reflog: improve grouping of subcommands
  Documentation/git-reflog: convert to use synopsis type

2 months agoMerge branch 'js/rebase-i-allow-drop-on-a-merge'
Junio C Hamano [Thu, 21 Aug 2025 20:46:56 +0000 (13:46 -0700)] 
Merge branch 'js/rebase-i-allow-drop-on-a-merge'

During interactive rebase, using 'drop' on a merge commit lead to
an error, which was incorrect.

* js/rebase-i-allow-drop-on-a-merge:
  rebase -i: permit 'drop' of a merge commit

2 months agogit-gui: simplify using nice(1)
Mark Levedahl [Wed, 20 Aug 2025 16:50:21 +0000 (12:50 -0400)] 
git-gui: simplify using nice(1)

git-gui invokes some long running commands using "nice git $cmd" if nice
is found and works, otherwise just "git $cmd".  The current code is more
complex than needed; let's simplify it.

Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2 months agogit-gui: simplify PATH de-duplication
Mark Levedahl [Wed, 20 Aug 2025 15:31:43 +0000 (11:31 -0400)] 
git-gui: simplify PATH de-duplication

git-gui since 8fe7861c51 ("git-gui: assure PATH has only absolute
elements.", 2025-04-11) uses a list to maintain order and a dict to
detect duplicated elements without quadratic complexity.  But, Tcl's
dict explicitly maintains keys in the order first added, thus the list
is not needed.  Simplify the code.

Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
2 months agodoc: fix asciidoc format compatibility in pretty-formats.adoc
Jean-Noël Avila [Wed, 20 Aug 2025 21:23:19 +0000 (23:23 +0200)] 
doc: fix asciidoc format compatibility in pretty-formats.adoc

Asciidoc.py and Asciidoctor do not process the '+' verbatim the same way. A
span is detected when the format sign (here '+')is preceded by a non-word
character. It seems that '{nbsp}' is considered a non-word sign by
Asciidoc.py, but not by Asciidoctor.

Using a double format-sign opens 'unconstrained' span, independent on the
preceding character in both engines.

The '+' sign is used instead of the backtick '`' because it is not processed
as synopsis in asciidoc.py. Unfortunately, the post-processing of verbatim
synopsis in asciidoctor cannot be bypassed and formatting of the parentheses
is forced in syntax sign instead of keywords, unless a proper grammar
analyzer is used.

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc: add discord to ways of getting help
Daniele Sassoli [Wed, 20 Aug 2025 08:36:58 +0000 (08:36 +0000)] 
doc: add discord to ways of getting help

Discord is a great way of receiving help for members of the community
that are not on the mailing list or not familiar with Libera.

Adding it to the official documentation will aid discoverability of it.

The link is the same as the one at https://git-scm.com/community.

Signed-off-by: Daniele Sassoli <danielesassoli@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodescribe: pass commit to describe_commit()
Jeff King [Mon, 18 Aug 2025 21:04:17 +0000 (17:04 -0400)] 
describe: pass commit to describe_commit()

There's a call in describe_commit() to lookup_commit_reference(), but we
don't check the return value. If it returns NULL, we'll segfault as we
immediately dereference the result.

In practice this can never happen, since all callers pass an oid which
came from a "struct commit" already. So we can make this more obvious
by just taking that commit struct in the first place.

Reported-by: Cheng <prophecheng@stu.pku.edu.cn>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodescribe: handle blob traversal with no commits
Jeff King [Wed, 20 Aug 2025 06:30:34 +0000 (02:30 -0400)] 
describe: handle blob traversal with no commits

When describing a blob, we traverse from HEAD, remembering each commit
we saw, and then checking each blob to report the containing commit.
But if we haven't seen any commits at all, we'll segfault (we store the
"current" commit as an oid initialized to the null oid, causing
lookup_commit_reference() to return NULL).

This shouldn't be able to happen normally. We always start our traversal
at HEAD, which must be a commit (a property which is enforced by the
refs code). But you can trigger the segfault like this:

  blob=$(echo foo | git hash-object -w --stdin)
  echo $blob >.git/HEAD
  git describe $blob

We can instead catch this case and return an empty result, which hits
the usual "we didn't find $blob while traversing HEAD" error.

This is a minor lie in that we did "find" the blob. And this even hints
at a bigger problem in this code: what if the traversal pointed to the
blob as _not_ part of a commit at all, but we had previously filled in
the recorded "current commit"? One could imagine this happening due to a
tag pointing directly to the blob in question.

But that can't happen, because we only traverse from HEAD, never from
any other refs. And the intent of the blob-describing code is to find
blobs within commits.

So I think this matches the original intent as closely as we can (and
again, this segfault cannot be triggered without corrupting your
repository!).

The test here does not use the formula above, which works only for the
files backend (and not reftables). Instead we use another loophole to
create the bogus state using only Git commands. See the comment in the
test for details.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2 months agodoc/gitk: update reference to the external project
Johannes Sixt [Wed, 20 Aug 2025 06:16:05 +0000 (08:16 +0200)] 
doc/gitk: update reference to the external project

Gitk is now maintained by Johannes Sixt and the repository can be
cloned from a new URL. b59358100c20 (Update the official repo of
gitk, 2024-12-24) could have updated this instance in the manual,
too, but the opportunity was missed. Update it now. Do give credit
to Paul Mackerras as the inventor of the program.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>