Git 2.31 Release Notes ====================== Updates since v2.30 ------------------- Backward incompatible and other important changes * The "pack-redundant" command, which has been left stale with almost unusable performance issues, now warns loudly when it gets used, as we no longer want to recommend its use (instead just "repack -d" instead). * The development community has adopted Contributor Covenant v2.0 to update from v1.4 that we have been using. * The support for deprecated PCRE1 library has been dropped. * Fixes for CVE-2021-21300 in Git 2.30.2 (and earlier) is included. UI, Workflows & Features * The "--format=%(trailers)" mechanism gets enhanced to make it easier to design output for machine consumption. * When a user does not tell "git pull" to use rebase or merge, the command gives a loud message telling a user to choose between rebase or merge but creates a merge anyway, forcing users who would want to rebase to redo the operation. Fix an early part of this problem by tightening the condition to give the message---there is no reason to stop or force the user to choose between rebase or merge if the history fast-forwards. * The configuration variable 'core.abbrev' can be set to 'no' to force no abbreviation regardless of the hash algorithm. * "git rev-parse" can be explicitly told to give output as absolute or relative path with the `--path-format=(absolute|relative)` option. * Bash completion (in contrib/) update to make it easier for end-users to add completion for their custom "git" subcommands. * "git maintenance" learned to drive scheduled maintenance on platforms whose native scheduling methods are not 'cron'. * After expiring a reflog and making a single commit, the reflog for the branch would record a single entry that knows both @{0} and @{1}, but we failed to answer "what commit were we on?", i.e. @{1} * "git bundle" learns "--stdin" option to read its refs from the standard input. Also, it now does not lose refs whey they point at the same object. * "git log" learned a new "--diff-merges=" option. * "git ls-files" can and does show multiple entries when the index is unmerged, which is a source for confusion unless -s/-u option is in use. A new option --deduplicate has been introduced. * `git worktree list` now annotates worktrees as prunable, shows locked and prunable attributes in --porcelain mode, and gained a --verbose option. * "git clone" tries to locally check out the branch pointed at by HEAD of the remote repository after it is done, but the protocol did not convey the information necessary to do so when copying an empty repository. The protocol v2 learned how to do so. * There are other ways than ".." for a single token to denote a "commit range", namely "^!" and "^-", but "git range-diff" did not understand them. * The "git range-diff" command learned "--(left|right)-only" option to show only one side of the compared range. * "git mergetool" feeds three versions (base, local and remote) of a conflicted path unmodified. The command learned to optionally prepare these files with unconflicted parts already resolved. * The .mailmap is documented to be read only from the root level of a working tree, but a stray file in a bare repository also was read by accident, which has been corrected. * "git maintenance" tool learned a new "pack-refs" maintenance task. * The error message given when a configuration variable that is expected to have a boolean value has been improved. * Signed commits and tags now allow verification of objects, whose two object names (one in SHA-1, the other in SHA-256) are both signed. * "git rev-list" command learned "--disk-usage" option. * "git {diff,log} --{skip,rotate}-to=" allows the user to discard diff output for early paths or move them to the end of the output. * "git difftool" learned "--skip-to=" option to restart an interrupted session from an arbitrary path. * "git grep" has been tweaked to be limited to the sparse checkout paths. * "git rebase --[no-]fork-point" gained a configuration variable rebase.forkPoint so that users do not have to keep specifying a non-default setting. Performance, Internal Implementation, Development Support etc. * A 3-year old test that was not testing anything useful has been corrected. * Retire more names with "sha1" in it. * The topological walk codepath is covered by new trace2 stats. * Update the Code-of-conduct to version 2.0 from the upstream (we've been using version 1.4). * "git mktag" validates its input using its own rules before writing a tag object---it has been updated to share the logic with "git fsck". * Two new ways to feed configuration variable-value pairs via environment variables have been introduced, and the way GIT_CONFIG_PARAMETERS encodes variable/value pairs has been tweaked to make it more robust. * Tests have been updated so that they do not to get affected by the name of the default branch "git init" creates. * "git fetch" learns to treat ref updates atomically in all-or-none fashion, just like "git push" does, with the new "--atomic" option. * The peel_ref() API has been replaced with peel_iterated_oid(). * The .use_shell flag in struct child_process that is passed to run_command() API has been clarified with a bit more documentation. * Document, clean-up and optimize the code around the cache-tree extension in the index. * The ls-refs protocol operation has been optimized to narrow the sub-hierarchy of refs/ it walks to produce response. * When removing many branches and tags, the code used to do so one ref at a time. There is another API it can use to delete multiple refs, and it makes quite a lot of performance difference when the refs are packed. * The "pack-objects" command needs to iterate over all the tags when automatic tag following is enabled, but it actually iterated over all refs and then discarded everything outside "refs/tags/" hierarchy, which was quite wasteful. * A perf script was made more portable. * Our setting of GitHub CI test jobs were a bit too eager to give up once there is even one failure found. Tweak the knob to allow other jobs keep running even when we see a failure, so that we can find more failures in a single run. * We've carried compatibility codepaths for compilers without variadic macros for quite some time, but the world may be ready for them to be removed. Force compilation failure on exotic platforms where variadic macros are not available to find out who screams in such a way that we can easily revert if it turns out that the world is not yet ready. * Code clean-up to ensure our use of hashtables using object names as keys use the "struct object_id" objects, not the raw hash values. * Lose the debugging aid that may have been useful in the past, but no longer is, in the "grep" codepaths. * Some pretty-format specifiers do not need the data in commit object (e.g. "%H"), but we were over-eager to load and parse it, which has been made even lazier. * Get rid of "GETTEXT_POISON" support altogether, which may or may not be controversial. * Introduce an on-disk file to record revindex for packdata, which traditionally was always created on the fly and only in-core. * The commit-graph learned to use corrected commit dates instead of the generation number to help topological revision traversal. * Piecemeal of rewrite of "git bisect" in C continues. * When a pager spawned by us exited, the trace log did not record its exit status correctly, which has been corrected. * Removal of GIT_TEST_GETTEXT_POISON continues. * The code to implement "git merge-base --independent" was poorly done and was kept from the very beginning of the feature. * Preliminary changes to fsmonitor integration. * Performance improvements for rename detection. * The common code to deal with "chunked file format" that is shared by the multi-pack-index and commit-graph files have been factored out, to help codepaths for both filetypes to become more robust. * The approach to "fsck" the incoming objects in "index-pack" is attractive for performance reasons (we have them already in core, inflated and ready to be inspected), but fundamentally cannot be applied fully when we receive more than one pack stream, as a tree object in one pack may refer to a blob object in another pack as ".gitmodules", when we want to inspect blobs that are used as ".gitmodules" file, for example. Teach "index-pack" to emit objects that must be inspected later and check them in the calling "fetch-pack" process. * The logic to handle "trailer" related placeholders in the "--format=" mechanisms in the "log" family and "for-each-ref" family is getting unified. * Raise the buffer size used when writing the index file out from (obviously too small) 8kB to (clearly sufficiently large) 128kB. * It is reported that open() on some platforms (e.g. macOS Big Sur) can return EINTR even though our timers are set up with SA_RESTART. A workaround has been implemented and enabled for macOS to rerun open() transparently from the caller when this happens. Fixes since v2.30 ----------------- * Diagnose command line error of "git rebase" early. * Clean up option descriptions in "git cmd --help". * "git stash" did not work well in a sparsely checked out working tree. * Some tests expect that "ls -l" output has either '-' or 'x' for group executable bit, but setgid bit can be inherited from parent directory and make these fields 'S' or 's' instead, causing test failures. * "git for-each-repo --config= " should not run for any repository when the configuration variable is not defined even once. * Fix 2.29 regression where "git mergetool --tool-help" fails to list all the available tools. * Fix for procedure to building CI test environment for mac. * The implementation of "git branch --sort" wrt the detached HEAD display has always been hacky, which has been cleaned up. * Newline characters in the host and path part of git:// URL are now forbidden. * "git diff" showed a submodule working tree with untracked cruft as "Submodule commit -dirty", but a natural expectation is that the "-dirty" indicator would align with "git describe --dirty", which does not consider having untracked files in the working tree as source of dirtiness. The inconsistency has been fixed. * When more than one commit with the same patch ID appears on one side, "git log --cherry-pick A...B" did not exclude them all when a commit with the same patch ID appears on the other side. Now it does. * Documentation for "git fsck" lost stale bits that has become incorrect. * Doc fix for packfile URI feature. * When "git rebase -i" processes "fixup" insn, there is no reason to clean up the commit log message, but we did the usual stripspace processing. This has been corrected. (merge f7d42ceec5 js/rebase-i-commit-cleanup-fix later to maint). * Fix in passing custom args from "git clone" to "upload-pack" on the other side. (merge ad6b5fefbd jv/upload-pack-filter-spec-quotefix later to maint). * The command line completion (in contrib/) completed "git branch -d" with branch names, but "git branch -D" offered tagnames in addition, which has been corrected. "git branch -M" had the same problem. (merge 27dc071b9a jk/complete-branch-force-delete later to maint). * When commands are started from a subdirectory, they may have to compare the path to the subdirectory (called prefix and found out from $(pwd)) with the tracked paths. On macOS, $(pwd) and readdir() yield decomposed path, while the tracked paths are usually normalized to the precomposed form, causing mismatch. This has been fixed by taking the same approach used to normalize the command line arguments. (merge 5c327502db tb/precompose-prefix-too later to maint). * Even though invocations of "die()" were logged to the trace2 system, "BUG()"s were not, which has been corrected. (merge 0a9dde4a04 jt/trace2-BUG later to maint). * "git grep --untracked" is meant to be "let's ALSO find in these files on the filesystem" when looking for matches in the working tree files, and does not make any sense if the primary search is done against the index, or the tree objects. The "--cached" and "--untracked" options have been marked as mutually incompatible. (merge 0c5d83b248 mt/grep-cached-untracked later to maint). * Fix "git fsck --name-objects" which apparently has not been used by anybody who is motivated enough to report breakage. (merge e89f89361c js/fsck-name-objects-fix later to maint). * Avoid individual tests in t5411 from getting affected by each other by forcing them to use separate output files during the test. (merge 822ee894f6 jx/t5411-unique-filenames later to maint). * Test to make sure "git rev-parse one-thing one-thing" gives the same thing twice (when one-thing is --since=X). (merge a5cdca4520 ew/rev-parse-since-test later to maint). * When certain features (e.g. grafts) used in the repository are incompatible with the use of the commit-graph, we used to silently turned commit-graph off; we now tell the user what we are doing. (merge c85eec7fc3 js/commit-graph-warning later to maint). * Objects that lost references can be pruned away, even when they have notes attached to it (and these notes will become dangling, which in turn can be pruned with "git notes prune"). This has been clarified in the documentation. (merge fa9ab027ba mz/doc-notes-are-not-anchors later to maint). * The error codepath around the "--temp/--prefix" feature of "git checkout-index" has been improved. (merge 3f7ba60350 mt/checkout-index-corner-cases later to maint). * The "git maintenance register" command had trouble registering bare repositories, which had been corrected. * A handful of multi-word configuration variable names in documentation that are spelled in all lowercase have been corrected to use the more canonical camelCase. (merge 7dd0eaa39c dl/doc-config-camelcase later to maint). * "git push $there --delete ''" should have been diagnosed as an error, but instead turned into a matching push, which has been corrected. (merge 20e416409f jc/push-delete-nothing later to maint). * Test script modernization. (merge 488acf15df sv/t7001-modernize later to maint). * An under-allocation for the untracked cache data has been corrected. (merge 6347d649bc jh/untracked-cache-fix later to maint). * Other code cleanup, docfix, build fix, etc. (merge e3f5da7e60 sg/t7800-difftool-robustify later to maint). (merge 9d336655ba js/doc-proto-v2-response-end later to maint). (merge 1b5b8cf072 jc/maint-column-doc-typofix later to maint). (merge 3a837b58e3 cw/pack-config-doc later to maint). (merge 01168a9d89 ug/doc-commit-approxidate later to maint). (merge b865734760 js/params-vs-args later to maint).