A release candidate Git v2.28.0-rc2 is now available for testing at the usual places. It is comprised of 301 non-merge commits since v2.27.0, contributed by 46 people, 12 of which are new faces. The tarballs are found at: https://www.kernel.org/pub/software/scm/git/testing/ The following public repositories all have a copy of the 'v2.28.0-rc2' tag and the 'master' branch that the tag points at: url = https://kernel.googlesource.com/pub/scm/git/git url = git://repo.or.cz/alt-git.git url = https://github.com/gitster/git New contributors whose contributions weren't in v2.27.0 are as follows. Welcome to the Git development community! Andrew Ng, Chris Torek, David J. Malan, Don Goodman-Wilson, Jiuyang Xie, Luc Van Oostenryck, Marco Trevisan (Treviño), Mikhail Terekhov, Miroslav Koškár, Rafael Aquini, Srinidhi Kaushik, and Trygve Aaberge. Returning contributors who helped this release are as follows. Thanks for your continued support. Abhishek Kumar, Ben Keene, brian m. carlson, Carlo Marcelo Arenas Belón, Christian Couder, Denton Liu, Derrick Stolee, Đoàn Trần Công Danh, Elijah Newren, Emily Shaffer, Eric Sunshine, Han-Wen Nienhuys, Jacob Keller, Jeff King, Johannes Schindelin, John Lin, Jonathan Nieder, Jonathan Tan, Josh Steadmon, Junio C Hamano, Laurent Arnoud, Martin Ågren, Matheus Tavares, Paolo Bonzini, Patrick Steinhardt, Pratyush Yadav, Ramsay Jones, Randall S. Becker, René Scharfe, Shourya Shukla, SZEDER Gábor, Taylor Blau, Ville Skyttä, and Xin Li. ---------------------------------------------------------------- Git 2.28 Release Notes (draft) ============================== Updates since v2.27 ------------------- Backward compatibility notes * "fetch.writeCommitGraph" is deemed to be still a bit too risky and is no longer part of the "feature.experimental" set. UI, Workflows & Features * The commands in the "diff" family learned to honor "diff.relative" configuration variable. * The check in "git fsck" to ensure that the tree objects are sorted still had corner cases it missed unsorted entries. * The interface to redact sensitive information in the trace output has been simplified. * The command line completion (in contrib/) learned to complete options that the "git switch" command takes. * "git diff" used to take arguments in random and nonsense range notation, e.g. "git diff A..B C", "git diff A..B C...D", etc., which has been cleaned up. * "git diff-files" has been taught to say paths that are marked as intent-to-add are new files, not modified from an empty blob. * "git status" learned to report the status of sparse checkout. * "git difftool" has trouble dealing with paths added to the index with the intent-to-add bit. * "git fast-export --anonymize" learned to take customized mapping to allow its users to tweak its output more usable for debugging. * The command line completion support (in contrib/) used to be prepared to work with "set -u" but recent changes got a bit more sloppy. This has been corrected. * "git gui" now allows opening work trees from the start-up dialog. Performance, Internal Implementation, Development Support etc. * Code optimization for a common case. (merge 8777616e4d an/merge-single-strategy-optim later to maint). * We've adopted a convention that any on-stack structure can be initialized to have zero values in all fields with "= { 0 }", even when the first field happens to be a pointer, but sparse complained that a null pointer should be spelled NULL for a long time. Start using -Wno-universal-initializer option to squelch it (the latest sparse has it on by default). * "git log -L..." now takes advantage of the "which paths are touched by this commit?" info stored in the commit-graph system. * As FreeBSD is not the only platform whose regexp library reports a REG_ILLSEQ error when fed invalid UTF-8, add logic to detect that automatically and skip the affected tests. * "git bugreport" learns to report what shell is in use. * Support for GIT_CURL_VERBOSE has been rewritten in terms of GIT_TRACE_CURL. * Preliminary clean-ups around refs API, plus file format specification documentation for the reftable backend. * Workaround breakage in MSVC build, where "curl-config --cflags" gives settings appropriate for GCC build. * Code clean-up of "git clean" resulted in a fix of recent performance regression. * Code clean-up in the codepath that serves "git fetch" continues. * "git merge-base --is-ancestor" is taught to take advantage of the commit graph. * Rewrite of parts of the scripted "git submodule" Porcelain command continues; this time it is "git submodule set-branch" subcommand's turn. * The "fetch/clone" protocol has been updated to allow the server to instruct the clients to grab pre-packaged packfile(s) in addition to the packed object data coming over the wire. * A misdesigned strbuf_write_fd() function has been retired. * SHA-256 migration work continues, including CVS/SVN interface. * A few fields in "struct commit" that do not have to always be present have been moved to commit slabs. * API cleanup for get_worktrees() * By renumbering object flag bits, "struct object" managed to lose bloated inter-field padding. * The name of the primary branch in existing repositories, and the default name used for the first branch in newly created repositories, is made configurable, so that we can eventually wean ourselves off of the hardcoded 'master'. * The effort to avoid using test_must_fail on non-git command continues. * In 2.28-rc0, we corrected a bug that some repository extensions are honored by mistake even in a version 0 repositories (these configuration variables in extensions.* namespace were supposed to have special meaning in repositories whose version numbers are 1 or higher), but this was a bit too big a change. The behaviour in recent versions of Git where certaion extensions.* were honored by mistake even in version 0 repositories has been restored. Fixes since v2.27 ----------------- * The "--prepare-p4-only" option of "git p4" is supposed to stop after replaying one changeset, but kept going (by mistake?) * The error message from "git checkout -b foo -t bar baz" was confusing. * Some repositories in the wild have commits that record nonsense committer timezone (e.g. rails.git); "git fast-import" learned an option to pass these nonsense timestamps intact to allow recreating existing repositories as-is. (merge d42a2fb72f en/fast-import-looser-date later to maint). * The command line completion script (in contrib/) tried to complete "git stash -p" as if it were "git stash push -p", but it was too aggressive and also affected "git stash show -p", which has been corrected. (merge fffd0cf520 vs/complete-stash-show-p-fix later to maint). * On-the-wire protocol v2 easily falls into a deadlock between the remote-curl helper and the fetch-pack process when the server side prematurely throws an error and disconnects. The communication has been updated to make it more robust. * "git checkout -p" did not handle a newly added path at all. (merge 2c8bd8471a js/checkout-p-new-file later to maint). * The code to parse "git bisect start" command line was lax in validating the arguments. (merge 4d9005ff5d cb/bisect-helper-parser-fix later to maint). * Reduce memory usage during "diff --quiet" in a worktree with too many stat-unmatched paths. (merge d2d7fbe129 jk/diff-memuse-optim-with-stat-unmatch later to maint). * The reflog entries for "git clone" and "git fetch" did not anonymize the URL they operated on. (merge 46da295a77 js/reflog-anonymize-for-clone-and-fetch later to maint). * The behaviour of "sparse-checkout" in the state "git clone --no-checkout" left was changed accidentally in 2.27, which has been corrected. * Use of negative pathspec, while collecting paths including untracked ones in the working tree, was broken. * The same worktree directory must be registered only once, but "git worktree move" allowed this invariant to be violated, which has been corrected. (merge 810382ed37 es/worktree-duplicate-paths later to maint). * The effect of sparse checkout settings on submodules is documented. (merge e7d7c73249 en/sparse-with-submodule-doc later to maint). * Code clean-up around "git branch" with a minor bugfix. (merge dc44639904 dl/branch-cleanup later to maint). * A branch name used in a test has been clarified to match what is going on. (merge 08dc26061f pb/t4014-unslave later to maint). * An in-code comment in "git diff" has been updated. (merge c592fd4c83 dl/diff-usage-comment-update later to maint). * The documentation and some tests have been adjusted for the recent renaming of "pu" branch to "seen". (merge 6dca5dbf93 js/pu-to-seen later to maint). * The code to push changes over "dumb" HTTP had a bad interaction with the commit reachability code due to incorrect allocation of object flag bits, which has been corrected. (merge 64472d15e9 bc/http-push-flagsfix later to maint). * "git send-email --in-reply-to=<msg>" did not use the In-Reply-To: header with the value given from the command line, and let it be overridden by the value on In-Reply-To: header in the messages being sent out (if exists). (merge f9f60d7066 ra/send-email-in-reply-to-from-command-line-wins later to maint). * "git log -Lx,y:path --before=date" lost track of where the range should be because it didn't take the changes made by the youngest commits that are omitted from the output into account. * When "fetch.writeCommitGraph" configuration is set in a shallow repository and a fetch moves the shallow boundary, we wrote out broken commit-graph files that do not match the reality, which has been corrected. * "git checkout" failed to catch an error from fstat() after updating a path in the working tree. (merge 35e6e212fd mt/entry-fstat-fallback-fix later to maint). * When an aliased command, whose output is piped to a pager by git, gets killed by a signal, the pager got into a funny state, which has been corrected (again). (merge c0d73a59c9 ta/wait-on-aliased-commands-upon-signal later to maint). * The code to produce progress output from "git commit-graph --write" had a few breakages, which have been fixed. * Other code cleanup, docfix, build fix, etc. (merge 2c31a7aa44 jx/pkt-line-doc-count-fix later to maint). (merge d63ae31962 cb/t5608-cleanup later to maint). (merge 788db145c7 dl/t-readme-spell-git-correctly later to maint). (merge 45a87a83bb dl/python-2.7-is-the-floor-version later to maint). (merge b75a219904 es/advertise-contribution-doc later to maint). (merge 0c9a4f638a rs/pull-leakfix later to maint). (merge d546fe2874 rs/commit-reach-leakfix later to maint). (merge 087bf5409c mk/pb-pretty-email-without-domain-part-fix later to maint). (merge 5f4ee57ad9 es/worktree-code-cleanup later to maint). (merge 0172f7834a cc/cat-file-usage-update later to maint). (merge 81de0c01cf ma/rebase-doc-typofix later to maint). ---------------------------------------------------------------- Changes since v2.27.0 are as follows: Abhishek Kumar (4): object: drop parsed_object_pool->commit_count commit-graph: introduce commit_graph_data_slab commit: move members graph_pos, generation to a slab commit-graph: minimize commit_graph_data_slab access Andrew Ng (1): merge: optimization to skip evaluate_result for single strategy Ben Keene (1): git-p4.py: fix --prepare-p4-only error with multiple commits Carlo Marcelo Arenas Belón (5): t/helper: teach test-regex to report pattern errors (like REG_ILLSEQ) t4210: detect REG_ILLSEQ dynamically and skip affected tests bisect--helper: avoid segfault with bad syntax in `start --term-*` t5608: avoid say() and use "skip_all" instead for consistency commit-reach: avoid is_descendant_of() shim Chris Torek (3): t/t3430: avoid undefined git diff behavior git diff: improve range handling Documentation: usage for diff combined commits Christian Couder (40): upload-pack: remove unused 'wants' from upload_pack_data upload-pack: move {want,have}_obj to upload_pack_data upload-pack: move 'struct upload_pack_data' around upload-pack: use 'struct upload_pack_data' in upload_pack() upload-pack: pass upload_pack_data to get_common_commits() upload-pack: pass upload_pack_data to receive_needs() upload-pack: use upload_pack_data writer in receive_needs() upload-pack: move symref to upload_pack_data upload-pack: pass upload_pack_data to send_ref() upload-pack: pass upload_pack_data to check_non_tip() upload-pack: remove static variable 'stateless_rpc' upload-pack: pass upload_pack_data to create_pack_file() upload-pack: use upload_pack_data fields in receive_needs() upload-pack: annotate upload_pack_data fields upload-pack: move static vars to upload_pack_data upload-pack: move use_sideband to upload_pack_data upload-pack: move filter_capability_requested to upload_pack_data upload-pack: move multi_ack to upload_pack_data upload-pack: change multi_ack to an enum upload-pack: pass upload_pack_data to upload_pack_config() upload-pack: move keepalive to upload_pack_data upload-pack: move allow_filter to upload_pack_data upload-pack: move allow_ref_in_want to upload_pack_data upload-pack: move allow_sideband_all to upload_pack_data upload-pack: move pack_objects_hook to upload_pack_data upload-pack: pass upload_pack_data to send_shallow_list() upload-pack: pass upload_pack_data to deepen() upload-pack: pass upload_pack_data to deepen_by_rev_list() upload-pack: pass upload_pack_data to send_unshallow() upload-pack: move shallow_nr to upload_pack_data upload-pack: move extra_edge_obj to upload_pack_data upload-pack: move allow_unadvertised_object_request to upload_pack_data upload-pack: change allow_unadvertised_object_request to an enum upload-pack: pass upload_pack_data to process_haves() upload-pack: pass upload_pack_data to send_acks() upload-pack: pass upload_pack_data to ok_to_give_up() upload-pack: pass upload_pack_data to got_oid() upload-pack: move oldest_have to upload_pack_data upload-pack: refactor common code into do_got_oid() cat-file: add missing [=<format>] to usage/synopsis David J. Malan (1): git-prompt: change == to = for zsh's sake Denton Liu (18): lib-submodule-update: add space after function name lib-submodule-update: consolidate --recurse-submodules remote-curl: fix typo remote-curl: remove label indentation transport: extract common fetch_pack() call pkt-line: extern packet_length() remote-curl: error on incomplete packet pkt-line: define PACKET_READ_RESPONSE_END stateless-connect: send response end packet t/README: avoid poor-man's small caps GIT CodingGuidelines: specify Python 2.7 is the oldest version lib-submodule-update: prepend "git" to $command t3200: rename "expected" to "expect" t3200: test for specific errors branch: don't mix --edit-description builtin/diff: update usage comment builtin/diff: fix botched update of usage comment lib-submodule-update: pass 'test_must_fail' as an argument Derrick Stolee (3): line-log: integrate with changed-path Bloom filters commit-reach: create repo_is_descendant_of() commit-reach: use fast logic in repo_in_merge_base Don Goodman-Wilson (1): init: allow setting the default for the initial branch name via the config Elijah Newren (11): fast-import: add new --date-format=raw-permissive format sparse-checkout: avoid staging deletions of all files dir: fix treatment of negated pathspecs git-sparse-checkout: clarify interactions with submodules dir: fix a few confusing comments dir, clean: avoid disallowed behavior clean: consolidate handling of ignored parameters clean: optimize and document cases where we recurse into subdirectories wt-status: show sparse checkout status as well git-prompt: document how in-progress operations affect the prompt git-prompt: include sparsity state as well Emily Shaffer (3): help: add shell-path to --build-options bugreport: include user interactive shell docs: mention MyFirstContribution in more places Eric Sunshine (10): worktree: factor out repeated string literal worktree: give "should be pruned?" function more meaningful name worktree: make high-level pruning re-usable worktree: prune duplicate entries referencing same worktree path worktree: prune linked worktree referencing main worktree path worktree: generalize candidate worktree path validation worktree: make "move" refuse to move atop missing registered worktree worktree: drop get_worktrees() special-purpose sorting option worktree: drop get_worktrees() unused 'flags' argument worktree: avoid dead-code in conditional Han-Wen Nienhuys (5): refs.h: clarify reflog iteration order t: use update-ref and show-ref to reading/writing refs refs: improve documentation for ref iterator reftable: clarify how empty tables should be written reftable: define version 2 of the spec to accomodate SHA256 Jacob Keller (16): completion: add test showing subpar git switch completion completion: add tests showing subpar DWIM logic for switch/checkout completion: add tests showing subar checkout --detach logic completion: add tests showing subpar switch/checkout --track logic completion: add tests showing subpar -c/-C startpoint completion completion: add tests showing subpar -c/C argument completion completion: add tests showing subpar switch/checkout --orphan logic completion: replace overloaded track term for __git_complete_refs completion: extract function __git_dwim_remote_heads completion: perform DWIM logic directly in __git_complete_refs completion: improve handling of DWIM mode for switch/checkout completion: improve completion for git switch with no options completion: improve handling of --detach in checkout completion: improve handling of --track in switch/checkout completion: improve handling of -c/-C and -b/-B in switch/checkout completion: improve handling of --orphan option of switch/checkout Jeff King (14): diff: discard blob data from stat-unmatched pairs upload-pack: actually use some upload_pack_data bitfields t9351: derive anonymized tree checks from original repo fast-export: use xmemdupz() for anonymizing oids fast-export: store anonymized oids as hex strings fast-export: tighten anonymize_mem() interface to handle only strings fast-export: stop storing lengths in anonymized hashmaps fast-export: use a flex array to store anonymized entries fast-export: move global "idents" anonymize hashmap into function fast-export: add a "data" callback parameter to anonymize_str() fast-export: allow seeding the anonymized mapping fast-export: anonymize "master" refname fast-export: use local array to store anonymized oid diff: check for merge bases before assigning sym->base Jiuyang Xie (1): doc: fix wrong 4-byte length of pkt-line message Johannes Schindelin (16): checkout -p: handle new files correctly clone/fetch: anonymize URLs in the reflog msvc: fix "REG_STARTEND" issue fmt-merge-msg: stop treating `master` specially send-pack/transport-helper: avoid mentioning a particular branch submodule: fall back to remote's HEAD for missing remote.<name>.branch docs: add missing diamond brackets init: allow specifying the initial branch name for the new repository clone: use configured default branch name when appropriate remote: use the configured default branch name when appropriate testsvn: respect `init.defaultBranch` docs: adjust for the recent rename of `pu` to `seen` docs: adjust the technical overview for the rename `pu` -> `seen` tests: reference `seen` wherever `pu` was referenced diff-files --raw: show correct post-image of intent-to-add files difftool -d: ensure that intent-to-add files are handled correctly John Lin (1): bash-completion: add git-prune into bash completion Jonathan Nieder (5): config: let feature.experimental imply protocol.version=2 reftable: file format documentation experimental: default to fetch.writeCommitGraph=false Revert "check_repository_format_gently(): refuse extensions for old repositories" repository: allow repository format upgrade with extensions Jonathan Tan (12): t5551: test that GIT_TRACE_CURL redacts password http, imap-send: stop using CURLOPT_VERBOSE http: redact all cookies, teach GIT_TRACE_REDACT=0 http: use --stdin when indexing dumb HTTP pack http: refactor finish_http_pack_request() http-fetch: refactor into function http-fetch: support fetching packfiles by URL Documentation: order protocol v2 sections Documentation: add Packfile URIs design doc upload-pack: refactor reading of pack-objects out fetch-pack: support more than one pack lockfile upload-pack: send part of packfile response as uri Josh Steadmon (1): fuzz-commit-graph: properly free graph struct Junio C Hamano (12): Start the post 2.27 cycle The second batch The third batch The fourth batch The fifth batch The sixth batch The seventh batch Git 2.28-rc0 Hopefully the last batch before -rc1 Git 2.28-rc1 RelNotes: update the v0 with extension situation Git 2.28-rc2 Laurent Arnoud (1): diff: add config option relative Luc Van Oostenryck (1): sparse: allow '{ 0 }' to be used without warnings Marco Trevisan (Treviño) (1): completion: use native ZSH array pattern matching Martin Ågren (5): git-rebase.txt: fix description list separator git-diff.txt: don't mark required argument as optional git-diff.txt: reorder possible usages gitworkflows.txt: fix broken subsection underline t3200: don't grep for `strerror()` string Matheus Tavares (1): entry: check for fstat() errors after checkout Mikhail Terekhov (1): git-gui: allow opening work trees from the startup dialog Miroslav Koškár (1): doc: fix author vs. committer copy/paste error Paolo Bonzini (1): t4014: do not use "slave branch" nomenclature Patrick Steinhardt (1): refs: implement reference transaction hook Rafael Aquini (1): send-email: restore --in-reply-to superseding behavior Ramsay Jones (1): upload-pack: fix a sparse '0 as NULL pointer' warning Randall S. Becker (2): bugreport.c: replace strbuf_write_fd with write_in_full strbuf: remove unreferenced strbuf_write_fd method. René Scharfe (10): fsck: fix a typo in a comment t1450: increase test coverage of in-tree d/f detection t1450: demonstrate undetected in-tree d/f conflict fsck: detect more in-tree d/f conflicts checkout: add tests for -b and --track checkout: improve error messages for -b with extra argument commit-reach: plug minor memory leak after using is_descendant_of() pull: plug minor memory leak after using is_descendant_of() revision: reallocate TOPO_WALK object flags revision: disable min_age optimization with line-log SZEDER Gábor (7): line-log: remove unused fields from 'struct line_log_data' t4211-line-log: add tests for parent oids line-log: more responsive, incremental 'git log -L' line-log: try to use generation number-based topo-ordering commit-graph: fix progress of reachable commits commit-graph: fix "Writing out commit graph" progress counter commit-graph: fix "Collecting commits from input" progress line Shourya Shukla (1): submodule: port subcommand 'set-branch' from shell to C Srinidhi Kaushik (1): diff-files: treat "i-t-a" files as "not-in-index" Taylor Blau (11): commit-graph.c: extract 'refs_cb_data' commit-graph.c: show progress of finding reachable commits commit-graph.c: peel refs in 'add_ref_to_set' builtin/commit-graph.c: extract 'read_one_commit()' builtin/commit-graph.c: dereference tags in builtin commit-graph.c: simplify 'fill_oids_from_commits' t5318: reorder test below 'graph_read_expect' commit-graph: drop COMMIT_GRAPH_WRITE_CHECK_OIDS flag t5318: use 'test_must_be_empty' t5318: test that '--stdin-commits' respects '--[no-]progress' commit.c: don't persist substituted parents when unshallowing Trygve Aaberge (2): Wait for child on signal death for aliases to builtins Wait for child on signal death for aliases to externals Ville Skyttä (2): completion: don't override given stash subcommand with -p completion: nounset mode fixes Xin Li (4): repository: add a helper function to perform repository format upgrade fetch: allow adding a filter after initial clone sparse-checkout: upgrade repository to version 1 when enabling extension check_repository_format_gently(): refuse extensions for old repositories brian m. carlson (61): t1050: match object ID paths in a hash-insensitive way Documentation: document v1 protocol object-format capability builtin/checkout: simplify metadata initialization t2060: add a test for switch with --orphan and --discard-changes connect: have ref processing code take struct packet_reader wrapper: add function to compare strings with different NUL termination remote: advertise the object-format capability on the server side connect: add function to parse multiple v1 capability values connect: add function to fetch value of a v2 server capability pkt-line: add a member for hash algorithm transport: add a hash algorithm member connect: add function to detect supported v1 hash functions send-pack: detect when the server doesn't support our hash connect: make parse_feature_value extern fetch-pack: detect when the server doesn't support our hash connect: detect algorithm when fetching refs builtin/receive-pack: detect when the server doesn't support our hash docs: update remote helper docs for object-format extensions transport-helper: implement object-format extensions remote-curl: implement object-format extensions builtin/clone: initialize hash algorithm properly t5562: pass object-format in synthesized test data fetch-pack: parse and advertise the object-format capability setup: set the_repository's hash algo when checking format t3200: mark assertion with SHA1 prerequisite packfile: compute and use the index CRC offset t5302: modernize test formatting builtin/show-index: provide options to determine hash algo t1302: expect repo format version 1 for SHA-256 Documentation/technical: document object-format for protocol v2 connect: pass full packet reader when parsing v2 refs connect: parse v2 refs with correct hash algorithm serve: advertise object-format capability for protocol v2 t5500: make hash independent builtin/ls-remote: initialize repository based on fetch remote-curl: detect algorithm for dumb HTTP by size builtin/index-pack: add option to specify hash algorithm t1050: pass algorithm to index-pack when outside repo remote-curl: avoid truncating refs with ls-remote t/helper: initialize the repository for test-sha1-array t5702: offer an object-format capability in the test t5703: use object-format serve option t5704: send object-format capability with SHA-256 t5300: pass --object-format to git index-pack bundle: detect hash algorithm when reading refs remote-testgit: adapt for object-format t9109: make test hash independent t9168: make test hash independent t9108: make test hash independent t9100: make test work with SHA-256 t9104: make hash size independent t9101: make hash independent t/lib-git-svn: make hash size independent perl: create and switch variables for hash constants perl: make Git::IndexInfo work with SHA-256 perl: make SVN code hash independent git-svn: set the OID length based on hash algorithm git-cvsserver: port to SHA-256 git-cvsimport: port to SHA-256 git-cvsexportcommit: port to SHA-256 http-push: ensure unforced pushes fail when data would be lost Đoàn Trần Công Danh (1): contrib: subtree: adjust test to change in fmt-merge-msg