From fe4e60759bfbf4eaca17949d3bbb204bb5c908a2 Mon Sep 17 00:00:00 2001 From: Toon Claes Date: Fri, 28 Nov 2025 17:37:13 +0100 Subject: [PATCH 01/13] last-modified: fix use of uninitialized memory git-last-modified(1) uses a scratch bitmap to keep track of paths that have been changed between commits. To avoid reallocating a bitmap on each call of process_parent(), the scratch bitmap is kept and reused. Although, it seems an incorrect length is passed to memset(3). `struct bitmap` uses `eword_t` to for internal storage. This type is typedef'd to uint64_t. To fully zero the memory used by the bitmap, multiply the length (saved in `struct bitmap::word_alloc`) by the size of `eword_t`. Reported-by: Anders Kaseorg Helped-by: Jeff King Signed-off-by: Toon Claes Signed-off-by: Junio C Hamano --- builtin/last-modified.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/last-modified.c b/builtin/last-modified.c index b0ecbdc5400d13..cc5fd2e7950be7 100644 --- a/builtin/last-modified.c +++ b/builtin/last-modified.c @@ -327,7 +327,7 @@ static void process_parent(struct last_modified *lm, if (!(parent->object.flags & PARENT1)) active_paths_free(lm, parent); - memset(lm->scratch->words, 0x0, lm->scratch->word_alloc); + memset(lm->scratch->words, 0x0, lm->scratch->word_alloc * sizeof(eword_t)); diff_queue_clear(&diff_queued_diff); } From 38f88051dae6ddb2f1cdb9c7415d4ba6caef04af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Sun, 30 Nov 2025 12:47:17 +0100 Subject: [PATCH 02/13] diff-index: don't queue unchanged filepairs with diff_change() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit diff_cache() queues unchanged filepairs if the flag find_copies_harder is set, and uses diff_change() for that. This function allocates a filespec for each side, does a few other things that are unnecessary for unchanged filepairs and always sets the diff_flag has_changes, which is simply misleading in this case. Add a new streamlined function for queuing unchanged filepairs and use it in show_modified(), which is called by diff_cache() via oneway_diff() and do_oneway_diff(). It allocates only a single filespec for each filepair and uses it twice with reference counting. This has a measurable effect if there are a lot of them, like in the Linux repo: Benchmark 1: ./git_v2.52.0 -C ../linux diff --cached --find-copies-harder Time (mean ± σ): 31.8 ms ± 0.2 ms [User: 24.2 ms, System: 6.3 ms] Range (min … max): 31.5 ms … 32.3 ms 85 runs Benchmark 2: ./git -C ../linux diff --cached --find-copies-harder Time (mean ± σ): 23.9 ms ± 0.2 ms [User: 18.1 ms, System: 4.6 ms] Range (min … max): 23.5 ms … 24.4 ms 111 runs Summary ./git -C ../linux diff --cached --find-copies-harder ran 1.33 ± 0.01 times faster than ./git_v2.52.0 -C ../linux diff --cached --find-copies-harder Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- diff-lib.c | 13 ++++++------- diff.c | 20 ++++++++++++++++++++ diff.h | 5 +++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/diff-lib.c b/diff-lib.c index b8f8f3bc312fbe..8e624f38c6d6f3 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -418,13 +418,12 @@ static int show_modified(struct rev_info *revs, } oldmode = old_entry->ce_mode; - if (mode == oldmode && oideq(oid, &old_entry->oid) && !dirty_submodule && - !revs->diffopt.flags.find_copies_harder) - return 0; - - diff_change(&revs->diffopt, oldmode, mode, - &old_entry->oid, oid, 1, !is_null_oid(oid), - old_entry->name, 0, dirty_submodule); + if (mode != oldmode || !oideq(oid, &old_entry->oid) || dirty_submodule) + diff_change(&revs->diffopt, oldmode, mode, + &old_entry->oid, oid, 1, !is_null_oid(oid), + old_entry->name, 0, dirty_submodule); + else if (revs->diffopt.flags.find_copies_harder) + diff_same(&revs->diffopt, mode, oid, old_entry->name); return 0; } diff --git a/diff.c b/diff.c index a1961526c0dab1..c3063d827e16d1 100644 --- a/diff.c +++ b/diff.c @@ -7347,6 +7347,26 @@ void diff_change(struct diff_options *options, concatpath, old_dirty_submodule, new_dirty_submodule); } +void diff_same(struct diff_options *options, + unsigned mode, + const struct object_id *oid, + const char *concatpath) +{ + struct diff_filespec *one; + + if (S_ISGITLINK(mode) && is_submodule_ignored(concatpath, options)) + return; + + if (options->prefix && + strncmp(concatpath, options->prefix, options->prefix_length)) + return; + + one = alloc_filespec(concatpath); + fill_filespec(one, oid, 1, mode); + one->count++; + diff_queue(&diff_queued_diff, one, one); +} + struct diff_filepair *diff_unmerge(struct diff_options *options, const char *path) { struct diff_filepair *pair; diff --git a/diff.h b/diff.h index 31eedd5c0c39d3..e80503aebb8d50 100644 --- a/diff.h +++ b/diff.h @@ -572,6 +572,11 @@ void diff_change(struct diff_options *, const char *fullpath, unsigned dirty_submodule1, unsigned dirty_submodule2); +void diff_same(struct diff_options *, + unsigned mode, + const struct object_id *oid, + const char *fullpath); + struct diff_filepair *diff_unmerge(struct diff_options *, const char *path); void compute_diffstat(struct diff_options *options, struct diffstat_t *diffstat, From b14f1df9f26cf87856cf6767847ccb4a5b31499b Mon Sep 17 00:00:00 2001 From: Kristoffer Haugsbakk Date: Tue, 2 Dec 2025 16:56:51 +0100 Subject: [PATCH 03/13] branch: advice using git-help(1) instead of man(1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 8fbd903e (branch: advise about ref syntax rules, 2024-03-05) added an advice about checking git-check-ref-format(1) for the ref syntax rules. The advice uses man(1). But git(1) is a multi-platform tool and man(1) may not be available on some platforms. It might also be slightly jarring to see a suggestion for running a command which is not from the Git suite. Let’s instead use git-help(1) in order to stay inside the land of git(1). This also means that `help.format` (for `man`, `html` or other formats) will be used if set. Also change to using single quotes (') to quote the command since that is more conventional. While here let’s also update the test to use `{SQ}`, which is more readable and easier to edit. Signed-off-by: Kristoffer Haugsbakk Signed-off-by: Junio C Hamano --- branch.c | 2 +- builtin/branch.c | 2 +- t/t3200-branch.sh | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/branch.c b/branch.c index 26be35834718f2..243db7d0fc0226 100644 --- a/branch.c +++ b/branch.c @@ -375,7 +375,7 @@ int validate_branchname(const char *name, struct strbuf *ref) if (check_branch_ref(ref, name)) { int code = die_message(_("'%s' is not a valid branch name"), name); advise_if_enabled(ADVICE_REF_SYNTAX, - _("See `man git check-ref-format`")); + _("See 'git help check-ref-format'")); exit(code); } diff --git a/builtin/branch.c b/builtin/branch.c index 9fcf04bebb2e72..c577b5d20f2969 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -591,7 +591,7 @@ static void copy_or_rename_branch(const char *oldname, const char *newname, int else { int code = die_message(_("invalid branch name: '%s'"), oldname); advise_if_enabled(ADVICE_REF_SYNTAX, - _("See `man git check-ref-format`")); + _("See 'git help check-ref-format'")); exit(code); } } diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index f3e720dc10da46..c58e505c43f9b9 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -1707,9 +1707,9 @@ test_expect_success '--track overrides branch.autoSetupMerge' ' ' test_expect_success 'errors if given a bad branch name' ' - cat <<-\EOF >expect && - fatal: '\''foo..bar'\'' is not a valid branch name - hint: See `man git check-ref-format` + cat <<-EOF >expect && + fatal: ${SQ}foo..bar${SQ} is not a valid branch name + hint: See ${SQ}git help check-ref-format${SQ} hint: Disable this message with "git config set advice.refSyntax false" EOF test_must_fail git branch foo..bar >actual 2>&1 && From cfdce4afcc3809fc9233bad9477f1bd8a57b7586 Mon Sep 17 00:00:00 2001 From: Julia Evans Date: Tue, 2 Dec 2025 18:11:24 +0000 Subject: [PATCH 04/13] doc: remove stray text in Git data model I meant to delete this sentence fragment when rewriting this paragraph, but accidentally left it in. It's repetitive (since it was meant to be deleted) and it's causing some formatting issues with the note. Signed-off-by: Julia Evans Signed-off-by: Junio C Hamano --- Documentation/gitdatamodel.adoc | 2 -- 1 file changed, 2 deletions(-) diff --git a/Documentation/gitdatamodel.adoc b/Documentation/gitdatamodel.adoc index 3614f5960ea143..dcfdff0346f669 100644 --- a/Documentation/gitdatamodel.adoc +++ b/Documentation/gitdatamodel.adoc @@ -235,8 +235,6 @@ there will no longer be a branch that points at the old commit. The old commit is recorded in the current branch's <>, so it is still "reachable", but when the reflog entry expires it may become unreachable and get deleted. - -the old commit will usually not be reachable, so it may be deleted eventually. Reachable objects will never be deleted. [[index]] From 8ef7355a8ffb0273f5b4713a0b1502887f8825d0 Mon Sep 17 00:00:00 2001 From: Julia Evans Date: Wed, 3 Dec 2025 15:34:55 +0000 Subject: [PATCH 05/13] doc: git-pull: fix 'git --rebase abort' typo An earlier commit e9d221b0 (doc: git-pull: clarify how to exit a conflicted merge, 2025-10-15) misspelt `git rebase --abort` to `git --rebase abort`. Fix it. Signed-off-by: Julia Evans Signed-off-by: Junio C Hamano --- Documentation/git-pull.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/git-pull.adoc b/Documentation/git-pull.adoc index cd3bbc90e3008d..4df4193575b345 100644 --- a/Documentation/git-pull.adoc +++ b/Documentation/git-pull.adoc @@ -37,8 +37,8 @@ You can also set the configuration options `pull.rebase`, `pull.squash`, or `pull.ff` with your preferred behaviour. If there's a merge conflict during the merge or rebase that you don't -want to handle, you can safely abort it with `git merge --abort` or `git ---rebase abort`. +want to handle, you can safely abort it with `git merge --abort` or +`git rebase --abort`. OPTIONS ------- From 05491b90ce200e6411f9aaac0afe13af45d69824 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sat, 29 Nov 2025 13:43:46 +0000 Subject: [PATCH 06/13] last-modified: support sparse checkouts In a sparse checkout, a user might want to run `last-modified` on a directory outside the worktree. And even in non-sparse checkouts, a user might need to run that command on a directory that does not exist in the worktree. These use cases should be supported via the `--` separator between revision and file arguments, which is even advertised in the documentation. This patch fixes a tiny bug that prevents that from working. This fixes https://github.com/git-for-windows/git/issues/5978 Signed-off-by: Johannes Schindelin Acked-by: Derrick Stolee Acked-by: Toon Claes Signed-off-by: Junio C Hamano --- builtin/last-modified.c | 3 ++- t/t8020-last-modified.sh | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/builtin/last-modified.c b/builtin/last-modified.c index b0ecbdc5400d13..dc1e229f4d4f44 100644 --- a/builtin/last-modified.c +++ b/builtin/last-modified.c @@ -525,7 +525,8 @@ int cmd_last_modified(int argc, const char **argv, const char *prefix, argc = parse_options(argc, argv, prefix, last_modified_options, last_modified_usage, - PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT); + PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN_OPT | + PARSE_OPT_KEEP_DASHDASH); repo_config(repo, git_default_config, NULL); diff --git a/t/t8020-last-modified.sh b/t/t8020-last-modified.sh index a4c1114ee28f7f..50f4312f715f41 100755 --- a/t/t8020-last-modified.sh +++ b/t/t8020-last-modified.sh @@ -78,6 +78,14 @@ test_expect_success 'last-modified subdir' ' EOF ' +test_expect_success 'last-modified in sparse checkout' ' + test_when_finished "git sparse-checkout disable" && + git sparse-checkout set b && + check_last_modified -- a <<-\EOF + 3 a + EOF +' + test_expect_success 'last-modified subdir recursive' ' check_last_modified -r a <<-\EOF 3 a/b/file From 9ce3478410e6d9769f4203687b1f074a64c0ac8e Mon Sep 17 00:00:00 2001 From: Toon Claes Date: Tue, 2 Dec 2025 11:48:08 +0100 Subject: [PATCH 07/13] meson: ignore subprojects/.wraplock When asking Meson to wrap subprojects, it generates a .wraplock file in the subprojects/ directory. Ignore this file. See also https://github.com/mesonbuild/meson/issues/14948. Signed-off-by: Toon Claes Acked-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- subprojects/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/subprojects/.gitignore b/subprojects/.gitignore index 63ea916ef5f302..2bb68c879432d7 100644 --- a/subprojects/.gitignore +++ b/subprojects/.gitignore @@ -1 +1,2 @@ /*/ +.wraplock From 574ac610761495b7b7afcced7717188501402925 Mon Sep 17 00:00:00 2001 From: Toon Claes Date: Tue, 2 Dec 2025 11:48:09 +0100 Subject: [PATCH 08/13] meson: only detect ICONV_OMITS_BOM if possible In our Meson setup it automatically detects whether ICONV_OMITS_BOM should be defined. To check this, a piece of code is compiled and ran. When cross-compiling, it's not possible to run this piece of code. Guard this test with a can_run_host_binaries() check to ensure it can run. Signed-off-by: Toon Claes Acked-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index f1b3615659e56a..95348e69a413a9 100644 --- a/meson.build +++ b/meson.build @@ -1064,7 +1064,7 @@ if iconv.found() } ''' - if compiler.run(iconv_omits_bom_source, + if meson.can_run_host_binaries() and compiler.run(iconv_omits_bom_source, dependencies: iconv, name: 'iconv omits BOM', ).returncode() != 0 From 4061692ba427af2085e934e0734926f93ea2c823 Mon Sep 17 00:00:00 2001 From: Toon Claes Date: Wed, 3 Dec 2025 15:53:31 +0100 Subject: [PATCH 09/13] meson: use is_cross_build() where possible In previous commit the first use of meson.can_run_host_binaries() was introduced. This is a guard around compiler.run() to ensure it's actually possible to execute the provided. In other places we've been having the same issue, but here `not meson.is_cross_build()` is used as guard. This does the trick, but it also prevents the code from running even when an exe_wrapper is configured. Switch to using meson.can_run_host_binaries() here as well. There is another place left that still uses `not meson.is_cross_build()`, but here it's a guard around fs.exists(). That function will always run on the build machine, so checking for cross-compilation is still in place here. Signed-off-by: Toon Claes Acked-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 95348e69a413a9..00ad8a5c6011e5 100644 --- a/meson.build +++ b/meson.build @@ -1492,7 +1492,7 @@ if not has_bsd_sysctl endif endif -if not meson.is_cross_build() and compiler.run(''' +if meson.can_run_host_binaries() and compiler.run(''' #include int main(int argc, const char **argv) From 6fd44f55a7594842e70d549853b7f1ac4e27e6ea Mon Sep 17 00:00:00 2001 From: Lucas Seiki Oshiro Date: Thu, 4 Dec 2025 17:10:10 -0300 Subject: [PATCH 10/13] repo: remove blank line from Documentation/git-repo.adoc There was an extra blank line in git-repo-structure documentation, which led to an unwawnted '+' character after generating an HTML or PDF from that page. This can be seen, for example, in Git 2.52.0 online docs [1]. Remove that extra line. [1] https://git-scm.com/docs/git-repo/2.52.0 Signed-off-by: Lucas Seiki Oshiro Signed-off-by: Junio C Hamano --- Documentation/git-repo.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc index 70f0a6d2e47291..5d9c7641c24c9e 100644 --- a/Documentation/git-repo.adoc +++ b/Documentation/git-repo.adoc @@ -50,7 +50,6 @@ supported: + * Reference counts categorized by type * Reachable object counts categorized by type - + The output format can be chosen through the flag `--format`. Three formats are supported: From 768cf991ffea54dbcaf63c45750f0e3a26ebdcc6 Mon Sep 17 00:00:00 2001 From: Lucas Seiki Oshiro Date: Thu, 4 Dec 2025 17:10:11 -0300 Subject: [PATCH 11/13] repo: use [--format=... | -z] instead of [-z] in git-repo-info synopsis The flag -z is only an alias for --format=null and even though --format and -z can be used together and repeated, only the last one is considered. Replace `[-z]` in the synopsis of git-repo-info by `[--format=... | -z]`, expliciting that the use of one of those flags replace the other. Signed-off-by: Lucas Seiki Oshiro Signed-off-by: Junio C Hamano --- Documentation/git-repo.adoc | 4 ++-- builtin/repo.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc index 5d9c7641c24c9e..f24514deaa4cd7 100644 --- a/Documentation/git-repo.adoc +++ b/Documentation/git-repo.adoc @@ -8,7 +8,7 @@ git-repo - Retrieve information about the repository SYNOPSIS -------- [synopsis] -git repo info [--format=(keyvalue|nul)] [-z] [--all | ...] +git repo info [--format=(keyvalue|nul) | -z] [--all | ...] git repo structure [--format=(table|keyvalue|nul)] DESCRIPTION @@ -19,7 +19,7 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE. COMMANDS -------- -`info [--format=(keyvalue|nul)] [-z] [--all | ...]`:: +`info [--format=(keyvalue|nul) | -z] [--all | ...]`:: Retrieve metadata-related information about the current repository. Only the requested data will be returned based on their keys (see "INFO KEYS" section below). diff --git a/builtin/repo.c b/builtin/repo.c index 2a653bd3eacf20..cc97dd1836fb9f 100644 --- a/builtin/repo.c +++ b/builtin/repo.c @@ -15,7 +15,7 @@ #include "utf8.h" static const char *const repo_usage[] = { - "git repo info [--format=(keyvalue|nul)] [-z] [--all | ...]", + "git repo info [--format=(keyvalue|nul) | -z] [--all | ...]", "git repo structure [--format=(table|keyvalue|nul)]", NULL }; From 76c0704bdf6ee8ac0be11830cb6ae8d08cc587a8 Mon Sep 17 00:00:00 2001 From: Lucas Seiki Oshiro Date: Thu, 4 Dec 2025 17:10:12 -0300 Subject: [PATCH 12/13] repo: add -z as an alias for --format=nul to git-repo-structure Other Git commands that have nul-terminated output, such as git-config, git-status, git-ls-files, and git-repo-info have a flag `-z` for using the null character as the record separator. Add the `-z` flag to git-repo-structure as an alias for `--format=nul`, making it consistent with the behavior of the other commands. Signed-off-by: Lucas Seiki Oshiro Signed-off-by: Junio C Hamano --- Documentation/git-repo.adoc | 6 ++++-- builtin/repo.c | 6 +++++- t/t1901-repo-structure.sh | 7 +++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc index f24514deaa4cd7..c4a78277df61c0 100644 --- a/Documentation/git-repo.adoc +++ b/Documentation/git-repo.adoc @@ -9,7 +9,7 @@ SYNOPSIS -------- [synopsis] git repo info [--format=(keyvalue|nul) | -z] [--all | ...] -git repo structure [--format=(table|keyvalue|nul)] +git repo structure [--format=(table|keyvalue|nul) | -z] DESCRIPTION ----------- @@ -44,7 +44,7 @@ supported: + `-z` is an alias for `--format=nul`. -`structure [--format=(table|keyvalue|nul)]`:: +`structure [--format=(table|keyvalue|nul) | -z]`:: Retrieve statistics about the current repository structure. The following kinds of information are reported: + @@ -71,6 +71,8 @@ supported: the delimiter between the key and value instead of '='. Unlike the `keyvalue` format, values containing "unusual" characters are never quoted. ++ +`-z` is an alias for `--format=nul`. INFO KEYS --------- diff --git a/builtin/repo.c b/builtin/repo.c index cc97dd1836fb9f..0dd41b17783ed1 100644 --- a/builtin/repo.c +++ b/builtin/repo.c @@ -16,7 +16,7 @@ static const char *const repo_usage[] = { "git repo info [--format=(keyvalue|nul) | -z] [--all | ...]", - "git repo structure [--format=(table|keyvalue|nul)]", + "git repo structure [--format=(table|keyvalue|nul) | -z]", NULL }; @@ -529,6 +529,10 @@ static int cmd_repo_structure(int argc, const char **argv, const char *prefix, OPT_CALLBACK_F(0, "format", &format, N_("format"), N_("output format"), PARSE_OPT_NONEG, parse_format_cb), + OPT_CALLBACK_F('z', NULL, &format, NULL, + N_("synonym for --format=nul"), + PARSE_OPT_NONEG | PARSE_OPT_NOARG, + parse_format_cb), OPT_BOOL(0, "progress", &show_progress, N_("show progress")), OPT_END() }; diff --git a/t/t1901-repo-structure.sh b/t/t1901-repo-structure.sh index 36a71a144e3f74..df7d4ea52485da 100755 --- a/t/t1901-repo-structure.sh +++ b/t/t1901-repo-structure.sh @@ -101,6 +101,13 @@ test_expect_success 'keyvalue and nul format' ' tr "\n=" "\0\n" expect_nul && git repo structure --format=nul >out 2>err && + test_cmp expect_nul out && + test_line_count = 0 err && + + # "-z", as a synonym to "--format=nul", participates in the + # usual "last one wins" rule. + git repo structure --format=table -z >out 2>err && + test_cmp expect_nul out && test_line_count = 0 err ) From d8af7cadaa79d5837d73ec949e10b57dedb43e9b Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 14 Dec 2025 17:04:17 +0900 Subject: [PATCH 13/13] The eighth batch Signed-off-by: Junio C Hamano --- Documentation/RelNotes/2.53.0.adoc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Documentation/RelNotes/2.53.0.adoc b/Documentation/RelNotes/2.53.0.adoc index 38cbd2186e8172..41ae2a5a7a4696 100644 --- a/Documentation/RelNotes/2.53.0.adoc +++ b/Documentation/RelNotes/2.53.0.adoc @@ -26,6 +26,11 @@ UI, Workflows & Features * The use of "revision" (a connected set of commits) has been clarified in the "git replay" documentation. + * A help message from "git branch" now mentions "git help" instead of + "man" when suggesting to read some documentation. + + * "git repo struct" learned to take "-z" as a synonym to "--format=nul". + Performance, Internal Implementation, Development Support etc. -------------------------------------------------------------- @@ -51,6 +56,10 @@ Performance, Internal Implementation, Development Support etc. * Code refactoring around object database sources. + * Halve the memory consumed by artificial filepairs created during + "git diff --find-copioes-harder", also making the operation run + faster. + Fixes since v2.52 ----------------- @@ -150,9 +159,18 @@ Fixes since v2.52 * The way patience diff finds LCS has been optimized. (merge c7e3b8085b yc/xdiff-patience-optim later to maint). + * Recent optimization to "last-modified" command introduced use of + uninitialized block of memory, which has been corrected. + (merge fe4e60759b tc/last-modified-active-paths-optimization later to maint). + + * "git last-modified" used to mishandle "--" to mark the beginning of + pathspec, which has been corrected. + (merge 05491b90ce js/last-modified-with-sparse-checkouts later to maint). + * Other code cleanup, docfix, build fix, etc. (merge 46207a54cc qj/doc-http-bad-want-response later to maint). (merge df90eccd93 kh/doc-commit-extra-references later to maint). (merge f18aa68861 rs/xmkstemp-simplify later to maint). (merge fddba8f737 ja/doc-synopsis-style later to maint). (merge 22ce0cb639 en/xdiff-cleanup-2 later to maint). + (merge 8ef7355a8f je/doc-pull later to maint).