| Git v2.98 Release Notes | |
| ======================= | |
| This is meant to be the antepenultimate release to prepare for the | |
| long anticipated Git 3.0 which has been vaporware for so long. | |
| UI, Workflows & Features | |
| ------------------------ | |
| * The experimental 'git history' command has been taught a new 'squash' | |
| subcommand to fold a range of commits into a single commit, with any | |
| descendants replayed on top. | |
| * A new hook 'report' is added to 'git receive-pack', which runs after | |
| reference updates and allows the server to filter or modify the | |
| packet-line status report sent back to the client. | |
| * The terminology regarding reference storage formats has been unified | |
| across command-line options, environment variables, configuration | |
| variables, and source code, standardizing on the phrase "ref storage | |
| format" (e.g., `--ref-storage-format`, `'GIT_REF_STORAGE_FORMAT'`). | |
| Additionally, the `--ref-storage-format` option has been updated to | |
| accept payloads in the form `<format>://<payload>`. | |
| * The build-time knob 'USE_NSEC' for nanosecond stat precision has been | |
| converted to a runtime configuration 'core.useNanosec', allowing | |
| distributions to bundle one binary that adapts to filesystem | |
| capabilities dynamically. | |
| * The command-line completion script (in 'contrib/') has been taught | |
| to complete the 'repair' subcommand for 'git worktree'. | |
| * Various documentation files have been updated to use explicit | |
| '<<TARGET,TARGET>>' AsciiDoc cross-references instead of plain text | |
| references. This improves rendering on the web and avoids broken | |
| links when manual pages are included into other pages. | |
| * The 'git var' command has been updated to output individual components | |
| of the author and committer identities, take multiple keys on the | |
| command-line, and support NUL-delimited output with the '-z' option. | |
| * The 'git-contacts' program (in contrib/) has been taught to read | |
| patches from the standard input stream when an explicit dash ('-') is | |
| passed in place of a file. | |
| * The @{upstream} notation had short-hand @{u} from the beginning, | |
| and @{push} learned corresponding @{p} to match. | |
| * The 'format-patch' command has been updated with options to | |
| configure notes specifically for range-diff output, allowing them to | |
| differ from the notes displayed on the patches themselves. | |
| * Validation of the 'fetch.followRemoteHEAD' configuration variable | |
| has been deferred to when it is actually used, preventing irrelevant | |
| warnings during 'git fetch' invocations that do not consult it. | |
| * "git status" now suggests to use 'git merge --continue', not 'git commit', | |
| when done with conflicts during a 'git merge'. | |
| Performance, Internal Implementation, Development Support etc. | |
| -------------------------------------------------------------- | |
| * The setup of alternates has been deferred to object database | |
| creation time during clone, which drops the unused ad-hoc alternate | |
| writing API, simplifying the object database backend interface. | |
| * Updates to Coccinelle semantic patches to correctly handle the | |
| 'FREE_AND_NULL()' macro and avoid generating broken transformations | |
| for negated pointer checks. | |
| * The 'Makefile' has been taught to precompile 'git-compat-util.h' to | |
| speed up overall compilation, while excluding sources that do not | |
| include the compatibility header. | |
| * The can_all_from_reach() and can_all_from_reach_with_flag() | |
| functions have been updated to accept a repository context, | |
| preventing bugs where submodule merging incorrectly reads from the | |
| superproject's commit-graph. | |
| * The error reporting machinery in the WinANSI compatibility layer has | |
| been simplified to pass the exact Windows error code and correctly | |
| format arguments for fatal errors. | |
| * The Debian 12 CI job has been updated to skip a half-auth clone test | |
| that occasionally fails due to a bug in the packaged curl version | |
| handling early HTTP/2 responses. | |
| * The CI script has been updated to check for one-indexed slice numbers | |
| when deciding to run unit tests on Windows, mirroring the behaviour in | |
| the modern GitHub and GitLab workflows. | |
| * The Windows GitLab CI job has been updated to provision and use the | |
| GCC-targeting Rust toolchain for MinGW builds, fixing job failures | |
| caused by incomplete Rust setup and missing linker support. | |
| * The external merge driver in 'git merge' now uses the tempfile API | |
| to create its temporary files. This ensures that these temporaries | |
| are reliably cleaned up even when the merge driver or its parent Git | |
| process is terminated abruptly. | |
| * The performance test for `git fetch` pack-dir rescans has been | |
| updated to use the `--no-deref` option when cleaning up | |
| remote-tracking branches. This prevents `git update-ref` from | |
| failing with a multiple updates error when both a symref and its | |
| target are deleted in the same transaction. | |
| * The build configurations for Meson have been optimized to avoid | |
| recompiling HTTP sources multiple times and to utilize precompiled | |
| headers for test-helpers and unit tests, reducing clean build times. | |
| Additionally, the shell completion tests and GitLab CI MSVC runner | |
| jobs have been fixed. | |
| * The handling of index conflicts in 'git stash apply --index' has | |
| been optimized. Instead of relying on expensive external | |
| subprocesses using 'git diff-tree' and 'git apply', the index is now | |
| merged in-core using the merge-ort machinery, which fixes a | |
| concurrent lock file issue with autostash. | |
| * The parse-options API has been updated to support grouping | |
| subcommands, and the 'git refs' command has been updated to use this | |
| new feature to categorize its subcommands in its help output. | |
| * Fix definition for the "--all" option to use symbolic constant | |
| in the options[] array passed to parse_options API. | |
| * The shell quoting of a lazy prereq script was quoted incorrectly and | |
| allowed variables dereferenced at the wrong moment, breaking the | |
| curl version detection. | |
| * The requirement for a 'SYNOPSIS' section in section 7 manual pages | |
| has been relaxed by updating the linter script, and dummy | |
| 'SYNOPSIS' sections from existing section 7 documentation have been | |
| removed to improve the rendered output | |
| * A test script (t0450) has been updated to use the test_path_is_file | |
| and test_path_is_missing helper functions, which provides better | |
| diagnostic output on failure. | |
| * The routine that rewrites the packed-refs file has been optimized to | |
| directly pass unmodified reference records verbatim to the output | |
| via fwrite(3p), instead of redundantly re-formatting them with | |
| fprintf(3p). | |
| * The fetch.writeCommitGraph behavior has been optimized to | |
| incrementally update the commit graph using only the newly fetched | |
| commits as seeds. This avoids a full reachability scan of all | |
| references and drastically reduces the post-fetch commit-graph | |
| update time for repositories with many references. | |
| * The odb_source API has been refactored to make alternates an | |
| implementation detail of the files backend instead of managing them | |
| at the core object database layer. | |
| * The test for verifying a signed tag with a missing key has been | |
| updated to point GNUPGHOME to an unused directory rather than | |
| deleting the active gpghome directory, working around a flaky rm | |
| failure caused by the background gpg-agent observed on Alpine. | |
| Fixes since v2.56 | |
| ----------------- | |
| * Updates to Coccinelle semantic patches to correctly handle the | |
| 'FREE_AND_NULL()' macro and avoid generating broken transformations | |
| for negated pointer checks. | |
| (merge 32814b69d0 jc/cocci-free-updates later to maint). | |
| * The files backend has been updated to avoid unconditionally locking | |
| the 'packed-refs' file when deleting a root ref (which are never | |
| packed). | |
| (merge d8e4585822 ak/refs-files-root-ref-lock later to maint). | |
| * The server-side protocol v2 response order for 'wanted-refs' and | |
| 'shallow-info' has been swapped to match the client's expectation, | |
| fixing a fetch failure when the server has 'uploadpack.allowRefInWant' | |
| enabled and the client performs a shallow fetch. | |
| (merge 191740edaa rr/upload-pack-swap-shallow-wanted-ref later to maint). | |
| * Assorted fixes for code paths that are not careful with boundary and | |
| error conditions. | |
| (merge c88341b7e1 js/coverity-fixes later to maint). | |
| * A bug in git diff --no-index that mishandled reverse (-R) output | |
| when conflicts existed between a file and a directory has been | |
| fixed. | |
| (merge 9a13b3742b hd/diff-no-index-reverse-fix later to maint). | |
| * 'git pull' has been taught to fail more gracefully instead of | |
| segfaulting when lookup_commit_reference() fails on unparseable | |
| objects. | |
| (merge 38bdda17dd jk/pull-null-merge-head later to maint). | |
| * The sequencer machinery (used by 'git rebase', 'git cherry-pick', and | |
| 'git revert') has been updated to defer automatic maintenance tasks | |
| until the end of the operation, preventing nested 'git commit', 'git | |
| merge', and 'exec' commands from triggering GC operations that could | |
| contend for locks or delete open packs while the sequence is in | |
| progress. | |
| (merge eba1a1c5dd tb/rerere-lock-grace later to maint). | |
| * When 'core.fsyncMethod' is set to 'batch', the ODB transaction | |
| failed to properly flush large blob packfiles residing in the | |
| temporary directory before migrating the directory's contents to the | |
| main object store. The execution sequence has been corrected by | |
| performing the packfile flush before the temporary directory | |
| migration, averting failure. | |
| (merge ef7faa6350 jt/object-file-batch-fsync-fix later to maint). | |
| * The default expiry periods for both reachable and unreachable reflog | |
| entries have been corrected from a past regression that swapped | |
| them. | |
| (merge 60cf500551 ps/reflog-expiry-fix later to maint). | |
| * The directory traversal logic has been updated to correctly evaluate | |
| pathspecs for ignored directories containing nested repositories, | |
| and has been fortified to gracefully handle null pathspecs during | |
| checkout operations. | |
| (merge ebc067f3cc rs/dir-skip-nested-repo-fix later to maint). | |
| * The command-line parsing of revision options has been updated to | |
| properly distinguish between malformed and unknown options, and to | |
| correctly report the name of unknown options after they have been | |
| moved during the option parsing process. | |
| (merge da2926c8f5 jk/parse-revision-opt-fixes later to maint). | |
| * The documentation for 'git-name-rev' has been updated to refer to | |
| object IDs instead of SHA-1, to more accurately reflect that the | |
| active hash algorithm is used. | |
| (merge b2ab8fccc3 jk/name-rev-update-hash-descriptions later to maint). | |
| * The HTTP transport has been updated to handle changes in recent curl | |
| versions that strip credentials from the effective URL, preventing | |
| unnecessary credential prompts during redirects. | |
| (merge 76524c2604 jk/http-curl-strip-creds later to maint). | |
| * The timestamp used for checking the reflog of a remote-tracking | |
| branch during 'git push --force-if-includes' was left uninitialized | |
| when the reflog was completely empty, which has been corrected. | |
| (merge c84ed3a0ab as/push-force-if-includes-no-reflog later to maint). | |
| * CI resource exhaustion during test runs on GitHub Actions has been | |
| mitigated by switching a comparison of a huge output to use a binary | |
| comparison, and by capping the parallel jobs on Linux to the number | |
| of available CPUs. | |
| (merge 4f956cf43a td/ci-large-test-resources later to maint). | |
| * The `t5520` test script has been updated to disable reflog expiration. | |
| This prevents test flakiness caused by the auto-maintenance | |
| reflog-expire task, which would otherwise immediately expire the | |
| test's reflogs due to them carrying hardcoded timestamps from 2005. | |
| (merge a68cca9953 tb/t5520-reflog-expire later to maint). | |
| * The internal representation of timezones in the reflog for the | |
| reftable format has been fixed to match the specification, which | |
| dictates an offset in minutes rather than the parsed "+HHMM" integer | |
| representation. | |
| (merge e14e2b6cf2 ps/reftable-reflog-timezone later to maint). | |
| * The internal diff and merge machinery has been updated to use | |
| standard size_t types rather than signed longs for buffer | |
| allocations and offsets, preventing subtle overflow issues on LLP64 | |
| architectures, and plugging uninitialized memory leaks along error | |
| paths. | |
| (merge 5b0456361d jk/xdiff-size_t later to maint). | |
| * The documentation for 'git remote set-head' has been updated to | |
| clarify that it only modifies the local repository's remote-tracking | |
| symbolic reference, and does not alter the target remote | |
| repository's own 'HEAD'. | |
| (merge c5f8f60719 mg/doc-remote-set-head later to maint). | |
| * The commit map populated from the state branch in 'git | |
| filter-branch' has been corrected to parse the map using the | |
| original-to-rewritten order. | |
| (merge 4811dabed7 gm/filter-branch-state-map-fix later to maint). | |
| * The documentation for core.pager has been updated to provide | |
| examples of overriding the LESS environment variable for custom | |
| pagers by prefixing the pager command in the configuration. | |
| (merge c7860da7db tz/doc-override-less-env later to maint). | |
| * Closing a packfile did not evict the entries belonging to it from | |
| the delta base cache, which could lead to data corruption when a | |
| newly allocated packfile happened to reuse the same memory address. | |
| The cache eviction logic has been updated to remove these stale | |
| entries upon closing a pack | |
| (merge 8d596ea8e7 ps/packfile-stale-delta-base-cache-fix later to maint). | |
| * Other code cleanup, docfix, build fix, etc. | |
| (merge e638de60bc kz/doc-add-rm-typofix later to maint). | |
| (merge 778c73948a kz/doc-user-manual-typo later to maint). | |
| (merge 42017ff979 kh/doc-trailers-cmd-examples later to maint). | |
| (merge 49e646f1c9 dk/fix-shattered-io-link later to maint). |