Git 2.38 was released in October for Windows, Linux/Unix, and macOS by the Microsoft-owned GitHub team. This version of Git included new features as well as the “Scalar” Repository Management Tool for managing big repositories.
The open-source team has now made a few new enhancements with the release of Git 2.39.0, which are described below. Visit this page to get the most recent Git 2.39 download for Windows, Linux/Unix, and macOS.
What’s new and improved in Git 2.39
UI, Workflows & Features
- “git grep” learned to expand the sparse-index more lazily and on demand in a sparse checkout
- By default, use of fsmonitor on a repository on networked filesystem is disabled. Add knobs to make it workable on macOS
- After checking out a “branch” that is a symbolic-ref that points at another branch, “git symbolic-ref HEAD” reports the underlying branch, not the symbolic-ref the user gave checkout as argument. The command learned the “–no-recurse” option to stop after dereferencing a symbolic-ref only once
- “git branch –edit-description @-1” is now a way to edit branch description of the branch you were on before switching to the current branch
- “git merge-tree –stdin” is a new way to request a series of merges and report the merge results
- “git shortlog” learned to group by the “format” string
- A new “–include-whitespace” option is added to “git patch-id”, and existing bugs in the internal patch-id logic that did not match what “git patch-id” produces have been corrected
- Enable gc.cruftpacks by default for those who opt into feature.experimental setting
- “git repack” learns to send cruft objects out of the way into packfiles outside the repository
- ‘scalar reconfigure -a’ is taught to automatically remove scalar.repo entires which no longer exist
- Redact headers from cURL’s h2h3 module in GIT_CURL_VERBOSE and others
- ‘git maintenance register’ is taught to write configuration to an arbitrary path, and ‘git for-each-repo’ is taught to expand tilde characters in paths
- When creating new notes, the template used to get a stray empty newline, which has been removed
- “git receive-pack” used to use all the local refs as the boundary for checking connectivity of the data “git push” sent, but now it uses only the refs that it advertised to the pusher. In a repository with the .hideRefs configuration, this reduces the resources needed to perform the check
- With ‘–recurse-submodules=on-demand’, all submodules are recursively pushed.
Performance, Internal Implementation, Development Support
- With a bit of header twiddling, use the native regexp library on macOS instead of the compat/ one.
- Prepare for GNU [ef]grep that throw warning of their uses.
- Sources related to fuzz testing have been moved down to their own directory.
- Most credential helpers ignored unknown entries in a credential description, but a few died upon seeing them. The latter were taught to ignore them, too
- “scalar unregister” in a repository that is already been unregistered reported an error.
- Remove error detection from a function that fetches from promisor remotes, and make it die when such a fetch fails to bring all the requested objects, to give an early failure to various operations.
- Update CodingGuidelines to clarify what features to use and avoid in C99.
- Avoid false-positive from LSan whose assumption may be broken with higher optimization levels.
- Enable address and undefined sanitizer tasks at GitHub Actions CI.
- More UNUSED annotation to help using -Wunused option with the compiler. (merge 4b992f0a24 jk/unused-anno-more later to maint).
- Rewrite a deep recursion in the skipping negotiator to use a loop with on-heap prio queue to avoid stack wastage.
- Add documentation for message IDs in fsck error messages.
- Define the logical elements of a “bundle list”, data structure to store them in-core, format to transfer them, and code to parse them.
- The role the security mailing list plays in an embargoed release has been documented.
- Two new facilities, “timer” and “counter”, are introduced to the trace2 API.
- Code simplification by using strvec_pushf() instead of building an argument in a separate strbuf.
- Make sure generated dependency file is stably sorted to help developers debugging their build issues.
- The glossary entries for “commit-graph file” and “reachability bitmap” have been added.
- Various tests exercising the transfer.credentialsInUrl configuration are taught to avoid making requests which require resolving localhost to reduce CI-flakiness.
- A redundant diagnostic message is dropped from test_path_is_missing().
- Simplify the run-command API.
- Update the actions/github-script dependency in CI to avoid a deprecation warning.
- Progress on being able to initialize a rev_info struct with a macro.
- Add trace2 counters to the region to clear skip worktree bits in a sparse checkout.
- Modernize test script to avoid “test -f” and friends.
- Avoid calling ‘cache_tree_update()’ when doing so would be redundant.
- Update the credential-cache documentation to provide a more realistic example.
- Makefile comments updates and reordering to clarify knobs used to choose SHA implementations.
- A design document for sparse-checkout’s future directions has been added.
- Teach chainlint.pl to annotate the original test definition instead of the token stream.
- “make coccicheck” is time consuming. It has been made to run more incrementally.
- `parse_object()` has been hardened to check for the existence of a suspected blob object.
- The build procedure has been adjusted to GNUmake version 4.4, which made some changes to how pattern rule with multiple targets are handled.
How to download Git 2.39 for Windows, Linux/Unix, and macOS
The latest version of the Git client can be downloaded from the official site. To download Git version 2.39 for Windows, click here and select either the 32-bit or 64-bit option. From this page, you can also download a portable (thumb drive edition) of Git. To download Git version 2.39 for Linux/Unix, click here. To download Git version 2.39 for Mac OS, click here.