| 1 | Git v2.44 Release Notes |
| 2 | ======================= |
| 3 | |
| 4 | Backward Compatibility Notes |
| 5 | |
| 6 | * "git checkout -B <branch>" used to allow switching to a branch that |
| 7 | is in use on another worktree, but this was by mistake. The users |
| 8 | need to use "--ignore-other-worktrees" option. |
| 9 | |
| 10 | |
| 11 | UI, Workflows & Features |
| 12 | |
| 13 | * "git add" and "git stash" learned to support the ":(attr:...)" |
| 14 | magic pathspec. |
| 15 | |
| 16 | * "git rebase --autosquash" is now enabled for non-interactive rebase, |
| 17 | but it is still incompatible with the apply backend. |
| 18 | |
| 19 | * Introduce "git replay", a tool meant on the server side without |
| 20 | working tree to recreate a history. |
| 21 | |
| 22 | * "git merge-file" learned to take the "--diff-algorithm" option to |
| 23 | use algorithm different from the default "myers" diff. |
| 24 | |
| 25 | * Command line completion (in contrib/) learned to complete path |
| 26 | arguments to the "add/set" subcommands of "git sparse-checkout" |
| 27 | better. |
| 28 | |
| 29 | * "git checkout -B <branch> [<start-point>]" allowed a branch that is |
| 30 | in use in another worktree to be updated and checked out, which |
| 31 | might be a bit unexpected. The rule has been tightened, which is a |
| 32 | breaking change. "--ignore-other-worktrees" option is required to |
| 33 | unbreak you, if you are used to the current behaviour that "-B" |
| 34 | overrides the safety. |
| 35 | |
| 36 | * The builtin_objectmode attribute is populated for each path |
| 37 | without adding anything in .gitattributes files, which would be |
| 38 | useful in magic pathspec, e.g., ":(attr:builtin_objectmode=100755)" |
| 39 | to limit to executables. |
| 40 | |
| 41 | * "git fetch" learned to pay attention to "fetch.all" configuration |
| 42 | variable, which pretends as if "--all" was passed from the command |
| 43 | line when no remote parameter was given. |
| 44 | |
| 45 | * In addition to (rather cryptic) Security Identifiers, show username |
| 46 | and domain in the error message when we barf on mismatch between |
| 47 | the Git directory and the current user on Windows. |
| 48 | |
| 49 | * The error message given when "git branch -d branch" fails due to |
| 50 | commits unique to the branch has been split into an error and a new |
| 51 | conditional advice message. |
| 52 | |
| 53 | * When given an existing but unreadable file as a configuration file, |
| 54 | gitweb behaved as if the file did not exist at all, but now it |
| 55 | errors out. This is a change that may break backward compatibility. |
| 56 | |
| 57 | * When $HOME/.gitconfig is missing but XDG config file is available, we |
| 58 | should write into the latter, not former. "git gc" and "git |
| 59 | maintenance" wrote into a wrong "global config" file, which have |
| 60 | been corrected. |
| 61 | |
| 62 | * Define "special ref" as a very narrow set that consists of |
| 63 | FETCH_HEAD and MERGE_HEAD, and clarify everything else that used to |
| 64 | be classified as such are actually just pseudorefs. |
| 65 | |
| 66 | * All conditional "advice" messages show how to turn them off, which |
| 67 | becomes repetitive. Setting advice.* configuration explicitly on |
| 68 | now omits the instruction part. |
| 69 | |
| 70 | * The "disable repository discovery of a bare repository" check, |
| 71 | triggered by setting safe.bareRepository configuration variable to |
| 72 | 'explicit', has been loosened to exclude the ".git/" directory inside |
| 73 | a non-bare repository from the check. So you can do "cd .git && |
| 74 | git cmd" to run a Git command that works on a bare repository without |
| 75 | explicitly specifying $GIT_DIR now. |
| 76 | |
| 77 | * The completion script (in contrib/) learned more options that can |
| 78 | be used with "git log". |
| 79 | |
| 80 | * The labels on conflict markers for the common ancestor, our version, |
| 81 | and the other version are available to custom 3-way merge driver |
| 82 | via %S, %X, and %Y placeholders. |
| 83 | |
| 84 | * The write codepath for the reftable data learned to honor |
| 85 | core.fsync configuration. |
| 86 | |
| 87 | * The "--fsck-objects" option of "git index-pack" now can take the |
| 88 | optional parameter to tweak severity of different fsck errors. |
| 89 | |
| 90 | * The wincred credential backend has been taught to support oauth |
| 91 | refresh token the same way as credential-cache and |
| 92 | credential-libsecret backends. |
| 93 | |
| 94 | * Command line completion support (in contrib/) has been |
| 95 | updated for "git bisect". |
| 96 | |
| 97 | * "git branch" and friends learned to use the formatted text as |
| 98 | sorting key, not the underlying timestamp value, when the --sort |
| 99 | option is used with author or committer timestamp with a format |
| 100 | specifier (e.g., "--sort=creatordate:format:%H:%M:%S"). |
| 101 | |
| 102 | * The command line completion script (in contrib/) learned to |
| 103 | complete configuration variable names better. |
| 104 | |
| 105 | |
| 106 | Performance, Internal Implementation, Development Support etc. |
| 107 | |
| 108 | * Process to add some form of low-level unit tests has started. |
| 109 | |
| 110 | * Add support for GitLab CI. |
| 111 | |
| 112 | * "git for-each-ref --no-sort" still sorted the refs alphabetically |
| 113 | which paid non-trivial cost. It has been redefined to show output |
| 114 | in an unspecified order, to allow certain optimizations to take |
| 115 | advantage of. |
| 116 | |
| 117 | * Simplify API implementation to delete references by eliminating |
| 118 | duplication. |
| 119 | |
| 120 | * Subject approxidate() and show_date() machinery to OSS-Fuzz. |
| 121 | |
| 122 | * A new helper to let us pretend that we called lstat() when we know |
| 123 | our cache_entry is up-to-date via fsmonitor. |
| 124 | |
| 125 | * The optimization based on fsmonitor in the "diff --cached" |
| 126 | codepath is resurrected with the "fake-lstat" introduced earlier. |
| 127 | |
| 128 | * Test balloon to use C99 "bool" type from <stdbool.h> has been |
| 129 | added. |
| 130 | |
| 131 | * "git clone" has been prepared to allow cloning a repository with |
| 132 | non-default hash function into a repository that uses the reftable |
| 133 | backend. |
| 134 | |
| 135 | * Streaming spans of packfile data used to be done only from a |
| 136 | single, primary, pack in a repository with multiple packfiles. It |
| 137 | has been extended to allow reuse from other packfiles, too. |
| 138 | |
| 139 | * Comment updates to help developers not to attempt to modify |
| 140 | messages from plumbing commands that must stay constant. |
| 141 | |
| 142 | It might make sense to reassess the plumbing needs every few years, |
| 143 | but that should be done as a separate effort. |
| 144 | |
| 145 | * Move test-ctype helper to the unit-test framework. |
| 146 | |
| 147 | * Instead of manually creating refs/ hierarchy on disk upon a |
| 148 | creation of a secondary worktree, which is only usable via the |
| 149 | files backend, use the refs API to populate it. |
| 150 | |
| 151 | * CI for GitLab learned to drive macOS jobs. |
| 152 | |
| 153 | * A few tests to "git commit -o <pathspec>" and "git commit -i |
| 154 | <pathspec>" has been added. |
| 155 | |
| 156 | * Tests on ref API are moved around to prepare for reftable. |
| 157 | |
| 158 | * The Makefile often had to say "-L$(path) -R$(path)" that repeats |
| 159 | the path to the same library directory for link time and runtime. |
| 160 | A Makefile template is used to reduce such repetition. |
| 161 | |
| 162 | * The priority queue test has been migrated to the unit testing |
| 163 | framework. |
| 164 | |
| 165 | * Setting `feature.experimental` opts the user into multi-pack reuse |
| 166 | experiment |
| 167 | |
| 168 | * Squelch node.js 16 deprecation warnings from GitHub Actions CI |
| 169 | by updating actions/github-script and actions/checkout that use |
| 170 | node.js 20. |
| 171 | |
| 172 | * The mechanism to report the filename in the source code, used by |
| 173 | the unit-test machinery, assumed that the compiler expanded __FILE__ |
| 174 | to the path to the source given to the $(CC), but some compilers |
| 175 | give full path, breaking the output. This has been corrected. |
| 176 | |
| 177 | |
| 178 | Fixes since v2.43 |
| 179 | ----------------- |
| 180 | |
| 181 | * The way CI testing used "prove" could lead to running the test |
| 182 | suite twice needlessly, which has been corrected. |
| 183 | |
| 184 | * Update ref-related tests. |
| 185 | |
| 186 | * "git format-patch --encode-email-headers" ignored the option when |
| 187 | preparing the cover letter, which has been corrected. |
| 188 | |
| 189 | * Newer versions of Getopt::Long started giving warnings against our |
| 190 | (ab)use of it in "git send-email". Bump the minimum version |
| 191 | requirement for Perl to 5.8.1 (from September 2002) to allow |
| 192 | simplifying our implementation. |
| 193 | |
| 194 | * Earlier we stopped relying on commit-graph that (still) records |
| 195 | information about commits that are lost from the object store, |
| 196 | which has negative performance implications. The default has been |
| 197 | flipped to disable this pessimization. |
| 198 | |
| 199 | * Stale URLs have been updated to their current counterparts (or |
| 200 | archive.org) and HTTP links are replaced with working HTTPS links. |
| 201 | |
| 202 | * trace2 streams used to record the URLs that potentially embed |
| 203 | authentication material, which has been corrected. |
| 204 | |
| 205 | * The sample pre-commit hook that tries to catch introduction of new |
| 206 | paths that use potentially non-portable characters did not notice |
| 207 | an existing path getting renamed to such a problematic path, when |
| 208 | rename detection was enabled. |
| 209 | |
| 210 | * The command line parser for the "log" family of commands was too |
| 211 | loose when parsing certain numbers, e.g., silently ignoring the |
| 212 | extra 'q' in "git log -n 1q" without complaining, which has been |
| 213 | tightened up. |
| 214 | |
| 215 | * "git $cmd --end-of-options --rev -- --path" for some $cmd failed |
| 216 | to interpret "--rev" as a rev, and "--path" as a path. This was |
| 217 | fixed for many programs like "reset" and "checkout". |
| 218 | |
| 219 | * "git bisect reset" has been taught to clean up state files and refs |
| 220 | even when BISECT_START file is gone. |
| 221 | |
| 222 | * Some codepaths did not correctly parse configuration variables |
| 223 | specified with valueless "true", which has been corrected. |
| 224 | |
| 225 | * Code clean-up for sanity checking of command line options for "git |
| 226 | show-ref". |
| 227 | |
| 228 | * The code to parse the From e-mail header has been updated to avoid |
| 229 | recursion. |
| 230 | |
| 231 | * "git fetch --atomic" issued an unnecessary empty error message, |
| 232 | which has been corrected. |
| 233 | |
| 234 | * Command line completion script (in contrib/) learned to work better |
| 235 | with the reftable backend. |
| 236 | |
| 237 | * "git status" is taught to show both the branch being bisected and |
| 238 | being rebased when both are in effect at the same time. |
| 239 | |
| 240 | * "git archive --list extra garbage" silently ignored excess command |
| 241 | line parameters, which has been corrected. |
| 242 | |
| 243 | * "git sparse-checkout set" added default patterns even when the |
| 244 | patterns are being fed from the standard input, which has been |
| 245 | corrected. |
| 246 | |
| 247 | * "git sparse-checkout (add|set) --[no-]cone --end-of-options" did |
| 248 | not handle "--end-of-options" correctly after a recent update. |
| 249 | |
| 250 | * Unlike other environment variables that took the usual |
| 251 | true/false/yes/no as well as 0/1, GIT_FLUSH only understood 0/1, |
| 252 | which has been corrected. |
| 253 | |
| 254 | * Clearing in-core repository (happens during e.g., "git fetch |
| 255 | --recurse-submodules" with commit graph enabled) made in-core |
| 256 | commit object in an inconsistent state by discarding the necessary |
| 257 | data from commit-graph too early, which has been corrected. |
| 258 | |
| 259 | * Update to a new feature recently added, "git show-ref --exists". |
| 260 | |
| 261 | * oss-fuzz tests are built and run in CI. |
| 262 | (merge c4a9cf1df3 js/oss-fuzz-build-in-ci later to maint). |
| 263 | |
| 264 | * Rename detection logic ignored the final line of a file if it is an |
| 265 | incomplete line. |
| 266 | |
| 267 | * GitHub CI update. |
| 268 | (merge 0188b2c8e0 pb/ci-github-skip-logs-for-broken-tests later to maint). |
| 269 | |
| 270 | * "git diff --no-rename A B" did not disable rename detection but did |
| 271 | not trigger an error from the command line parser. |
| 272 | |
| 273 | * "git archive --remote=<remote>" learned to talk over the smart |
| 274 | http (aka stateless) transport. |
| 275 | (merge 176cd68634 jx/remote-archive-over-smart-http later to maint). |
| 276 | |
| 277 | * Fetching via protocol v0 over Smart HTTP transport sometimes failed |
| 278 | to correctly auto-follow tags. |
| 279 | (merge fba732c462 jk/fetch-auto-tag-following-fix later to maint). |
| 280 | |
| 281 | * The documentation for the --exclude-per-directory option marked it |
| 282 | as deprecated, which confused readers into thinking there may be a |
| 283 | plan to remove it in the future, which was not our intention. |
| 284 | (merge 0009542cab jc/ls-files-doc-update later to maint). |
| 285 | |
| 286 | * "git diff --no-index file1 file2" segfaulted while invoking the |
| 287 | external diff driver, which has been corrected. |
| 288 | |
| 289 | * Rewrite //-comments to /* comments */ in files whose comments |
| 290 | prevalently use the latter. |
| 291 | |
| 292 | * Cirrus CI jobs started breaking because we specified version of |
| 293 | FreeBSD that is no longer available, which has been corrected. |
| 294 | (merge 81fffb66d3 cb/use-freebsd-13-2-at-cirrus-ci later to maint). |
| 295 | |
| 296 | * A caller called index_file_exists() that takes a string expressed |
| 297 | as <ptr, length> with a wrong length, which has been corrected. |
| 298 | (merge 156e28b36d jh/sparse-index-expand-to-path-fix later to maint). |
| 299 | |
| 300 | * A failed "git tag -s" did not necessarily result in an error |
| 301 | depending on the crypto backend, which has been corrected. |
| 302 | |
| 303 | * "git stash" sometimes was silent even when it failed due to |
| 304 | unwritable index file, which has been corrected. |
| 305 | |
| 306 | * "git show-ref --verify" did not show things like "CHERRY_PICK_HEAD", |
| 307 | which has been corrected. |
| 308 | |
| 309 | * Recent conversion to allow more than 0/1 in GIT_FLUSH broke the |
| 310 | mechanism by flipping what yes/no means by mistake, which has been |
| 311 | corrected. |
| 312 | |
| 313 | * The sequencer machinery does not use the ref API and instead |
| 314 | records names of certain objects it needs for its correct operation |
| 315 | in temporary files, which makes these objects susceptible to loss |
| 316 | by garbage collection. These temporary files have been added as |
| 317 | starting points for reachability analysis to fix this. |
| 318 | (merge bc7f5db896 pw/gc-during-rebase later to maint). |
| 319 | |
| 320 | * "git cherry-pick" invoked during "git rebase -i" session lost |
| 321 | the authorship information, which has been corrected. |
| 322 | (merge e4301f73ff vn/rebase-with-cherry-pick-authorship later to maint). |
| 323 | |
| 324 | * The code paths that call repo_read_object_file() have been |
| 325 | tightened to react to errors. |
| 326 | (merge 568459bf5e js/check-null-from-read-object-file later to maint). |
| 327 | |
| 328 | * Other code cleanup, docfix, build fix, etc. |
| 329 | (merge 5aea3955bc rj/clarify-branch-doc-m later to maint). |
| 330 | (merge 9cce3be2df bk/bisect-doc-fix later to maint). |
| 331 | (merge 8430b438f6 vd/fsck-submodule-url-test later to maint). |
| 332 | (merge 3cb4384683 jc/t0091-with-unknown-git later to maint). |
| 333 | (merge 020456cb74 rs/receive-pack-remove-find-header later to maint). |
| 334 | (merge bc47139f4f la/trailer-cleanups later to maint). |