{"thread":{"id":"54379","subject":"[ANNOUNCE] Git v2.29.0-rc1","startedAt":"2020-10-09T15:58:26Z","lastAt":"2020-10-26T18:01:28Z","messageCount":8,"participants":["Junio C Hamano","René Scharfe"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"407214","messageId":"xmqq7drzv1bn.fsf@gitster.c.googlers.com","threadId":"54379","inReplyTo":null,"subject":"[ANNOUNCE] Git v2.29.0-rc1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-10-09T15:58:04Z","receivedAt":"2020-10-09T15:58:26Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"A release candidate Git v2.29.0-rc1 is now available for testing\nat the usual places.  It is comprised of 605 non-merge commits\nsince v2.28.0, contributed by 77 people, 22 of which are new faces.\n\nThe tarballs are found at:\n\n    https://www.kernel.org/pub/software/scm/git/testing/\n\nThe following public repositories all have a copy of the\n'v2.29.0-rc1' tag and the 'master' branch that the tag points at:\n\n  url = https://kernel.googlesource.com/pub/scm/git/git\n  url = git://repo.or.cz/alt-git.git\n  url = https://github.com/gitster/git\n\nNew contributors whose contributions weren't in v2.28.0 are as follows.\nWelcome to the Git development community!\n\n  Aaron Lipman, Adrian Moennich, Ákos Uzonyi, Antti Keränen,\n  Christian Schlack, Conor Davis, Eric Huber, Evan Gates, Han\n  Xin, Hugo Locurcio, Kyohei Kadota, Lin Sun, Nikita Leonov,\n  Noam Yorav-Raphael, pudinha, Raymond E. Pasco, Ryan Zoeller,\n  Samanta Navarro, Sibi Siddharthan, Simon Legner, Steve Kemp,\n  and Theodore Dubois.\n\nReturning contributors who helped this release are as follows.\nThanks for your continued support.\n\n  Ævar Arnfjörð Bjarmason, Alban Gruin, Alex Henrie, Alex\n  Riesen, Andrei Rybak, Beat Bolli, Ben Wijen, brian m. carlson,\n  Christian Couder, Chris Torek, Danny Lin, Denton Liu, Derrick\n  Stolee, Đoàn Trần Công Danh, Drew DeVault, Edmundo Carmona\n  Antoranz, Elijah Newren, Emily Shaffer, Eric Sunshine, Han-Wen\n  Nienhuys, Hariom Verma, Jacob Keller, Jean-Noël Avila, Jeff\n  Hostetler, Jeff King, Jiang Xin, Johannes Berg, Johannes\n  Schindelin, Johannes Sixt, Jonathan Tan, Junio C Hamano,\n  Kazuhiro Kato, Luke Diamand, Martin Ågren, Matheus Tavares,\n  Matthew Rogers, Michael Forney, Michal Privoznik, Miriam Rubio,\n  Orgad Shaneh, Patrick Steinhardt, Paul Mackerras, Philippe\n  Blain, Phillip Wood, Pranit Bauva, Prathamesh Chavan, René\n  Scharfe, Rohit Ashiwal, Sergey Organov, Shourya Shukla, Stefan\n  Dotterweich, SZEDER Gábor, Taylor Blau, Thomas Guyot-Sionnest,\n  and Роман Донченко.\n\n----------------------------------------------------------------\n\nGit 2.29 Release Notes (draft)\n==============================\n\nUpdates since v2.28\n-------------------\n\nUI, Workflows & Features\n\n * \"git help log\" has been enhanced by sharing more material from the\n   documentation for the underlying \"git rev-list\" command.\n\n * \"git for-each-ref --format=<>\" learned %(contents:size).\n\n * \"git merge\" learned to selectively omit \" into <branch>\" at the end\n   of the title of default merge message with merge.suppressDest\n   configuration.\n\n * The component to respond to \"git fetch\" request is made more\n   configurable to selectively allow or reject object filtering\n   specification used for partial cloning.\n\n * Stop when \"sendmail.*\" configuration variables are defined, which\n   could be a mistaken attempt to define \"sendemail.*\" variables.\n\n * The existing backends for \"git mergetool\" based on variants of vim\n   have been refactored and then support for \"nvim\" has been added.\n\n * \"git bisect\" learns the \"--first-parent\" option to find the first\n   breakage along the first-parent chain.\n\n * \"git log --first-parent -p\" showed patches only for single-parent\n   commits on the first-parent chain; the \"--first-parent\" option has\n   been made to imply \"-m\".  Use \"--no-diff-merges\" to restore the\n   previous behaviour to omit patches for merge commits.\n\n * The commit labels used to explain each side of conflicted hunks\n   placed by the sequencer machinery have been made more readable by\n   humans.\n\n * The \"--batch-size\" option of \"git multi-pack-index repack\" command\n   is now used to specify that very small packfiles are collected into\n   one until the total size roughly exceeds it.\n\n * The recent addition of SHA-256 support is marked as experimental in\n   the documentation.\n\n * \"git fetch\" learned --no-write-fetch-head option to avoid writing\n   the FETCH_HEAD file.\n\n * Command line completion (in contrib/) usually omits redundant,\n   deprecated and/or dangerous options from its output; it learned to\n   optionally include all of them.\n\n * The output from the \"diff\" family of the commands had abbreviated\n   object names of blobs involved in the patch, but its length was not\n   affected by the --abbrev option.  Now it is.\n\n * \"git worktree\" gained a \"repair\" subcommand to help users recover\n   after moving the worktrees or repository manually without telling\n   Git.  Also, \"git init --separate-git-dir\" no longer corrupts\n   administrative data related to linked worktrees.\n\n * The \"--format=\" option to the \"for-each-ref\" command and friends\n   learned a few more tricks, e.g. the \":short\" suffix that applies to\n   \"objectname\" now also can be used for \"parent\", \"tree\", etc.\n\n * \"git worktree add\" learns that the \"-d\" is a synonym to \"--detach\"\n   option to create a new worktree without being on a branch.\n\n * \"format-patch --range-diff=<prev> <origin>..HEAD\" has been taught\n   not to ignore <origin> when <prev> is a single version.\n\n * \"add -p\" now allows editing paths that were only added in intent.\n\n * The 'meld' backend of the \"git mergetool\" learned to give the\n   underlying 'meld' the '--auto-merge' option, which would help\n   reduce the amount of text that requires manual merging.\n\n * \"git for-each-ref\" and friends that list refs used to allow only\n   one --merged or --no-merged to filter them; they learned to take\n   combination of both kind of filtering.\n\n * \"git maintenance\", a \"git gc\"'s big brother, has been introduced to\n   take care of more repository maintenance tasks, not limited to the\n   object database cleaning.\n\n * \"git receive-pack\" that accepts requests by \"git push\" learned to\n   outsource most of the ref updates to the new \"proc-receive\" hook.\n\n * \"git push\" that wants to be atomic and wants to send push\n   certificate learned not to prepare and sign the push certificate\n   when it fails the local check (hence due to atomicity it is known\n   that no certificate is needed).\n\n * \"git commit-graph write\" learned to limit the number of bloom\n   filters that are computed from scratch with the --max-new-filters\n   option.\n\n * The transport protocol v2 has become the default again.\n\n * The installation procedure learned to optionally omit \"git-foo\"\n   executable files for each 'foo' built-in subcommand, which are only\n   required by old timers that still rely on the age old promise that\n   prepending \"git --exec-path\" output to PATH early in their script\n   will keep the \"git-foo\" calls they wrote working.\n\n * The command line completion (in contrib/) learned that \"git restore\n   -s <TAB>\" is often followed by a refname.\n\n * \"git shortlog\" has been taught to group commits by the contents of\n   the trailer lines, like \"Reviewed-by:\", \"Coauthored-by:\", etc.\n\n * \"git archive\" learns the \"--add-file\" option to include untracked\n   files into a snapshot from a tree-ish.\n\n * \"git fetch\" and \"git push\" support negative refspecs.\n\n * \"git format-patch\" learns to take \"whenAble\" as a possible value\n   for the format.useAutoBase configuration variable to become no-op\n   when the  automatically computed base does not make sense.\n\n * Credential helpers are now allowed to terminate lines with CRLF\n   line ending, as well as LF line ending.\n\n\nPerformance, Internal Implementation, Development Support etc.\n\n * The changed-path Bloom filter is improved using ideas from an\n   independent implementation.\n\n * Updates to the changed-paths bloom filter.\n\n * The test framework has been updated so that most tests will run\n   with predictable (artificial) timestamps.\n\n * Preliminary clean-up of the refs API in preparation for adding a\n   new refs backend \"reftable\".\n\n * Dev support to limit the use of test_must_fail to only git commands.\n\n * While packing many objects in a repository with a promissor remote,\n   lazily fetching missing objects from the promissor remote one by\n   one may be inefficient---the code now attempts to fetch all the\n   missing objects in batch (obviously this won't work for a lazy\n   clone that lazily fetches tree objects as you cannot even enumerate\n   what blobs are missing until you learn which trees are missing).\n\n * The pretend-object mechanism checks if the given object already\n   exists in the object store before deciding to keep the data\n   in-core, but the check would have triggered lazy fetching of such\n   an object from a promissor remote.\n\n * The argv_array API is useful for not just managing argv but any\n   \"vector\" (NULL-terminated array) of strings, and has seen adoption\n   to a certain degree.  It has been renamed to \"strvec\" to reduce the\n   barrier to adoption.\n\n * The final leg of SHA-256 transition plus doc updates.  Note that\n   there is no interoperability between SHA-1 and SHA-256\n   repositories yet.\n\n * CMake support to build with MSVC for Windows bypassing the Makefile.\n\n * A new helper function has_object() has been introduced to make it\n   easier to mark object existence checks that do and don't want to\n   trigger lazy fetches, and a few such checks are converted using it.\n\n * A no-op replacement function implemented as a C preprocessor macro\n   does not perform as good a job as one implemented as a \"static\n   inline\" function in catching errors in parameters; replace the\n   former with the latter in <git-compat-util.h> header.\n\n * Test framework update.\n   (merge d572f52a64 es/test-cmp-typocatcher later to maint).\n\n * Updates to \"git merge\" tests, in preparation for a new merge\n   strategy backend.\n\n * midx and commit-graph files now use the byte defined in their file\n   format specification for identifying the hash function used for\n   object names.\n\n * The FETCH_HEAD is now always read from the filesystem regardless of\n   the ref backend in use, as its format is much richer than the\n   normal refs, and written directly by \"git fetch\" as a plain file..\n\n * An unused binary has been discarded, and and a bunch of commands\n   have been turned into into built-in.\n\n * A handful of places in in-tree code still relied on being able to\n   execute the git subcommands, especially built-ins, in \"git-foo\"\n   form, which have been corrected.\n\n * When a packfile is removed by \"git repack\", multi-pack-index gets\n   cleared; the code was taught to do so less aggressively by first\n   checking if the midx actually refers to a pack that no longer\n   exists.\n\n * Internal API clean-up to handle two options \"diff-index\" and \"log\"\n   have, which happen to share the same short form, more sensibly.\n\n * The \"add -i/-p\" machinery has been written in C but it is not used\n   by default yet.  It is made default to those who are participating\n   in feature.experimental experiment.\n\n * Allow maintainers to tweak $(TAR) invocations done while making\n   distribution tarballs.\n\n * \"git index-pack\" learned to resolve deltified objects with greater\n   parallelism.\n\n * \"diff-highlight\" (in contrib/) had a logic to flush its output upon\n   seeing a blank line but the way it detected a blank line was broken.\n\n * The logic to skip testing on the tagged commit and the tag itself\n   was not quite consistent which led to failure of Windows test\n   tasks.  It has been revamped to consistently skip revisions that\n   have already been tested, based on the tree object of the revision.\n\n\nFixes since v2.28\n-----------------\n\n * The \"mediawiki\" remote backend which lives in contrib/mw-to-git/\n   and is not built with git by default, had an RCE bug allowing a\n   malicious MediaWiki server operator to inject arbitrary commands\n   for execution by a cloning client. This has been fixed.\n\n   The bug was discovered and reported by Joern Schneeweisz of GitLab\n   to the git-security mailing list. Its practical impact due to the\n   obscurity of git-remote-mediawiki was deemed small enough to forgo\n   a dedicated security release.\n\n * \"git clone --separate-git-dir=$elsewhere\" used to stomp on the\n   contents of the existing directory $elsewhere, which has been\n   taught to fail when $elsewhere is not an empty directory.\n   (merge dfaa209a79 bw/fail-cloning-into-non-empty later to maint).\n\n * With the base fix to 2.27 regresion, any new extensions in a v0\n   repository would still be silently honored, which is not quite\n   right.  Instead, complain and die loudly.\n   (merge ec91ffca04 jk/reject-newer-extensions-in-v0 later to maint).\n\n * Fetching from a lazily cloned repository resulted at the server\n   side in attempts to lazy fetch objects that the client side has,\n   many of which will not be available from the third-party anyway.\n   (merge 77aa0941ce jt/avoid-lazy-fetching-upon-have-check later to maint).\n\n * Fix to an ancient bug caused by an over-eager attempt for\n   optimization.\n   (merge a98f7fb366 rs/add-index-entry-optim-fix later to maint).\n\n * Pushing a ref whose name contains non-ASCII character with the\n   \"--force-with-lease\" option did not work over smart HTTP protocol,\n   which has been corrected.\n   (merge cd85b447bf bc/push-cas-cquoted-refname later to maint).\n\n * \"git mv src dst\", when src is an unmerged path, errored out\n   correctly but with an incorrect error message to claim that src is\n   not tracked, which has been clarified.\n   (merge 9b906af657 ct/mv-unmerged-path-error later to maint).\n\n * Fix to a regression introduced during 2.27 cycle.\n   (merge cada7308ad en/fill-directory-exponential later to maint).\n\n * Command line completion (in contrib/) update.\n   (merge 688b87c81b mp/complete-show-color-moved later to maint).\n\n * All \"mergy\" operations that internally use the merge-recursive\n   machinery should honor the merge.renormalize configuration, but\n   many of them didn't.\n\n * Doc cleanup around \"worktree\".\n   (merge dc9c144be5 es/worktree-doc-cleanups later to maint).\n\n * The \"git blame --first-parent\" option was not documented, but now\n   it is.\n   (merge 11bc12ae1e rp/blame-first-parent-doc later to maint).\n\n * The logic to find the ref transaction hook script attempted to\n   cache the path to the found hook without realizing that it needed\n   to keep a copied value, as the API it used returned a transitory\n   buffer space.  This has been corrected.\n   (merge 09b2aa30c9 ps/ref-transaction-hook later to maint).\n\n * Recent versions of \"git diff-files\" shows a diff between the index\n   and the working tree for \"intent-to-add\" paths as a \"new file\"\n   patch; \"git apply --cached\" should be able to take \"git diff-files\"\n   and should act as an equivalent to \"git add\" for the path, but the\n   command failed to do so for such a path.\n   (merge 4c025c667e rp/apply-cached-with-i-t-a later to maint).\n\n * \"git diff [<tree-ish>] $path\" for a $path that is marked with i-t-a\n   bit was not showing the mode bits from the working tree.\n   (merge cb0dd22b82 rp/ita-diff-modefix later to maint).\n\n * Ring buffer with size 4 used for bin-hex translation resulted in a\n   wrong object name in the sequencer's todo output, which has been\n   corrected.\n   (merge 5da69c0dac ak/sequencer-fix-find-uniq-abbrev later to maint).\n\n * When given more than one target line ranges, \"git blame -La,b\n   -Lc,d\" was over-eager to coalesce groups of original lines and\n   showed incorrect results, which has been corrected.\n   (merge c2ebaa27d6 jk/blame-coalesce-fix later to maint).\n\n * The regexp to identify the function boundary for FORTRAN programs\n   has been updated.\n   (merge 75c3b6b2e8 pb/userdiff-fortran-update later to maint).\n\n * A few end-user facing messages have been updated to be\n   hash-algorithm agnostic.\n   (merge 4279000d3e jc/object-names-are-not-sha-1 later to maint).\n\n * \"unlink\" emulation on MinGW has been optimized.\n   (merge 680e0b4524 jh/mingw-unlink later to maint).\n\n * The purpose of \"git init --separate-git-dir\" is to initialize a\n   new project with the repository separate from the working tree,\n   or, in the case of an existing project, to move the repository\n   (the .git/ directory) out of the working tree. It does not make\n   sense to use --separate-git-dir with a bare repository for which\n   there is no working tree, so disallow its use with bare\n   repositories.\n   (merge ccf236a23a es/init-no-separate-git-dir-in-bare later to maint).\n\n * \"ls-files -o\" mishandled the top-level directory of another git\n   working tree that hangs in the current git working tree.\n   (merge ab282aa548 en/dir-nonbare-embedded later to maint).\n\n * Fix some incorrect UNLEAK() annotations.\n   (merge 3e19816dc0 jk/unleak-fixes later to maint).\n\n * Use more buffered I/O where we used to call many small write(2)s.\n   (merge a698d67b08 rs/more-buffered-io later to maint).\n\n * The patch-id computation did not ignore the \"incomplete last line\"\n   marker like whitespaces.\n   (merge 82a62015a7 rs/patch-id-with-incomplete-line later to maint).\n\n * Updates into a lazy/partial clone with a submodule did not work\n   well with transfer.fsckobjects set.\n\n * The parser for \"git for-each-ref --format=...\" was too loose when\n   parsing the \"%(trailers...)\" atom, and forgot that \"trailers\" and\n   \"trailers:<modifiers>\" are the only two allowed forms, which has\n   been corrected.\n   (merge 2c22e102f8 hv/ref-filter-trailers-atom-parsing-fix later to maint).\n\n * Long ago, we decided to use 3 threads by default when running the\n   index-pack task in parallel, which has been adjusted a bit upwards.\n   (merge fbff95b67f jk/index-pack-w-more-threads later to maint).\n\n * \"git restore/checkout --no-overlay\" with wildcarded pathspec\n   mistakenly removed matching paths in subdirectories, which has been\n   corrected.\n   (merge bfda204ade rs/checkout-no-overlay-pathspec-fix later to maint).\n\n * The description of --cached/--index options in \"git apply --help\"\n   has been updated.\n   (merge d064702be3 rp/apply-cached-doc later to maint).\n\n * Feeding \"$ZERO_OID\" to \"git log --ignore-missing --stdin\", and\n   running \"git log --ignore-missing $ZERO_OID\" fell back to start\n   digging from HEAD; it has been corrected to become a no-op, like\n   \"git log --tags=no-tag-matches-this-pattern\" does.\n   (merge 04a0e98515 jk/rev-input-given-fix later to maint).\n\n * Various callers of run_command API have been modernized.\n   (merge afbdba391e jc/run-command-use-embedded-args later to maint).\n\n * List of options offered and accepted by \"git add -i/-p\" were\n   inconsistent, which have been corrected.\n   (merge ce910287e7 pw/add-p-allowed-options-fix later to maint).\n\n * \"git diff --stat -w\" showed 0-line changes for paths whose changes\n   were only whitespaces, which was not intuitive.  We now omit such\n   paths from the stat output.\n   (merge 1cf3d5db9b mr/diff-hide-stat-wo-textual-change later to maint).\n\n * It was possible for xrealloc() to send a non-NULL pointer that has\n   been freed, which has been fixed.\n   (merge 6479ea4a8a jk/xrealloc-avoid-use-after-free later to maint).\n\n * \"git status\" has trouble showing where it came from by interpreting\n   reflog entries that record certain events, e.g. \"checkout @{u}\", and\n   gives a hard/fatal error.  Even though it inherently is impossible\n   to give a correct answer because the reflog entries lose some\n   information (e.g. \"@{u}\" does not record what branch the user was\n   on hence which branch 'the upstream' needs to be computed, and even\n   if the record were available, the relationship between branches may\n   have changed), at least hide the error and allow \"status\" to show its\n   output.\n\n * \"git status --short\" quoted a path with SP in it when tracked, but\n   not those that are untracked, ignored or unmerged.  They are all\n   shown quoted consistently.\n\n * \"git diff/show\" on a change that involves a submodule used to read\n   the information on commits in the submodule from a wrong repository\n   and gave a wrong information when the commit-graph is involved.\n   (merge 85a1ec2c32 mf/submodule-summary-with-correct-repository later to maint).\n\n * Unlike \"git config --local\", \"git config --worktree\" did not fail\n   early and cleanly when started outside a git repository.\n   (merge 378fe5fc3d mt/config-fail-nongit-early later to maint).\n\n * There is a logic to estimate how many objects are in the\n   repository, which is meant to run once per process invocation, but\n   it ran every time the estimated value was requested.\n   (merge 67bb65de5d jk/dont-count-existing-objects-twice later to maint).\n\n * \"git remote set-head\" that failed still said something that hints\n   the operation went through, which was misleading.\n   (merge 5a07c6c3c2 cs/don-t-pretend-a-failed-remote-set-head-succeeded later to maint).\n\n * \"git fetch --all --ipv4/--ipv6\" forgot to pass the protocol options\n   to instances of the \"git fetch\" that talk to individual remotes,\n   which has been corrected.\n   (merge 4e735c1326 ar/fetch-ipversion-in-all later to maint).\n\n * The \"unshelve\" subcommand of \"git p4\" incorrectly used commit^N\n   where it meant to say commit~N to name the Nth generation\n   ancestor, which has been corrected.\n   (merge 0acbf5997f ld/p4-unshelve-fix later to maint).\n\n * \"git clone\" that clones from SHA-1 repository, while\n   GIT_DEFAULT_HASH set to use SHA-256 already, resulted in an\n   unusable repository that half-claims to be SHA-256 repository\n   with SHA-1 objects and refs.  This has been corrected.\n\n * Adjust sample hooks for hash algorithm other than SHA-1.\n   (merge d8d3d632f4 dl/zero-oid-in-hooks later to maint).\n\n * \"git range-diff\" showed incorrect diffstat, which has been\n   corrected.\n\n * Earlier we taught \"git pull\" to warn when the user does not say the\n   histories need to be merged, rebased or accepts only fast-\n   forwarding, but the warning triggered for those who have set the\n   pull.ff configuration variable.\n   (merge 54200cef86 ah/pull later to maint).\n\n * Compilation fix around type punning.\n   (merge 176380fd11 jk/drop-unaligned-loads later to maint).\n\n * \"git blame --ignore-rev/--ignore-revs-file\" failed to validate\n   their input are valid revision, and failed to take into account\n   that the user may want to give an annotated tag instead of a\n   commit, which has been corrected.\n   (merge 610e2b9240 jc/blame-ignore-fix later to maint).\n\n * \"git bisect start X Y\", when X and Y are not valid committish\n   object names, should take X and Y as pathspec, but didn't.\n   (merge 73c6de06af cc/bisect-start-fix later to maint).\n\n * The explanation of the \"scissors line\" has been clarified.\n   (merge 287416dba6 eg/mailinfo-doc-scissors later to maint).\n\n * A race that leads to an access to a free'd data was corrected in\n   the codepath that reads pack files.\n   (merge bda959c476 mt/delta-base-cache-races later to maint).\n\n * in_merge_bases_many(), a way to see if a commit is reachable from\n   any commit in a set of commits, was totally broken when the\n   commit-graph feature was in use, which has been corrected.\n   (merge 8791bf1841 ds/in-merge-bases-many-optim-bug later to maint).\n\n * \"git submodule update --quiet\" did not squelch underlying \"rebase\"\n   and \"pull\" commands.\n   (merge 3ad0401e9e td/submodule-update-quiet later to maint).\n\n * The lazy fetching done internally to make missing objects available\n   in a partial clone incorrectly made permanent damage to the partial\n   clone filter in the repository, which has been corrected.\n\n * \"log -c --find-object=X\" did not work well to find a merge that\n   involves a change to an object X from only one parent.\n   (merge 957876f17d jk/diff-cc-oidfind-fix later to maint).\n\n * Other code cleanup, docfix, build fix, etc.\n   (merge 84544f2ea3 sk/typofixes later to maint).\n   (merge b17f411ab5 ar/help-guides-doc later to maint).\n   (merge 98c6871fad rs/grep-simpler-parse-object-or-die-call later to maint).\n   (merge 861c4ce141 en/typofixes later to maint).\n   (merge 60e47f6773 sg/ci-git-path-fix-with-pyenv later to maint).\n   (merge e2bfa50ac3 jb/doc-packfile-name later to maint).\n   (merge 918d8ff780 es/worktree-cleanup later to maint).\n   (merge dc156bc31f ma/t1450-quotefix later to maint).\n   (merge 56e743426b en/merge-recursive-comment-fixes later to maint).\n   (merge 7d23ff818f rs/bisect-oid-to-hex-fix later to maint).\n   (merge de20baf2c9 ny/notes-doc-sample-update later to maint).\n   (merge f649aaaf82 so/rev-parser-errormessage-fix later to maint).\n   (merge 6103d58b7f bc/sha-256-cvs-svn-updates later to maint).\n   (merge ac900fddb7 ma/stop-progress-null-fix later to maint).\n   (merge e767963ab6 rs/upload-pack-sigchain-fix later to maint).\n   (merge a831908599 rs/preserve-merges-unused-code-removal later to maint).\n   (merge 6dfefe70a9 jb/commit-graph-doc-fix later to maint).\n   (merge 847b37271e pb/set-url-docfix later to maint).\n   (merge 748f733d54 mt/checkout-entry-dead-code-removal later to maint).\n   (merge ce820cbd58 dl/subtree-docs later to maint).\n   (merge 55fe225dde jk/leakfix later to maint).\n   (merge ee22a29215 so/pretty-abbrev-doc later to maint).\n   (merge 3100fd5588 jc/post-checkout-doc later to maint).\n   (merge 17bae89476 pb/doc-external-diff-env later to maint).\n   (merge 27ed6ccc12 jk/worktree-check-clean-leakfix later to maint).\n   (merge 1302badd16 ea/blame-use-oideq later to maint).\n   (merge e6d5a11fed al/t3200-back-on-a-branch later to maint).\n   (merge 324efcf6b6 pw/add-p-leakfix later to maint).\n   (merge 1c6ffb546b jk/add-i-fixes later to maint).\n   (merge e40e936551 cd/commit-graph-doc later to maint).\n   (merge 0512eabd91 jc/sequencer-stopped-sha-simplify later to maint).\n   (merge d01141de5a so/combine-diff-simplify later to maint).\n   (merge 3be01e5ab1 sn/fast-import-doc later to maint).\n\n----------------------------------------------------------------\n\nChanges since v2.28.0 are as follows:\n\nAaron Lipman (12):\n      t6030: modernize \"git bisect run\" tests\n      rev-list: allow bisect and first-parent flags\n      cmd_bisect__helper: defer parsing no-checkout flag\n      bisect: introduce first-parent flag\n      bisect: combine args passed to find_bisection()\n      bisect: add first-parent option to documentation\n      t3200: clean side effect of git checkout --orphan\n      t3201: test multiple branch filter combinations\n      Doc: cover multiple contains/no-contains filters\n      ref-filter: allow merged and no-merged filters\n      ref-filter: make internal reachable-filter API more precise\n      Doc: prefer more specific file name\n\nAdrian Moennich (1):\n      ci: fix inconsistent indentation\n\nAlban Gruin (1):\n      t6300: fix issues related to %(contents:size)\n\nAlex Henrie (1):\n      pull: don't warn if pull.ff has been set\n\nAlex Riesen (1):\n      fetch: pass --ipv4 and --ipv6 options to sub-fetches\n\nAndrei Rybak (1):\n      git-help.txt: fix mentions of option --guides\n\nAntti Keränen (1):\n      rebase -i: fix possibly wrong onto hash in todo\n\nBeat Bolli (1):\n      gitk: rename \"commit summary\" to \"commit reference\"\n\nBen Wijen (1):\n      git clone: don't clone into non-empty directory\n\nChris Torek (1):\n      git-mv: improve error message for conflicted file\n\nChristian Couder (4):\n      Documentation: clarify %(contents:XXXX) doc\n      t6300: test refs pointing to tree and blob\n      ref-filter: add support for %(contents:size)\n      bisect: don't use invalid oid as rev when starting\n\nChristian Schlack (1):\n      remote: don't show success message when set-head fails\n\nConor Davis (1):\n      commit-graph-format.txt: fix no-parent value\n\nDanny Lin (2):\n      contrib/subtree: fix \"unsure\" for --message in the document\n      contrib/subtree: document 'push' does not take '--squash'\n\nDenton Liu (13):\n      t3701: stop using `env` in force_color()\n      t5324: reorder `run_with_limited_open_files test_might_fail`\n      t7107: don't use test_must_fail()\n      t9834: remove use of `test_might_fail p4`\n      t9400: don't use test_must_fail with cvs\n      test-lib-functions: restrict test_must_fail usage\n      contrib/completion: complete options that take refs for format-patch\n      hooks--pre-push.sample: modernize script\n      hooks--pre-push.sample: use hash-agnostic zero OID\n      hooks--update.sample: use hash-agnostic zero OID\n      gitk: replace tabs with spaces\n      compat/mingw.h: drop extern from function declaration\n      Makefile: ASCII-sort += lists\n\nDerrick Stolee (22):\n      commit-graph: place bloom_settings in context\n      commit-graph: change test to die on parse, not load\n      bloom: fix logic in get_bloom_filter()\n      commit-graph: persist existence of changed-paths\n      revision.c: fix whitespace\n      multi-pack-index: repack batches below --batch-size\n      t/README: document GIT_TEST_DEFAULT_HASH\n      commit-graph: use the \"hash version\" byte\n      multi-pack-index: use hash version byte\n      bloom/diff: properly short-circuit on max_changes\n      maintenance: create basic maintenance runner\n      maintenance: add --quiet option\n      maintenance: replace run_auto_gc()\n      maintenance: initialize task array\n      maintenance: add commit-graph task\n      maintenance: add --task option\n      maintenance: take a lock on the objects directory\n      maintenance: create maintenance.<task>.enabled config\n      maintenance: use pointers to check --auto\n      maintenance: add auto condition for commit-graph task\n      maintenance: add trace2 regions for task execution\n      commit-reach: fix in_merge_bases_many bug\n\nDrew DeVault (1):\n      git-send-email: die if sendmail.* config is set\n\nEdmundo Carmona Antoranz (1):\n      blame.c: replace instance of !oidcmp for oideq\n\nElijah Newren (26):\n      Remove doubled words in various comments\n      hashmap: fix typo in usage docs\n      merge-recursive: fix unclear and outright wrong comments\n      t6038: make tests fail for the right reason\n      t6038: remove problematic test\n      merge: make merge.renormalize work for all uses of merge machinery\n      checkout: support renormalization with checkout -m <paths>\n      Collect merge-related tests to t64xx\n      t6418: tighten delete/normalize conflict testcase\n      t6422: fix bad check against missing file\n      t6416, t6422: fix incorrect untracked file count\n      t6423: fix test setup for a couple tests\n      t6422: fix multiple errors with the mod6 test expectations\n      t6416, t6423: clarify some comments and fix some typos\n      t6423: add an explanation about why one of the tests does not pass\n      t6422, t6426: be more flexible for add/add conflicts involving renames\n      t642[23]: be more flexible for add/add conflicts involving pair renames\n      t6425: be more flexible with rename/delete conflict messages\n      t3000: fix some test description typos\n      dir: avoid prematurely marking nonbare repositories as matches\n      sequencer: avoid garbled merge machinery messages due to commit labels\n      mem-pool: add convenience functions for strdup and strndup\n      mem-pool: use more standard initialization and finalization\n      mem-pool: use consistent pool variable name\n      dir: make clear_directory() free all relevant memory\n      dir: fix problematic API to avoid memory leaks\n\nEmily Shaffer (1):\n      Revert \"contrib: subtree: adjust test to change in fmt-merge-msg\"\n\nEric Huber (1):\n      gitk: Preserve window dimensions on exit when not using ttk themes\n\nEric Sunshine (22):\n      worktree: drop pointless strbuf_release()\n      worktree: drop unused code from get_linked_worktree()\n      worktree: drop bogus and unnecessary path munging\n      worktree: retire special-case normalization of main worktree path\n      git-worktree.txt: employ fixed-width typeface consistently\n      git-worktree.txt: consistently use term \"working tree\"\n      git-worktree.txt: fix minor grammatical issues\n      git-worktree.txt: make start of new sentence more obvious\n      git-worktree.txt: link to man pages when citing other Git commands\n      test_cmp: diagnose incorrect arguments\n      init: disallow --separate-git-dir with bare repository\n      worktree: add skeleton \"repair\" command\n      worktree: teach \"repair\" to fix worktree back-links to main worktree\n      worktree: teach \"repair\" to fix outgoing links to worktrees\n      init: teach --separate-git-dir to repair linked worktrees\n      init: make --separate-git-dir work from within linked worktree\n      git-checkout.txt: document -d short option for --detach\n      worktree: teach `add` to recognize -d as shorthand for --detach\n      git-worktree.txt: discuss branch-based vs. throwaway worktrees\n      diff: move show_interdiff() from its own file to diff-lib\n      diff-lib: tighten show_interdiff()'s interface\n      format-patch: use 'origin' as start of current-series-range when known\n\nEvan Gates (1):\n      Doc: show example scissors line\n\nHan Xin (1):\n      send-pack: run GPG after atomic push checking\n\nHan-Wen Nienhuys (17):\n      lib-t6000.sh: write tag using git-update-ref\n      t3432: use git-reflog to inspect the reflog for HEAD\n      bisect: treat BISECT_HEAD as a pseudo ref\n      t1400: use git rev-parse for testing PSEUDOREF existence\n      Modify pseudo refs through ref backend storage\n      Make HEAD a PSEUDOREF rather than PER_WORKTREE.\n      refs: move the logic to add \\t to reflog to the files backend\n      refs: split off reading loose ref data in separate function\n      refs: fix comment about submodule ref_stores\n      refs: move gitdir into base ref_store\n      refs: read FETCH_HEAD and MERGE_HEAD generically\n      refs: make refs_ref_exists public\n      sequencer: treat CHERRY_PICK_HEAD as a pseudo ref\n      builtin/commit: suggest update-ref for pseudoref removal\n      sequencer: treat REVERT_HEAD as a pseudo ref\n      refs: move REF_LOG_ONLY to refs-internal.h\n      refs: add GIT_TRACE_REFS debugging mechanism\n\nHariom Verma (10):\n      t6300: unify %(trailers) and %(contents:trailers) tests\n      ref-filter: 'contents:trailers' show error if `:` is missing\n      ref-filter: support different email formats\n      ref-filter: refactor `grab_objectname()`\n      ref-filter: modify error messages in `grab_objectname()`\n      ref-filter: rename `objectname` related functions and fields\n      ref-filter: add `short` modifier to 'tree' atom\n      ref-filter: add `short` modifier to 'parent' atom\n      pretty: refactor `format_sanitized_subject()`\n      ref-filter: add `sanitize` option for 'subject' atom\n\nHugo Locurcio (1):\n      bisect: swap command-line options in documentation\n\nJacob Keller (4):\n      refspec: fix documentation referring to refspec_item\n      refspec: make sure stack refspec_item variables are zeroed\n      refspec: add support for negative refspecs\n      format-patch: teach format.useAutoBase \"whenAble\" option\n\nJean-Noël Avila (4):\n      git-bisect-lk2009: make continuation of list indented\n      doc: use linkgit macro where needed.\n      doc: git-remote fix ups\n      doc: fix the bnf like style of some commands\n\nJeff Hostetler (1):\n      mingw: improve performance of mingw_unlink()\n\nJeff King (82):\n      t6000: use test_tick consistently\n      t9700: loosen ident timezone regex\n      t5539: make timestamp requirements more explicit\n      t9100: explicitly unset GIT_COMMITTER_DATE\n      test-lib: set deterministic default author/committer date\n      t9100: stop depending on commit timestamps\n      verify_repository_format(): complain about new extensions in v0 repo\n      argv-array: use size_t for count and alloc\n      argv-array: rename to strvec\n      strvec: rename files from argv-array to strvec\n      quote: rename sq_dequote_to_argv_array to mention strvec\n      strvec: convert builtin/ callers away from argv_array name\n      strvec: convert more callers away from argv_array name\n      strvec: convert remaining callers away from argv_array name\n      strvec: fix indentation in renamed calls\n      strvec: update documention to avoid argv_array\n      strvec: drop argv_array compatibility layer\n      log: drop \"--cc implies -m\" logic\n      revision: add \"--no-diff-merges\" option to counteract \"-m\"\n      log: enable \"-m\" automatically with \"--first-parent\"\n      doc/git-log: move \"Diff Formatting\" from rev-list-options\n      doc/git-log: drop \"-r\" diff option\n      doc/git-log: move \"-t\" into diff-options list\n      doc/git-log: clarify handling of merge commit diffs\n      strvec: rename struct fields\n      config: work around gcc-10 -Wstringop-overflow warning\n      revision: avoid out-of-bounds read/write on empty pathspec\n      revision: avoid leak when preparing bloom filter for \"/\"\n      t5616: use test_i18ngrep for upload-pack errors\n      sideband: mark \"remote error:\" prefix for translation\n      t1416: avoid hard-coded sha1 ids\n      t8003: check output of coalesced blame\n      t8003: factor setup out of coalesce test\n      blame: only coalesce lines that are adjacent in result\n      Makefile: drop builtins from MSVC pdb list\n      make credential helpers builtins\n      make git-bugreport a builtin\n      make git-fast-import a builtin\n      drop vcs-svn experiment\n      stop calling UNLEAK() before die()\n      ls-remote: simplify UNLEAK() usage\n      clear_pattern_list(): clear embedded hashmaps\n      submodule--helper: use strbuf_release() to free strbufs\n      checkout: fix leak of non-existent branch names\n      config: fix leaks from git_config_get_string_const()\n      config: drop git_config_get_string_const()\n      config: fix leak in git_config_get_expiry_in_days()\n      submodule--helper: fix leak of core.worktree value\n      p5302: disable thread-count parameter tests by default\n      p5302: count up to online-cpus for thread tests\n      index-pack: adjust default threading cap\n      revision: set rev_input_given in handle_revision_arg()\n      worktree: fix leak in check_clean_worktree()\n      xrealloc: do not reuse pointer freed by zero-length realloc()\n      add-patch: fix inverted return code of repo_read_index()\n      add--interactive.perl: specify --no-color explicitly\n      packfile: actually set approximate_object_count_valid\n      diff-highlight: correctly match blank lines for flush\n      bswap.h: drop unaligned loads\n      Revert \"fast-export: use local array to store anonymized oid\"\n      shortlog: change \"author\" variables to \"ident\"\n      protocol: re-enable v2 protocol by default\n      shortlog: add grouping option\n      trailer: add interface for iterating over commit trailers\n      shortlog: match commit trailers with --group\n      shortlog: de-duplicate trailer values\n      shortlog: rename parse_stdin_ident()\n      shortlog: parse trailer idents\n      shortlog: allow multiple groups to be specified\n      convert: drop unused crlf_action from check_global_conv_flags_eol()\n      drop unused argc parameters\n      env--helper: write to opt->value in parseopt helper\n      assert PARSE_OPT_NONEG in parse-options callbacks\n      push: drop unused repo argument to do_push()\n      sequencer: drop repository argument from run_git_commit()\n      sparse-checkout: fill in some options boilerplate\n      test-advise: check argument count with argc instead of argv\n      sequencer: handle ignore_footer when parsing trailers\n      dir.c: drop unused \"untracked\" from treat_path_fast()\n      combine-diff: handle --find-object in multitree code path\n      index-pack: restore \"resolving deltas\" progress meter\n      index-pack: drop type_cas mutex\n\nJiang Xin (10):\n      transport: not report a non-head push as a branch\n      t5411: add basic test cases for proc-receive hook\n      receive-pack: add new proc-receive hook\n      receive-pack: feed report options to post-receive\n      New capability \"report-status-v2\" for git-push\n      doc: add document for capability report-status-v2\n      receive-pack: new config receive.procReceiveRefs\n      t5411: test updates of remote-tracking branches\n      transport: parse report options for tracking refs\n      doc: add documentation for the proc-receive hook\n\nJohannes Berg (2):\n      pack-write/docs: update regarding pack naming\n      docs: commit-graph: fix some whitespace in the diagram\n\nJohannes Schindelin (26):\n      t3404: prepare 'short SHA-1 collision' tests for SHA-256\n      ci: fix indentation of the `ci-config` job\n      ci: avoid ugly \"failure\" in the `ci-config` job\n      t/test-terminal: avoid non-inclusive language\n      fast-export: avoid using unnecessary language in a code comment\n      t3200: avoid variations of the `master` branch name\n      msvc: copy the correct `.pdb` files in the Makefile target `install`\n      Optionally skip linking/copying the built-ins\n      ci: stop linking built-ins to the dashed versions\n      cmake: ignore files generated by CMake as run in Visual Studio\n      tests: avoid variations of the `master` branch name\n      t9902: avoid using the branch name `master`\n      cmake: do find Git for Windows' shell interpreter\n      cmake: ensure that the `vcpkg` packages are found on Windows\n      cmake: fall back to using `vcpkg`'s `msgfmt.exe` on Windows\n      cmake: quote the path accurately when editing `test-lib.sh`\n      cmake (Windows): let the `.dll` files be found when running the tests\n      cmake (Windows): complain when encountering an unknown compiler\n      cmake (Windows): initialize vcpkg/build dependencies automatically\n      cmake (Windows): recommend using Visual Studio's built-in CMake support\n      GitHub workflow: automatically follow minor updates of setup-msbuild\n      help: do not expect built-in commands to be hardlinked\n      t1415: avoid using `main` as ref name\n      tests: avoid using the branch name `main`\n      ci: skip GitHub workflow runs for already-tested commits/trees\n      ci: do not skip tagged revisions in GitHub workflows\n\nJohannes Sixt (1):\n      gitk: Un-hide selection in areas with non-default background color\n\nJonathan Tan (33):\n      upload-pack: do not lazy-fetch \"have\" objects\n      pack-objects: refactor to oid_object_info_extended\n      pack-objects: prefetch objects to be packed\n      sha1-file: make pretend_object_file() not prefetch\n      sha1-file: introduce no-lazy-fetch has_object()\n      apply: do not lazy fetch when applying binary\n      pack-objects: no fetch when allow-{any,promisor}\n      fsck: do not lazy fetch known non-promisor object\n      negotiator/noop: add noop fetch negotiator\n      fetch: allow refspecs specified through stdin\n      fetch: avoid reading submodule config until needed\n      fetch: only populate existing_refs if needed\n      fetch-pack: do not lazy-fetch during ref iteration\n      promisor-remote: lazy-fetch objects in subprocess\n      fetch-pack: remove no_dependents code\n      fetch-pack: in partial clone, pass --promisor\n      Documentation: deltaBaseCacheLimit is per-thread\n      index-pack: remove redundant parameter\n      index-pack: unify threaded and unthreaded code\n      index-pack: remove redundant child field\n      index-pack: calculate {ref,ofs}_{first,last} early\n      index-pack: make resolve_delta() assume base data\n      (various): document from_promisor parameter\n      fetch-pack: document only_packfile in get_pack()\n      fetch-pack: make packfile URIs work with transfer.fsckobjects\n      fetch: no FETCH_HEAD display if --no-write-fetch-head\n      sha1-name: replace unsigned int with option struct\n      refs: move dwim_ref() to header file\n      wt-status: tolerate dangling marks\n      index-pack: make quantum of work smaller\n      promisor-remote: remove unused variable\n      fetch: do not override partial clone filter\n      index-pack: make get_base_data() comment clearer\n\nJunio C Hamano (50):\n      gitk: be prepared to be run in a bare repository\n      reflog: cleanse messages in the refs.c layer\n      Revert \"fmt-merge-msg: stop treating `master` specially\"\n      fmt-merge-msg: allow merge destination to be omitted again\n      First batch post 2.28\n      The second batch -- mostly minor typofixes\n      Third batch\n      Fourth batch\n      Documentation: don't hardcode command categories twice\n      compat-util: type-check parameters of no-op replacement functions\n      Fifth batch\n      Sixth batch\n      Seventh batch\n      messages: avoid SHA-1 in end-user facing messages\n      Eighth batch\n      fetch: optionally allow disabling FETCH_HEAD update\n      Ninth batch\n      ident: say whose identity is missing when giving user.name hint\n      Tenth batch\n      t3436: do not run git-merge-recursive in dashed form\n      transport-helper: do not run git-remote-ext etc. in dashed form\n      cvsexportcommit: do not run git programs in dashed form\n      run_command: teach API users to use embedded 'args' more\n      credential-cache: use child_process.args\n      Eleventh batch\n      doc: clarify how exit status of post-checkout hook is used\n      Twelfth batch\n      Thirteenth batch\n      add -i: use the built-in version when feature.experimental is set\n      Makefile: allow extra tweaking of distribution tarball\n      Fourteenth batch\n      quote_path: rename quote_path_relative() to quote_path()\n      quote_path: give flags parameter to quote_path()\n      quote_path: optionally allow quoting a path with SP in it\n      quote_path: code clarification\n      wt-status: consistently quote paths in \"status --short\" output\n      quote: rename misnamed sq_lookup[] to cq_lookup[]\n      quote: turn 'nodq' parameter into a set of flags\n      Fifteenth batch\n      Sixteenth batch\n      t8013: minimum preparatory clean-up\n      blame: validate and peel the object names on the ignore list\n      t1506: rev-parse A..B and A...B\n      sequencer: stop abbreviating stopped-sha file\n      Seventeenth batch\n      Eighteenth batch\n      hashmap_for_each_entry(): workaround MSVC's runtime check failure #3\n      Nineteenth batch\n      Git 2.29-rc0\n      Git 2.29-rc1\n\nKazuhiro Kato (1):\n      gitk: fix branch name encoding error\n\nKyohei Kadota (1):\n      Fit to Plan 9's ANSI/POSIX compatibility layer\n\nLin Sun (1):\n      mergetool: allow auto-merge for meld to follow the vim-diff behavior\n\nLuke Diamand (2):\n      git-p4 unshelve: adding a commit breaks git-p4 unshelve\n      git-p4: use HEAD~$n to find parent commit for unshelve\n\nMartin Ågren (19):\n      dir: check pathspecs before returning `path_excluded`\n      t1450: fix quoting of NUL byte when corrupting pack\n      t: don't spuriously close and reopen quotes\n      t4104: modernize and simplify quoting\n      progress: don't dereference before checking for NULL\n      http-protocol.txt: document SHA-256 \"want\"/\"have\" format\n      index-format.txt: document SHA-256 index format\n      protocol-capabilities.txt: clarify \"allow-x-sha1-in-want\" re SHA-256\n      shallow.txt: document SHA-256 shallow format\n      Documentation: mark `--object-format=sha256` as experimental\n      wt-status: replace sha1 mentions with oid\n      wt-status: print to s->fp, not stdout\n      wt-status: introduce wt_status_state_free_buffers()\n      worktree: inline `worktree_ref()` into its only caller\n      worktree: update renamed variable in comment\n      worktree: rename copy-pasted variable\n      worktree: use skip_prefix to parse target\n      config/fmt-merge-msg.txt: drop space in quote\n      config/uploadpack.txt: fix typo in `--filter=tree:<n>`\n\nMatheus Tavares (4):\n      checkout_entry(): remove unreachable error() call\n      config: complain about --worktree outside of a git repo\n      packfile: fix race condition on unpack_entry()\n      packfile: fix memory leak in add_delta_base_cache()\n\nMatthew Rogers (1):\n      diff: teach --stat to ignore uninteresting modifications\n\nMichael Forney (2):\n      revision: use repository from rev_info when parsing commits\n      submodule: use submodule repository when preparing summary\n\nMichal Privoznik (1):\n      completion: add show --color-moved[-ws]\n\nMiriam Rubio (4):\n      bisect--helper: BUG() in cmd_*() on invalid subcommand\n      bisect--helper: use '-res' in 'cmd_bisect__helper' return\n      bisect--helper: introduce new `write_in_file()` function\n      bisect: call 'clear_commit_marks_all()' in 'bisect_next_all()'\n\nNikita Leonov (1):\n      credential: treat CR/LF as line endings in the credential protocol\n\nNoam Yorav-Raphael (1):\n      docs: improve the example that illustrates git-notes path names\n\nOrgad Shaneh (5):\n      vcbuild: fix library name for expat with make MSVC=1\n      vcbuild: fix batch file name in README\n      fetch: do not look for submodule changes in unchanged refs\n      submodule: suppress checking for file name and ref ambiguity for object ids\n      contrib/buildsystems: fix expat library name for generated vcxproj\n\nPatrick Steinhardt (2):\n      refs: fix interleaving hook calls with reference-transaction hook\n      refs: remove lookup cache for reference-transaction hook\n\nPaul Mackerras (1):\n      gitk: Resize panes correctly when reducing window size\n\nPhilippe Blain (19):\n      git-log.txt: add links to 'rev-list' and 'diff' docs\n      revisions.txt: describe 'rev1 rev2 ...' meaning for ranges\n      git-rev-list.txt: fix Asciidoc syntax\n      git-rev-list.txt: tweak wording in set operations\n      git-rev-list.txt: move description to separate file\n      git-log.txt: include rev-list-description.txt\n      command-list.txt: add missing 'gitcredentials' and 'gitremote-helpers'\n      help: drop usage of 'common' and 'useful' for guides\n      git.txt: add list of guides\n      fetch, pull doc: correct description of '--set-upstream'\n      userdiff: add tests for Fortran xfuncname regex\n      userdiff: improve Fortran xfuncname regex\n      git-imap-send.txt: don't duplicate 'Examples' sections\n      git-imap-send.txt: do verify SSL certificate for gmail.com\n      git-imap-send.txt: add note about localized Gmail folders\n      doc: mention GIT_SEQUENCE_EDITOR and 'sequence.editor' more\n      git.txt: correct stale 'GIT_EXTERNAL_DIFF' description\n      Makefile: add support for generating JSON compilation database\n      gitsubmodules doc: invoke 'ls-files' with '--recurse-submodules'\n\nPhillip Wood (7):\n      add -p: use ALLOC_GROW_BY instead of ALLOW_GROW\n      add -p: fix checking of user input\n      am: stop exporting GIT_COMMITTER_DATE\n      rebase -i: support --committer-date-is-author-date\n      rebase -i: support --ignore-date\n      add -p: fix memory leak\n      add -p: fix editing of intent-to-add paths\n\nPranit Bauva (2):\n      bisect--helper: reimplement `bisect_autostart` shell function in C\n      bisect--helper: reimplement `bisect_next` and `bisect_auto_next` shell functions in C\n\nPrathamesh Chavan (1):\n      submodule: port submodule subcommand 'summary' from shell to C\n\nRaymond E. Pasco (6):\n      apply: allow \"new file\" patches on i-t-a entries\n      blame-options.txt: document --first-parent option\n      apply: make i-t-a entries never match worktree\n      t4140: test apply with i-t-a paths\n      diff-lib: use worktree mode in diffs from i-t-a entries\n      git-apply.txt: update descriptions of --cached, --index\n\nRené Scharfe (21):\n      read-cache: remove bogus shortcut\n      grep: avoid using oid_to_hex() with parse_object_or_die()\n      bisect: use oid_to_hex_r() instead of memcpy()+oid_to_hex()\n      upload-pack: remove superfluous sigchain_pop() call\n      rebase: remove unused function reschedule_last_action\n      connected: use buffered I/O to talk to rev-list\n      midx: use buffered I/O to talk to pack-objects\n      upload-pack: use buffered I/O to talk to rev-list\n      patch-id: ignore newline at end of file in diff_flush_patch_id()\n      checkout, restore: make pathspec recursive\n      read-cache: fix mem-pool allocation for multi-threaded index loading\n      push: release strbufs used for refspec formatting\n      refspec: add and use refspec_appendf()\n      fast-import: use write_pack_header()\n      midx: use hashwrite_u8() in write_midx_header()\n      pack-bitmap-write: use hashwrite_be32() in write_hash_cache()\n      pack-write: use hashwrite_be32() in write_idx_file()\n      archive: read short blobs in archive.c::write_archive_entry()\n      archive: add --add-file\n      Makefile: use git-archive --add-file\n      ref-filter: plug memory leak in reach_filter()\n\nRohit Ashiwal (2):\n      rebase -i: add --ignore-whitespace flag\n      rebase: add --reset-author-date\n\nRyan Zoeller (2):\n      parse-options: add --git-completion-helper-all\n      completion: add GIT_COMPLETION_SHOW_ALL env var\n\nSZEDER Gábor (15):\n      tree-walk.c: don't match submodule entries for 'submod/anything'\n      commit-graph: fix parsing the Chunk Lookup table\n      commit-graph-format.txt: all multi-byte numbers are in network byte order\n      commit-slab: add a function to deep free entries on the slab\n      diff.h: drop diff_tree_oid() & friends' return value\n      commit-graph: clean up #includes\n      commit-graph: simplify parse_commit_graph() #1\n      commit-graph: simplify parse_commit_graph() #2\n      commit-graph: simplify write_commit_graph_file() #1\n      commit-graph: simplify write_commit_graph_file() #2\n      commit-graph: unify the signatures of all write_graph_chunk_*() functions\n      commit-graph: simplify chunk writes into loop\n      commit-graph: check chunk sizes after writing\n      commit-graph: check all leading directories in changed path Bloom filters\n      ci: use absolute PYTHON_PATH in the Linux jobs\n\nSamanta Navarro (1):\n      fast-import: fix typo in documentation\n\nSergey Organov (9):\n      revision: fix die() message for \"--unpacked=\"\n      revision: change \"--diff-merges\" option to require parameter\n      doc/git-log: describe --diff-merges=off\n      t/t4013: add test for --diff-merges=off\n      pretty-options.txt: fix --no-abbrev-commit description\n      revision: add separate field for \"-m\" of \"diff-index -m\"\n      log_tree_diff: get rid of code duplication for first_parent_only\n      log_tree_diff: get rid of extra check for NULL\n      diff: get rid of redundant 'dense' argument\n\nShourya Shukla (11):\n      submodule: remove extra line feeds between callback struct and macro\n      submodule: rename helper functions to avoid ambiguity\n      t7421: introduce a test script for verifying 'summary' output\n      t7401: modernize style\n      t7401: use 'short' instead of 'verify' and cut in rev-parse calls\n      t7401: change syntax of test_i18ncmp calls for clarity\n      t7401: change indentation for enhanced readability\n      t7401: add a NEEDSWORK\n      submodule: eliminate unused parameters from print_submodule_summary()\n      submodule: fix style in function definition\n      t7421: eliminate 'grep' check in t7421.4 for mingw compatibility\n\nSibi Siddharthan (8):\n      Introduce CMake support for configuring Git\n      cmake: generate the shell/perl/python scripts and templates, translations\n      cmake: installation support for git\n      cmake: support for testing git with ctest\n      cmake: support for testing git when building out of the source tree\n      cmake: support for building git on windows with mingw\n      cmake: support for building git on windows with msvc and clang.\n      ci: modification of main.yml to use cmake for vs-build job\n\nSimon Legner (1):\n      remote-mediawiki: fix duplicate revisions being imported\n\nStefan Dotterweich (1):\n      gitk: add diff lines background colors\n\nSteve Kemp (1):\n      comment: fix spelling mistakes inside comments\n\nTaylor Blau (18):\n      revision: empty pathspecs should not use Bloom filters\n      list_objects_filter_options: introduce 'list_object_filter_config_name'\n      upload-pack.c: allow banning certain object filter(s)\n      upload-pack.c: introduce 'uploadpackfilter.tree.maxDepth'\n      builtin/repack.c: invalidate MIDX only when necessary\n      midx: traverse the local MIDX first\n      commit-graph: introduce 'get_bloom_filter_settings()'\n      t4216: use an '&&'-chain\n      commit-graph: pass a 'struct repository *' in more places\n      t/helper/test-read-graph.c: prepare repo settings\n      commit-graph: respect 'commitGraph.readChangedPaths'\n      commit-graph.c: store maximum changed paths\n      bloom: split 'get_bloom_filter()' in two\n      bloom: use provided 'struct bloom_filter_settings'\n      bloom: encode out-of-bounds filters as non-empty\n      commit-graph: rename 'split_commit_graph_opts'\n      builtin/commit-graph.c: introduce '--max-new-filters=<n>'\n      commit-graph: introduce 'commitGraph.maxNewFilters'\n\nTheodore Dubois (1):\n      submodule update: silence underlying merge/rebase with \"--quiet\"\n\nThomas Guyot-Sionnest (1):\n      diff: fix modified lines stats with --stat and --numstat\n\nbrian m. carlson (48):\n      remote-curl: make --force-with-lease work with non-ASCII ref names\n      t: make test-bloom initialize repository\n      t1001: use $ZERO_OID\n      t3305: make hash agnostic\n      t6100: make hash size independent\n      t6101: make hash size independent\n      t6301: make hash size independent\n      t6500: specify test values for SHA-256\n      t6501: avoid hard-coded objects\n      t7003: compute appropriate length constant\n      t7063: make hash size independent\n      t7201: abstract away SHA-1-specific constants\n      t7102: abstract away SHA-1-specific constants\n      t7400: make hash size independent\n      t7405: make hash size independent\n      t7506: avoid checking for SHA-1-specific constants\n      t7508: use $ZERO_OID instead of hard-coded constant\n      t8002: make hash size independent\n      t8003: make hash size independent\n      t8011: make hash size independent\n      t9300: abstract away SHA-1-specific constants\n      t9300: use $ZERO_OID instead of hard-coded object ID\n      t9301: make hash size independent\n      t9350: make hash size independent\n      t9500: ensure that algorithm info is preserved in config\n      t9700: make hash size independent\n      t5308: make test work with SHA-256\n      t0410: mark test with SHA1 prerequisite\n      http-fetch: set up git directory before parsing pack hashes\n      builtin/verify-pack: implement an --object-format option\n      bundle: add new version for use with SHA-256\n      setup: add support for reading extensions.objectformat\n      repository: enable SHA-256 support by default\n      t: add test_oid option to select hash algorithm\n      t: allow testing different hash algorithms via environment\n      t: make SHA1 prerequisite depend on default hash\n      ci: run tests with SHA-256\n      docs: add documentation for extensions.objectFormat\n      t: remove test_oid_init in tests\n      git-cvsexportcommit: support Perl before 5.10.1\n      docs: document SHA-256 pack and indices\n      docs: fix step in transition plan\n      t4013: improve diff-post-processor logic\n      po: add missing letter for French message\n      docs: explain why squash merges are broken with long-running branches\n      docs: explain why reverts are not always applied on merge\n      docs: explain how to deal with files that are always modified\n      builtin/clone: avoid failure with GIT_DEFAULT_HASH\n\npudinha (2):\n      mergetool--lib: improve support for vimdiff-style tool variants\n      mergetools: add support for nvimdiff (neovim) family\n\nÁkos Uzonyi (2):\n      completion: use \"prev\" variable instead of introducing \"prevword\"\n      completion: complete refs after 'git restore -s'\n\nÆvar Arnfjörð Bjarmason (17):\n      remote-mediawiki doc: correct link to GitHub project\n      remote-mediawiki doc: link to MediaWiki's current version\n      remote-mediawiki doc: don't hardcode Debian PHP versions\n      remote-mediawiki tests: use the login/password variables\n      remote-mediawiki tests: use a 10 character password\n      remote-mediawiki tests: use test_cmp in tests\n      remote-mediawiki tests: change `[]` to `test`\n      remote-mediawiki tests: use \"$dir/\" instead of \"$dir.\"\n      remote-mediawiki tests: use a more idiomatic dispatch table\n      remote-mediawiki tests: replace deprecated Perl construct\n      remote-mediawiki tests: use inline PerlIO for readability\n      remote-mediawiki tests: use CLI installer\n      remote-mediawiki tests: annotate failing tests\n      remote-mediawiki: provide a list form of run_git()\n      remote-mediawiki: convert to quoted run_git() invocation\n      remote-mediawiki: annotate unquoted uses of run_git()\n      remote-mediawiki: use \"sh\" to eliminate unquoted commands\n\nĐoàn Trần Công Danh (2):\n      diff: index-line: respect --abbrev in object's name\n      t5534: split stdout and stderr redirection\n\nРоман Донченко (2):\n      gitk: don't highlight files after submodules as submodules\n      gitk: fix the context menu not appearing in the presence of submodule diffs\n\n"},{"id":"407280","messageId":"ce8f482f-9a78-6867-38ae-601bcc2c9f66@web.de","threadId":"54379","inReplyTo":"xmqq7drzv1bn.fsf@gitster.c.googlers.com","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2020-10-10T16:45:07Z","receivedAt":"2020-10-10T23:10:34Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 09.10.20 um 17:58 schrieb Junio C Hamano:\n>  * \"git archive\" learns the \"--add-file\" option to include untracked\n>    files into a snapshot from a tree-ish.\n\n>       archive: read short blobs in archive.c::write_archive_entry()\n>       archive: add --add-file\n>       Makefile: use git-archive --add-file\n\nOh, this feature landed quickly, with little discussion.  I dropped the\nball while being distracted by other things and working on supporting\nother use cases, like dist-doc and artifacts-tar.\n\nThe option --add-file in rc1 is peculiar in that it captures the value\nof --prefix at the time of left-to-right parsing.  I don't know any\nother option that does that.  It gives users a way to craft in-archive\npaths, but simply adding them with their original path (just normalized\nto use slashes as directory separators) would probably suffice.\n\nThe option serves a niche use case, so this weirdness might be bearable,\nbut I wouldn't have expected it to be merged without debate.  Perhaps\nwe want to slap an \"experimental\" label on it?\n\nWe can create the dist-doc tars easily without --add-file and tar(1);\npatch forthcoming.\n\nWe could do the same for artifacts-tar, but that would generate a huge\narchive due to the many hardlinks for dash aliases that are flattened\ninto copies.  Implementing hardlink support might be worthwhile anyway\nand we would not even have to make it optional.  This target doesn't use\nTAR_DIST_EXTRA_OPTS, so this is a separate topic anyway, though.\n\nRené\n"},{"id":"407288","messageId":"e7b33ed0-b7e8-d14d-c97a-1fe13840ee29@web.de","threadId":"54379","inReplyTo":"ce8f482f-9a78-6867-38ae-601bcc2c9f66@web.de","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2020-10-11T06:11:11Z","receivedAt":"2020-10-11T06:11:23Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 10.10.20 um 18:45 schrieb René Scharfe:\n> Implementing hardlink support might be worthwhile anyway\n> and we would not even have to make it optional.\n\nIt would be useful to have the contents duplicate blobs included only once\nin a tar file generated by git archive, but could have unexpected\nconsequences.  Hard links would be extracted as such on platforms that\nsupport it.  Changing one of them might change all linked files, depending\non the editor used.  That may be intended, but it could also be surprising.\nSo this feature (if implemented) cannot be turned on unconditionally.\n\nRené\n"},{"id":"407344","messageId":"xmqqmu0rqu8h.fsf@gitster.c.googlers.com","threadId":"54379","inReplyTo":"ce8f482f-9a78-6867-38ae-601bcc2c9f66@web.de","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-10-12T16:33:50Z","receivedAt":"2020-10-12T16:33:55Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"René Scharfe <l.s.r@web.de> writes:\n\n> The option --add-file in rc1 is peculiar in that it captures the value\n> of --prefix at the time of left-to-right parsing.  I don't know any\n> other option that does that.\n\nIf you do not count the early design of \"git update-index\", where\nyou could do funky things like\n\n    git update-cache must-exist --add new-file\n\nto affect the way each path argument is taken, that is ;-)\n\nI am not sure if that is a useful feature, but I do not see a reason\nto add more code just to forbid giving the prefix argument multiple\ntimes.  As the main archive contents taken out of tree use just the\nsingle \"--prefix\", I suspect nobody would even imagine giving\nmultiple \"--prefix\".\n\n> It gives users a way to craft in-archive\n> paths, but simply adding them with their original path (just normalized\n> to use slashes as directory separators) would probably suffice.\n>\n> The option serves a niche use case, so this weirdness might be bearable,\n> but I wouldn't have expected it to be merged without debate.  Perhaps\n> we want to slap an \"experimental\" label on it?\n\nI have no strong opinion on this.\n\nIf this \"feature\" were experimental and if the experiment turns out\nto be a failure, would we have a viable alternative definition?\n\nPerhaps \"--add-file names an untracked file in the working tree and\nthe single '--prefix' that is used for entries that come from the\ntree object is applied\"?  Or perhaps remove --add-file entirely as a\nfailed experiment?\n\n"},{"id":"407345","messageId":"xmqqimbfqu5u.fsf@gitster.c.googlers.com","threadId":"54379","inReplyTo":"e7b33ed0-b7e8-d14d-c97a-1fe13840ee29@web.de","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-10-12T16:35:25Z","receivedAt":"2020-10-12T16:35:34Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"René Scharfe <l.s.r@web.de> writes:\n\n> Am 10.10.20 um 18:45 schrieb René Scharfe:\n>> Implementing hardlink support might be worthwhile anyway\n>> and we would not even have to make it optional.\n>\n> It would be useful to have the contents duplicate blobs included only once\n> in a tar file generated by git archive, but could have unexpected\n> consequences.  Hard links would be extracted as such on platforms that\n> support it.  Changing one of them might change all linked files, depending\n> on the editor used.  That may be intended, but it could also be surprising.\n> So this feature (if implemented) cannot be turned on unconditionally.\n\nGood thinking.\n"},{"id":"407367","messageId":"61bafa3b-bd23-f01f-9a4a-c348b7588f37@web.de","threadId":"54379","inReplyTo":"xmqqmu0rqu8h.fsf@gitster.c.googlers.com","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2020-10-12T19:19:28Z","receivedAt":"2020-10-12T19:19:55Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 12.10.20 um 18:33 schrieb Junio C Hamano:\n> If this \"feature\" were experimental and if the experiment turns out\n> to be a failure, would we have a viable alternative definition?\n>\n> Perhaps \"--add-file names an untracked file in the working tree and\n> the single '--prefix' that is used for entries that come from the\n> tree object is applied\"?  Or perhaps remove --add-file entirely as a\n> failed experiment?\n\nRemoving --add-file entirely is certainly possible, but it's used in the\nMakefile now and I can't imagine what would make its disposal necessary.\n\nTurning it into a standard OPT_STRING_LIST option for full untracked\npaths and using the last --prefix value for all archive entries would be\na more straightforward UI and might be versatile enough.\n\nRené\n"},{"id":"408297","messageId":"e135ac82-49f1-e06c-45d7-6b3b9f9837c6@web.de","threadId":"54379","inReplyTo":"61bafa3b-bd23-f01f-9a4a-c348b7588f37@web.de","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"René Scharfe","fromEmail":"l.s.r@web.de","sentAt":"2020-10-24T17:52:49Z","receivedAt":"2020-10-24T17:52:58Z","isPatch":false,"sender":{"key":"l.s.r@web.de","avatar":"https://avatars.githubusercontent.com/u/26122331?v=4"},"body":"Am 12.10.20 um 21:19 schrieb René Scharfe:\n> Am 12.10.20 um 18:33 schrieb Junio C Hamano:\n>> If this \"feature\" were experimental and if the experiment turns out\n>> to be a failure, would we have a viable alternative definition?\n>>\n>> Perhaps \"--add-file names an untracked file in the working tree and\n>> the single '--prefix' that is used for entries that come from the\n>> tree object is applied\"?  Or perhaps remove --add-file entirely as a\n>> failed experiment?\n>\n> Removing --add-file entirely is certainly possible, but it's used in the\n> Makefile now and I can't imagine what would make its disposal necessary.\n>\n> Turning it into a standard OPT_STRING_LIST option for full untracked\n> paths and using the last --prefix value for all archive entries would be\n> a more straightforward UI and might be versatile enough.\n\nHere's how that would have looked, but it seems I'm too late.\n\nThe Makefile rules get a bit more fragile because the version files are\nspecial and the simpler --add-file forces us to create them at their\nactual place if not present, which can lead to problems (stuck version)\nif we don't delete them afterwards.  Avoiding that was the reason for\nthe more complicated version that ended up in v2.29.  That fragility\ncould be defused by teaching GIT-VERSION-GEN about version_is_generated.\n\nAnyway, at this point I'm OK with keeping the released version to avoid\nadditional confusion.\n\n\n Documentation/git-archive.txt |  4 +--\n Makefile                      | 52 +++++++++++++++------------\n archive.c                     | 83 ++++++++++++++++---------------------------\n t/t5000-tar-tree.sh           | 11 ------\n t/t5003-archive-zip.sh        | 10 ------\n 5 files changed, 61 insertions(+), 99 deletions(-)\n\ndiff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt\nindex 9f8172828d..b221dd5e3d 100644\n--- a/Documentation/git-archive.txt\n+++ b/Documentation/git-archive.txt\n@@ -57,9 +57,7 @@ OPTIONS\n\n --add-file=<file>::\n \tAdd a non-tracked file to the archive.  Can be repeated to add\n-\tmultiple files.  The path of the file in the archive is built\n-\tby concatenating the value for `--prefix` (if any) and the\n-\tbasename of <file>.\n+\tmultiple files.\n\n --worktree-attributes::\n \tLook for attributes in .gitattributes files in the working tree\ndiff --git a/Makefile b/Makefile\nindex 1fb0ec1705..33fd806bc6 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -3050,34 +3050,41 @@ quick-install-html:\n\n ### Maintainer's dist rules\n\n+version:\n+\ttouch version_is_generated\n+\techo $(GIT_VERSION) > version\n+\n+git-gui/version:\n+\ttouch git-gui/version_is_generated\n+\t$(MAKE) -C git-gui TARDIR=. dist-version\n+\n+define version_clean_script =\n+if test -f version_is_generated; then \\\n+\t$(RM) version version_is_generated; \\\n+fi\n+if test -f git-gui/version_is_generated; then \\\n+\t$(RM) git-gui/version git-gui/version_is_generated; \\\n+fi\n+endef\n+\n # Allow tweaking to hide local environment effects, like perm bits.\n # With GNU tar, \"--mode=u+rwX,og+rX,og-w\" would be a good idea, for example.\n TAR_DIST_EXTRA_OPTS =\n GIT_TARNAME = git-$(GIT_VERSION)\n-GIT_ARCHIVE_EXTRA_FILES = \\\n-\t--prefix=$(GIT_TARNAME)/ \\\n-\t--add-file=configure \\\n-\t--add-file=$(GIT_TARNAME)/version \\\n-\t--prefix=$(GIT_TARNAME)/git-gui/ \\\n-\t--add-file=$(GIT_TARNAME)/git-gui/version\n+GIT_ARCHIVE_EXTRA_FILES = configure version git-gui/version\n ifdef DC_SHA1_SUBMODULE\n-GIT_ARCHIVE_EXTRA_FILES += \\\n-\t--prefix=$(GIT_TARNAME)/sha1collisiondetection/ \\\n-\t--add-file=sha1collisiondetection/LICENSE.txt \\\n-\t--prefix=$(GIT_TARNAME)/sha1collisiondetection/lib/ \\\n-\t--add-file=sha1collisiondetection/lib/sha1.c \\\n-\t--add-file=sha1collisiondetection/lib/sha1.h \\\n-\t--add-file=sha1collisiondetection/lib/ubc_check.c \\\n-\t--add-file=sha1collisiondetection/lib/ubc_check.h\n-endif\n-dist: git-archive$(X) configure\n-\t@mkdir -p $(GIT_TARNAME)\n-\t@echo $(GIT_VERSION) > $(GIT_TARNAME)/version\n-\t@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version\n+GIT_ARCHIVE_EXTRA_FILES += sha1collisiondetection/LICENSE.txt \\\n+\t\t\t   sha1collisiondetection/lib/sha1.c \\\n+\t\t\t   sha1collisiondetection/lib/sha1.h \\\n+\t\t\t   sha1collisiondetection/lib/ubc_check.c \\\n+\t\t\t   sha1collisiondetection/lib/ubc_check.h\n+endif\n+dist: git-archive$(X) configure version git-gui/version\n \t./git-archive --format=tar \\\n-\t\t$(GIT_ARCHIVE_EXTRA_FILES) \\\n-\t\t--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar\n-\t@$(RM) -r $(GIT_TARNAME)\n+\t\t$(subst $(space),$(space)--add-file=,$(space)$(GIT_ARCHIVE_EXTRA_FILES)) \\\n+\t\t--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar || \\\n+\t$(RM) $(GIT_TARNAME).tar\n+\t$(version_clean_script)\n \tgzip -f -9 $(GIT_TARNAME).tar\n\n rpm::\n@@ -3164,6 +3171,7 @@ endif\n \t$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS\n \t$(RM) GIT-USER-AGENT GIT-PREFIX\n \t$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PERL-HEADER GIT-PYTHON-VARS\n+\t$(version_clean_script)\n ifdef MSVC\n \t$(RM) $(patsubst %.o,%.o.pdb,$(OBJECTS))\n \t$(RM) $(patsubst %.exe,%.pdb,$(OTHER_PROGRAMS))\ndiff --git a/archive.c b/archive.c\nindex 3c1541af9e..bb56b27581 100644\n--- a/archive.c\n+++ b/archive.c\n@@ -267,8 +267,8 @@ static int queue_or_write_archive_entry(const struct object_id *oid,\n }\n\n struct extra_file_info {\n-\tchar *base;\n-\tstruct stat stat;\n+\tunsigned int mode;\n+\tsize_t size;\n };\n\n int write_archive_entries(struct archiver_args *args,\n@@ -278,7 +278,6 @@ int write_archive_entries(struct archiver_args *args,\n \tstruct unpack_trees_options opts;\n \tstruct tree_desc t;\n \tint err;\n-\tstruct strbuf path_in_archive = STRBUF_INIT;\n \tstruct strbuf content = STRBUF_INIT;\n \tstruct object_id fake_oid = null_oid;\n \tint i;\n@@ -331,27 +330,24 @@ int write_archive_entries(struct archiver_args *args,\n \tfor (i = 0; i < args->extra_files.nr; i++) {\n \t\tstruct string_list_item *item = args->extra_files.items + i;\n \t\tchar *path = item->string;\n+\t\tchar *path_on_disk = prefix_filename(args->prefix, path);\n+\t\tchar *path_in_archive = prefix_filename(args->base, path);\n \t\tstruct extra_file_info *info = item->util;\n\n \t\tput_be64(fake_oid.hash, i + 1);\n\n-\t\tstrbuf_reset(&path_in_archive);\n-\t\tif (info->base)\n-\t\t\tstrbuf_addstr(&path_in_archive, info->base);\n-\t\tstrbuf_addstr(&path_in_archive, basename(path));\n-\n \t\tstrbuf_reset(&content);\n-\t\tif (strbuf_read_file(&content, path, info->stat.st_size) < 0)\n+\t\tif (strbuf_read_file(&content, path_on_disk, info->size) < 0)\n \t\t\terr = error_errno(_(\"could not read '%s'\"), path);\n \t\telse\n-\t\t\terr = write_entry(args, &fake_oid, path_in_archive.buf,\n-\t\t\t\t\t  path_in_archive.len,\n-\t\t\t\t\t  info->stat.st_mode,\n+\t\t\terr = write_entry(args, &fake_oid, path_in_archive,\n+\t\t\t\t\t  strlen(path_in_archive), info->mode,\n \t\t\t\t\t  content.buf, content.len);\n+\t\tfree(path_on_disk);\n+\t\tfree(path_in_archive);\n \t\tif (err)\n \t\t\tbreak;\n \t}\n-\tstrbuf_release(&path_in_archive);\n \tstrbuf_release(&content);\n\n \treturn err;\n@@ -493,42 +489,6 @@ static void parse_treeish_arg(const char **argv,\n \tar_args->time = archive_time;\n }\n\n-static void extra_file_info_clear(void *util, const char *str)\n-{\n-\tstruct extra_file_info *info = util;\n-\tfree(info->base);\n-\tfree(info);\n-}\n-\n-static int add_file_cb(const struct option *opt, const char *arg, int unset)\n-{\n-\tstruct archiver_args *args = opt->value;\n-\tconst char **basep = (const char **)opt->defval;\n-\tconst char *base = *basep;\n-\tchar *path;\n-\tstruct string_list_item *item;\n-\tstruct extra_file_info *info;\n-\n-\tif (unset) {\n-\t\tstring_list_clear_func(&args->extra_files,\n-\t\t\t\t       extra_file_info_clear);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!arg)\n-\t\treturn -1;\n-\n-\tpath = prefix_filename(args->prefix, arg);\n-\titem = string_list_append_nodup(&args->extra_files, path);\n-\titem->util = info = xmalloc(sizeof(*info));\n-\tinfo->base = xstrdup_or_null(base);\n-\tif (stat(path, &info->stat))\n-\t\tdie(_(\"File not found: %s\"), path);\n-\tif (!S_ISREG(info->stat.st_mode))\n-\t\tdie(_(\"Not a regular file: %s\"), path);\n-\treturn 0;\n-}\n-\n #define OPT__COMPR(s, v, h, p) \\\n \tOPT_SET_INT_F(s, NULL, v, h, p, PARSE_OPT_NONEG)\n #define OPT__COMPR_HIDDEN(s, v, p) \\\n@@ -548,14 +508,14 @@ static int parse_archive_args(int argc, const char **argv,\n \tint i;\n \tint list = 0;\n \tint worktree_attributes = 0;\n+\tstruct string_list_item *item;\n \tstruct option opts[] = {\n \t\tOPT_GROUP(\"\"),\n \t\tOPT_STRING(0, \"format\", &format, N_(\"fmt\"), N_(\"archive format\")),\n \t\tOPT_STRING(0, \"prefix\", &base, N_(\"prefix\"),\n \t\t\tN_(\"prepend prefix to each pathname in the archive\")),\n-\t\t{ OPTION_CALLBACK, 0, \"add-file\", args, N_(\"file\"),\n-\t\t  N_(\"add untracked file to archive\"), 0, add_file_cb,\n-\t\t  (intptr_t)&base },\n+\t\tOPT_STRING_LIST(0, \"add-file\", &args->extra_files, N_(\"file\"),\n+\t\t\t\tN_(\"add untracked file to archive\")),\n \t\tOPT_STRING('o', \"output\", &output, N_(\"file\"),\n \t\t\tN_(\"write the archive to this file\")),\n \t\tOPT_BOOL(0, \"worktree-attributes\", &worktree_attributes,\n@@ -593,6 +553,23 @@ static int parse_archive_args(int argc, const char **argv,\n \tif (is_remote && args->extra_files.nr)\n \t\tdie(_(\"Options --add-file and --remote cannot be used together\"));\n\n+\tfor_each_string_list_item(item, &args->extra_files) {\n+\t\tchar *path;\n+\t\tstruct stat st;\n+\t\tstruct extra_file_info *info;\n+\n+\t\tpath = prefix_filename(args->prefix, item->string);\n+\t\tif (lstat(path, &st))\n+\t\t\tdie(_(\"File not found: %s\"), item->string);\n+\t\tif (!S_ISREG(st.st_mode))\n+\t\t\tdie(_(\"Not a regular file: %s\"), item->string);\n+\t\tfree(path);\n+\n+\t\titem->util = info = xmalloc(sizeof(*info));\n+\t\tinfo->mode = canon_mode(st.st_mode);\n+\t\tinfo->size = st.st_size;\n+\t}\n+\n \tif (!base)\n \t\tbase = \"\";\n\n@@ -661,7 +638,7 @@ int write_archive(int argc, const char **argv, const char *prefix,\n\n \trc = ar->write_archive(ar, &args);\n\n-\tstring_list_clear_func(&args.extra_files, extra_file_info_clear);\n+\tstring_list_clear(&args.extra_files, 1);\n\n \treturn rc;\n }\ndiff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh\nindex 3ebb0d3b65..a090712ddb 100755\n--- a/t/t5000-tar-tree.sh\n+++ b/t/t5000-tar-tree.sh\n@@ -182,17 +182,6 @@ test_expect_success 'git archive --add-file' '\n check_tar with_untracked\n check_added with_untracked untracked untracked\n\n-test_expect_success 'git archive --add-file twice' '\n-\techo untracked >untracked &&\n-\tgit archive --prefix=one/ --add-file=untracked \\\n-\t\t--prefix=two/ --add-file=untracked \\\n-\t\t--prefix= HEAD >with_untracked2.tar\n-'\n-\n-check_tar with_untracked2\n-check_added with_untracked2 untracked one/untracked\n-check_added with_untracked2 untracked two/untracked\n-\n test_expect_success 'git archive on large files' '\n     test_config core.bigfilethreshold 1 &&\n     git archive HEAD >b3.tar &&\ndiff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh\nindex 1e6d18b140..a9a44f2760 100755\n--- a/t/t5003-archive-zip.sh\n+++ b/t/t5003-archive-zip.sh\n@@ -206,14 +206,4 @@ test_expect_success 'git archive --format=zip --add-file' '\n check_zip with_untracked\n check_added with_untracked untracked untracked\n\n-test_expect_success 'git archive --format=zip --add-file twice' '\n-\techo untracked >untracked &&\n-\tgit archive --format=zip --prefix=one/ --add-file=untracked \\\n-\t\t--prefix=two/ --add-file=untracked \\\n-\t\t--prefix= HEAD >with_untracked2.zip\n-'\n-check_zip with_untracked2\n-check_added with_untracked2 untracked one/untracked\n-check_added with_untracked2 untracked two/untracked\n-\n test_done\n"},{"id":"408430","messageId":"xmqqtuugeujc.fsf@gitster.c.googlers.com","threadId":"54379","inReplyTo":"e135ac82-49f1-e06c-45d7-6b3b9f9837c6@web.de","subject":"Re: [ANNOUNCE] Git v2.29.0-rc1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-10-26T18:01:11Z","receivedAt":"2020-10-26T18:01:28Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"René Scharfe <l.s.r@web.de> writes:\n\n> Am 12.10.20 um 21:19 schrieb René Scharfe:\n>> Am 12.10.20 um 18:33 schrieb Junio C Hamano:\n>>> If this \"feature\" were experimental and if the experiment turns out\n>>> to be a failure, would we have a viable alternative definition?\n>>>\n>>> Perhaps \"--add-file names an untracked file in the working tree and\n>>> the single '--prefix' that is used for entries that come from the\n>>> tree object is applied\"?  Or perhaps remove --add-file entirely as a\n>>> failed experiment?\n>>\n>> Removing --add-file entirely is certainly possible, but it's used in the\n>> Makefile now and I can't imagine what would make its disposal necessary.\n>>\n>> Turning it into a standard OPT_STRING_LIST option for full untracked\n>> paths and using the last --prefix value for all archive entries would be\n>> a more straightforward UI and might be versatile enough.\n>\n> Here's how that would have looked, but it seems I'm too late.\n\nI think the \"unusual --prefix semantics\" does not hurt that much.\nIf people can play funny games, they can, but if they do not want to\nconfuse themselves, they can just give a single --prefix at the very\nbeginning (or no --prefix at all of course), and then the semantics\nthey will get is the same as what this add-on patch gives, I think.\n\n> The Makefile rules get a bit more fragile because the version files are\n> special and the simpler --add-file forces us to create them at their\n> actual place if not present, which can lead to problems (stuck version)\n> if we don't delete them afterwards.  Avoiding that was the reason for\n> the more complicated version that ended up in v2.29.  That fragility\n> could be defused by teaching GIT-VERSION-GEN about version_is_generated.\n\nThanks for a thoughtful analysis, as usual.\n\n"}]}