Relnotes
- 1.5.0.1
- 1.5.0.2
- 1.5.0.3
- 1.5.0.4
- 1.5.0.5
- 1.5.0.6
- 1.5.0.7
- 1.5.0
- 1.5.1.1
- 1.5.1.2
- 1.5.1.3
- 1.5.1.4
- 1.5.1.5
- 1.5.1.6
- 1.5.1
- 1.5.2.1
- 1.5.2.2
- 1.5.2.3
- 1.5.2.4
- 1.5.2.5
- 1.5.2
- 1.5.3.1
- 1.5.3.2
- 1.5.3.3
- 1.5.3.4
- 1.5.3.5
- 1.5.3.6
- 1.5.3.7
- 1.5.3.8
- 1.5.3
- 1.5.4.1
- 1.5.4.2
- 1.5.4.3
- 1.5.4.4
- 1.5.4.5
- 1.5.4.6
- 1.5.4.7
- 1.5.4
- 1.5.5.1
- 1.5.5.2
- 1.5.5.3
- 1.5.5.4
- 1.5.5.5
- 1.5.5.6
- 1.5.5
- 1.5.6.1
- 1.5.6.2
- 1.5.6.3
- 1.5.6.4
- 1.5.6.5
- 1.5.6.6
- 1.5.6
- 1.6.0.1
- 1.6.0.2
- 1.6.0.3
- 1.6.0.4
- 1.6.0.5
- 1.6.0.6
- 1.6.0
- 1.6.1.1
- 1.6.1.2
- 1.6.1.3
- 1.6.1.4
- 1.6.1
- 1.6.2.1
- 1.6.2.2
- 1.6.2.3
- 1.6.2.4
- 1.6.2.5
- 1.6.2
- 1.6.3.1
- 1.6.3.2
- 1.6.3.3
- 1.6.3.4
- 1.6.3
- 1.6.4.1
- 1.6.4.2
- 1.6.4.3
- 1.6.4.4
- 1.6.4.5
- 1.6.4
- 1.6.5.1
- 1.6.5.2
- 1.6.5.3
- 1.6.5.4
- 1.6.5.5
- 1.6.5.6
- 1.6.5.7
- 1.6.5.8
- 1.6.5.9
- 1.6.5
- 1.6.6.1
- 1.6.6.2
- 1.6.6.3
- 1.6.6
- 1.7.0.1
- 1.7.0.2
- 1.7.0.3
- 1.7.0.4
- 1.7.0.5
- 1.7.0.6
- 1.7.0.7
- 1.7.0.8
- 1.7.0.9
- 1.7.0
- 1.7.1.1
- 1.7.1.2
- 1.7.1.3
- 1.7.1.4
- 1.7.1
- 1.7.10.1
- 1.7.10.2
- 1.7.10.3
- 1.7.10.4
- 1.7.10.5
- 1.7.10
- 1.7.11.1
- 1.7.11.2
- 1.7.11.3
- 1.7.11.4
- 1.7.11.5
- 1.7.11.6
- 1.7.11.7
- 1.7.11
- 1.7.12.1
- 1.7.12.2
- 1.7.12.3
- 1.7.12.4
- 1.7.12
- 1.7.2.1
- 1.7.2.2
- 1.7.2.3
- 1.7.2.4
- 1.7.2.5
- 1.7.2
- 1.7.3.1
- 1.7.3.2
- 1.7.3.3
- 1.7.3.4
- 1.7.3.5
- 1.7.3
- 1.7.4.1
- 1.7.4.2
- 1.7.4.3
- 1.7.4.4
- 1.7.4.5
- 1.7.4
- 1.7.5.1
- 1.7.5.2
- 1.7.5.3
- 1.7.5.4
- 1.7.5
- 1.7.6.1
- 1.7.6.2
- 1.7.6.3
- 1.7.6.4
- 1.7.6.5
- 1.7.6.6
- 1.7.6
- 1.7.7.1
- 1.7.7.2
- 1.7.7.3
- 1.7.7.4
- 1.7.7.5
- 1.7.7.6
- 1.7.7.7
- 1.7.7
- 1.7.8.1
- 1.7.8.2
- 1.7.8.3
- 1.7.8.4
- 1.7.8.5
- 1.7.8.6
- 1.7.8
- 1.7.9.1
- 1.7.9.2
- 1.7.9.3
- 1.7.9.4
- 1.7.9.5
- 1.7.9.6
- 1.7.9.7
- 1.7.9
- 1.8.0.1
- 1.8.0.2
- 1.8.0.3
- 1.8.0
- 1.8.1.1
- 1.8.1.2
- 1.8.1.3
- 1.8.1.4
- 1.8.1.5
- 1.8.1.6
- 1.8.1
- 1.8.2.1
- 1.8.2.2
- 1.8.2.3
- 1.8.2
- 1.8.3.1
- 1.8.3.2
- 1.8.3.3
- 1.8.3.4
- 1.8.3
- 1.8.4.1
- 1.8.4.2
- 1.8.4.3
- 1.8.4.4
- 1.8.4.5
- 1.8.4
- 1.8.5.1
- 1.8.5.2
- 1.8.5.3
- 1.8.5.4
- 1.8.5.5
- 1.8.5.6
- 1.8.5
- 1.9.0
- 1.9.1
- 1.9.2
- 1.9.3
- 1.9.4
- 1.9.5
- 2.0.0
- 2.0.1
- 2.0.2
- 2.0.3
- 2.0.4
- 2.0.5
- 2.1.0
- 2.1.1
- 2.1.2
- 2.1.3
- 2.1.4
- 2.10.0
- 2.10.1
- 2.10.2
- 2.10.3
- 2.10.4
- 2.10.5
- 2.11.0
- 2.11.1
- 2.11.2
- 2.11.3
- 2.11.4
- 2.12.0
- 2.12.1
- 2.12.2
- 2.12.3
- 2.12.4
- 2.12.5
- 2.13.0
- 2.13.1
- 2.13.2
- 2.13.3
- 2.13.4
- 2.13.5
- 2.13.6
- 2.13.7
- 2.14.0
- 2.14.1
- 2.14.2
- 2.14.3
- 2.14.4
- 2.14.5
- 2.14.6
- 2.15.0
- 2.15.1
- 2.15.2
- 2.15.3
- 2.15.4
- 2.16.0
- 2.16.1
- 2.16.2
- 2.16.3
- 2.16.4
- 2.16.5
- 2.16.6
- 2.17.0
- 2.17.1
- 2.17.2
- 2.17.3
- 2.17.4
- 2.17.5
- 2.17.6
- 2.18.0
- 2.18.1
- 2.18.2
- 2.18.3
- 2.18.4
- 2.18.5
- 2.19.0
- 2.19.1
- 2.19.2
- 2.19.3
- 2.19.4
- 2.19.5
- 2.19.6
- 2.2.0
- 2.2.1
- 2.2.2
- 2.2.3
- 2.20.0
- 2.20.1
- 2.20.2
- 2.20.3
- 2.20.4
- 2.20.5
- 2.21.0
- 2.21.1
- 2.21.2
- 2.21.3
- 2.21.4
- 2.22.0
- 2.22.1
- 2.22.2
- 2.22.3
- 2.22.4
- 2.22.5
- 2.23.0
- 2.23.1
- 2.23.2
- 2.23.3
- 2.23.4
- 2.24.0
- 2.24.1
- 2.24.2
- 2.24.3
- 2.24.4
- 2.25.0
- 2.25.1
- 2.25.2
- 2.25.3
- 2.25.4
- 2.25.5
- 2.26.0
- 2.26.1
- 2.26.2
- 2.26.3
- 2.27.0
- 2.27.1
- 2.28.0
- 2.28.1
- 2.29.0
- 2.29.1
- 2.29.2
- 2.29.3
- 2.3.0
- 2.3.1
- 2.3.10
- 2.3.2
- 2.3.3
- 2.3.4
- 2.3.5
- 2.3.6
- 2.3.7
- 2.3.8
- 2.3.9
- 2.30.0
- 2.30.1
- 2.30.2
- 2.30.3
- 2.30.4
- 2.30.5
- 2.30.6
- 2.30.7
- 2.30.8
- 2.30.9
- 2.31.0
- 2.31.1
- 2.31.2
- 2.31.3
- 2.31.4
- 2.31.5
- 2.31.6
- 2.31.7
- 2.31.8
- 2.32.0
- 2.32.1
- 2.32.2
- 2.32.3
- 2.32.4
- 2.32.5
- 2.32.6
- 2.32.7
- 2.33.0
- 2.33.1
- 2.33.2
- 2.33.3
- 2.33.4
- 2.33.5
- 2.33.6
- 2.33.7
- 2.33.8
- 2.34.0
- 2.34.1
- 2.34.2
- 2.34.3
- 2.34.4
- 2.34.5
- 2.34.6
- 2.34.7
- 2.34.8
- 2.35.0
- 2.35.1
- 2.35.2
- 2.35.3
- 2.35.4
- 2.35.5
- 2.35.6
- 2.35.7
- 2.35.8
- 2.36.0
- 2.36.1
- 2.36.2
- 2.36.3
- 2.36.4
- 2.36.5
- 2.36.6
- 2.37.0
- 2.37.1
- 2.37.2
- 2.37.3
- 2.37.4
- 2.37.5
- 2.37.6
- 2.37.7
- 2.38.0
- 2.38.1
- 2.38.2
- 2.38.3
- 2.38.4
- 2.38.5
- 2.39.0
- 2.39.1
- 2.39.2
- 2.39.3
- 2.39.4
- 2.39.5
- 2.4.0
- 2.4.1
- 2.4.10
- 2.4.11
- 2.4.12
- 2.4.2
- 2.4.3
- 2.4.4
- 2.4.5
- 2.4.6
- 2.4.7
- 2.4.8
- 2.4.9
- 2.40.0
- 2.40.1
- 2.40.2
- 2.40.3
- 2.40.4
- 2.41.0
- 2.41.1
- 2.41.2
- 2.41.3
- 2.42.0
- 2.42.1
- 2.42.2
- 2.42.3
- 2.42.4
- 2.43.0
- 2.43.1
- 2.43.2
- 2.43.3
- 2.43.4
- 2.43.5
- 2.43.6
- 2.43.7
- 2.44.0
- 2.44.1
- 2.44.2
- 2.44.3
- 2.44.4
- 2.45.0
- 2.45.1
- 2.45.2
- 2.45.3
- 2.45.4
- 2.46.0
- 2.46.1
- 2.46.2
- 2.46.3
- 2.46.4
- 2.47.0
- 2.47.1
- 2.47.2
- 2.47.3
- 2.48.0
- 2.48.1
- 2.48.2
- 2.49.0
- 2.49.1
- 2.5.0
- 2.5.1
- 2.5.2
- 2.5.3
- 2.5.4
- 2.5.5
- 2.5.6
- 2.50.0
- 2.50.1
- 2.51.0
- 2.51.1
- 2.51.2
- 2.52.0
- 2.53.0
- 2.54.0
- 2.54.1
- 2.55.0
- 2.56.0
- 2.6.0
- 2.6.1
- 2.6.2
- 2.6.3
- 2.6.4
- 2.6.5
- 2.6.6
- 2.6.7
- 2.7.0
- 2.7.1
- 2.7.2
- 2.7.3
- 2.7.4
- 2.7.5
- 2.7.6
- 2.8.0
- 2.8.1
- 2.8.2
- 2.8.3
- 2.8.4
- 2.8.5
- 2.8.6
- 2.9.0
- 2.9.1
- 2.9.2
- 2.9.3
- 2.9.4
- 2.9.5
- 2.98.0
1.5.0.1
GIT v1.5.0.1 Release Notes ==========================
Fixes since v1.5.0 ------------------
- Documentation updates
- Clarifications and corrections to 1.5.0 release notes.
- The main documentation did not link to git-remote documentation.
- Clarified introductory text of git-rebase documentation.
- Converted remaining mentions of update-index on Porcelain documents to git-add/git-rm.
- Some i18n.* configuration variables were incorrectly described as core.*; fixed.
- Bugfixes
- git-add and git-update-index on a filesystem on which executable bits are unreliable incorrectly reused st_mode bits even when the path changed between symlink and regular file.
- git-daemon marks the listening sockets with FD_CLOEXEC so that it won’t be leaked into the children.
- segfault from git-blame when the mandatory pathname parameter was missing was fixed; usage() message is given instead.
- git-rev-list did not read $GIT_DIR/config file, which means that did not honor i18n.logoutputencoding correctly.
- Tweaks
- sliding mmap() inefficiently mmaped the same region of a packfile with an access pattern that used objects in the reverse order. This has been made more efficient.
1.5.0.2
GIT v1.5.0.2 Release Notes ==========================
Fixes since v1.5.0.1 --------------------
- Bugfixes
- Automated merge conflict handling when changes to symbolic links conflicted were completely broken. The merge-resolve strategy created a regular file with conflict markers in it in place of the symbolic link. The default strategy, merge-recursive was even more broken. It removed the path that was pointed at by the symbolic link. Both of these problems have been fixed.
- ’git diff maint master next’ did not correctly give combined diff across three trees.
- ’git fast-import’ portability fix for Solaris.
- ’git show-ref --verify’ without arguments did not error out but segfaulted.
- ’git diff :tracked-file
pwd/an-untracked-file’ gave an extra slashes after a/ and b/.
- ’git format-patch’ produced too long filenames if the commit message had too long line at the beginning.
- Running ’make all’ and then without changing anything running ’make install’ still rebuilt some files. This was inconvenient when building as yourself and then installing as root (especially problematic when the source directory is on NFS and root is mapped to nobody).
- ’git-rerere’ failed to deal with two unconflicted paths that sorted next to each other.
- ’git-rerere’ attempted to open(2) a symlink and failed if there was a conflict. Since a conflicting change to a symlink would not benefit from rerere anyway, the command now ignores conflicting changes to symlinks.
- ’git-repack’ did not like to pass more than 64 arguments internally to underlying ’rev-list’ logic, which made it impossible to repack after accumulating many (small) packs in the repository.
- ’git-diff’ to review the combined diff during a conflicted merge were not reading the working tree version correctly when changes to a symbolic link conflicted. It should have read the data using readlink(2) but read from the regular file the symbolic link pointed at.
- ’git-remote’ did not like period in a remote’s name.
- Documentation updates
- added and clarified core.bare, core.legacyheaders configurations.
- updated "git-clone --depth" documentation.
- Assorted git-gui fixes.
1.5.0.3
GIT v1.5.0.3 Release Notes ==========================
Fixes since v1.5.0.2 --------------------
- Bugfixes
- ’git.el’ honors the commit coding system from the configuration.
- ’blameview’ in contrib/ correctly digs deeper when a line is clicked.
- ’http-push’ correctly makes sure the remote side has leading path. Earlier it started in the middle of the path, and incorrectly.
- ’git-merge’ did not exit with non-zero status when the working tree was dirty and cannot fast forward. It does now.
- ’cvsexportcommit’ does not lose yet-to-be-used message file.
- int-vs-size_t typefix when running combined diff on files over 2GB long.
- ’git apply --whitespace=strip’ should not touch unmodified lines.
- ’git-mailinfo’ choke when a logical header line was too long.
- ’git show A..B’ did not error out. Negative ref ("not A" in this example) does not make sense for the purpose of the command, so now it errors out.
- ’git fmt-merge-msg --file’ without file parameter did not correctly error out.
- ’git archimport’ barfed upon encountering a commit without summary.
- ’git index-pack’ did not protect itself from getting a short read out of pread(2).
- ’git http-push’ had a few buffer overruns.
- Build dependency fixes to rebuild fetch.o when other headers change.
- Documentation updates
- user-manual updates.
- Options to ’git remote add’ were described insufficiently.
- Configuration format.suffix was not documented.
- Other formatting and spelling fixes.
1.5.0.4
GIT v1.5.0.4 Release Notes ==========================
Fixes since v1.5.0.3 --------------------
- Bugfixes
- git.el does not add duplicate sign-off lines.
- git-commit shows the full stat of the resulting commit, not just about the files in the current directory, when run from a subdirectory.
- "git-checkout -m ’@{8 hours ago}’" had a funny failure from eval; fixed.
- git-gui updates.
- Documentation updates
- User manual updates
1.5.0.5
GIT v1.5.0.5 Release Notes ==========================
Fixes since v1.5.0.3 --------------------
- Bugfixes
- git-merge (hence git-pull) did not refuse fast-forwarding when the working tree had local changes that would have conflicted with it.
- git.el does not add duplicate sign-off lines.
- git-commit shows the full stat of the resulting commit, not just about the files in the current directory, when run from a subdirectory.
- "git-checkout -m ’@{8 hours ago}’" had a funny failure from eval; fixed.
- git-gui updates.
- Documentation updates
- User manual updates
1.5.0.6
GIT v1.5.0.6 Release Notes ==========================
Fixes since v1.5.0.5 --------------------
- Bugfixes
- a handful small fixes to gitweb.
- build procedure for user-manual is fixed not to require locally installed stylesheets.
- "git commit $paths" on paths whose earlier contents were already updated in the index were failing out.
- Documentation
- user-manual has better cross references.
- gitweb installation/deployment procedure is now documented.
1.5.0.7
GIT v1.5.0.7 Release Notes ==========================
Fixes since v1.5.0.6 --------------------
- Bugfixes
- git-upload-pack failed to close unused pipe ends, resulting in many zombies to hang around.
- git-rerere was recording the contents of earlier hunks duplicated in later hunks. This prevented resolving the same conflict when performing the same merge the other way around.
- Documentation
- a few documentation fixes from Debian package maintainer.
1.5.0
GIT v1.5.0 Release Notes ========================
Old news --------
This section is for people who are upgrading from ancient versions of git. Although all of the changes in this section happened before the current v1.4.4 release, they are summarized here in the v1.5.0 release notes for people who skipped earlier versions.
As of git v1.5.0 there are some optional features that changes the repository to allow data to be stored and transferred more efficiently. These features are not enabled by default, as they will make the repository unusable with older versions of git. Specifically, the available options are:
- There is a configuration variable core.legacyheaders that changes the format of loose objects so that they are more efficient to pack and to send out of the repository over git native protocol, since v1.4.2. However, loose objects written in the new format cannot be read by git older than that version; people fetching from your repository using older clients over dumb transports (e.g. http) using older versions of git will also be affected.
To let git use the new loose object format, you have to
set core.legacyheaders to false.
- Since v1.4.3, configuration repack.usedeltabaseoffset allows packfile to be created in more space efficient format, which cannot be read by git older than that version.
To let git use the new format for packfiles, you have to
set repack.usedeltabaseoffset to true.
The above two new features are not enabled by default and you have to explicitly ask for them, because they make repositories unreadable by older versions of git, and in v1.5.0 we still do not enable them by default for the same reason. We will change this default probably 1 year after 1.4.2’s release, when it is reasonable to expect everybody to have new enough version of git.
- ’git pack-refs’ appeared in v1.4.4; this command allows tags to be accessed much more efficiently than the traditional ’one-file-per-tag’ format. Older git-native clients can still fetch from a repository that packed and pruned refs (the server side needs to run the up-to-date version of git), but older dumb transports cannot. Packing of refs is done by an explicit user action, either by use of "git pack-refs --prune" command or by use of "git gc" command.
- ’git -p’ to paginate anything — many commands do pagination by default on a tty. Introduced between v1.4.1 and v1.4.2; this may surprise old timers.
- ’git archive’ superseded ’git tar-tree’ in v1.4.3;
- ’git cvsserver’ was new invention in v1.3.0;
- ’git repo-config’, ’git grep’, ’git rebase’ and ’gitk’ were seriously enhanced during v1.4.0 timeperiod.
- ’gitweb’ became part of git.git during v1.4.0 timeperiod and seriously modified since then.
- reflog is an v1.4.0 invention. This allows you to name a revision that a branch used to be at (e.g. "git diff master@{yesterday} master" allows you to see changes since yesterday’s tip of the branch).
Updates in v1.5.0 since v1.4.4 series -------------------------------------
- Index manipulation
- git-add is to add contents to the index (aka "staging area" for the next commit), whether the file the contents happen to be is an existing one or a newly created one.
- git-add without any argument does not add everything anymore. Use ’git-add .’ instead. Also you can add otherwise ignored files with an -f option.
- git-add tries to be more friendly to users by offering an interactive mode ("git-add -i").
- git-commit <path> used to refuse to commit if <path> was different between HEAD and the index (i.e. update-index was used on it earlier). This check was removed.
- git-rm is much saner and safer. It is used to remove paths from both the index file and the working tree, and makes sure you are not losing any local modification before doing so.
- git-reset <tree> <paths>… can be used to revert index entries for selected paths.
- git-update-index is much less visible. Many suggestions to use the command in git output and documentation have now been replaced by simpler commands such as "git add" or "git rm".
- Repository layout and objects transfer
- The data for origin repository is stored in the configuration file $GIT_DIR/config, not in $GIT_DIR/remotes/, for newly created clones. The latter is still supported and there is no need to convert your existing repository if you are already comfortable with your workflow with the layout.
- git-clone always uses what is known as "separate remote" layout for a newly created repository with a working tree.
A repository with the separate remote layout starts with only
one default branch, 'master', to be used for your own
development. Unlike the traditional layout that copied all
the upstream branches into your branch namespace (while
renaming their 'master' to your 'origin'), the new layout
puts upstream branches into local "remote-tracking branches"
with their own namespace. These can be referenced with names
such as "origin/$upstream_branch_name" and are stored in
.git/refs/remotes rather than .git/refs/heads where normal
branches are stored.
This layout keeps your own branch namespace less cluttered,
avoids name collision with your upstream, makes it possible
to automatically track new branches created at the remote
after you clone from it, and makes it easier to interact with
more than one remote repository (you can use "git remote" to
add other repositories to track). There might be some
surprises:
- ’git branch’ does not show the remote tracking branches. It only lists your own branches. Use ’-r’ option to view the tracking branches.
- If you are forking off of a branch obtained from the upstream, you would have done something like ’git branch my-next next’, because traditional layout dropped the tracking branch ’next’ into your own branch namespace. With the separate remote layout, you say ’git branch next origin/next’, which allows you to use the matching name ’next’ for your own branch. It also allows you to track a remote other than ’origin’ (i.e. where you initially cloned from) and fork off of a branch from there the same way (e.g. "git branch mingw j6t/master").
Repositories initialized with the traditional layout continue
to work.
- New branches that appear on the origin side after a clone is made are also tracked automatically. This is done with an wildcard refspec "refs/heads/:refs/remotes/origin/", which older git does not understand, so if you clone with 1.5.0, you would need to downgrade remote.*.fetch in the configuration file to specify each branch you are interested in individually if you plan to fetch into the repository with older versions of git (but why would you?).
- Similarly, wildcard refspec "refs/heads/:refs/remotes/me/" can be given to "git-push" command to update the tracking branches that is used to track the repository you are pushing from on the remote side.
- git-branch and git-show-branch know remote tracking branches (use the command line switch "-r" to list only tracked branches).
- git-push can now be used to delete a remote branch or a tag. This requires the updated git on the remote side (use "git push <remote> :refs/heads/<branch>" to delete "branch").
- git-push more aggressively keeps the transferred objects packed. Earlier we recommended to monitor amount of loose objects and repack regularly, but you should repack when you accumulated too many small packs this way as well. Updated git-count-objects helps you with this.
- git-fetch also more aggressively keeps the transferred objects packed. This behavior of git-push and git-fetch can be tweaked with a single configuration transfer.unpacklimit (but usually there should not be any need for a user to tweak it).
- A new command, git-remote, can help you manage your remote tracking branch definitions.
- You may need to specify explicit paths for upload-pack and/or receive-pack due to your ssh daemon configuration on the other end. This can now be done via remote..uploadpack and remote..receivepack configuration.
- Bare repositories
- Certain commands change their behavior in a bare repository (i.e. a repository without associated working tree). We use a fairly conservative heuristic (if $GIT_DIR is ".git", or ends with "/.git", the repository is not bare) to decide if a repository is bare, but "core.bare" configuration variable can be used to override the heuristic when it misidentifies your repository.
- git-fetch used to complain updating the current branch but this is now allowed for a bare repository. So is the use of ’git-branch -f’ to update the current branch.
- Porcelain-ish commands that require a working tree refuses to work in a bare repository.
- Reflog
- Reflog records the history from the view point of the local repository. In other words, regardless of the real history, the reflog shows the history as seen by one particular repository (this enables you to ask "what was the current revision in this repository, yesterday at 1pm?"). This facility is enabled by default for repositories with working trees, and can be accessed with the "branch@{time}" and "branch@{Nth}" notation.
- "git show-branch" learned showing the reflog data with the new -g option. "git log" has -g option to view reflog entries in a more verbose manner.
- git-branch knows how to rename branches and moves existing reflog data from the old branch to the new one.
- In addition to the reflog support in v1.4.4 series, HEAD reference maintains its own log. "HEAD@{5.minutes.ago}" means the commit you were at 5 minutes ago, which takes branch switching into account. If you want to know where the tip of your current branch was at 5 minutes ago, you need to explicitly say its name (e.g. "master@{5.minutes.ago}") or omit the refname altogether i.e. "@{5.minutes.ago}".
- The commits referred to by reflog entries are now protected against pruning. The new command "git reflog expire" can be used to truncate older reflog entries and entries that refer to commits that have been pruned away previously with older versions of git.
Existing repositories that have been using reflog may get
complaints from fsck-objects and may not be able to run
git-repack, if you had run git-prune from older git; please
run "git reflog expire --stale-fix --all" first to remove
reflog entries that refer to commits that are no longer in
the repository when that happens.
- Cruft removal
- We used to say "old commits are retrievable using reflog and ’master@{yesterday}’ syntax as long as you haven’t run git-prune". We no longer have to say the latter half of the above sentence, as git-prune does not remove things reachable from reflog entries.
- There is a toplevel garbage collector script, ’git-gc’, that runs periodic cleanup functions, including ’git-repack -a -d’, ’git-reflog expire’, ’git-pack-refs --prune’, and ’git-rerere gc’.
- The output from fsck ("fsck-objects" is called just "fsck" now, but the old name continues to work) was needlessly alarming in that it warned missing objects that are reachable only from dangling objects. This has been corrected and the output is much more useful.
- Detached HEAD
- You can use ’git-checkout’ to check out an arbitrary revision or a tag as well, instead of named branches. This will dissociate your HEAD from the branch you are currently on.
A typical use of this feature is to "look around". E.g.
$ git checkout v2.6.16
... compile, test, etc.
$ git checkout v2.6.17
... compile, test, etc.
- After detaching your HEAD, you can go back to an existing branch with usual "git checkout $branch". Also you can start a new branch using "git checkout -b $newbranch" to start a new branch at that commit.
- You can even pull from other repositories, make merges and commits while your HEAD is detached. Also you can use "git reset" to jump to arbitrary commit, while still keeping your HEAD detached.
Remember that a detached state is volatile, i.e. it will be forgotten
as soon as you move away from it with the checkout or reset command,
unless a branch is created from it as mentioned above. It is also
possible to rescue a lost detached state from the HEAD reflog.
- Packed refs
- Repositories with hundreds of tags have been paying large overhead, both in storage and in runtime, due to the traditional one-ref-per-file format. A new command, git-pack-refs, can be used to "pack" them in more efficient representation (you can let git-gc do this for you).
- Clones and fetches over dumb transports are now aware of packed refs and can download from repositories that use them.
- Configuration
- configuration related to color setting are consolidated under color.* namespace (older diff.color., status.color. are still supported).
- ’git-repo-config’ command is accessible as ’git-config’ now.
- Updated features
- git-describe uses better criteria to pick a base ref. It used to pick the one with the newest timestamp, but now it picks the one that is topologically the closest (that is, among ancestors of commit C, the ref T that has the shortest output from "git-rev-list T..C" is chosen).
- git-describe gives the number of commits since the base ref between the refname and the hash suffix. E.g. the commit one before v2.6.20-rc6 in the kernel repository is:
v2.6.20-rc5-306-ga21b069
which tells you that its object name begins with a21b069,
v2.6.20-rc5 is an ancestor of it (meaning, the commit
contains everything -rc5 has), and there are 306 commits
since v2.6.20-rc5.
- git-describe with --abbrev=0 can be used to show only the name of the base ref.
- git-blame learned a new option, --incremental, that tells it to output the blames as they are assigned. A sample script to use it is also included as contrib/blameview.
- git-blame starts annotating from the working tree by default.
- Less external dependency
- We no longer require the "merge" program from the RCS suite. All 3-way file-level merges are now done internally.
- The original implementation of git-merge-recursive which was in Python has been removed; we have a C implementation of it now.
- git-shortlog is no longer a Perl script. It no longer requires output piped from git-log; it can accept revision parameters directly on the command line.
- I18n
- We have always encouraged the commit message to be encoded in UTF-8, but the users are allowed to use legacy encoding as appropriate for their projects. This will continue to be the case. However, a non UTF-8 commit encoding must be explicitly set with i18n.commitencoding in the repository where a commit is made; otherwise git-commit-tree will complain if the log message does not look like a valid UTF-8 string.
- The value of i18n.commitencoding in the originating repository is recorded in the commit object on the "encoding" header, if it is not UTF-8. git-log and friends notice this, and re-encodes the message to the log output encoding when displaying, if they are different. The log output encoding is determined by "git log --encoding=<encoding>", i18n.logoutputencoding configuration, or i18n.commitencoding configuration, in the decreasing order of preference, and defaults to UTF-8.
- Tools for e-mailed patch application now default to -u behavior; i.e. it always re-codes from the e-mailed encoding to the encoding specified with i18n.commitencoding. This unfortunately forces projects that have happily been using a legacy encoding without setting i18n.commitencoding to set the configuration, but taken with other improvement, please excuse us for this very minor one-time inconvenience.
- e-mailed patches
- See the above I18n section.
- git-format-patch now enables --binary without being asked. git-am does not default to it, as sending binary patch via e-mail is unusual and is harder to review than textual patches and it is prudent to require the person who is applying the patch to explicitly ask for it.
- The default suffix for git-format-patch output is now ".patch", not ".txt". This can be changed with --suffix=.txt option, or setting the config variable "format.suffix" to ".txt".
- Foreign SCM interfaces
-
git-svn now requires the Perl SVN
libraries, the command-line backend was too slow and limited. -
the ’commit’ subcommand of git-svn has been renamed to ’set-tree’, and ’dcommit’ is the recommended replacement for day-to-day work.
- git fast-import backend.
- User support
- Quite a lot of documentation updates.
- Bash completion scripts have been updated heavily.
- Better error messages for often used Porcelainish commands.
- Git GUI. This is a simple Tk based graphical interface for common Git operations.
- Sliding mmap
- We used to assume that we can mmap the whole packfile while in use, but with a large project this consumes huge virtual memory space and truly huge ones would not fit in the userland address space on 32-bit platforms. We now mmap huge packfile in pieces to avoid this problem.
- Shallow clones
- There is a partial support for ’shallow’ repositories that keeps only recent history. A ’shallow clone’ is created by specifying how deep that truncated history should be (e.g. "git clone --depth 5 git://some.where/repo.git").
Currently a shallow repository has number of limitations:
- Cloning and fetching from a shallow clone are not supported (nor tested — so they might work by accident but they are not expected to).
- Pushing from nor into a shallow clone are not expected to work.
- Merging inside a shallow repository would work as long as a merge base is found in the recent history, but otherwise it will be like merging unrelated histories and may result in huge conflicts.
but this would be more than adequate for people who want to
look at near the tip of a big project with a deep history and
send patches in e-mail format.
1.5.1.1
GIT v1.5.1.1 Release Notes ==========================
Fixes since v1.5.1 ------------------
- Documentation updates
- The --left-right option of rev-list and friends is documented.
- The documentation for cvsimport has been majorly improved.
- "git-show-ref --exclude-existing" was documented.
- Bugfixes
- The implementation of -p option in "git cvsexportcommit" had the meaning of -C (context reduction) option wrong, and loosened the context requirements when it was told to be strict.
- "git cvsserver" did not behave like the real cvsserver when client side removed a file from the working tree without doing anything else on the path. In such a case, it should restore it from the checked out revision.
- "git fsck" issued an alarming error message on detached HEAD. It is not an error since at least 1.5.0.
- "git send-email" produced of References header of unbounded length; fixed this with line-folding.
- "git archive" to download from remote site should not require you to be in a git repository, but it incorrectly did.
- "git apply" ignored -p<n> for "diff --git" formatted patches.
- "git rerere" recorded a conflict that had one side empty (the other side adds) incorrectly; this made merging in the other direction fail to use previously recorded resolution.
- t4200 test was broken where "wc -l" pads its output with spaces.
- "git branch -m old new" to rename branch did not work without a configuration file in ".git/config".
- The sample hook for notification e-mail was misnamed.
- gitweb did not show type-changing patch correctly in the blobdiff view.
- git-svn did not error out with incorrect command line options.
- git-svn fell into an infinite loop when insanely long commit message was found.
- git-svn dcommit and rebase was confused by patches that were merged from another branch that is managed by git-svn.
- git-svn used to get confused when globbing remote branch/tag spec (e.g. "branches = proj/branches/:refs/remotes/origin/") is used and there was a plain file that matched the glob.
1.5.1.2
GIT v1.5.1.2 Release Notes ==========================
Fixes since v1.5.1.1 --------------------
- Bugfixes
- "git clone" over http from a repository that has lost the loose refs by running "git pack-refs" were broken (a code to deal with this was added to "git fetch" in v1.5.0, but it was missing from "git clone").
- "git diff a/ b/" incorrectly fell in "diff between two filesystem objects" codepath, when the user most likely wanted to limit the extent of output to two tracked directories.
- git-quiltimport had the same bug as we fixed for git-applymbox in v1.5.1.1 — it gave an alarming "did not have any patch" message (but did not actually fail and was harmless).
- various git-svn fixes.
- Sample update hook incorrectly always refused requests to delete branches through push.
- git-blame on a very long working tree path had buffer overrun problem.
- git-apply did not like to be fed two patches in a row that created and then modified the same file.
- git-svn was confused when a non-project was stored directly under trunk/, branches/ and tags/.
- git-svn wants the Error.pm module that was at least as new as what we ship as part of git; install ours in our private installation location if the one on the system is older.
- An earlier update to command line integer parameter parser was botched and made ’update-index --cacheinfo’ completely useless.
- Documentation updates
- Various documentation updates from J. Bruce Fields, Frank Lichtenheld, Alex Riesen and others. Andrew Ruder started a war on undocumented options.
1.5.1.3
GIT v1.5.1.3 Release Notes ==========================
Fixes since v1.5.1.2 --------------------
- Bugfixes
- git-add tried to optimize by finding common leading directories across its arguments but botched, causing very confused behaviour.
- unofficial rpm.spec file shipped with git was letting ETC_GITCONFIG set to /usr/etc/gitconfig. Tweak the official Makefile to make it harder for distro people to make the same mistake, by setting the variable to /etc/gitconfig if prefix is set to /usr.
- git-svn inconsistently stripped away username from the URL only when svnsync_props was in use.
- git-svn got confused when handling symlinks on Mac OS.
- git-send-email was not quoting recipient names that have period ’.’ in them. Also it did not allow overriding envelope sender, which made it impossible to send patches to certain subscriber-only lists.
- built-in write_tree() routine had a sequence that renamed a file that is still open, which some systems did not like.
- when memory is very tight, sliding mmap code to read packfiles incorrectly closed the fd that was still being used to read the pack.
- import-tars contributed front-end for fastimport was passing wrong directory modes without checking.
- git-fastimport trusted its input too much and allowed to create corrupt tree objects with entries without a name.
- git-fetch needlessly barfed when too long reflog action description was given by the caller.
Also contains various documentation updates.
1.5.1.4
GIT v1.5.1.4 Release Notes ==========================
Fixes since v1.5.1.3 --------------------
- Bugfixes
- "git-http-fetch" did not work around a bug in libcurl earlier than 7.16 (curl_multi_remove_handle() was broken).
- "git cvsserver" handles a file that was once removed and then added again correctly.
- import-tars script (in contrib/) handles GNU tar archives that contain pathnames longer than 100 bytes (long-link extension) correctly.
- xdelta test program did not build correctly.
- gitweb sometimes tried incorrectly to apply function to decode utf8 twice, resulting in corrupt output.
- "git blame -C" mishandled text at the end of a group of lines.
- "git log/rev-list --boundary" did not produce output correctly without --left-right option.
- Many documentation updates.
1.5.1.5
GIT v1.5.1.5 Release Notes ==========================
Fixes since v1.5.1.4 --------------------
- Bugfixes
- git-send-email did not understand aliases file for mutt, which allows leading whitespaces.
- git-format-patch emitted Content-Type and Content-Transfer-Encoding headers for non ASCII contents, but failed to add MIME-Version.
- git-name-rev had a buffer overrun with a deep history.
- contributed script import-tars did not get the directory in tar archives interpreted correctly.
- git-svn was reported to segfault for many people on list and #git; hopefully this has been fixed.
- "git-svn clone" does not try to minimize the URL (i.e. connect to higher level hierarchy) by default, as this can prevent clone to fail if only part of the repository (e.g. ’trunk’) is open to public.
- "git checkout branch^0" did not detach the head when you are already on ’branch’; backported the fix from the ’master’.
- "git-config section.var" did not correctly work when existing configuration file had both [section] and [section "name"] next to each other.
- "git clone ../other-directory" was fooled if the current directory $PWD points at is a symbolic link.
- (build) tree_entry_extract() function was both static inline and extern, which caused trouble compiling with Forte12 compilers on Sun.
- Many many documentation fixes and updates.
1.5.1.6
GIT v1.5.1.6 Release Notes ==========================
Fixes since v1.5.1.4 --------------------
- Bugfixes
- git-send-email did not understand aliases file for mutt, which allows leading whitespaces.
- git-format-patch emitted Content-Type and Content-Transfer-Encoding headers for non ASCII contents, but failed to add MIME-Version.
- git-name-rev had a buffer overrun with a deep history.
- contributed script import-tars did not get the directory in tar archives interpreted correctly.
- git-svn was reported to segfault for many people on list and #git; hopefully this has been fixed.
- git-svn also had a bug to crash svnserve by sending a bad sequence of requests.
- "git-svn clone" does not try to minimize the URL (i.e. connect to higher level hierarchy) by default, as this can prevent clone to fail if only part of the repository (e.g. ’trunk’) is open to public.
- "git checkout branch^0" did not detach the head when you are already on ’branch’; backported the fix from the ’master’.
- "git-config section.var" did not correctly work when existing configuration file had both [section] and [section "name"] next to each other.
- "git clone ../other-directory" was fooled if the current directory $PWD points at is a symbolic link.
- (build) tree_entry_extract() function was both static inline and extern, which caused trouble compiling with Forte12 compilers on Sun.
- Many many documentation fixes and updates.
1.5.1
GIT v1.5.1 Release Notes ========================
Updates since v1.5.0 --------------------
- Deprecated commands and options.
- git-diff-stages and git-resolve have been removed.
- New commands and options.
- "git log" and friends take --reverse, which instructs them to give their output in the order opposite from their usual. They typically output from new to old, but with this option their output would read from old to new. "git shortlog" usually lists older commits first, but with this option, they are shown from new to old.
- "git log --pretty=format:<string>" to allow more flexible custom log output.
- "git diff" learned --ignore-space-at-eol. This is a weaker form of --ignore-space-change.
- "git diff --no-index pathA pathB" can be used as diff replacement with git specific enhancements.
- "git diff --no-index" can read from ’-’ (standard input).
- "git diff" also learned --exit-code to exit with non-zero status when it found differences. In the future we might want to make this the default but that would be a rather big backward incompatible change; it will stay as an option for now.
- "git diff --quiet" is --exit-code with output turned off, meant for scripted use to quickly determine if there is any tree-level difference.
- Textual patch generation with "git diff" without -w/-b option has been significantly optimized. "git blame" got faster because of the same change.
- "git log" and "git rev-list" has been optimized significantly when they are used with pathspecs.
- "git branch --track" can be used to set up configuration variables to help it easier to base your work on branches you track from a remote site.
- "git format-patch --attach" now emits attachments. Use --inline to get an inlined multipart/mixed.
- "git name-rev" learned --refs=<pattern>, to limit the tags used for naming the given revisions only to the ones matching the given pattern.
- "git remote update" is to run "git fetch" for defined remotes to update tracking branches.
- "git cvsimport" can now take ’-d’ to talk with a CVS repository different from what are recorded in CVS/Root (overriding it with environment CVSROOT does not work).
- "git bundle" can help sneaker-netting your changes between repositories.
- "git mergetool" can help 3-way file-level conflict resolution with your favorite graphical merge tools.
- A new configuration "core.symlinks" can be used to disable symlinks on filesystems that do not support them; they are checked out as regular files instead.
- You can name a commit object with its first line of the message. The syntax to use is ’:/message text’. E.g.
$ git show ":/object name: introduce ':/<oneline prefix>' notation"
means the same thing as:
$ git show 28a4d940443806412effa246ecc7768a21553ec7
- "git bisect" learned a new command "run" that takes a script to run after each revision is checked out to determine if it is good or bad, to automate the bisection process.
- "git log" family learned a new traversal option --first-parent, which does what the name suggests.
- Updated behavior of existing commands.
- "git-merge-recursive" used to barf when there are more than one common ancestors for the merge, and merging them had a rename/rename conflict. This has been fixed.
- "git fsck" does not barf on corrupt loose objects.
- "git rm" does not remove newly added files without -f.
- "git archimport" allows remapping when coming up with git branch names from arch names.
- git-svn got almost a rewrite.
- core.autocrlf configuration, when set to ’true’, makes git to convert CRLF at the end of lines in text files to LF when reading from the filesystem, and convert in reverse when writing to the filesystem. The variable can be set to ’input’, in which case the conversion happens only while reading from the filesystem but files are written out with LF at the end of lines. Currently, which paths to consider ’text’ (i.e. be subjected to the autocrlf mechanism) is decided purely based on the contents, but the plan is to allow users to explicitly override this heuristic based on paths.
- The behavior of ’git-apply’, when run in a subdirectory, without --index nor --cached were inconsistent with that of the command with these options. This was fixed to match the behavior with --index. A patch that is meant to be applied with -p1 from the toplevel of the project tree can be applied with any custom -p<n> option. A patch that is not relative to the toplevel needs to be applied with -p<n> option with or without --index (or --cached).
- "git diff" outputs a trailing HT when pathnames have embedded SP on +++/--- header lines, in order to help "GNU patch" to parse its output. "git apply" was already updated to accept this modified output format since ce74618d (Sep 22, 2006).
- "git cvsserver" runs hooks/update and honors its exit status.
- "git cvsserver" can be told to send everything with -kb.
- "git diff --check" also honors the --color output option.
- "git name-rev" used to stress the fact that a ref is a tag too much, by saying something like "v1.2.3^0
22". It now says "v1.2.322" in such a case (it still says "v1.2.3^0" if it does not talk about an ancestor of the commit that is tagged, which makes sense).
- "git rev-list --boundary" now shows boundary markers for the commits omitted by --max-age and --max-count condition.
- The configuration mechanism now reads $(prefix)/etc/gitconfig.
- "git apply --verbose" shows what preimage lines were wanted when it couldn’t find them.
- "git status" in a read-only repository got a bit saner.
- "git fetch" (hence "git clone" and "git pull") are less noisy when the output does not go to tty.
- "git fetch" between repositories with many refs were slow even when there are not many changes that needed transferring. This has been sped up by partially rewriting the heaviest parts in C.
- "git mailinfo" which splits an e-mail into a patch and the meta-information was rewritten, thanks to Don Zickus. It handles nested multipart better. The command was broken for a brief period on ’master’ branch since 1.5.0 but the breakage is fixed now.
- send-email learned configurable bcc and chain-reply-to.
- "git remote show $remote" also talks about branches that would be pushed if you run "git push remote".
- Using objects from packs is now seriously optimized by clever use of a cache. This should be most noticeable in git-log family of commands that involve reading many tree objects. In addition, traversing revisions while filtering changes with pathspecs is made faster by terminating the comparison between the trees as early as possible.
- Hooks
- The part to send out notification e-mails was removed from the sample update hook, as it was not an appropriate place to do so. The proper place to do this is the new post-receive hook. An example hook has been added to contrib/hooks/.
- Others
- git-revert, git-gc and git-cherry-pick are now built-ins.
Fixes since v1.5.0 ------------------
These are all in v1.5.0.x series.
- Documentation updates
- Clarifications and corrections to 1.5.0 release notes.
- The main documentation did not link to git-remote documentation.
- Clarified introductory text of git-rebase documentation.
- Converted remaining mentions of update-index on Porcelain documents to git-add/git-rm.
- Some i18n.* configuration variables were incorrectly described as core.*; fixed.
- added and clarified core.bare, core.legacyheaders configurations.
- updated "git-clone --depth" documentation.
- user-manual updates.
- Options to ’git remote add’ were described insufficiently.
- Configuration format.suffix was not documented.
- Other formatting and spelling fixes.
- user-manual has better cross references.
- gitweb installation/deployment procedure is now documented.
- Bugfixes
- git-upload-pack closes unused pipe ends; earlier this caused many zombies to hang around.
- git-rerere was recording the contents of earlier hunks duplicated in later hunks. This prevented resolving the same conflict when performing the same merge the other way around.
- git-add and git-update-index on a filesystem on which executable bits are unreliable incorrectly reused st_mode bits even when the path changed between symlink and regular file.
- git-daemon marks the listening sockets with FD_CLOEXEC so that it won’t be leaked into the children.
- segfault from git-blame when the mandatory pathname parameter was missing was fixed; usage() message is given instead.
- git-rev-list did not read $GIT_DIR/config file, which means that did not honor i18n.logoutputencoding correctly.
- Automated merge conflict handling when changes to symbolic links conflicted were completely broken. The merge-resolve strategy created a regular file with conflict markers in it in place of the symbolic link. The default strategy, merge-recursive was even more broken. It removed the path that was pointed at by the symbolic link. Both of these problems have been fixed.
- ’git diff maint master next’ did not correctly give combined diff across three trees.
- ’git fast-import’ portability fix for Solaris.
- ’git show-ref --verify’ without arguments did not error out but segfaulted.
- ’git diff :tracked-file
pwd/an-untracked-file’ gave an extra slashes after a/ and b/.
- ’git format-patch’ produced too long filenames if the commit message had too long line at the beginning.
- Running ’make all’ and then without changing anything running ’make install’ still rebuilt some files. This was inconvenient when building as yourself and then installing as root (especially problematic when the source directory is on NFS and root is mapped to nobody).
- ’git-rerere’ failed to deal with two unconflicted paths that sorted next to each other.
- ’git-rerere’ attempted to open(2) a symlink and failed if there was a conflict. Since a conflicting change to a symlink would not benefit from rerere anyway, the command now ignores conflicting changes to symlinks.
- ’git-repack’ did not like to pass more than 64 arguments internally to underlying ’rev-list’ logic, which made it impossible to repack after accumulating many (small) packs in the repository.
- ’git-diff’ to review the combined diff during a conflicted merge were not reading the working tree version correctly when changes to a symbolic link conflicted. It should have read the data using readlink(2) but read from the regular file the symbolic link pointed at.
- ’git-remote’ did not like period in a remote’s name.
- ’git.el’ honors the commit coding system from the configuration.
- ’blameview’ in contrib/ correctly digs deeper when a line is clicked.
- ’http-push’ correctly makes sure the remote side has leading path. Earlier it started in the middle of the path, and incorrectly.
- ’git-merge’ did not exit with non-zero status when the working tree was dirty and cannot fast forward. It does now.
- ’cvsexportcommit’ does not lose yet-to-be-used message file.
- int-vs-size_t typefix when running combined diff on files over 2GB long.
- ’git apply --whitespace=strip’ should not touch unmodified lines.
- ’git-mailinfo’ choke when a logical header line was too long.
- ’git show A..B’ did not error out. Negative ref ("not A" in this example) does not make sense for the purpose of the command, so now it errors out.
- ’git fmt-merge-msg --file’ without file parameter did not correctly error out.
- ’git archimport’ barfed upon encountering a commit without summary.
- ’git index-pack’ did not protect itself from getting a short read out of pread(2).
- ’git http-push’ had a few buffer overruns.
- Build dependency fixes to rebuild fetch.o when other headers change.
- git.el does not add duplicate sign-off lines.
- git-commit shows the full stat of the resulting commit, not just about the files in the current directory, when run from a subdirectory.
- "git-checkout -m ’@{8 hours ago}’" had a funny failure from eval; fixed.
- git-merge (hence git-pull) did not refuse fast-forwarding when the working tree had local changes that would have conflicted with it.
- a handful small fixes to gitweb.
- build procedure for user-manual is fixed not to require locally installed stylesheets.
- "git commit $paths" on paths whose earlier contents were already updated in the index were failing out.
- Tweaks
- sliding mmap() inefficiently mmaped the same region of a packfile with an access pattern that used objects in the reverse order. This has been made more efficient.
1.5.2.1
GIT v1.5.2.1 Release Notes ==========================
Fixes since v1.5.2 ------------------
- Bugfixes
- Temporary files that are used when invoking external diff programs did not tolerate a long TMPDIR.
- git-daemon did not notice when it could not write into its pid file.
- git-status did not honor core.excludesFile configuration like git-add did.
- git-annotate did not work from a subdirectory while git-blame did.
- git-cvsserver should have disabled access to a repository with "gitcvs.pserver.enabled = false" set even when "gitcvs.enabled = true" was set at the same time. It didn’t.
- git-cvsimport did not work correctly in a repository with its branch heads were packed with pack-refs.
- ident unexpansion to squash "$Id: xxx $" that is in the repository copy removed incorrect number of bytes.
- git-svn misbehaved when the subversion repository did not provide MD5 checksums for files.
- git rebase (and git am) misbehaved on commits that have ’n’ (literally backslash and en, not a linefeed) in the title.
- code to decode base85 used in binary patches had one error return codepath wrong.
- RFC2047 Q encoding output by git-format-patch used ’_’ for a space, which is not understood by some programs. It uses =20 which is safer.
- git-fastimport --import-marks was broken; fixed.
- A lot of documentation updates, clarifications and fixes.
1.5.2.2
GIT v1.5.2.2 Release Notes ==========================
Fixes since v1.5.2.1 --------------------
- Usability fix
- git-gui is shipped with its updated blame interface. It is rumored that the older one was not just unusable but was active health hazard, but this one is actually pretty. Please see for yourself.
- Bugfixes
- "git checkout fubar" was utterly confused when there is a branch fubar and a tag fubar at the same time. It correctly checks out the branch fubar now.
- "git clone /path/foo" to clone a local /path/foo.git repository left an incorrect configuration.
- "git send-email" correctly unquotes RFC 2047 quoted names in the patch-email before using their values.
- We did not accept number of seconds since epoch older than year 2000 as a valid timestamp. We now interpret positive integers more than 8 digits as such, which allows us to express timestamps more recent than March 1973.
- git-cvsimport did not work when you have GIT_DIR to point your repository at a nonstandard location.
- Some systems (notably, Solaris) lack hstrerror() to make h_errno human readable; prepare a replacement implementation.
-
gitignore file listed git-core.spec but what we generate is
git.spec, and nobody noticed for a long time.
- "git-merge-recursive" does not try to run file level merge on binary files.
- "git-branch --track" did not create tracking configuration correctly when the branch name had slash in it.
- The email address of the user specified with user.email configuration was overridden by EMAIL environment variable.
- The tree parser did not warn about tree entries with nonsense file modes, and assumed they must be blobs.
- "git log -z" without any other request to generate diff still invoked the diff machinery, wasting cycles.
- Documentation
- Many updates to fix stale or missing documentation.
- Although our documentation was primarily meant to be formatted with AsciiDoc7, formatting with AsciiDoc8 is supported better.
1.5.2.3
GIT v1.5.2.3 Release Notes ==========================
Fixes since v1.5.2.2 --------------------
- Bugfixes
- Version 2 pack index format was introduced in version 1.5.2 to support pack files that has offset that cannot be represented in 32-bit. The runtime code to validate such an index mishandled such an index for an empty pack.
- Commit walkers (most notably, fetch over http protocol) tried to traverse commit objects contained in trees (aka subproject); they shouldn’t.
- A build option NO_R_TO_GCC_LINKER was not explained in Makefile comment correctly.
- Documentation Fixes and Updates
- git-config --regexp was not documented properly.
- git-repack -a was not documented properly.
- git-remote -n was not documented properly.
1.5.2.4
GIT v1.5.2.4 Release Notes ==========================
Fixes since v1.5.2.3 --------------------
- Bugfixes
- "git-gui" bugfixes, including a handful fixes to run it better on Cygwin/MSYS.
- "git checkout" failed to switch back and forth between branches, one of which has "frotz → xyzzy" symlink and file "xyzzy/filfre", while the other one has a file "frotz/filfre".
- "git prune" used to segfault upon seeing a commit that is referred to by a tree object (aka "subproject").
- "git diff --name-status --no-index" mishandled an added file.
- "git apply --reverse --whitespace=warn" still complained about whitespaces that a forward application would have introduced.
- Documentation Fixes and Updates
- A handful documentation updates.
1.5.2.5
GIT v1.5.2.5 Release Notes ==========================
Fixes since v1.5.2.4 --------------------
- Bugfixes
- "git add -u" had a serious data corruption problem in one special case (when the changes to a subdirectory’s files consist only deletion of files).
- "git add -u <path>" did not work from a subdirectory.
- "git apply" left an empty directory after all its files are renamed away.
- "git $anycmd foo/bar", when there is a file ’foo’ in the working tree, complained that "git $anycmd foo/bar --" form should be used to disambiguate between revs and files, which was completely bogus.
- "git checkout-index" and other commands that checks out files to the work tree tried unlink(2) on directories, which is a sane thing to do on sane systems, but not on Solaris when you are root.
- Documentation Fixes and Updates
- A handful documentation fixes.
1.5.2
GIT v1.5.2 Release Notes ========================
Updates since v1.5.1 --------------------
- Plumbing level superproject support.
You can include a subdirectory that has an independent git
repository in your index and tree objects of your project
("superproject"). This plumbing (i.e. "core") level
superproject support explicitly excludes recursive behaviour.
The "subproject" entries in the index and trees of a superproject
are incompatible with older versions of git. Experimenting with
the plumbing level support is encouraged, but be warned that
unless everybody in your project updates to this release or
later, using this feature would make your project
inaccessible by people with older versions of git.
- Plumbing level gitattributes support.
The gitattributes mechanism allows you to add 'attributes' to
paths in your project, and affect the way certain git
operations work. Currently you can influence if a path is
considered a binary or text (the former would be treated by
'git diff' not to produce textual output; the latter can go
through the line endings conversion process in repositories
with core.autocrlf set), expand and unexpand '$Id$' keyword
with blob object name, specify a custom 3-way merge driver,
and specify a custom diff driver. You can also apply
arbitrary filter to contents on check-in/check-out codepath
but this feature is an extremely sharp-edged razor and needs
to be handled with caution (do not use it unless you
understand the earlier mailing list discussion on keyword
expansion). These conversions apply when checking files in
or out, and exporting via git-archive.
- The packfile format now optionally supports 64-bit index.
This release supports the "version 2" format of the .idx
file. This is automatically enabled when a huge packfile
needs more than 32-bit to express offsets of objects in the
pack.
- Comes with an updated git-gui 0.7.1
- Updated gitweb:
-
can show combined diff for merges;
-
uses font size of user’s preference, not hardcoded in pixels;
-
can now ’grep’;
- New commands and options.
- "git bisect start" can optionally take a single bad commit and zero or more good commits on the command line.
- "git shortlog" can optionally be told to wrap its output.
- "subtree" merge strategy allows another project to be merged in as your subdirectory.
- "git format-patch" learned a new --subject-prefix=<string> option, to override the built-in "[PATCH]".
- "git add -u" is a quick way to do the first stage of "git commit -a" (i.e. update the index to match the working tree); it obviously does not make a commit.
- "git clean" honors a new configuration, "clean.requireforce". When set to true, this makes "git clean" a no-op, preventing you from losing files by typing "git clean" when you meant to say "make clean". You can still say "git clean -f" to override this.
- "git log" family of commands learned --date={local,relative,default} option. --date=relative is synonym to the --relative-date. --date=local gives the timestamp in local timezone.
- Updated behavior of existing commands.
- When $GIT_COMMITTER_EMAIL or $GIT_AUTHOR_EMAIL is not set but $EMAIL is set, the latter is used as a substitute.
- "git diff --stat" shows size of preimage and postimage blobs for binary contents. Earlier it only said "Bin".
- "git lost-found" shows stuff that are unreachable except from reflogs.
- "git checkout branch^0" now detaches HEAD at the tip commit on the named branch, instead of just switching to the branch (use "git checkout branch" to switch to the branch, as before).
- "git bisect next" can be used after giving only a bad commit without giving a good one (this starts bisection half-way to the root commit). We used to refuse to operate without a good and a bad commit.
- "git push", when pushing into more than one repository, does not stop at the first error.
- "git archive" does not insist you to give --format parameter anymore; it defaults to "tar".
- "git cvsserver" can use backends other than sqlite.
- "gitview" (in contrib/ section) learned to better support "git-annotate".
- "git diff $commit1:$path2 $commit2:$path2" can now report mode changes between the two blobs.
- Local "git fetch" from a repository whose object store is one of the alternates (e.g. fetching from the origin in a repository created with "git clone -l -s") avoids downloading objects unnecessarily.
- "git blame" uses .mailmap to canonicalize the author name just like "git shortlog" does.
- "git pack-objects" pays attention to pack.depth configuration variable.
- "git cherry-pick" and "git revert" does not use .msg file in the working tree to prepare commit message; instead it uses $GIT_DIR/MERGE_MSG as other commands do.
- Builds
- git-p4import has never been installed; now there is an installation option to do so.
- gitk and git-gui can be configured out.
- Generated documentation pages automatically get version information from GIT_VERSION.
- Parallel build with "make -j" descending into subdirectory was fixed.
- Performance Tweaks
- Optimized "git-rev-list --bisect" (hence "git-bisect").
- Optimized "git-add $path" in a large directory, most of whose contents are ignored.
- Optimized "git-diff-tree" for reduced memory footprint.
- The recursive merge strategy updated a worktree file that was changed identically in two branches, when one of them renamed it. We do not do that when there is no rename, so match that behaviour. This avoids excessive rebuilds.
- The default pack depth has been increased to 50, as the recent addition of delta_base_cache makes deeper delta chains much less expensive to access. Depending on the project, it was reported that this reduces the resulting pack file by 10% or so.
Fixes since v1.5.1 ------------------
All of the fixes in v1.5.1 maintenance series are included in this release, unless otherwise noted.
- Bugfixes
- Switching branches with "git checkout" refused to work when a path changes from a file to a directory between the current branch and the new branch, in order not to lose possible local changes in the directory that is being turned into a file with the switch. We now allow such a branch switch after making sure that there is no locally modified file nor un-ignored file in the directory. This has not been backported to 1.5.1.x series, as it is rather an intrusive change.
- Merging branches that have a file in one and a directory in another at the same path used to get quite confused. We handle such a case a bit more carefully, even though that is still left as a conflict for the user to sort out. This will not be backported to 1.5.1.x series, as it is rather an intrusive change.
- git-fetch had trouble with a remote with insanely large number of refs.
- "git clean -d -X" now does not remove non-excluded directories.
- rebasing (without -m) a series that changes a symlink to a directory in the middle of a path confused git-apply greatly and refused to operate.
1.5.3.1
GIT v1.5.3.1 Release Notes ==========================
Fixes since v1.5.3 ------------------
This is solely to fix the generated RPM’s dependencies. We used to have git-p4 package but we do not anymore. As suggested on the mailing list, this release makes git-core "Obsolete" git-p4, so that yum update would not complain.
1.5.3.2
GIT v1.5.3.2 Release Notes ==========================
Fixes since v1.5.3.1 --------------------
- git-push sent thin packs by default, which was not good for the public distribution server (no point in saving transfer while pushing; no point in making the resulting pack less optimum).
- git-svn sometimes terminated with "Malformed network data" when talking over svn:
- git-send-email re-issued the same message-id about 10% of the time if you fired off 30 messages within a single second.
- git-stash was not terminating the log message of commits it internally creates with LF.
- git-apply failed to check the size of the patch hunk when its beginning part matched the remainder of the preimage exactly, even though the preimage recorded in the hunk was much larger (therefore the patch should not have applied), leading to a segfault.
- "git rm foo && git commit foo" complained that ’foo’ needs to be added first, instead of committing the removal, which was a nonsense.
- git grep -c said "/dev/null: 0".
- git-add -u failed to recognize a blob whose type changed between the index and the work tree.
- The limit to rename detection has been tightened a lot to reduce performance problems with a huge change.
- cvsimport and svnimport barfed when the input tried to move a tag.
- "git apply -pN" did not chop the right number of directories.
- "git svnimport" did not like SVN tags with funny characters in them.
- git-gui 0.8.3, with assorted fixes, including:
-
font-chooser on X11 was unusable with large number of fonts;
-
a diff that contained a deleted symlink made it barf;
-
an untracked symbolic link to a directory made it fart;
-
a file with % in its name made it vomit;
Documentation updates ---------------------
User manual has been somewhat restructured. I think the new organization is much easier to read.
1.5.3.3
GIT v1.5.3.3 Release Notes ==========================
Fixes since v1.5.3.2 --------------------
- git-quiltimport did not like it when a patch described in the series file does not exist.
- p4 importer missed executable bit in some cases.
- The default shell on some FreeBSD did not execute the argument parsing code correctly and made git unusable.
- git-svn incorrectly spawned pager even when the user explicitly asked not to.
- sample post-receive hook overquoted the envelope sender value.
- git-am got confused when the patch contained a change that is only about type and not contents.
- git-mergetool did not show our and their version of the conflicted file when started from a subdirectory of the project.
- git-mergetool did not pass correct options when invoking diff3.
- git-log sometimes invoked underlying "diff" machinery unnecessarily.
1.5.3.4
GIT v1.5.3.4 Release Notes ==========================
Fixes since v1.5.3.3 --------------------
- Change to "git-ls-files" in v1.5.3.3 that was introduced to support partial commit of removal better had a segfaulting bug, which was diagnosed and fixed by Keith and Carl.
- Performance improvements for rename detection has been backported from the ’master’ branch.
- "git-for-each-ref --format=’%(numparent)’" was not working correctly at all, and --format=’%(parent)’ was not working for merge commits.
- Sample "post-receive-hook" incorrectly sent out push notification e-mails marked as "From: " the committer of the commit that happened to be at the tip of the branch that was pushed, not from the person who pushed.
- "git-remote" did not exit non-zero status upon error.
- "git-add -i" did not respond very well to EOF from tty nor bogus input.
- "git-rebase -i" squash subcommand incorrectly made the author of later commit the author of resulting commit, instead of taking from the first one in the squashed series.
- "git-stash apply --index" was not documented.
- autoconfiguration learned that "ar" command is found as "gas" on some systems.
1.5.3.5
GIT v1.5.3.5 Release Notes ==========================
Fixes since v1.5.3.4 --------------------
- Comes with git-gui 0.8.4.
- "git-config" silently ignored options after --list; now it will error out with a usage message.
- "git-config --file" failed if the argument used a relative path as it changed directories before opening the file.
- "git-config --file" now displays a proper error message if it cannot read the file specified on the command line.
- "git-config", "git-diff", "git-apply" failed if run from a subdirectory with relative GIT_DIR and GIT_WORK_TREE set.
- "git-blame" crashed if run during a merge conflict.
- "git-add -i" did not handle single line hunks correctly.
- "git-rebase -i" and "git-stash apply" failed if external diff drivers were used for one or more files in a commit. They now avoid calling the external diff drivers.
- "git-log --follow" did not work unless diff generation (e.g. -p) was also requested.
- "git-log --follow -B" did not work at all. Fixed.
- "git-log -M -B" did not correctly handle cases of very large files being renamed and replaced by very small files in the same commit.
- "git-log" printed extra newlines between commits when a diff was generated internally (e.g. -S or --follow) but not displayed.
- "git-push" error message is more helpful when pushing to a repository with no matching refs and none specified.
- "git-push" now respects + (force push) on wildcard refspecs, matching the behavior of git-fetch.
- "git-filter-branch" now updates the working directory when it has finished filtering the current branch.
- "git-instaweb" no longer fails on Mac OS X.
- "git-cvsexportcommit" didn’t always create new parent directories before trying to create new child directories. Fixed.
- "git-fetch" printed a scary (but bogus) error message while fetching a tag that pointed to a tree or blob. The error did not impact correctness, only user perception. The bogus error is no longer printed.
- "git-ls-files --ignored" did not properly descend into non-ignored directories that themselves contained ignored files if d_type was not supported by the filesystem. This bug impacted systems such as AFS. Fixed.
- Git segfaulted when reading an invalid .gitattributes file. Fixed.
- post-receive-email example hook was fixed for non-fast-forward updates.
- Documentation updates for supported (but previously undocumented) options of "git-archive" and "git-reflog".
- "make clean" no longer deletes the configure script that ships with the git tarball, making multiple architecture builds easier.
- "git-remote show origin" spewed a warning message from Perl when no remote is defined for the current branch via branch.<name>.remote configuration settings.
- Building with NO_PERL_MAKEMAKER excessively rebuilt contents of perl/ subdirectory by rewriting perl.mak.
- http.sslVerify configuration settings were not used in scripted Porcelains.
- "git-add" leaked a bit of memory while scanning for files to add.
- A few workarounds to squelch false warnings from recent gcc have been added.
- "git-send-pack $remote frotz" segfaulted when there is nothing named ’frotz’ on the local end.
- "git-rebase --interactive" did not handle its "--strategy" option properly.
1.5.3.6
GIT v1.5.3.6 Release Notes ==========================
Fixes since v1.5.3.5 --------------------
- git-cvsexportcommit handles root commits better.
- git-svn dcommit used to clobber when sending a series of patches.
- git-svn dcommit failed after attempting to rebase when started with a dirty index; now it stops upfront.
- git-grep sometimes refused to work when your index was unmerged.
- "git-grep -A1 -B2" acted as if it was told to run "git -A1 -B21".
- git-hash-object did not honor configuration variables, such as core.compression.
- git-index-pack choked on a huge pack on 32-bit machines, even when large file offsets are supported.
- atom feeds from git-web said "10" for the month of November.
- a memory leak in commit walker was plugged.
- When git-send-email inserted the original author’s From: address in body, it did not mark the message with Content-type: as needed.
- git-revert and git-cherry-pick incorrectly refused to start when the work tree was dirty.
- git-clean did not honor core.excludesfile configuration.
- git-add mishandled ".gitignore" files when applying them to subdirectories.
- While importing a too branchy history, git-fastimport did not honor delta depth limit properly.
- Support for zlib implementations that lack ZLIB_VERNUM and definition of deflateBound() has been added.
- Quite a lot of documentation clarifications.
1.5.3.7
GIT v1.5.3.7 Release Notes ==========================
Fixes since v1.5.3.6 --------------------
- git-send-email added 8-bit contents to the payload without marking it as 8-bit in a CTE header.
- "git-bundle create a.bndl HEAD" dereferenced the symref and did not record the ref as ’HEAD’; this prevented a bundle from being used as a normal source of git-clone.
- The code to reject nonsense command line of the form "git-commit -a paths…" and "git-commit --interactive paths…" were broken.
- Adding a signature that is not ASCII-only to an original commit that is ASCII-only would make the result non-ASCII. "git-format-patch -s" did not mark such a message correctly with MIME encoding header.
- git-add sometimes did not mark the resulting index entry stat-clean. This affected only cases when adding the contents with the same length as the previously staged contents, and the previous staging made the index entry "racily clean".
- git-commit did not honor GIT_INDEX_FILE the user had in the environment.
- When checking out a revision, git-checkout did not report where the updated HEAD is if you happened to have a file called HEAD in the work tree.
- "git-rev-list --objects" mishandled a tree that points at a submodule.
- "git cvsimport" was not ready for packed refs that "git gc" can produce and gave incorrect results.
- Many scripted Porcelains were confused when you happened to have a file called "HEAD" in your work tree.
Also it contains updates to the user manual and documentation.
1.5.3.8
GIT v1.5.3.8 Release Notes ==========================
Fixes since v1.5.3.7 --------------------
- Some documentation used "email.com" as an example domain.
- git-svn fix to handle funky branch and project names going over http/https correctly.
- git-svn fix to tone down a needlessly alarming warning message.
- git-clone did not correctly report errors while fetching over http.
- git-send-email added redundant Message-Id: header to the outgoing e-mail when the patch text already had one.
- a read-beyond-end-of-buffer bug in configuration file updater was fixed.
- git-grep used to show the same hit repeatedly for unmerged paths.
- After amending the patch title in "git-am -i", the command did not report the patch it applied with the updated title.
1.5.3
GIT v1.5.3 Release Notes ========================
Updates since v1.5.2 --------------------
- The commit walkers other than http are officially deprecated, but still supported for now.
- The submodule support has Porcelain layer.
Note that the current submodule support is minimal and this is
deliberately so. A design decision we made is that operations
at the supermodule level do not recurse into submodules by
default. The expectation is that later we would add a
mechanism to tell git which submodules the user is interested
in, and this information might be used to determine the
recursive behaviour of certain commands (e.g. "git checkout"
and "git diff"), but currently we haven't agreed on what that
mechanism should look like. Therefore, if you use submodules,
you would probably need "git submodule update" on the
submodules you care about after running a "git checkout" at
the supermodule level.
- There are a handful pack-objects changes to help you cope better with repositories with pathologically large blobs in them.
- For people who need to import from Perforce, a front-end for fast-import is in contrib/fast-import/.
- Comes with git-gui 0.8.2.
- Comes with updated gitk.
- New commands and options.
- "git log --date=<format>" can use more formats: iso8601, rfc2822.
- The hunk header output from "git diff" family can be customized with the attributes mechanism. See gitattributes(5) for details.
- "git stash" allows you to quickly save away your work in progress and replay it later on an updated state.
- "git rebase" learned an "interactive" mode that let you pick and reorder which commits to rebuild.
- "git fsck" can save its findings in $GIT_DIR/lost-found, without a separate invocation of "git lost-found" command. The blobs stored by lost-found are stored in plain format to allow you to grep in them.
- $GIT_WORK_TREE environment variable can be used together with $GIT_DIR to work in a subdirectory of a working tree that is not located at "$GIT_DIR/..".
- Giving "--file=<file>" option to "git config" is the same as running the command with GIT_CONFIG=<file> environment.
- "git log" learned a new option "--follow", to follow renaming history of a single file.
- "git filter-branch" lets you rewrite the revision history of specified branches. You can specify a number of filters to modify the commits, files and trees.
- "git cvsserver" learned new options (--base-path, --export-all, --strict-paths) inspired by "git daemon".
- "git daemon --base-path-relaxed" can help migrating a repository URL that did not use to use --base-path to use --base-path.
- "git commit" can use "-t templatefile" option and commit.template configuration variable to prime the commit message given to you in the editor.
- "git submodule" command helps you manage the projects from the superproject that contain them.
- In addition to core.compression configuration option, core.loosecompression and pack.compression options can independently tweak zlib compression levels used for loose and packed objects.
- "git ls-tree -l" shows size of blobs pointed at by the tree entries, similar to "/bin/ls -l".
- "git rev-list" learned --regexp-ignore-case and --extended-regexp options to tweak its matching logic used for --grep filtering.
- "git describe --contains" is a handier way to call more obscure command "git name-rev --tags".
- "git gc --aggressive" tells the command to spend more cycles to optimize the repository harder.
- "git repack" learned a "window-memory" limit which dynamically reduces the window size to stay within the specified memory usage.
- "git repack" can be told to split resulting packs to avoid exceeding limit specified with "--max-pack-size".
- "git fsck" gained --verbose option. This is really really verbose but it might help you identify exact commit that is corrupt in your repository.
- "git format-patch" learned --numbered-files option. This may be useful for MH users.
- "git format-patch" learned format.subjectprefix configuration variable, which serves the same purpose as "--subject-prefix" option.
- "git tag -n -l" shows tag annotations while listing tags.
- "git cvsimport" can optionally use the separate-remote layout.
- "git blame" can be told to see through commits that change whitespaces and indentation levels with "-w" option.
- "git send-email" can be told not to thread the messages when sending out more than one patches.
- "git send-email" can also be told how to find whom to cc the message to for each message via --cc-cmd.
- "git config" learned NUL terminated output format via -z to help scripts.
- "git add" learned "--refresh <paths>…" option to selectively refresh the cached stat information.
- "git init -q" makes the command quieter.
- "git -p command" now has a cousin of opposite sex, "git --no-pager command".
- Updated behavior of existing commands.
- "gitweb" can offer multiple snapshot formats.
***NOTE*** Unfortunately, this changes the format of the
$feature{snapshot}{default} entry in the per-site
configuration file 'gitweb_config.perl'. It used to be a
three-element tuple that describe a single format; with the
new configuration item format, you only have to say the name
of the format ('tgz', 'tbz2' or 'zip'). Please update the
your configuration file accordingly.
- "git clone" uses -l (hardlink files under .git) by default when cloning locally.
- URL used for "git clone" and friends can specify nonstandard SSH port by using ssh://host:port/path/to/repo syntax.
- "git bundle create" can now create a bundle without negative refs, i.e. "everything since the beginning up to certain points".
- "git diff" (but not the plumbing level "git diff-tree") now recursively descends into trees by default.
- "git diff" does not show differences that come only from stat-dirtiness in the form of "diff --git" header anymore. It runs "update-index --refresh" silently as needed.
- "git tag -l" used to match tags by globbing its parameter as if it has wildcard ’*’ on both ends, which made "git tag -l gui" to match tag ’gitgui-0.7.0’; this was very annoying. You now have to add asterisk on the sides you want to wildcard yourself.
- The editor to use with many interactive commands can be overridden with GIT_EDITOR environment variable, or if it does not exist, with core.editor configuration variable. As before, if you have neither, environment variables VISUAL and EDITOR are consulted in this order, and then finally we fall back on "vi".
- "git rm --cached" does not complain when removing a newly added file from the index anymore.
- Options to "git log" to affect how --grep/--author options look for given strings now have shorter abbreviations. -i is for ignore case, and -E is for extended regexp.
- "git log" learned --log-size to show the number of bytes in the log message part of the output to help qgit.
- "git log --name-status" does not require you to give "-r" anymore. As a general rule, Porcelain commands should recurse when showing diff.
- "git format-patch --root A" can be used to format everything since the beginning up to A. This was supported with "git format-patch --root A A" for a long time, but was not properly documented.
- "git svn dcommit" retains local merge information.
- "git svnimport" allows an empty string to be specified as the trunk/ directory. This is necessary to suck data from a SVN repository that doe not have trunk/ branches/ and tags/ organization at all.
- "git config" to set values also honors type flags like --bool and --int.
- core.quotepath configuration can be used to make textual git output to emit most of the characters in the path literally.
- "git mergetool" chooses its backend more wisely, taking notice of its environment such as use of X, Gnome/KDE, etc.
- "gitweb" shows merge commits a lot nicer than before. The default view uses more compact --cc format, while the UI allows to choose normal diff with any parent.
- snapshot files "gitweb" creates from a repository at $path/$project/.git are more useful. We use $project part in the filename, which we used to discard.
- "git cvsimport" creates lightweight tags; there is no interesting information we can record in an annotated tag, and the handcrafted ones the old code created was not properly formed anyway.
- "git push" pretends that you immediately fetched back from the remote by updating corresponding remote tracking branches if you have any.
- The diffstat given after a merge (or a pull) honors the color.diff configuration.
- "git commit --amend" is now compatible with various message source options such as -m/-C/-c/-F.
- "git apply --whitespace=strip" removes blank lines added at the end of the file.
- "git fetch" over git native protocols with "-v" option shows connection status, and the IP address of the other end, to help diagnosing problems.
- We used to have core.legacyheaders configuration, when set to false, allowed git to write loose objects in a format that mimics the format used by objects stored in packs. It turns out that this was not so useful. Although we will continue to read objects written in that format, we do not honor that configuration anymore and create loose objects in the legacy/traditional format.
- "--find-copies-harder" option to diff family can now be spelled as "-C -C" for brevity.
- "git mailsplit" (hence "git am") can read from Maildir formatted mailboxes.
- "git cvsserver" does not barf upon seeing "cvs login" request.
- "pack-objects" honors "delta" attribute set in .gitattributes. It does not attempt to deltify blobs that come from paths with delta attribute set to false.
- "new-workdir" script (in contrib) can now be used with a bare repository.
- "git mergetool" learned to use gvimdiff.
- "gitview" (in contrib) has a better blame interface.
- "git log" and friends did not handle a commit log message that is larger than 16kB; they do now.
- "--pretty=oneline" output format for "git log" and friends deals with "malformed" commit log messages that have more than one lines in the first paragraph better. We used to show the first line, cutting the title at mid-sentence; we concatenate them into a single line and treat the result as "oneline".
- "git p4import" has been demoted to contrib status. For a superior option, checkout the "git p4" front end to "git fast-import" (also in contrib). The man page and p4 rpm have been removed as well.
- "git mailinfo" (hence "am") now tries to see if the message is in utf-8 first, instead of assuming iso-8859-1, if incoming e-mail does not say what encoding it is in.
- Builds
- old-style function definitions (most notably, a function without parameter defined with "func()", not "func(void)") have been eradicated.
- "git tag" and "git verify-tag" have been rewritten in C.
- Performance Tweaks
- "git pack-objects" avoids re-deltification cost by caching small enough delta results it creates while looking for the best delta candidates.
- "git pack-objects" learned a new heuristic to prefer delta that is shallower in depth over the smallest delta possible. This improves both overall packfile access performance and packfile density.
- diff-delta code that is used for packing has been improved to work better on big files.
- when there are more than one pack files in the repository, the runtime used to try finding an object always from the newest packfile; it now tries the same packfile as we found the object requested the last time, which exploits the locality of references.
- verifying pack contents done by "git fsck --full" got boost by carefully choosing the order to verify objects in them.
- "git read-tree -m" to read into an already populated index has been optimized vastly. The effect of this can be seen when switching branches that have differences in only a handful paths.
- "git add paths…" and "git commit paths…" has also been heavily optimized.
Fixes since v1.5.2 ------------------
All of the fixes in v1.5.2 maintenance series are included in this release, unless otherwise noted.
- Bugfixes
- "gitweb" had trouble handling non UTF-8 text with older Encode.pm Perl module.
- "git svn" misparsed the data from the commits in the repository when the user had "color.diff = true" in the configuration. This has been fixed.
- There was a case where "git svn dcommit" clobbered changes made on the SVN side while committing multiple changes.
- "git-write-tree" had a bad interaction with racy-git avoidance and gitattributes mechanisms.
- "git --bare command" overrode existing GIT_DIR setting and always made it treat the current working directory as GIT_DIR.
- "git ls-files --error-unmatch" does not complain if you give the same path pattern twice by mistake.
- "git init" autodetected core.filemode but not core.symlinks, which made a new directory created automatically by "git clone" cumbersome to use on filesystems that require these configurations to be set.
- "git log" family of commands behaved differently when run as "git log" (no pathspec) and as "git log --" (again, no pathspec). This inconsistency was introduced somewhere in v1.3.0 series but now has been corrected.
- "git rebase -m" incorrectly displayed commits that were skipped.
1.5.4.1
GIT v1.5.4.1 Release Notes ==========================
Fixes since v1.5.4 ------------------
- "git-commit -C $tag" used to work but rewrite in C done in 1.5.4 broke it.
- An entry in the .gitattributes file that names a pattern in a subdirectory of the directory it is in did not match correctly (e.g. pattern "b/*.c" in "a/.gitattributes" should match "a/b/foo.c" but it didn’t).
- Customized color specification was parsed incorrectly when numeric color values are used. This was fixed in 1.5.4.1.
1.5.4.2
GIT v1.5.4.2 Release Notes ==========================
Fixes since v1.5.4 ------------------
- The configuration parser was not prepared to see string valued variables misspelled as boolean and segfaulted.
- Temporary files left behind due to interrupted object transfers were not cleaned up with "git prune".
- "git config --unset" was confused when the unset variables were spelled with continuation lines in the config file.
- The merge message detection in "git cvsimport" did not catch a message that began with "Merge…".
- "git status" suggests "git rm --cached" for unstaging the earlier "git add" before the initial commit.
- "git status" output was incorrect during a partial commit.
- "git bisect" refused to start when the HEAD was detached.
- "git bisect" allowed a wildcard character in the commit message expanded while writing its log file.
- Manual pages were not formatted correctly with docbook xsl 1.72; added a workaround.
- "git-commit -C $tag" used to work but rewrite in C done in 1.5.4 broke it. This was fixed in 1.5.4.1.
- An entry in the .gitattributes file that names a pattern in a subdirectory of the directory it is in did not match correctly (e.g. pattern "b/*.c" in "a/.gitattributes" should match "a/b/foo.c" but it didn’t). This was fixed in 1.5.4.1.
- Customized color specification was parsed incorrectly when numeric color values are used. This was fixed in 1.5.4.1.
- http transport misbehaved when linked with curl-gnutls.
1.5.4.3
GIT v1.5.4.3 Release Notes ==========================
Fixes since v1.5.4.2 --------------------
- RPM spec used to pull in everything with ’git’. This has been changed so that ’git’ package contains just the core parts, and we now supply ’git-all’ metapackage to slurp in everything. This should match end user’s expectation better.
- When some refs failed to update, git-push reported "failure" which was unclear if some other refs were updated or all of them failed atomically (the answer is the former). Reworded the message to clarify this.
- "git clone" from a repository whose HEAD was misconfigured did not set up the remote properly. Now it tries to do better.
- Updated git-push documentation to clarify what "matching" means, in order to reduce user confusion.
- Updated git-add documentation to clarify "add -u" operates in the current subdirectory you are in, just like other commands.
- git-gui updates to work on OSX and Windows better.
1.5.4.4
GIT v1.5.4.4 Release Notes ==========================
Fixes since v1.5.4.3 --------------------
- Building and installing with an overtight umask such as 077 made installed templates unreadable by others, while the rest of the install are done in a way that is friendly to umask 022.
- "git cvsexportcommit -w $cvsdir" misbehaved when GIT_DIR is set to a relative directory.
- "git http-push" had an invalid memory access that could lead it to segfault.
- When "git rebase -i" gave control back to the user for a commit that is marked to be edited, it just said "modify it with commit --amend", without saying what to do to continue after modifying it. Give an explicit instruction to run "rebase --continue" to be more helpful.
- "git send-email" in 1.5.4.3 issued a bogus empty In-Reply-To: header.
- "git bisect" showed mysterious "won’t bisect on seeked tree" error message. This was leftover from Cogito days to prevent "bisect" starting from a cg-seeked state. We still keep the Cogito safety, but running "git bisect start" when another bisect was in effect will clean up and start over.
- "git push" with an explicit PATH to receive-pack did not quite work if receive-pack was not on usual PATH. We earlier fixed the same issue with "git fetch" and upload-pack, but somehow forgot to do so in the other direction.
- git-gui’s info dialog was not displayed correctly when the user tries to commit nothing (i.e. without staging anything).
- "git revert" did not properly fail when attempting to run with a dirty index.
- "git merge --no-commit --no-ff <other>" incorrectly made commits.
- "git merge --squash --no-ff <other>", which is a nonsense combination of options, was not rejected.
- "git ls-remote" and "git remote show" against an empty repository failed, instead of just giving an empty result (regression).
- "git fast-import" did not handle a renamed path whose name needs to be quoted, due to a bug in unquote_c_style() function.
- "git cvsexportcommit" was confused when multiple files with the same basename needed to be pushed out in the same commit.
- "git daemon" did not send early errors to syslog.
- "git log --merge" did not work well with --left-right option.
- "git svn" prompted for client cert password every time it accessed the server.
- The reset command in "git fast-import" data stream was documented to end with an optional LF, but it actually required one.
- "git svn dcommit/rebase" did not honor --rewrite-root option.
Also included are a handful documentation updates.
1.5.4.5
GIT v1.5.4.5 Release Notes ==========================
Fixes since v1.5.4.4 --------------------
- "git fetch there" when the URL information came from the Cogito style branches/there file did not update refs/heads/there (regression in 1.5.4).
- Bogus refspec configuration such as "remote.there.fetch = =" were not detected as errors (regression in 1.5.4).
- You couldn’t specify a custom editor whose path contains a whitespace via GIT_EDITOR (and core.editor).
- The subdirectory filter to "git filter-branch" mishandled a history where the subdirectory becomes empty and then later becomes non-empty.
- "git shortlog" gave an empty line if the original commit message was malformed (e.g. a botched import from foreign SCM). Now it finds the first non-empty line and uses it for better information.
- When the user fails to give a revision parameter to "git svn", an error from the Perl interpreter was issued because the script lacked proper error checking.
- After "git rebase" stopped due to conflicts, if the user played with "git reset" and friends, "git rebase --abort" failed to go back to the correct commit.
- Additional work trees prepared with git-new-workdir (in contrib/) did not share git-svn metadata directory .git/svn with the original.
- "git-merge-recursive" did not mark addition of the same path with different filemodes correctly as a conflict.
- "gitweb" gave malformed URL when pathinfo stype paths are in use.
- "-n" stands for "--no-tags" again for "git fetch".
- "git format-patch" did not detect the need to add 8-bit MIME header when the user used format.header configuration.
- "rev~" revision specifier used to mean "rev", which was inconsistent with how "rev^" worked. Now "rev~" is the same as "rev
1" (hence it also is the same as "rev^1"), and "rev0" is the same as "rev^0" (i.e. it has to be a commit).
- "git quiltimport" did not grok empty lines, lines in "file -pNNN" format to specify the prefix levels and lines with trailing comments.
- "git rebase -m" triggered pre-commit verification, which made "rebase --continue" impossible.
As usual, it also comes with many documentation fixes and clarifications.
1.5.4.6
GIT v1.5.4.6 Release Notes ==========================
I personally do not think there is any reason anybody should want to run v1.5.4.X series these days, because ’master’ version is always more stable than any tagged released version of git.
This is primarily to futureproof "git-shell" to accept requests without a dash between "git" and subcommand name (e.g. "git upload-pack") which the newer client will start to make sometime in the future.
Fixes since v1.5.4.5 --------------------
- Command line option "-n" to "git-repack" was not correctly parsed.
- Error messages from "git-apply" when the patchfile cannot be opened have been improved.
- Error messages from "git-bisect" when given nonsense revisions have been improved.
- reflog syntax that uses time e.g. "HEAD@{10 seconds ago}:path" did not stop parsing at the closing "}".
- "git rev-parse --symbolic-full-name master2" printed solitary "^", but it should print nothing.
- "git apply" did not enforce "match at the beginning" correctly.
- a path specification "a/b" in .gitattributes file should not match "sub/a/b", but it did.
- "git log --date-order --topo-order" did not override the earlier date-order with topo-order as expected.
- "git fast-export" did not export octopus merges correctly.
- "git archive --prefix=$path/" mishandled gitattributes.
As usual, it also comes with many documentation fixes and clarifications.
1.5.4.7
GIT v1.5.4.7 Release Notes ==========================
Fixes since 1.5.4.7 -------------------
- Removed support for an obsolete gitweb request URI, whose implementation ran "git diff" Porcelain, instead of using plumbing, which would have run an external diff command specified in the repository configuration as the gitweb user.
1.5.4
GIT v1.5.4 Release Notes ========================
Removal -------
- "git svnimport" was removed in favor of "git svn". It is still there in the source tree (contrib/examples) but unsupported.
- As git-commit and git-status have been rewritten, "git runstatus" helper script lost all its users and has been removed.
Temporarily disabled --------------------
- "git http-push" is known not to work well with cURL library older than 7.16, and we had reports of repository corruption. It is disabled on such platforms for now. Unfortunately, 1.5.3.8 shares the same issue. In other words, this does not mean you will be fine if you stick to an older git release. For now, please do not use http-push from older git with cURL older than 7.16 if you value your data. A proper fix will hopefully materialize in later versions.
Deprecation notices -------------------
- From v1.6.0, git will by default install dashed form of commands (e.g. "git-commit") outside of users’ normal $PATH, and will install only selected commands ("git" itself, and "gitk") in $PATH. This implies:
- Using dashed forms of git commands (e.g. "git-commit") from the command line has been informally deprecated since early 2006, but now it officially is, and will be removed in the future. Use dash-less forms (e.g. "git commit") instead.
- Using dashed forms from your scripts, without first prepending the return value from "git --exec-path" to the scripts’ PATH, has been informally deprecated since early 2006, but now it officially is.
- Use of dashed forms with "PATH=$(git --exec-path):$PATH; export PATH" early in your script is not deprecated with this change.
Users are strongly encouraged to adjust their habits and scripts now
to prepare for this change.
- The post-receive hook was introduced in March 2007 to supersede the post-update hook, primarily to overcome the command line length limitation of the latter. Use of post-update hook will be deprecated in future versions of git, starting from v1.6.0.
- "git lost-found" was deprecated in favor of "git fsck"’s --lost-found option, and will be removed in the future.
- "git peek-remote" is deprecated, as "git ls-remote" was written in C and works for all transports; "git peek-remote" will be removed in the future.
- "git repo-config" which was an old name for "git config" command has been supported without being advertised for a long time. The next feature release will remove it.
- From v1.6.0, the repack.usedeltabaseoffset config option will default to true, which will give denser packfiles (i.e. more efficient storage). The downside is that git older than version 1.4.4 will not be able to directly use a repository packed using this setting.
- From v1.6.0, the pack.indexversion config option will default to 2, which is slightly more efficient, and makes repacking more immune to data corruptions. Git older than version 1.5.2 may revert to version 1 of the pack index with a manual "git index-pack" to be able to directly access corresponding pack files.
Updates since v1.5.3 --------------------
- Comes with much improved gitk, with i18n.
- Comes with git-gui 0.9.2 with i18n.
- gitk is now merged as a subdirectory of git.git project, in preparation for its i18n.
- progress displays from many commands are a lot nicer to the eye. Transfer commands show throughput data.
- many commands that pay attention to per-directory .gitignore now do so lazily, which makes the usual case go much faster.
- Output processing for '--pretty=format:<user format>’ has been optimized.
- Rename detection of diff family while detecting exact matches has been greatly optimized.
- Rename detection of diff family tries to make more natural looking pairing. Earlier, if multiple identical rename sources were found in the preimage, the source used was picked pretty much at random.
- Value "true" for color.diff and color.status configuration used to mean "always" (even when the output is not going to a terminal). This has been corrected to mean the same thing as "auto".
- "git diff" Porcelain now respects diff.external configuration, which is another way to specify GIT_EXTERNAL_DIFF.
- "git diff" can be told to use different prefixes other than "a/" and "b/" e.g. "git diff --src-prefix=l/ --dst-prefix=k/".
- "git diff" sometimes did not quote paths with funny characters properly.
- "git log" (and any revision traversal commands) misbehaved when --diff-filter is given but was not asked to actually produce diff.
- HTTP proxy can be specified per remote repository using remote.*.httpproxy configuration, or global http.proxy configuration variable.
- Various Perforce importer updates.
- Example update and post-receive hooks have been improved.
- Any command that wants to take a commit object name can now use ":/string" syntax to name a commit.
- "git reset" is now built-in and its output can be squelched with -q.
- "git reset --hard" does not make any sense in a bare repository, but did not error out; fixed.
- "git send-email" can optionally talk over ssmtp and use SMTP-AUTH.
- "git rebase" learned --whitespace option.
- In "git rebase", when you decide not to replay a particular change after the command stopped with a conflict, you can say "git rebase --skip" without first running "git reset --hard", as the command now runs it for you.
- "git rebase --interactive" mode can now work on detached HEAD.
- Other minor to serious bugs in "git rebase -i" have been fixed.
- "git rebase" now detaches head during its operation, so after a successful "git rebase" operation, the reflog entry branch@{1} for the current branch points at the commit before the rebase was started.
- "git rebase -i" also triggers rerere to help your repeated merges.
- "git merge" can call the "post-merge" hook.
- "git pack-objects" can optionally run deltification with multiple threads.
- "git archive" can optionally substitute keywords in files marked with export-subst attribute.
- "git cherry-pick" made a misguided attempt to repeat the original command line in the generated log message, when told to cherry-pick a commit by naming a tag that points at it. It does not anymore.
- "git for-each-ref" learned %(xxxdate:<date-format>) syntax to show the various date fields in different formats.
- "git gc --auto" is a low-impact way to automatically run a variant of "git repack" that does not lose unreferenced objects (read: safer than the usual one) after the user accumulates too many loose objects.
- "git clean" has been rewritten in C.
- You need to explicitly set clean.requireForce to "false" to allow "git clean" without -f to do any damage (lack of the configuration variable used to mean "do not require -f option to lose untracked files", but we now use the safer default).
- The kinds of whitespace errors "git diff" and "git apply" notice (and fix) can be controlled via ’core.whitespace’ configuration variable and ’whitespace’ attribute in .gitattributes file.
- "git push" learned --dry-run option to show what would happen if a push is run.
- "git push" does not update a tracking ref on the local side when the remote refused to update the corresponding ref.
- "git push" learned --mirror option. This is to push the local refs one-to-one to the remote, and deletes refs from the remote that do not exist anymore in the repository on the pushing side.
- "git push" can remove a corrupt ref at the remote site with the usual ":ref" refspec.
- "git remote" knows --mirror mode. This is to set up configuration to push into a remote repository to store local branch heads to the same branch on the remote side, and remove branch heads locally removed from local repository at the same time. Suitable for pushing into a back-up repository.
- "git remote" learned "rm" subcommand.
- "git cvsserver" can be run via "git shell". Also, "cvs" is recognized as a synonym for "git cvsserver", so that CVS users can be switched to git just by changing their login shell.
- "git cvsserver" acts more like receive-pack by running post-receive and post-update hooks.
- "git am" and "git rebase" are far less verbose.
- "git pull" learned to pass --[no-]ff option to underlying "git merge".
- "git pull --rebase" is a different way to integrate what you fetched into your current branch.
- "git fast-export" produces data-stream that can be fed to fast-import to reproduce the history recorded in a git repository.
- "git add -i" takes pathspecs to limit the set of files to work on.
- "git add -p" is a short-hand to go directly to the selective patch subcommand in the interactive command loop and to exit when done.
- "git add -i" UI has been colorized. The interactive prompt and menu can be colored by setting color.interactive configuration. The diff output (including the hunk picker) are colored with color.diff configuration.
- "git commit --allow-empty" allows you to create a single-parent commit that records the same tree as its parent, overriding the usual safety valve.
- "git commit --amend" can amend a merge that does not change the tree from its first parent.
- "git commit" used to unconditionally strip comment lines that began with ’#’ and removed excess blank lines. This behavior has been made configurable.
- "git commit" has been rewritten in C.
- "git stash random-text" does not create a new stash anymore. It was a UI mistake. Use "git stash save random-text", or "git stash" (without extra args) for that.
- "git stash clear extra-text" does not clear the whole stash anymore. It is tempting to expect "git stash clear stash@{2}" to drop only a single named stash entry, and it is rude to discard everything when that is asked (but not provided).
- "git prune --expire <time>" can exempt young loose objects from getting pruned.
- "git branch --contains <commit>" can list branches that are descendants of a given commit.
- "git log" learned --early-output option to help interactive GUI implementations.
- "git bisect" learned "skip" action to mark untestable commits.
- "git bisect visualize" learned a shorter synonym "git bisect view".
- "git bisect visualize" runs "git log" in a non-windowed environments. It also can be told what command to run (e.g. "git bisect visualize tig").
- "git format-patch" learned "format.numbered" configuration variable to automatically turn --numbered option on when more than one commits are formatted.
- "git ls-files" learned "--exclude-standard" to use the canned set of exclude files.
- "git tag -a -f existing" begins the editor session using the existing annotation message.
- "git tag -m one -m bar" (multiple -m options) behaves similarly to "git commit"; the parameters to -m options are formatted as separate paragraphs.
- The format "git show" outputs an annotated tag has been updated to include "Tagger: " and "Date: " lines from the tag itself. Strictly speaking this is a backward incompatible change, but this is a reasonable usability fix and people’s scripts shouldn’t have been relying on the exact output from "git show" Porcelain anyway.
- "git cvsimport" did not notice errors from underlying "cvsps" and produced a corrupt import silently.
- "git cvsexportcommit" learned -w option to specify and switch to the CVS working directory.
- "git checkout" from a subdirectory learned to use "../path" to allow checking out a path outside the current directory without cd’ing up.
- "git checkout" from and to detached HEAD leaves a bit more information in the reflog.
- "git send-email --dry-run" shows full headers for easier diagnosis.
- "git merge-ours" is now built-in.
- "git svn" learned "info" and "show-externals" subcommands.
- "git svn" run from a subdirectory failed to read settings from the .git/config.
- "git svn" learned --use-log-author option, which picks up more descriptive name from From: and Signed-off-by: lines in the commit message.
- "git svn" wasted way too much disk to record revision mappings between svn and git; a new representation that is much more compact for this information has been introduced to correct this.
- "git svn" left temporary index files it used without cleaning them up; this was corrected.
- "git status" from a subdirectory now shows relative paths, which makes copy-and-pasting for git-checkout/git-add/git-rm easier. The traditional behavior to show the full path relative to the top of the work tree can be had by setting status.relativepaths configuration variable to false.
- "git blame" kept text for each annotated revision in core needlessly; this has been corrected.
- "git shortlog" learned to default to HEAD when the standard input is a terminal and the user did not give any revision parameter.
- "git shortlog" learned "-e" option to show e-mail addresses as well as authors’ names.
- "git help" learned "-w" option to show documentation in browsers.
- In addition there are quite a few internal clean-ups. Notably:
- many fork/exec have been replaced with run-command API, brought from the msysgit effort.
- introduction and more use of the option parser API.
- enhancement and more use of the strbuf API.
- Makefile tweaks to support HP-UX is in.
Fixes since v1.5.3 ------------------
All of the fixes in v1.5.3 maintenance series are included in this release, unless otherwise noted.
These fixes are only in v1.5.4 and not backported to v1.5.3 maintenance series.
- The way "git diff --check" behaves is much more consistent with the way "git apply --whitespace=warn" works.
- "git svn" talking with the SVN over HTTP will correctly quote branch and project names.
- "git config" did not work correctly on platforms that define REG_NOMATCH to an even number.
- Recent versions of AsciiDoc 8 has a change to break our documentation; a workaround has been implemented.
- "git diff --color-words" colored context lines in a wrong color.
1.5.5.1
GIT v1.5.5.1 Release Notes ==========================
Fixes since v1.5.5 ------------------
- "git archive --prefix=$path/" mishandled gitattributes.
- "git fetch -v" that fetches into FETCH_HEAD did not report the summary the same way as done for updating the tracking refs.
- "git svn" misbehaved when the configuration file customized the "git log" output format using format.pretty.
- "git submodule status" leaked an unnecessary error message.
- "git log --date-order --topo-order" did not override the earlier date-order with topo-order as expected.
- "git bisect good $this" did not check the validity of the revision given properly.
- "url.<there>.insteadOf" did not work correctly.
- "git clean" ran inside subdirectory behaved as if the directory was explicitly specified for removal by the end user from the top level.
- "git bisect" from a detached head leaked an unnecessary error message.
- "git bisect good $a $b" when $a is Ok but $b is bogus should have atomically failed before marking $a as good.
- "git fmt-merge-msg" did not clean up leading empty lines from commit log messages like "git log" family does.
- "git am" recorded a commit with empty Subject: line without complaining.
- when given a commit log message whose first paragraph consists of multiple lines, "git rebase" squashed it into a single line.
- "git remote add $bogus_name $url" did not complain properly.
Also comes with various documentation updates.
1.5.5.2
GIT v1.5.5.2 Release Notes ==========================
Fixes since v1.5.5.1 --------------------
- "git repack -n" was mistakenly made no-op earlier.
- "git imap-send" wanted to always have imap.host even when use of imap.tunnel made it unnecessary.
- reflog syntax that uses time e.g. "HEAD@{10 seconds ago}:path" did not stop parsing at the closing "}".
- "git rev-parse --symbolic-full-name master2" printed solitary "^", but it should print nothing.
- "git commit" did not detect when it failed to write tree objects.
- "git fetch" sometimes transferred too many objects unnecessarily.
- a path specification "a/b" in .gitattributes file should not match "sub/a/b".
- various gitweb fixes.
Also comes with various documentation updates.
1.5.5.3
GIT v1.5.5.3 Release Notes ==========================
Fixes since v1.5.5.2 --------------------
- "git send-email --compose" did not notice that non-ascii contents needed some MIME magic.
- "git fast-export" did not export octopus merges correctly.
Also comes with various documentation updates.
1.5.5.4
GIT v1.5.5.4 Release Notes ==========================
Fixes since v1.5.5.4 --------------------
- "git name-rev --all" used to segfault.
1.5.5.5
GIT v1.5.5.5 Release Notes ==========================
I personally do not think there is any reason anybody should want to run v1.5.5.X series these days, because ’master’ version is always more stable than any tagged released version of git.
This is primarily to futureproof "git-shell" to accept requests without a dash between "git" and subcommand name (e.g. "git upload-pack") which the newer client will start to make sometime in the future.
1.5.5.6
GIT v1.5.5.6 Release Notes ==========================
Fixes since 1.5.5.5 -------------------
- Removed support for an obsolete gitweb request URI, whose implementation ran "git diff" Porcelain, instead of using plumbing, which would have run an external diff command specified in the repository configuration as the gitweb user.
1.5.5
GIT v1.5.5 Release Notes ========================
Updates since v1.5.4 --------------------
(subsystems)
- Comes with git-gui 0.10.1
(portability)
- We shouldn’t ask for BSD group ownership semantics by setting g+s bit on directories on older BSD systems that refuses chmod() by non root users. BSD semantics is the default there anyway.
- Bunch of portability improvement patches coming from an effort to port to Solaris has been applied.
(performance)
- On platforms with suboptimal qsort(3) implementation, there is an option to use more reasonable substitute we ship with our software.
- New configuration variable "pack.packsizelimit" can be used in place of command line option --max-pack-size.
- "git fetch" over the native git protocol used to make a connection to find out the set of current remote refs and another to actually download the pack data. We now use only one connection for these tasks.
- "git commit" does not run lstat(2) more than necessary anymore.
(usability, bells and whistles)
- Bash completion script (in contrib) are aware of more commands and options.
- You can be warned when core.autocrlf conversion is applied in such a way that results in an irreversible conversion.
- A catch-all "color.ui" configuration variable can be used to enable coloring of all color-capable commands, instead of individual ones such as "color.status" and "color.branch".
- The commands refused to take absolute pathnames where they require pathnames relative to the work tree or the current subdirectory. They now can take absolute pathnames in such a case as long as the pathnames do not refer outside of the work tree. E.g. "git add $(pwd)/foo" now works.
- Error messages used to be sent to stderr, only to get hidden, when $PAGER was in use. They now are sent to stdout along with the command output to be shown in the $PAGER.
- A pattern "foo/" in .gitignore file now matches a directory "foo". Pattern "foo" also matches as before.
- bash completion’s prompt helper function can talk about operation in-progress (e.g. merge, rebase, etc.).
- Configuration variables "url.<usethis>.insteadof = <otherurl>" can be used to tell "git-fetch" and "git-push" to use different URL than what is given from the command line.
- "git add -i" behaves better even before you make an initial commit.
- "git am" refused to run from a subdirectory without a good reason.
- After "git apply --whitespace=fix" fixes whitespace errors in a patch, a line before the fix can appear as a context or preimage line in a later patch, causing the patch not to apply. The command now knows to see through whitespace fixes done to context lines to successfully apply such a patch series.
- "git branch" (and "git checkout -b") to branch from a local branch can optionally set "branch.<name>.merge" to mark the new branch to build on the other local branch, when "branch.autosetupmerge" is set to "always", or when passing the command line option "--track" (this option was ignored when branching from local branches). By default, this does not happen when branching from a local branch.
- "git checkout" to switch to a branch that has "branch.<name>.merge" set (i.e. marked to build on another branch) reports how much the branch and the other branch diverged.
- When "git checkout" has to update a lot of paths, it used to be silent for 4 seconds before it showed any progress report. It is now a bit more impatient and starts showing progress report early.
- "git commit" learned a new hook "prepare-commit-msg" that can inspect what is going to be committed and prepare the commit log message template to be edited.
- "git cvsimport" can now take more than one -M options.
- "git describe" learned to limit the tags to be used for naming with --match option.
- "git describe --contains" now barfs when the named commit cannot be described.
- "git describe --exact-match" describes only commits that are tagged.
- "git describe --long" describes a tagged commit as $tag-0-$sha1, instead of just showing the exact tagname.
- "git describe" warns when using a tag whose name and path contradict with each other.
- "git diff" learned "--relative" option to limit and output paths relative to the current directory when working in a subdirectory.
- "git diff" learned "--dirstat" option to show birds-eye-summary of changes more concisely than "--diffstat".
- "git format-patch" learned --cover-letter option to generate a cover letter template.
- "git gc" learned --quiet option.
- "git gc" now automatically prunes unreachable objects that are two weeks old or older.
- "git gc --auto" can be disabled more easily by just setting gc.auto to zero. It also tolerates more packfiles by default.
- "git grep" now knows "--name-only" is a synonym for the "-l" option.
- "git help <alias>" now reports "’git <alias>’ is alias to <what>", instead of saying "No manual entry for git-<alias>".
- "git help" can use different backends to show manual pages and this can be configured using "man.viewer" configuration.
- "gitk" does not restore window position from $HOME/.gitk anymore (it still restores the size).
- "git log --grep=<what>" learned "--fixed-strings" option to look for <what> without treating it as a regular expression.
- "git gui" learned an auto-spell checking.
- "git push <somewhere> HEAD" and "git push <somewhere> +HEAD" works as expected; they push the current branch (and only the current branch). In addition, HEAD can be written as the value of "remote.<there>.push" configuration variable.
- When the configuration variable "pack.threads" is set to 0, "git repack" auto detects the number of CPUs and uses that many threads.
- "git send-email" learned to prompt for passwords interactively.
- "git send-email" learned an easier way to suppress CC recipients.
- "git stash" learned "pop" command, that applies the latest stash and removes it from the stash, and "drop" command to discard the named stash entry.
- "git submodule" learned a new subcommand "summary" to show the symmetric difference between the HEAD version and the work tree version of the submodule commits.
- Various "git cvsimport", "git cvsexportcommit", "git cvsserver", "git svn" and "git p4" improvements.
(internal)
- Duplicated code between git-help and git-instaweb that launches user’s preferred browser has been refactored.
- It is now easier to write test scripts that records known breakages.
- "git checkout" is rewritten in C.
- "git remote" is rewritten in C.
- Two conflict hunks that are separated by a very short span of common lines are now coalesced into one larger hunk, to make the result easier to read.
- Run-command API’s use of file descriptors is documented clearer and is more consistent now.
- diff output can be sent to FILE * that is different from stdout. This will help reimplementing more things in C.
Fixes since v1.5.4 ------------------
All of the fixes in v1.5.4 maintenance series are included in this release, unless otherwise noted.
- "git-http-push" did not allow deletion of remote ref with the usual "push <remote> :<branch>" syntax.
- "git-rebase --abort" did not go back to the right location if "git-reset" was run during the "git-rebase" session.
- "git imap-send" without setting imap.host did not error out but segfaulted.
1.5.6.1
GIT v1.5.6.1 Release Notes ==========================
Fixes since v1.5.6 ------------------
- Last minute change broke loose object creation on AIX.
- (performance fix) We used to make $GIT_DIR absolute path early in the programs but keeping it relative to the current directory internally gives 1-3 per-cent performance boost.
- bash completion knows the new --graph option to git-log family.
- git-diff -c/--cc showed unnecessary "deletion" lines at the context boundary.
- git-for-each-ref ignored %(object) and %(type) requests for tag objects.
- git-merge usage had a typo.
- Rebuilding of git-svn metainfo database did not take rewriteRoot option into account.
- Running "git-rebase --continue/--skip/--abort" before starting a rebase gave nonsense error messages.
1.5.6.2
GIT v1.5.6.2 Release Notes ==========================
Futureproof -----------
- "git-shell" accepts requests without a dash between "git" and subcommand name (e.g. "git upload-pack") which the newer client will start to make sometime in the future.
Fixes since v1.5.6.1 --------------------
- "git clone" from a remote that is named with url.insteadOf setting in $HOME/.gitconfig did not work well.
- "git describe --long --tags" segfaulted when the described revision was tagged with a lightweight tag.
- "git diff --check" did not report the result via its exit status reliably.
- When remote side used to have branch ’foo’ and git-fetch finds that now it has branch ’foo/bar’, it refuses to lose the existing remote tracking branch and its reflog. The error message has been improved to suggest pruning the remote if the user wants to proceed and get the latest set of branches from the remote, including such ’foo/bar’.
- "git reset file" should mean the same thing as "git reset HEAD file", but we required disambiguating — even when "file" is not ambiguous.
- "git show" segfaulted when an annotated tag that points at another annotated tag was given to it.
- Optimization for a large import via "git-svn" introduced in v1.5.6 had a serious memory and temporary file leak, which made it unusable for moderately large import.
- "git-svn" mangled remote nickname used in the configuration file unnecessarily.
1.5.6.3
GIT v1.5.6.3 Release Notes ==========================
Fixes since v1.5.6.2 --------------------
- Setting GIT_TRACE will report spawning of external process via run_command().
- Using an object with very deep delta chain pinned memory needed for extracting intermediate base objects unnecessarily long, leading to excess memory usage.
- Bash completion script did not notice '--’ marker on the command line and tried the relatively slow "ref completion" even when completing arguments after one.
- Registering a non-empty blob racily and then truncating the working tree file for it confused "racy-git avoidance" logic into thinking that the path is now unchanged.
- The section that describes attributes related to git-archive were placed in a wrong place in the gitattributes(5) manual page.
- "git am" was not helpful to the users when it detected that the committer information is not set up properly yet.
- "git clone" had a leftover debugging fprintf().
- "git clone -q" was not quiet enough as it used to and gave object count and progress reports.
- "git clone" marked downloaded packfile with .keep; this could be a good thing if the remote side is well packed but otherwise not, especially for a project that is not really big.
- "git daemon" used to call syslog() from a signal handler, which could raise signals of its own but generally is not reentrant. This was fixed by restructuring the code to report syslog() after the handler returns.
- When "git push" tries to remove a remote ref, and corresponding tracking ref is missing, we used to report error (i.e. failure to remove something that does not exist).
- "git mailinfo" (hence "git am") did not handle commit log messages in a MIME multipart mail correctly.
Contains other various documentation fixes.
1.5.6.4
GIT v1.5.6.4 Release Notes ==========================
Fixes since v1.5.6.3 --------------------
- Various commands could overflow its internal buffer on a platform with small PATH_MAX value in a repository that has contents with long pathnames.
- There wasn’t a way to make --pretty=format:%<> specifiers to honor .mailmap name rewriting for authors and committers. Now you can with %aN and %cN.
- Bash completion wasted too many cycles; this has been optimized to be usable again.
- Bash completion lost ref part when completing something like "git show pu:Makefile".
- "git-cvsserver" did not clean up its temporary working area after annotate request.
- "git-daemon" called syslog() from its signal handler, which was a no-no.
- "git-fetch" into an empty repository used to remind that the fetch will be huge by saying "no common commits", but this was an unnecessary noise; it is already known by the user anyway.
- "git-http-fetch" would have segfaulted when pack idx file retrieved from the other side was corrupt.
- "git-index-pack" used too much memory when dealing with a deep delta chain.
- "git-mailinfo" (hence "git-am") did not correctly handle in-body [PATCH] line to override the commit title taken from the mail Subject header.
- "git-rebase -i -p" lost parents that are not involved in the history being rewritten.
- "git-rm" lost track of where the index file was when GIT_DIR was specified as a relative path.
- "git-rev-list --quiet" was not quiet as advertised.
Contains other various documentation fixes.
1.5.6.5
GIT v1.5.6.5 Release Notes ==========================
Fixes since v1.5.6.4 --------------------
- "git cvsimport" used to spit out "UNKNOWN LINE…" diagnostics to stdout.
- "git commit -F filename" and "git tag -F filename" run from subdirectories did not read the right file.
- "git init --template=" with blank "template" parameter linked files under root directories to .git, which was a total nonsense. Instead, it means "I do not want to use anything from the template directory".
- "git diff-tree" and other diff plumbing ignored diff.renamelimit configuration variable when the user explicitly asked for rename detection.
- "git name-rev --name-only" did not work when "--stdin" option was in effect.
- "git show-branch" mishandled its 8th branch.
- Addition of "git update-index --ignore-submodules" that happened during 1.5.6 cycle broke "git update-index --ignore-missing".
- "git send-email" did not parse charset from an existing Content-type: header properly.
Contains other various documentation fixes.
1.5.6.6
GIT v1.5.6.6 Release Notes ==========================
Fixes since 1.5.6.5 -------------------
- Removed support for an obsolete gitweb request URI, whose implementation ran "git diff" Porcelain, instead of using plumbing, which would have run an external diff command specified in the repository configuration as the gitweb user.
1.5.6
GIT v1.5.6 Release Notes ========================
Updates since v1.5.5 --------------------
(subsystems)
- Comes with updated gitk and git-gui.
(portability)
- git will build on AIX better than before now.
- core.ignorecase configuration variable can be used to work better on filesystems that are not case sensitive.
- "git init" now autodetects the case sensitivity of the filesystem and sets core.ignorecase accordingly.
- cpio is no longer used; neither "curl" binary (libcurl is still used).
(documentation)
- Many freestanding documentation pages have been converted and made available to "git help" (aka "man git<something>") as section 7 of the manual pages. This means bookmarks to some HTML documentation files may need to be updated (eg "tutorial.html" became "gittutorial.html").
(performance)
- "git clone" was rewritten in C. This will hopefully help cloning a repository with insane number of refs.
- "git rebase --onto $there $from $branch" used to switch to the tip of $branch only to immediately reset back to $from, smudging work tree files unnecessarily. This has been optimized.
- Object creation codepath in "git-svn" has been optimized by enhancing plumbing commands git-cat-file and git-hash-object.
(usability, bells and whistles)
- "git add -p" (and the "patch" subcommand of "git add -i") can choose to apply (or not apply) mode changes independently from contents changes.
- "git bisect help" gives longer and more helpful usage information.
- "git bisect" does not use a special branch "bisect" anymore; instead, it does its work on a detached HEAD.
- "git branch" (and "git checkout -b") can be told to set up branch.<name>.rebase automatically, so that later you can say "git pull" and magically cause "git pull --rebase" to happen.
- "git branch --merged" and "git branch --no-merged" can be used to list branches that have already been merged (or not yet merged) to the current branch.
- "git cherry-pick" and "git revert" can add a sign-off.
- "git commit" mentions the author identity when you are committing somebody else’s changes.
- "git diff/log --dirstat" output is consistent between binary and textual changes.
- "git filter-branch" rewrites signed tags by demoting them to annotated.
- "git format-patch --no-binary" can produce a patch that lack binary changes (i.e. cannot be used to propagate the whole changes) meant only for reviewing.
- "git init --bare" is a synonym for "git --bare init" now.
- "git gc --auto" honors a new pre-auto-gc hook to temporarily disable it.
- "git log --pretty=tformat:<custom format>" gives a LF after each entry, instead of giving a LF between each pair of entries which is how "git log --pretty=format:<custom format>" works.
- "git log" and friends learned the "--graph" option to show the ancestry graph at the left margin of the output.
- "git log" and friends can be told to use date format that is different from the default via ’log.date’ configuration variable.
- "git send-email" now can send out messages outside a git repository.
- "git send-email --compose" was made aware of rfc2047 quoting.
- "git status" can optionally include output from "git submodule summary".
- "git svn" learned --add-author-from option to propagate the authorship by munging the commit log message.
- new object creation and looking up in "git svn" has been optimized.
- "gitweb" can read from a system-wide configuration file.
(internal)
- "git unpack-objects" and "git receive-pack" is now more strict about detecting breakage in the objects they receive over the wire.
Fixes since v1.5.5 ------------------
All of the fixes in v1.5.5 maintenance series are included in this release, unless otherwise noted.
And there are too numerous small fixes to otherwise note here ;-)
1.6.0.1
GIT v1.6.0.1 Release Notes ==========================
Fixes since v1.6.0 ------------------
- "git diff --cc" did not honor content mangling specified by gitattributes and core.autocrlf when reading from the work tree.
- "git diff --check" incorrectly detected new trailing blank lines when whitespace check was in effect.
- "git for-each-ref" tried to dereference NULL when asked for ’%(body)" on a tag with a single incomplete line as its payload.
- "git format-patch" peeked before the beginning of a string when "format.headers" variable is empty (a misconfiguration).
- "git help help" did not work correctly.
- "git mailinfo" (hence "git am") was unhappy when MIME multipart message contained garbage after the finishing boundary.
- "git mailinfo" also was unhappy when the "From: " line only had a bare e-mail address.
- "git merge" did not refresh the index correctly when a merge resulted in a fast-forward.
- "git merge" did not resolve a truly trivial merges that can be done without content level merges.
- "git svn dcommit" to a repository with URL that has embedded usernames did not work correctly.
Contains other various documentation fixes.
1.6.0.2
GIT v1.6.0.2 Release Notes ==========================
Fixes since v1.6.0.1 --------------------
- Installation on platforms that needs .exe suffix to git-* programs were broken in 1.6.0.1.
- Installation on filesystems without symbolic links support did not work well.
- In-tree documentations and test scripts now use "git foo" form to set a better example, instead of the "git-foo" form (which is an acceptable form if you have "PATH=$(git --exec-path):$PATH" in your script)
- Many commands did not use the correct working tree location when used with GIT_WORK_TREE environment settings.
- Some systems need to use compatibility fnmatch and regex libraries independent from each other; the compat/ area has been reorganized to allow this.
- "git apply --unidiff-zero" incorrectly applied a -U0 patch that inserts a new line before the second line.
- "git blame -c" did not exactly work like "git annotate" when range boundaries are involved.
- "git checkout file" when file is still unmerged checked out contents from a random high order stage, which was confusing.
- "git clone $there $here/" with extra trailing slashes after explicit local directory name $here did not work as expected.
- "git diff" on tracked contents with CRLF line endings did not drive "less" intelligently when showing added or removed lines.
- "git diff --dirstat -M" did not add changes in subdirectories up correctly for renamed paths.
- "git diff --cumulative" did not imply "--dirstat".
- "git for-each-ref refs/heads/" did not work as expected.
- "git gui" allowed users to feed patch without any context to be applied.
- "git gui" botched parsing "diff" output when a line that begins with two dashes and a space gets removed or a line that begins with two pluses and a space gets added.
- "git gui" translation updates and i18n fixes.
- "git index-pack" is more careful against disk corruption while completing a thin pack.
- "git log -i --grep=pattern" did not ignore case; neither "git log -E --grep=pattern" triggered extended regexp.
- "git log --pretty="%ad" --date=short" did not use short format when showing the timestamp.
- Build procedure for "git shell" that used stub versions of some functions and globals was not understood by linkers on some platforms.
- "git stash" was fooled by a stat-dirty but otherwise unmodified paths and refused to work until the user refreshed the index.
- "git svn" was broken on Perl before 5.8 with recent fixes to reduce use of temporary files.
- "git verify-pack -v" did not work correctly when given more than one packfile.
Also contains many documentation updates.
1.6.0.3
GIT v1.6.0.3 Release Notes ==========================
Fixes since v1.6.0.2 --------------------
- "git archive --format=zip" did not honor core.autocrlf while --format=tar did.
- Continuing "git rebase -i" was very confused when the user left modified files in the working tree while resolving conflicts.
- Continuing "git rebase -i" was also very confused when the user left some staged changes in the index after "edit".
- "git rebase -i" now honors the pre-rebase hook, just like the other rebase implementations "git rebase" and "git rebase -m".
- "git rebase -i" incorrectly aborted when there is no commit to replay.
- Behaviour of "git diff --quiet" was inconsistent with "diff --exit-code" with the output redirected to /dev/null.
- "git diff --no-index" on binary files no longer outputs a bogus "diff --git" header line.
- "git diff" hunk header patterns with multiple elements separated by LF were not used correctly.
- Hunk headers in "git diff" default to using extended regular expressions, fixing some of the internal patterns on non-GNU platforms.
- New config "diff.*.xfuncname" exposes extended regular expressions for user specified hunk header patterns.
- "git gc" when ejecting otherwise unreachable objects from packfiles into loose form leaked memory.
- "git index-pack" was recently broken and mishandled objects added by thin-pack completion processing under memory pressure.
- "git index-pack" was recently broken and misbehaved when run from inside .git/objects/pack/ directory.
- "git stash apply sash@{1}" was fixed to error out. Prior versions would have applied stash@{0} incorrectly.
- "git stash apply" now offers a better suggestion on how to continue if the working tree is currently dirty.
- "git for-each-ref --format=%(subject)" fixed for commits with no newline in the message body.
- "git remote" fixed to protect printf from user input.
- "git remote show -v" now displays all URLs of a remote.
- "git checkout -b branch" was confused when branch already existed.
- "git checkout -q" once again suppresses the locally modified file list.
- "git clone -q", "git fetch -q" asks remote side to not send progress messages, actually making their output quiet.
- Cross-directory renames are no longer used when creating packs. This allows more graceful behavior on filesystems like sshfs.
- Stale temporary files under $GIT_DIR/objects/pack are now cleaned up automatically by "git prune".
- "git merge" once again removes directories after the last file has been removed from it during the merge.
- "git merge" did not allocate enough memory for the structure itself when enumerating the parents of the resulting commit.
- "git blame -C -C" no longer segfaults while trying to pass blame if it encounters a submodule reference.
- "git rm" incorrectly claimed that you have local modifications when a path was merely stat-dirty.
- "git svn" fixed to display an error message when ’set-tree’ failed, instead of a Perl compile error.
- "git submodule" fixed to handle checking out a different commit than HEAD after initializing the submodule.
- The "git commit" error message when there are still unmerged files present was clarified to match "git write-tree".
- "git init" was confused when core.bare or core.sharedRepository are set in system or user global configuration file by mistake. When --bare or --shared is given from the command line, these now override such settings made outside the repositories.
- Some segfaults due to uncaught NULL pointers were fixed in multiple tools such as apply, reset, update-index.
- Solaris builds now default to OLD_ICONV=1 to avoid compile warnings; Solaris 8 does not define NEEDS_LIBICONV by default.
- "Git.pm" tests relied on unnecessarily more recent version of Perl.
- "gitweb" triggered undef warning on commits without log messages.
- "gitweb" triggered undef warnings on missing trees.
- "gitweb" now removes PATH_INFO from its URLs so users don’t have to manually set the URL in the gitweb configuration.
- Bash completion removed support for legacy "git-fetch", "git-push" and "git-pull" as these are no longer installed. Dashless form ("git fetch") is still however supported.
Many other documentation updates.
1.6.0.4
GIT v1.6.0.4 Release Notes ==========================
Fixes since v1.6.0.3 --------------------
- ’git add -p’ said "No changes" when only binary files were changed.
- ’git archive’ did not work correctly in bare repositories.
- ’git checkout -t -b newbranch’ when you are on detached HEAD was broken.
- when we refuse to detect renames because there are too many new or deleted files, ’git diff’ did not say how many there are.
- ’git push --mirror’ tried and failed to push the stash; there is no point in sending it to begin with.
- ’git push’ did not update the remote tracking reference if the corresponding ref on the remote end happened to be already up to date.
- ’git pull $there $branch:$current_branch’ did not work when you were on a branch yet to be born.
- when giving up resolving a conflicted merge, ’git reset --hard’ failed to remove new paths from the working tree.
- ’git send-email’ had a small fd leak while scanning directory.
- ’git status’ incorrectly reported a submodule directory as an untracked directory.
- ’git svn’ used deprecated ’git-foo’ form of subcommand invocation.
- ’git update-ref -d’ to remove a reference did not honor --no-deref option.
- Plugged small memleaks here and there.
- Also contains many documentation updates.
1.6.0.5
GIT v1.6.0.5 Release Notes ==========================
Fixes since v1.6.0.4 --------------------
- "git checkout" used to crash when your HEAD was pointing at a deleted branch.
- "git checkout" from an un-checked-out state did not allow switching out of the current branch.
- "git diff" always allowed GIT_EXTERNAL_DIFF and --no-ext-diff was no-op for the command.
- Giving 3 or more tree-ish to "git diff" is supposed to show the combined diff from second and subsequent trees to the first one, but the order was screwed up.
- "git fast-export" did not export all tags.
- "git ls-files --with-tree=<tree>" did not work with options other than -c, most notably with -m.
- "git pack-objects" did not make its best effort to honor --max-pack-size option when a single first object already busted the given limit and placed many objects in a single pack.
- "git-p4" fast import frontend was too eager to trigger its keyword expansion logic, even on a keyword-looking string that does not have closing ’$’ on the same line.
- "git push $there" when the remote $there is defined in $GIT_DIR/branches/$there behaves more like what cg-push from Cogito used to work.
- when giving up resolving a conflicted merge, "git reset --hard" failed to remove new paths from the working tree.
- "git tag" did not complain when given mutually incompatible set of options.
- The message constructed in the internal editor was discarded when "git tag -s" failed to sign the message, which was often caused by the user not configuring GPG correctly.
- "make check" cannot be run without sparse; people may have meant to say "make test" instead, so suggest that.
- Internal diff machinery had a corner case performance bug that choked on a large file with many repeated contents.
- "git repack" used to grab objects out of packs marked with .keep into a new pack.
- Many unsafe call to sprintf() style varargs functions are corrected.
- Also contains quite a few documentation updates.
1.6.0.6
GIT v1.6.0.6 Release Notes ==========================
Fixes since 1.6.0.5 -------------------
- "git fsck" had a deep recursion that wasted stack space.
- "git fast-export" and "git fast-import" choked on an old style annotated tag that lack the tagger information.
- "git mergetool — file" did not correctly skip "--" marker that signals the end of options list.
- "git show $tag" segfaulted when an annotated $tag pointed at a nonexistent object.
- "git show 2>error" when the standard output is automatically redirected to the pager redirected the standard error to the pager as well; there was no need to.
- "git send-email" did not correctly handle list of addresses when they had quoted comma (e.g. "Lastname, Givenname" <mail@addre.ss>).
- Logic to discover branch ancestry in "git svn" was unreliable when the process to fetch history was interrupted.
- Removed support for an obsolete gitweb request URI, whose implementation ran "git diff" Porcelain, instead of using plumbing, which would have run an external diff command specified in the repository configuration as the gitweb user.
Also contains numerous documentation typofixes.
1.6.0
GIT v1.6.0 Release Notes ========================
User visible changes --------------------
With the default Makefile settings, most of the programs are now installed outside your $PATH, except for "git", "gitk" and some server side programs that need to be accessible for technical reasons. Invoking a git subcommand as "git-xyzzy" from the command line has been deprecated since early 2006 (and officially announced in 1.5.4 release notes); use of them from your scripts after adding output from "git --exec-path" to the $PATH is still supported in this release, but users are again strongly encouraged to adjust their scripts to use "git xyzzy" form, as we will stop installing "git-xyzzy" hardlinks for built-in commands in later releases.
An earlier change to page "git status" output was overwhelmingly unpopular and has been reverted.
Source changes needed for porting to MinGW environment are now all in the main git.git codebase.
By default, packfiles created with this version uses delta-base-offset encoding introduced in v1.4.4. Pack idx files are using version 2 that allows larger packs and added robustness thanks to its CRC checking, introduced in v1.5.2 and v1.4.4.5. If you want to keep your repositories backwards compatible past these versions, set repack.useDeltaBaseOffset to false or pack.indexVersion to 1, respectively.
We used to prevent sample hook scripts shipped in templates/ from triggering by default by relying on the fact that we install them as unexecutable, but on some filesystems, this approach does not work. They are now shipped with ".sample" suffix. If you want to activate any of these samples as-is, rename them to drop the ".sample" suffix, instead of running "chmod +x" on them. For example, you can rename hooks/post-update.sample to hooks/post-update to enable the sample hook that runs update-server-info, in order to make repositories friendly to dumb protocols (i.e. HTTP).
GIT_CONFIG, which was only documented as affecting "git config", but actually affected all git commands, now only affects "git config". GIT_LOCAL_CONFIG, also only documented as affecting "git config" and not different from GIT_CONFIG in a useful way, is removed.
The ".dotest" temporary area "git am" and "git rebase" use is now moved inside the $GIT_DIR, to avoid mistakes of adding it to the project by accident.
An ancient merge strategy "stupid" has been removed.
Updates since v1.5.6 --------------------
(subsystems)
- git-p4 in contrib learned "allowSubmit" configuration to control on which branch to allow "submit" subcommand.
- git-gui learned to stage changes per-line.
(portability)
- Changes for MinGW port have been merged, thanks to Johannes Sixt and gangs.
- Sample hook scripts shipped in templates/ are now suffixed with *.sample.
- perl’s in-place edit (-i) does not work well without backup files on Windows; some tests are rewritten to cope with this.
(documentation)
- Updated howto/update-hook-example
- Got rid of usage of "git-foo" from the tutorial and made typography more consistent.
- Disambiguating "--" between revs and paths is finally documented.
(performance, robustness, sanity etc.)
- index-pack used too much memory when dealing with a deep delta chain. This has been optimized.
- reduced excessive inlining to shrink size of the "git" binary.
- verify-pack checks the object CRC when using version 2 idx files.
- When an object is corrupt in a pack, the object became unusable even when the same object is available in a loose form, We now try harder to fall back to these redundant objects when able. In particular, "git repack -a -f" can be used to fix such a corruption as long as necessary objects are available.
- Performance of "git-blame -C -C" operation is vastly improved.
- git-clone does not create refs in loose form anymore (it behaves as if you immediately ran git-pack-refs after cloning). This will help repositories with insanely large number of refs.
- core.fsyncobjectfiles configuration can be used to ensure that the loose objects created will be fsync’ed (this is only useful on filesystems that does not order data writes properly).
- "git commit-tree" plumbing can make Octopus with more than 16 parents. "git commit" has been capable of this for quite some time.
(usability, bells and whistles)
- even more documentation pages are now accessible via "man" and "git help".
- A new environment variable GIT_CEILING_DIRECTORIES can be used to stop the discovery process of the toplevel of working tree; this may be useful when you are working in a slow network disk and are outside any working tree, as bash-completion and "git help" may still need to run in these places.
- By default, stash entries never expire. Set reflogexpire in [gc "refs/stash"] to a reasonable value to get traditional auto-expiration behaviour back
- Longstanding latency issue with bash completion script has been addressed. This will need to be backmerged to ’maint’ later.
- pager.<cmd> configuration variable can be used to enable/disable the default paging behaviour per command.
- "git-add -i" has a new action ’e/dit’ to allow you edit the patch hunk manually.
- git-am records the original tip of the branch in ORIG_HEAD before it starts applying patches.
- git-apply can handle a patch that touches the same path more than once much better than before.
- git-apply can be told not to trust the line counts recorded in the input patch but recount, with the new --recount option.
- git-apply can be told to apply a patch to a path deeper than what the patch records with --directory option.
- git-archive can be told to omit certain paths from its output using export-ignore attributes.
- git-archive uses the zlib default compression level when creating zip archive.
- git-archive’s command line options --exec and --remote can take their parameters as separate command line arguments, similar to other commands. IOW, both "--exec=path" and "--exec path" are now supported.
- With -v option, git-branch describes the remote tracking statistics similar to the way git-checkout reports by how many commits your branch is ahead/behind.
- git-branch’s --contains option used to always require a commit parameter to limit the branches with; it now defaults to list branches that contains HEAD if this parameter is omitted.
- git-branch’s --merged and --no-merged option used to always limit the branches relative to the HEAD, but they can now take an optional commit argument that is used in place of HEAD.
- git-bundle can read the revision arguments from the standard input.
- git-cherry-pick can replay a root commit now.
- git-clone can clone from a remote whose URL would be rewritten by configuration stored in $HOME/.gitconfig now.
- "git-clone --mirror" is a handy way to set up a bare mirror repository.
- git-cvsserver learned to respond to "cvs co -c".
- git-diff --check now checks leftover merge conflict markers.
- "git-diff -p" learned to grab a better hunk header lines in BibTex, Pascal/Delphi, and Ruby files and also pays attention to chapter and part boundary in TeX documents.
- When remote side used to have branch ’foo’ and git-fetch finds that now it has branch ’foo/bar’, it refuses to lose the existing remote tracking branch and its reflog. The error message has been improved to suggest pruning the remote if the user wants to proceed and get the latest set of branches from the remote, including such ’foo/bar’.
- fast-export learned to export and import marks file; this can be used to interface with fast-import incrementally.
- fast-import and fast-export learned to export and import gitlinks.
- "gitk" left background process behind after being asked to dig very deep history and the user killed the UI; the process is killed when the UI goes away now.
- git-rebase records the original tip of branch in ORIG_HEAD before it is rewound.
- "git rerere" can be told to update the index with auto-reused resolution with rerere.autoupdate configuration variable.
- git-rev-parse learned $commit^! and $commit^@ notations used in "log" family. These notations are available in gitk as well, because the gitk command internally uses rev-parse to interpret its arguments.
- git-rev-list learned --children option to show child commits it encountered during the traversal, instead of showing parent commits.
- git-send-mail can talk not just over SSL but over TLS now.
- git-shortlog honors custom output format specified with "--pretty=format:".
- "git-stash save" learned --keep-index option. This lets you stash away the local changes and bring the changes staged in the index to your working tree for examination and testing.
- git-stash also learned branch subcommand to create a new branch out of stashed changes.
- git-status gives the remote tracking statistics similar to the way git-checkout reports by how many commits your branch is ahead/behind.
- "git-svn dcommit" is now aware of auto-props setting the subversion user has.
- You can tell "git status -u" to even more aggressively omit checking untracked files with --untracked-files=no.
- Original SHA-1 value for "update-ref -d" is optional now.
- Error codes from gitweb are made more descriptive where possible, rather than "403 forbidden" as we used to issue everywhere.
(internal)
- git-merge has been reimplemented in C.
Fixes since v1.5.6 ------------------
All of the fixes in v1.5.6 maintenance series are included in this release, unless otherwise noted.
- git-clone ignored its -u option; the fix needs to be backported to ’maint’;
- git-mv used to lose the distinction between changes that are staged and that are only in the working tree, by staging both in the index after moving such a path.
- "git-rebase -i -p" rewrote the parents to wrong ones when amending (either edit or squash) was involved, and did not work correctly when fast forwarding.
1.6.1.1
GIT v1.6.1.1 Release Notes ==========================
Fixes since v1.6.1 ------------------
- "git add frotz/nitfol" when "frotz" is a submodule should have errored out, but it didn’t.
- "git apply" took file modes from the patch text and updated the mode bits of the target tree even when the patch was not about mode changes.
- "git bisect view" on Cygwin did not launch gitk
- "git checkout $tree" did not trigger an error.
- "git commit" tried to remove COMMIT_EDITMSG from the work tree by mistake.
- "git describe --all" complained when a commit is described with a tag, which was nonsense.
- "git diff --no-index --" did not trigger no-index (aka "use git-diff as a replacement of diff on untracked files") behaviour.
- "git format-patch -1 HEAD" on a root commit failed to produce patch text.
- "git fsck branch" did not work as advertised; instead it behaved the same way as "git fsck".
- "git log --pretty=format:%s" did not handle a multi-line subject the same way as built-in log listers (i.e. shortlog, --pretty=oneline, etc.)
- "git daemon", and "git merge-file" are more careful when freopen fails and barf, instead of going on and writing to unopened filehandle.
- "git http-push" did not like some RFC 4918 compliant DAV server responses.
- "git merge -s recursive" mistakenly overwritten an untracked file in the work tree upon delete/modify conflict.
- "git merge -s recursive" didn’t leave the index unmerged for entries with rename/delete conflicts.
- "git merge -s recursive" clobbered untracked files in the work tree.
- "git mv -k" with more than one erroneous paths misbehaved.
- "git read-tree -m -u" hence branch switching incorrectly lost a subdirectory in rare cases.
- "git rebase -i" issued an unnecessary error message upon a user error of marking the first commit to be "squash"ed.
- "git shortlog" did not format a commit message with multi-line subject correctly.
Many documentation updates.
1.6.1.2
GIT v1.6.1.2 Release Notes ==========================
Fixes since v1.6.1.1 --------------------
- The logic for rename detection in internal diff used by commands like "git diff" and "git blame" has been optimized to avoid loading the same blob repeatedly.
- We did not allow writing out a blob that is larger than 2GB for no good reason.
- "git format-patch -o $dir", when $dir is a relative directory, used it as relative to the root of the work tree, not relative to the current directory.
- v1.6.1 introduced an optimization for "git push" into a repository (A) that borrows its objects from another repository (B) to avoid sending objects that are available in repository B, when they are not yet used by repository A. However the code on the "git push" sender side was buggy and did not work when repository B had new objects that are not known by the sender. This caused pushing into a "forked" repository served by v1.6.1 software using "git push" from v1.6.1 sometimes did not work. The bug was purely on the "git push" sender side, and has been corrected.
- "git status -v" did not paint its diff output in colour even when color.ui configuration was set.
- "git ls-tree" learned --full-tree option to help Porcelain scripts that want to always see the full path regardless of the current working directory.
- "git grep" incorrectly searched in work tree paths even when they are marked as assume-unchanged. It now searches in the index entries.
- "git gc" with no grace period needlessly ejected packed but unreachable objects in their loose form, only to delete them right away.
1.6.1.3
GIT v1.6.1.3 Release Notes ==========================
Fixes since v1.6.1.2 --------------------
- "git diff --binary | git apply" pipeline did not work well when a binary blob is changed to a symbolic link.
- Some combinations of -b/-w/--ignore-space-at-eol to "git diff" did not work as expected.
- "git grep" did not pass the -I (ignore binary) option when calling out an external grep program.
- "git log" and friends include HEAD to the set of starting points when --all is given. This makes a difference when you are not on any branch.
- "git mv" to move an untracked file to overwrite a tracked contents misbehaved.
- "git merge -s octopus" with many potential merge bases did not work correctly.
- RPM binary package installed the html manpages in a wrong place.
Also includes minor documentation fixes and updates.
1.6.1.4
GIT v1.6.1.4 Release Notes ==========================
Fixes since v1.6.1.3 --------------------
-
gitignore learned to handle backslash as a quoting mechanism for
comment introduction character "#". This fix was first merged to 1.6.2.1.
- "git fast-export" produced wrong output with some parents missing from commits, when the history is clock-skewed.
- "git fast-import" sometimes failed to read back objects it just wrote out and aborted, because it failed to flush stale cached data.
- "git-ls-tree" and "git-diff-tree" used a pathspec correctly when deciding to descend into a subdirectory but they did not match the individual paths correctly. This caused pathspecs "abc/d ab" to match "abc/0" ("abc/d" made them decide to descend into the directory "abc/", and then "ab" incorrectly matched "abc/0" when it shouldn’t). This fix was first merged to 1.6.2.3.
- import-zips script (in contrib) did not compute the common directory prefix correctly. This fix was first merged to 1.6.2.2.
- "git init" segfaulted when given an overlong template location via the --template= option. This fix was first merged to 1.6.2.4.
- "git repack" did not error out when necessary object was missing in the repository.
- git-repack (invoked from git-gc) did not work as nicely as it should in a repository that borrows objects from neighbours via alternates mechanism especially when some packs are marked with the ".keep" flag to prevent them from being repacked. This fix was first merged to 1.6.2.3.
Also includes minor documentation fixes and updates.
1.6.1
GIT v1.6.1 Release Notes ========================
Updates since v1.6.0 --------------------
When some commands (e.g. "git log", "git diff") spawn pager internally, we used to make the pager the parent process of the git command that produces output. This meant that the exit status of the whole thing comes from the pager, not the underlying git command. We swapped the order of the processes around and you will see the exit code from the command from now on.
(subsystems)
- gitk can call out to git-gui to view "git blame" output; git-gui in turn can run gitk from its blame view.
- Various git-gui updates including updated translations.
- Various gitweb updates from repo.or.cz installation.
- Updates to emacs bindings.
(portability)
- A few test scripts used nonportable "grep" that did not work well on some platforms, e.g. Solaris.
- Sample pre-auto-gc script has OS X support.
- Makefile has support for (ancient) FreeBSD 4.9.
(performance)
- Many operations that are lstat(3) heavy can be told to pre-execute necessary lstat(3) in parallel before their main operations, which potentially gives much improved performance for cold-cache cases or in environments with weak metadata caching (e.g. NFS).
- The underlying diff machinery to produce textual output has been optimized, which would result in faster "git blame" processing.
- Most of the test scripts (but not the ones that try to run servers) can be run in parallel.
- Bash completion of refnames in a repository with massive number of refs has been optimized.
- Cygwin port uses native stat/lstat implementations when applicable, which leads to improved performance.
- "git push" pays attention to alternate repositories to avoid sending unnecessary objects.
- "git svn" can rebuild an out-of-date rev_map file.
(usability, bells and whistles)
- When you mistype a command name, git helpfully suggests what it guesses you might have meant to say. help.autocorrect configuration can be set to a non-zero value to accept the suggestion when git can uniquely guess.
- The packfile machinery hopefully is more robust when dealing with corrupt packs if redundant objects involved in the corruption are available elsewhere.
- "git add -N path…" adds the named paths as an empty blob, so that subsequent "git diff" will show a diff as if they are creation events.
- "git add" gained a built-in synonym for people who want to say "stage changes" instead of "add contents to the staging area" which amounts to the same thing.
- "git apply" learned --include=paths option, similar to the existing --exclude=paths option.
- "git bisect" is careful about a user mistake and suggests testing of merge base first when good is not a strict ancestor of bad.
- "git bisect skip" can take a range of commits.
- "git blame" re-encodes the commit metainfo to UTF-8 from i18n.commitEncoding by default.
- "git check-attr --stdin" can check attributes for multiple paths.
- "git checkout --track origin/hack" used to be a syntax error. It now DWIMs to create a corresponding local branch "hack", i.e. acts as if you said "git checkout --track -b hack origin/hack".
- "git checkout --ours/--theirs" can be used to check out one side of a conflicting merge during conflict resolution.
- "git checkout -m" can be used to recreate the initial conflicted state during conflict resolution.
- "git cherry-pick" can also utilize rerere for conflict resolution.
- "git clone" learned to be verbose with -v
- output from "git commit" has been reworded in a more concise and yet more informative way.
- "git count-objects" reports the on-disk footprint for packfiles and their corresponding idx files.
- "git daemon" learned --max-connections=<count> option.
- "git daemon" exports REMOTE_ADDR to record client address, so that spawned programs can act differently on it.
- "git diff" learned to mimic --suppress-blank-empty from GNU diff via a configuration option.
- "git diff" learned to put more sensible hunk headers for Python, HTML and ObjC contents.
- "git diff" learned to vary the a/ vs b/ prefix depending on what are being compared, controlled by diff.mnemonicprefix configuration.
- "git diff" learned --dirstat-by-file to count changed files, not number of lines, when summarizing the global picture.
- "git diff" learned "textconv" filters --- a binary or hard-to-read contents can be munged into human readable form and the difference between the results of the conversion can be viewed (obviously this cannot produce a patch that can be applied, so this is disabled in format-patch among other things).
- "--cached" option to "git diff has an easier to remember synonym "--staged", to ask "what is the difference between the given commit and the contents staged in the index?"
- "git for-each-ref" learned "refname:short" token that gives an unambiguously abbreviated refname.
- Auto-numbering of the subject lines is the default for "git format-patch" now.
- "git grep" learned to accept -z similar to GNU grep.
- "git help" learned to use GIT_MAN_VIEWER environment variable before using "man" program.
- "git imap-send" can optionally talk SSL.
- "git index-pack" is more careful against disk corruption while completing a thin pack.
- "git log --check" and "git log --exit-code" passes their underlying diff status with their exit status code.
- "git log" learned --simplify-merges, a milder variant of --full-history; "gitk --simplify-merges" is easier to view than with --full-history.
- "git log" learned "--source" to show what ref each commit was reached from.
- "git log" also learned "--simplify-by-decoration" to show the birds-eye-view of the topology of the history.
- "git log --pretty=format:" learned "%d" format element that inserts names of tags that point at the commit.
- "git merge --squash" and "git merge --no-ff" into an unborn branch are noticed as user errors.
- "git merge -s $strategy" can use a custom built strategy if you have a command "git-merge-$strategy" on your $PATH.
- "git pull" (and "git fetch") can be told to operate "-v"erbosely or "-q"uietly.
- "git push" can be told to reject deletion of refs with receive.denyDeletes configuration.
- "git rebase" honours pre-rebase hook; use --no-verify to bypass it.
- "git rebase -p" uses interactive rebase machinery now to preserve the merges.
- "git reflog expire branch" can be used in place of "git reflog expire refs/heads/branch".
- "git remote show $remote" lists remote branches one-per-line now.
- "git send-email" can be given revision range instead of files and maildirs on the command line, and automatically runs format-patch to generate patches for the given revision range.
- "git submodule foreach" subcommand allows you to iterate over checked out submodules.
- "git submodule sync" subcommands allows you to update the origin URL recorded in submodule directories from the toplevel .gitmodules file.
- "git svn branch" can create new branches on the other end.
- "gitweb" can use more saner PATH_INFO based URL.
(internal)
- "git hash-object" learned to lie about the path being hashed, so that correct gitattributes processing can be done while hashing contents stored in a temporary file.
- various callers of git-merge-recursive avoid forking it as an external process.
- Git class defined in "Git.pm" can be subclasses a bit more easily.
- We used to link GNU regex library as a compatibility layer for some platforms, but it turns out it is not necessary on most of them.
- Some path handling routines used fixed number of buffers used alternately but depending on the call depth, this arrangement led to hard to track bugs. This issue is being addressed.
Fixes since v1.6.0 ------------------
All of the fixes in v1.6.0.X maintenance series are included in this release, unless otherwise noted.
- Porcelains implemented as shell scripts were utterly confused when you entered to a subdirectory of a work tree from sideways, following a symbolic link (this may need to be backported to older releases later).
- Tracking symbolic links would work better on filesystems whose lstat() returns incorrect st_size value for them.
- "git add" and "git update-index" incorrectly allowed adding S/F when S is a tracked symlink that points at a directory D that has a path F in it (we still need to fix a similar nonsense when S is a submodule and F is a path in it).
- "git am" after stopping at a broken patch lost --whitespace, -C, -p and --3way options given from the command line initially.
- "git diff --stdin" used to take two trees on a line and compared them, but we dropped support for such a use case long time ago. This has been resurrected.
- "git filter-branch" failed to rewrite a tag name with slashes in it.
- "git http-push" did not understand URI scheme other than opaquelocktoken when acquiring a lock from the server (this may need to be backported to older releases later).
- After "git rebase -p" stopped with conflicts while replaying a merge, "git rebase --continue" did not work (may need to be backported to older releases).
- "git revert" records relative to which parent a revert was made when reverting a merge. Together with new documentation that explains issues around reverting a merge and merging from the updated branch later, this hopefully will reduce user confusion (this may need to be backported to older releases later).
- "git rm --cached" used to allow an empty blob that was added earlier to be removed without --force, even when the file in the work tree has since been modified.
- "gitweb" did not mark non-ASCII characters imported from external HTML fragments correctly.
1.6.2.1
GIT v1.6.2.1 Release Notes ==========================
Fixes since v1.6.2 ------------------
-
gitignore learned to handle backslash as a quoting mechanism for
comment introduction character "#".
- timestamp output in --date=relative mode used to display timestamps that are long time ago in the default mode; it now uses "N years M months ago", and "N years ago".
- git-add -i/-p now works with non-ASCII pathnames.
- "git hash-object -w" did not read from the configuration file from the correct .git directory.
- git-send-email learned to correctly handle multiple Cc: addresses.
1.6.2.2
GIT v1.6.2.2 Release Notes ==========================
Fixes since v1.6.2.1 --------------------
- A longstanding confusing description of what --pickaxe option of git-diff does has been clarified in the documentation.
- "git-blame -S" did not quite work near the commits that were given on the command line correctly.
- "git diff --pickaxe-regexp" did not count overlapping matches correctly.
- "git diff" did not feed files in work-tree representation to external diff and textconv.
- "git-fetch" in a repository that was not cloned from anywhere said it cannot find ’origin’, which was hard to understand for new people.
- "git-format-patch --numbered-files --stdout" did not have to die of incompatible options; it now simply ignores --numbered-files as no files are produced anyway.
- "git-ls-files --deleted" did not work well with GIT_DIR&GIT_WORK_TREE.
- "git-read-tree A B C…" without -m option has been broken for a long time.
- git-send-email ignored --in-reply-to when --no-thread was given.
- ’git-submodule add’ did not tolerate extra slashes and ./ in the path it accepted from the command line; it now is more lenient.
- git-svn misbehaved when the project contained a path that began with two dashes.
- import-zips script (in contrib) did not compute the common directory prefix correctly.
- miscompilation of negated enum constants by old gcc (2.9) affected the codepaths to spawn subprocesses.
Many small documentation updates are included as well.
1.6.2.3
GIT v1.6.2.3 Release Notes ==========================
Fixes since v1.6.2.2 --------------------
- Setting an octal mode value to core.sharedrepository configuration to restrict access to the repository to group members did not work as advertised.
- A fairly large and trivial memory leak while rev-list shows list of reachable objects has been identified and plugged.
- "git-commit --interactive" did not abort when underlying "git-add -i" signaled a failure.
- git-repack (invoked from git-gc) did not work as nicely as it should in a repository that borrows objects from neighbours via alternates mechanism especially when some packs are marked with the ".keep" flag to prevent them from being repacked.
Many small documentation updates are included as well.
1.6.2.4
GIT v1.6.2.4 Release Notes ==========================
Fixes since v1.6.2.3 --------------------
- The configuration parser had a buffer overflow while parsing an overlong value.
- pruning reflog entries that are unreachable from the tip of the ref during "git reflog prune" (hence "git gc") was very inefficient.
- "git-add -p" lacked a way to say "q"uit to refuse staging any hunks for the remaining paths. You had to say "d" and then ^C.
- "git-checkout <tree-ish> <submodule>" did not update the index entry at the named path; it now does.
- "git-fast-export" choked when seeing a tag that does not point at commit.
- "git init" segfaulted when given an overlong template location via the --template= option.
- "git-ls-tree" and "git-diff-tree" used a pathspec correctly when deciding to descend into a subdirectory but they did not match the individual paths correctly. This caused pathspecs "abc/d ab" to match "abc/0" ("abc/d" made them decide to descend into the directory "abc/", and then "ab" incorrectly matched "abc/0" when it shouldn’t).
- "git-merge-recursive" was broken when a submodule entry was involved in a criss-cross merge situation.
Many small documentation updates are included as well.
exec >/var/tmp/1 echo O=$(git describe maint) O=v1.6.2.3-38-g318b847 git shortlog --no-merges $O..maint ---
1.6.2.5
GIT v1.6.2.5 Release Notes ==========================
Fixes since v1.6.2.4 --------------------
- "git apply" mishandled if you fed a git generated patch that renames file A to B and file B to A at the same time.
- "git diff -c -p" (and "diff --cc") did not expect to see submodule differences and instead refused to work.
- "git grep -e ’(’" segfaulted, instead of diagnosing a mismatched parentheses error.
- "git fetch" generated packs with offset-delta encoding when both ends of the connection are capable of producing one; this cannot be read by ancient git and the user should be able to disable this by setting repack.usedeltabaseoffset configuration to false.
1.6.2
GIT v1.6.2 Release Notes ========================
With the next major release, "git push" into a branch that is currently checked out will be refused by default. You can choose what should happen upon such a push by setting the configuration variable receive.denyCurrentBranch in the receiving repository.
To ease the transition plan, the receiving repository of such a push running this release will issue a big warning when the configuration variable is missing. Please refer to:
https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
for more details on the reason why this change is needed and the transition plan.
For a similar reason, "git push $there :$killed" to delete the branch $killed in a remote repository $there, if $killed branch is the current branch pointed at by its HEAD, gets a large warning. You can choose what should happen upon such a push by setting the configuration variable receive.denyDeleteCurrent in the receiving repository.
Updates since v1.6.1 --------------------
(subsystems)
- git-svn updates.
- gitweb updates, including a new patch view and RSS/Atom feed improvements.
- (contrib/emacs) git.el now has commands for checking out a branch, creating a branch, cherry-picking and reverting commits; vc-git.el is not shipped with git anymore (it is part of official Emacs).
(performance)
- pack-objects autodetects the number of CPUs available and uses threaded version.
(usability, bells and whistles)
- automatic typo correction works on aliases as well
- @{-1} is a way to refer to the last branch you were on. This is accepted not only where an object name is expected, but anywhere a branch name is expected and acts as if you typed the branch name. E.g. "git branch --track mybranch @{-1}", "git merge @{-1}", and "git rev-parse --symbolic-full-name @{-1}" would work as expected.
- When refs/remotes/origin/HEAD points at a remote tracking branch that has been pruned away, many git operations issued warning when they internally enumerated the refs. We now warn only when you say "origin" to refer to that pruned branch.
- The location of .mailmap file can be configured, and its file format was enhanced to allow mapping an incorrect e-mail field as well.
- "git add -p" learned ’g’oto action to jump directly to a hunk.
- "git add -p" learned to find a hunk with given text with ’/’.
- "git add -p" optionally can be told to work with just the command letter without Enter.
- when "git am" stops upon a patch that does not apply, it shows the title of the offending patch.
- "git am --directory=<dir>" and "git am --reject" passes these options to underlying "git apply".
- "git am" learned --ignore-date option.
- "git blame" aligns author names better when they are spelled in non US-ASCII encoding.
- "git clone" now makes its best effort when cloning from an empty repository to set up configuration variables to refer to the remote repository.
- "git checkout -" is a shorthand for "git checkout @{-1}".
- "git cherry" defaults to whatever the current branch is tracking (if exists) when the <upstream> argument is not given.
- "git cvsserver" can be told not to add extra "via git-CVS emulator" to the commit log message it serves via gitcvs.commitmsgannotation configuration.
- "git cvsserver" learned to handle ’noop’ command some CVS clients seem to expect to work.
- "git diff" learned a new option --inter-hunk-context to coalesce close hunks together and show context between them.
- The definition of what constitutes a word for "git diff --color-words" can be customized via gitattributes, command line or a configuration.
- "git diff" learned --patience to run "patience diff" algorithm.
- "git filter-branch" learned --prune-empty option that discards commits that do not change the contents.
- "git fsck" now checks loose objects in alternate object stores, instead of misreporting them as missing.
- "git gc --prune" was resurrected to allow "git gc --no-prune" and giving non-default expiration period e.g. "git gc --prune=now".
- "git grep -w" and "git grep" for fixed strings have been optimized.
- "git mergetool" learned -y(--no-prompt) option to disable prompting.
- "git rebase -i" can transplant a history down to root to elsewhere with --root option.
- "git reset --merge" is a new mode that works similar to the way "git checkout" switches branches, taking the local changes while switching to another commit.
- "git submodule update" learned --no-fetch option.
- "git tag" learned --contains that works the same way as the same option from "git branch".
Fixes since v1.6.1 ------------------
All of the fixes in v1.6.1.X maintenance series are included in this release, unless otherwise noted.
Here are fixes that this release has, but have not been backported to v1.6.1.X series.
- "git-add sub/file" when sub is a submodule incorrectly added the path to the superproject.
- "git bundle" did not exclude annotated tags even when a range given from the command line wanted to.
- "git filter-branch" unnecessarily refused to work when you had checked out a different commit from what is recorded in the superproject index in a submodule.
- "git filter-branch" incorrectly tried to update a nonexistent work tree at the end when it is run in a bare repository.
- "git gc" did not work if your repository was created with an ancient git and never had any pack files in it before.
- "git mergetool" used to ignore autocrlf and other attributes based content rewriting.
- branch switching and merges had a silly bug that did not validate the correct directory when making sure an existing subdirectory is clean.
- "git -p cmd" when cmd is not a built-in one left the display in funny state when killed in the middle.
1.6.3.1
GIT v1.6.3.1 Release Notes ==========================
Fixes since v1.6.3 ------------------
- "git checkout -b new-branch" with a staged change in the index incorrectly primed the in-index cache-tree, resulting a wrong tree object to be written out of the index. This is a grave regression since the last 1.6.2.X maintenance release.
1.6.3.2
GIT v1.6.3.2 Release Notes ==========================
Fixes since v1.6.3.1 --------------------
- A few codepaths picked up the first few bytes from an sha1[] by casting the (char ) pointer to (int); GCC 4.4 did not like this, and aborted compilation.
- Some unlink(2) failures went undiagnosed.
- The "recursive" merge strategy misbehaved when faced rename/delete conflicts while coming up with an intermediate merge base.
- The low-level merge algorithm did not handle a degenerate case of merging a file with itself using itself as the common ancestor gracefully. It should produce the file itself, but instead produced an empty result.
- GIT_TRACE mechanism segfaulted when tracing a shell-quoted aliases.
- OpenBSD also uses st_ctimspec in "struct stat", instead of "st_ctim".
- With NO_CROSS_DIRECTORY_HARDLINKS, "make install" can be told not to create hardlinks between $(gitexecdir)/git-$builtin_commands and $(bindir)/git.
- command completion code in bash did not reliably detect that we are in a bare repository.
- "git add ." in an empty directory complained that pathspec "." did not match anything, which may be technically correct, but not useful. We silently make it a no-op now.
- "git add -p" (and "patch" action in "git add -i") was broken when the first hunk that adds a line at the top was split into two and both halves are marked to be used.
- "git blame path" misbehaved at the commit where path became file from a directory with some files in it.
- "git for-each-ref" had a segfaulting bug when dealing with a tag object created by an ancient git.
- "git format-patch -k" still added patch numbers if format.numbered configuration was set.
- "git grep --color ’’" did not terminate. The command also had subtle bugs with its -w option.
- http-push had a small use-after-free bug.
- "git push" was converting OFS_DELTA pack representation into less efficient REF_DELTA representation unconditionally upon transfer, making the transferred data unnecessarily larger.
- "git remote show origin" segfaulted when origin was still empty.
Many other general usability updates around help text, diagnostic messages and documentation are included as well.
1.6.3.3
GIT v1.6.3.3 Release Notes ==========================
Fixes since v1.6.3.2 --------------------
- "git archive" running on Cygwin can get stuck in an infinite loop.
- "git daemon" did not correctly parse the initial line that carries virtual host request information.
- "git diff --textconv" leaked memory badly when the textconv filter errored out.
- The built-in regular expressions to pick function names to put on hunk header lines for java and objc were very inefficiently written.
- in certain error situations git-fetch (and git-clone) on Windows didn’t detect connection abort and ended up waiting indefinitely.
- import-tars script (in contrib) did not import symbolic links correctly.
- http.c used CURLOPT_SSLKEY even on libcURL version 7.9.2, even though it was only available starting 7.9.3.
- low-level filelevel merge driver used return value from strdup() without checking if we ran out of memory.
- "git rebase -i" left stray closing parenthesis in its reflog message.
- "git remote show" did not show all the URLs associated with the named remote, even though "git remote -v" did. Made them consistent by making the former show all URLs.
- "whitespace" attribute that is set was meant to detect all errors known to git, but it told git to ignore trailing carriage-returns.
Includes other documentation fixes.
1.6.3.4
GIT v1.6.3.4 Release Notes ==========================
Fixes since v1.6.3.3 --------------------
- "git add --no-ignore-errors" did not override configured add.ignore-errors configuration.
- "git apply --whitespace=fix" did not fix trailing whitespace on an incomplete line.
- "git branch" opened too many commit objects unnecessarily.
- "git checkout -f $commit" with a path that is a file (or a symlink) in the work tree to a commit that has a directory at the path issued an unnecessary error message.
- "git diff -c/--cc" was very inefficient in coalescing the removed lines shared between parents.
- "git diff -c/--cc" showed removed lines at the beginning of a file incorrectly.
- "git remote show nickname" did not honor configured remote.nickname.uploadpack when inspecting the branches at the remote.
- "git request-pull" when talking to the terminal for a preview showed some of the output in the pager.
- "git request-pull start nickname [end]" did not honor configured remote.nickname.uploadpack when it ran git-ls-remote against the remote repository to learn the current tip of branches.
Includes other documentation updates and minor fixes.
1.6.3
GIT v1.6.3 Release Notes ========================
With the next major release, "git push" into a branch that is currently checked out will be refused by default. You can choose what should happen upon such a push by setting the configuration variable receive.denyCurrentBranch in the receiving repository.
To ease the transition plan, the receiving repository of such a push running this release will issue a big warning when the configuration variable is missing. Please refer to:
https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
for more details on the reason why this change is needed and the transition plan.
For a similar reason, "git push $there :$killed" to delete the branch $killed in a remote repository $there, if $killed branch is the current branch pointed at by its HEAD, gets a large warning. You can choose what should happen upon such a push by setting the configuration variable receive.denyDeleteCurrent in the receiving repository.
When the user does not tell "git push" what to push, it has always pushed matching refs. For some people it is unexpected, and a new configuration variable push.default has been introduced to allow changing a different default behaviour. To advertise the new feature, a big warning is issued if this is not configured and a git push without arguments is attempted.
Updates since v1.6.2 --------------------
(subsystems)
- various git-svn updates.
- git-gui updates, including an update to Russian translation, and a fix to an infinite loop when showing an empty diff.
- gitk updates, including an update to Russian translation and improved Windows support.
(performance)
- many uses of lstat(2) in the codepath for "git checkout" have been optimized out.
(usability, bells and whistles)
- Boolean configuration variable yes/no can be written as on/off.
- rsync:/path/to/repo can be used to run git over rsync for local repositories. It may not be useful in practice; meant primarily for testing.
- http transport learned to prompt and use password when fetching from or pushing to http://user@host.xz/ URL.
- (msysgit) progress output that is sent over the sideband protocol can be handled appropriately in Windows console.
- "--pretty=<style>" option to the log family of commands can now be spelled as "--format=<style>". In addition, --format=%formatstring is a short-hand for --pretty=tformat:%formatstring.
- "--oneline" is a synonym for "--pretty=oneline --abbrev-commit".
- "--graph" to the "git log" family can draw the commit ancestry graph in colors.
- If you realize that you botched the patch when you are editing hunks with the ’edit’ action in git-add -i/-p, you can abort the editor to tell git not to apply it.
- @{-1} is a new way to refer to the last branch you were on introduced in 1.6.2, but the initial implementation did not teach this to a few commands. Now the syntax works with "branch -m @{-1} newname".
- git-archive learned --output=<file> option.
- git-archive takes attributes from the tree being archived; strictly speaking, this is an incompatible behaviour change, but is a good one. Use --worktree-attributes option to allow it to read attributes from the work tree as before (deprecated git-tar tree command always reads attributes from the work tree).
- git-bisect shows not just the number of remaining commits whose goodness is unknown, but also shows the estimated number of remaining rounds.
- You can give --date=<format> option to git-blame.
- "git-branch -r" shows HEAD symref that points at a remote branch in interest of each tracked remote repository.
- "git-branch -v -v" is a new way to get list of names for branches and the "upstream" branch for them.
- git-config learned -e option to open an editor to edit the config file directly.
- git-clone runs post-checkout hook when run without --no-checkout.
- git-difftool is now part of the officially supported command, primarily maintained by David Aguilar.
- git-for-each-ref learned a new "upstream" token.
- git-format-patch can be told to use attachment with a new configuration, format.attach.
- git-format-patch can be told to produce deep or shallow message threads.
- git-format-patch can be told to always add sign-off with a configuration variable.
- git-format-patch learned format.headers configuration to add extra header fields to the output. This behaviour is similar to the existing --add-header=<header> option of the command.
- git-format-patch gives human readable names to the attached files, when told to send patches as attachments.
- git-grep learned to highlight the found substrings in color.
- git-imap-send learned to work around Thunderbird’s inability to easily disable format=flowed with a new configuration, imap.preformattedHTML.
- git-rebase can be told to rebase the series even if your branch is a descendant of the commit you are rebasing onto with --force-rebase option.
- git-rebase can be told to report diffstat with the --stat option.
- Output from git-remote command has been vastly improved.
- "git remote update --prune $remote" updates from the named remote and then prunes stale tracking branches.
- git-send-email learned --confirm option to review the Cc: list before sending the messages out.
(developers)
- Test scripts can be run under valgrind.
- Test scripts can be run with installed git.
- Makefile learned ’coverage’ option to run the test suites with coverage tracking enabled.
- Building the manpages with docbook-xsl between 1.69.1 and 1.71.1 now requires setting DOCBOOK_SUPPRESS_SP to work around a docbook-xsl bug. This workaround used to be enabled by default, but causes problems with newer versions of docbook-xsl. In addition, there are a few more knobs you can tweak to work around issues with various versions of the docbook-xsl package. See comments in Documentation/Makefile for details.
- Support for building and testing a subset of git on a system without a working perl has been improved.
Fixes since v1.6.2 ------------------
All of the fixes in v1.6.2.X maintenance series are included in this release, unless otherwise noted.
Here are fixes that this release has, but have not been backported to v1.6.2.X series.
- "git-apply" rejected a patch that swaps two files (i.e. renames A to B and B to A at the same time). May need to be backported by cherry picking d8c81df and then 7fac0ee).
- The initial checkout did not read the attributes from the .gitattribute file that is being checked out.
- git-gc spent excessive amount of time to decide if an object appears in a locally existing pack (if needed, backport by merging 69e020a).
1.6.4.1
GIT v1.6.4.1 Release Notes ==========================
Fixes since v1.6.4 ------------------
- An unquoted value in the configuration file, when it contains more than one whitespaces in a row, got them replaced with a single space.
- "git am" used to accept a single piece of e-mail per file (not a mbox) as its input, but multiple input format support in v1.6.4 broke it. Apparently many people have been depending on this feature.
- The short help text for "git filter-branch" command was a single long line, wrapped by terminals, and was hard to read.
- The "recursive" strategy of "git merge" segfaulted when a merge has more than one merge-bases, and merging of these merge-bases involves a rename/rename or a rename/add conflict.
- "git pull --rebase" did not use the right fork point when the repository has already fetched from the upstream that rewinds the branch it is based on in an earlier fetch.
- Explain the concept of fast-forward more fully in "git push" documentation, and hint to refer to it from an error message when the command refuses an update to protect the user.
- The default value for pack.deltacachesize, used by "git repack", is now 256M, instead of unbounded. Otherwise a repack of a moderately sized repository would needlessly eat into swap.
- Document how "git repack" (hence "git gc") interacts with a repository that borrows its objects from other repositories (e.g. ones created by "git clone -s").
- "git show" on an annotated tag lacked a delimiting blank line between the tag itself and the contents of the object it tags.
- "git verify-pack -v" erroneously reported number of objects with too deep delta depths as "chain length 0" objects.
Other minor documentation updates are included.
1.6.4.2
GIT v1.6.4.2 Release Notes ==========================
Fixes since v1.6.4.1 --------------------
- --date=relative output between 1 and 5 years ago rounded the number of years when saying X years Y months ago, instead of rounding it down.
- "git add -p" did not handle changes in executable bits correctly (a regression around 1.6.3).
- "git apply" did not honor GNU diff’s convention to mark the creation/deletion event with UNIX epoch timestamp on missing side.
- "git checkout" incorrectly removed files in a directory pointed by a symbolic link during a branch switch that replaces a directory with a symbolic link.
- "git clean -d -f" happily descended into a subdirectory that is managed by a separate git repository. It now requires two -f options for safety.
- "git fetch/push" over http transports had two rather grave bugs.
- "git format-patch --cover-letter" did not prepare the cover letter file for use with non-ASCII strings when there are the series contributors with non-ASCII names.
- "git pull origin branch" and "git fetch origin && git merge origin/branch" left different merge messages in the resulting commit.
Other minor documentation updates are included.
1.6.4.3
GIT v1.6.4.3 Release Notes ==========================
Fixes since v1.6.4.2 --------------------
- "git clone" from an empty repository gave unnecessary error message, even though it did everything else correctly.
- "git cvsserver" invoked git commands via "git-foo" style, which has long been deprecated.
- "git fetch" and "git clone" had an extra sanity check to verify the presence of the corresponding .pack file before downloading.idx file by issuing a HEAD request. Github server however sometimes gave 500 (Internal server error) response to HEAD even if a GET request for *.pack file to the same URL would have succeeded, and broke clone over HTTP from some of their repositories. As a workaround, this verification has been removed (as it is not absolutely necessary).
- "git grep" did not like relative pathname to refer outside the current directory when run from a subdirectory.
- an error message from "git push" was formatted in a very ugly way.
- "git svn" did not quote the subversion user name correctly when running its author-prog helper program.
Other minor documentation updates are included.
1.6.4.4
GIT v1.6.4.4 Release Notes ==========================
Fixes since v1.6.4.4 --------------------
- The workaround for Github server that sometimes gave 500 (Internal server error) response to HEAD requests in 1.6.4.3 introduced a regression that caused re-fetching projects over http to segfault in certain cases due to uninitialized pointer being freed.
- "git pull" on an unborn branch used to consider anything in the work tree and the index discardable.
- "git diff -b/w" did not work well on the incomplete line at the end of the file, due to an incorrect hashing of lines in the low-level xdiff routines.
- "git checkout-index --prefix=$somewhere" used to work when $somewhere is a symbolic link to a directory elsewhere, but v1.6.4.2 broke it.
- "git unpack-objects --strict", invoked when receive.fsckobjects configuration is set in the receiving repository of "git push", did not properly check the objects, especially the submodule links, it received.
Other minor documentation updates are included.
1.6.4.5
Git v1.6.4.5 Release Notes ==========================
Fixes since v1.6.4.4 --------------------
- Simplified base85 implementation.
- An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
- "git count-objects" did not handle packs larger than 4G.
- "git rev-parse --parseopt --stop-at-non-option" did not stop at non option when --keep-dashdash was in effect.
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
Other minor fixes and documentation updates are included.
1.6.4
GIT v1.6.4 Release Notes ========================
With the next major release, "git push" into a branch that is currently checked out will be refused by default. You can choose what should happen upon such a push by setting the configuration variable receive.denyCurrentBranch in the receiving repository.
To ease the transition plan, the receiving repository of such a push running this release will issue a big warning when the configuration variable is missing. Please refer to:
https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
for more details on the reason why this change is needed and the transition plan.
For a similar reason, "git push $there :$killed" to delete the branch $killed in a remote repository $there, if $killed branch is the current branch pointed at by its HEAD, gets a large warning. You can choose what should happen upon such a push by setting the configuration variable receive.denyDeleteCurrent in the receiving repository.
Updates since v1.6.3 --------------------
(subsystems)
- gitweb Perl style clean-up.
- git-svn updates, including a new --authors-prog option to map author names by invoking an external program, ’git svn reset’ to unwind ’git svn fetch’, support for more than one branches, documenting of the useful --minimize-url feature, new "git svn gc" command, etc.
(portability)
- We feed iconv with "UTF-8" instead of "utf8"; the former is understood more widely. Similarly updated test scripts to use encoding names more widely understood (e.g. use "ISO8859-1" instead of "ISO-8859-1").
- Various portability fixes/workarounds for different vintages of SunOS, IRIX, and Windows.
- Git-over-ssh transport on Windows supports PuTTY plink and TortoisePlink.
(performance)
- Many repeated use of lstat() are optimized out in "checkout" codepath.
- git-status (and underlying git-diff-index --cached) are optimized to take advantage of cache-tree information in the index.
(usability, bells and whistles)
- "git add --edit" lets users edit the whole patch text to fine-tune what is added to the index.
- "git am" accepts StGIT series file as its input.
- "git bisect skip" skips to a more randomly chosen place in the hope to avoid testing a commit that is too close to a commit that is already known to be untestable.
- "git cvsexportcommit" learned -k option to stop CVS keywords expansion
- "git fast-export" learned to handle history simplification more gracefully.
- "git fast-export" learned an option --tag-of-filtered-object to handle dangling tags resulting from history simplification more usefully.
- "git grep" learned -p option to show the location of the match using the same context hunk marker "git diff" uses.
- https transport can optionally be told that the used client certificate is password protected, in which case it asks the password only once.
- "git imap-send" is IPv6 aware.
- "git log --graph" draws graphs more compactly by using horizontal lines when able.
- "git log --decorate" shows shorter refnames by stripping well-known refs/* prefix.
- "git push $name" honors remote.$name.pushurl if present before using remote.$name.url. In other words, the URL used for fetching and pushing can be different.
- "git send-email" understands quoted aliases in .mailrc files (might have to be backported to 1.6.3.X).
- "git send-email" can fetch the sender address from the configuration variable "sendmail.from" (and "sendmail.<identity>.from").
- "git show-branch" can color its output.
- "add" and "update" subcommands to "git submodule" learned --reference option to use local clone with references.
- "git submodule update" learned --rebase option to update checked out submodules by rebasing the local changes.
- "gitweb" can optionally use gravatar to adorn author/committer names.
(developers)
- A major part of the "git bisect" wrapper has moved to C.
- Formatting with the new version of AsciiDoc 8.4.1 is now supported.
Fixes since v1.6.3 ------------------
All of the fixes in v1.6.3.X maintenance series are included in this release, unless otherwise noted.
Here are fixes that this release has, but have not been backported to v1.6.3.X series.
- "git diff-tree -r -t" used to omit new or removed directories from the output. df533f3 (diff-tree -r -t: include added/removed directories in the output, 2009-06-13) may need to be cherry-picked to backport this fix.
- The way Git.pm sets up a Repository object was not friendly to callers that chdir around. It now internally records the repository location as an absolute path when autodetected.
- Removing a section with "git config --remove-section", when its section header has a variable definition on the same line, lost that variable definition.
- "git rebase -p --onto" used to always leave side branches of a merge intact, even when both branches are subject to rewriting.
- "git repack" used to faithfully follow grafts and considered true parents recorded in the commit object unreachable from the commit. After such a repacking, you cannot remove grafts without corrupting the repository.
- "git send-email" did not detect erroneous loops in alias expansion.
1.6.5.1
GIT v1.6.5.1 Release Notes ==========================
Fixes since v1.6.5 ------------------
- An corrupt pack could make codepath to read objects into an infinite loop.
- Download throughput display was always shown in KiB/s but on fast links it is more appropriate to show it in MiB/s.
- "git grep -f filename" used uninitialized variable and segfaulted.
- "git clone -b branch" gave a wrong commit object name to post-checkout hook.
- "git pull" over http did not work on msys.
Other minor documentation updates are included.
1.6.5.2
GIT v1.6.5.2 Release Notes ==========================
Fixes since v1.6.5.1 --------------------
- Installation of templates triggered a bug in busybox when using tar implementation from it.
- "git add -i" incorrectly ignored paths that are already in the index if they matched .gitignore patterns.
- "git describe --always" should have produced some output even there were no tags in the repository, but it didn’t.
- "git ls-files" when showing tracked files incorrectly paid attention to the exclude patterns.
Other minor documentation updates are included.
1.6.5.3
Git v1.6.5.3 Release Notes ==========================
Fixes since v1.6.5.2 --------------------
- info/grafts file didn’t ignore trailing CR at the end of lines.
- Packages generated on newer FC were unreadable by older versions of RPM as the new default is to use stronger hash.
- output from "git blame" was unreadable when the file ended in an incomplete line.
- "git add -i/-p" didn’t handle deletion of empty files correctly.
- "git clone" takes up to two parameters, but did not complain when given more arguments than necessary and silently ignored them.
- "git cvsimport" did not read files given as command line arguments correctly when it is run from a subdirectory.
- "git diff --color-words -U0" didn’t work correctly.
- The handling of blank lines at the end of file by "git diff/apply --whitespace" was inconsistent with the other kinds of errors. They are now colored, warned against, and fixed the same way as others.
- There was no way to allow blank lines at the end of file without allowing extra blanks at the end of lines. You can use blank-at-eof and blank-at-eol whitespace error class to specify them separately. The old trailing-space error class is now a short-hand to set both.
- "-p" option to "git format-patch" was supposed to suppress diffstat generation, but it was broken since 1.6.1.
- "git imap-send" did not compile cleanly with newer OpenSSL.
- "git help -a" outside of a git repository was broken.
- "git ls-files -i" was supposed to be inverse of "git ls-files" without -i with respect to exclude patterns, but it was broken since 1.6.5.2.
- "git ls-remote" outside of a git repository over http was broken.
- "git rebase -i" gave bogus error message when the command word was misspelled.
- "git receive-pack" that is run in response to "git push" did not run garbage collection nor update-server-info, but in larger hosting sites, these almost always need to be run. To help site administrators, the command now runs "gc --auto" and "u-s-i" by setting receive.autogc and receive.updateserverinfo configuration variables, respectively.
- Release notes spelled the package name with incorrect capitalization.
- "gitweb" did not escape non-ascii characters correctly in the URL.
- "gitweb" showed "patch" link even for merge commits.
- "gitweb" showed incorrect links for blob line numbers in pathinfo mode.
Other minor documentation updates are included.
1.6.5.4
Git v1.6.5.4 Release Notes ==========================
Fixes since v1.6.5.3 --------------------
- "git help" (without argument) used to check if you are in a directory under git control. There was no breakage in behaviour per-se, but this was unnecessary.
- "git prune-packed" gave progress output even when its standard error is not connected to a terminal; this caused cron jobs that run it to produce cruft.
- "git pack-objects --all-progress" is an option to ask progress output from write-object phase if progress output were to be produced, and shouldn’t have forced the progress output.
- "git apply -p<n> --directory=<elsewhere>" did not work well for a non-default value of n.
- "git merge foo HEAD" was misparsed as an old-style invocation of the command and produced a confusing error message. As it does not specify any other branch to merge, it shouldn’t be mistaken as such. We will remove the old style "git merge <message> HEAD <commit>…" syntax in future versions, but not in this release,
- "git merge -m <message> <branch>…" added the standard merge message on its own after user-supplied message, which should have overridden the standard one.
Other minor documentation updates are included.
1.6.5.5
Git v1.6.5.5 Release Notes ==========================
Fixes since v1.6.5.4 --------------------
- Manual pages can be formatted with older xmlto again.
- GREP_OPTIONS exported from user’s environment could have broken our scripted commands.
- In configuration files, a few variables that name paths can begin with ~/ and ~username/ and they are expanded as expected. This is not a bugfix but 1.6.6 will have this and without backporting users cannot easily use the same ~/.gitconfig across versions.
- "git diff -B -M" did the same computation to hash lines of contents twice, and held onto memory after it has used the data in it unnecessarily before it freed.
- "git diff -B" and "git diff --dirstat" was not counting newly added contents correctly.
- "git format-patch revisions… — path" issued an incorrect error message that suggested to use "--" on the command line when path does not exist in the current work tree (it is a separate matter if it makes sense to limit format-patch with pathspecs like that without using the --full-diff option).
- "git grep -F -i StRiNg" did not work as expected.
- Enumeration of available merge strategies iterated over the list of commands in a wrong way, sometimes producing an incorrect result.
- "git shortlog" did not honor the "encoding" header embedded in the commit object like "git log" did.
- Reading progress messages that come from the remote side while running "git pull" is given precedence over reading the actual pack data to prevent garbled progress message on the user’s terminal.
- "git rebase" got confused when the log message began with certain strings that looked like Subject:, Date: or From: header.
- "git reset" accidentally run in .git/ directory checked out the work tree contents in there.
Other minor documentation updates are included.
1.6.5.6
Git v1.6.5.6 Release Notes ==========================
Fixes since v1.6.5.5 --------------------
- "git add -p" had a regression since v1.6.5.3 that broke deletion of non-empty files.
- "git archive -o o.zip — Makefile" produced an archive in o.zip but in POSIX tar format.
- Error message given to "git pull --rebase" when the user didn’t give enough clue as to what branch to integrate with still talked about "merging with" the branch.
- Error messages given by "git merge" when the merge resulted in a fast-forward still were in plumbing lingo, even though in v1.6.5 we reworded messages in other cases.
- The post-upload-hook run by upload-pack in response to "git fetch" has been removed, due to security concerns (the hook first appeared in 1.6.5).
1.6.5.7
Git v1.6.5.7 Release Notes ==========================
Fixes since v1.6.5.6 --------------------
- If a user specifies a color for a <slot> (i.e. a class of things to show in a particular color) that is known only by newer versions of git (e.g. "color.diff.func" was recently added for upcoming 1.6.6 release), an older version of git should just ignore them. Instead we diagnosed it as an error.
- With help.autocorrect set to non-zero value, the logic to guess typos in the subcommand name misfired and ran a random nonsense command.
- If a command is run with an absolute path as a pathspec inside a bare repository, e.g. "rev-list HEAD — /home", the code tried to run strlen() on NULL, which is the result of get_git_work_tree(), and segfaulted.
1.6.5.8
Git v1.6.5.8 Release Notes ==========================
Fixes since v1.6.5.7 --------------------
- "git count-objects" did not handle packfiles that are bigger than 4G on platforms with 32-bit off_t.
- "git rebase -i" did not abort cleanly if it failed to launch the editor.
- "git blame" did not work well when commit lacked the author name.
- "git fast-import" choked when handling a tag that points at an object that is not a commit.
- "git reset --hard" did not work correctly when GIT_WORK_TREE environment variable is used to point at the root of the true work tree.
- "git grep" fed a buffer that is not NUL-terminated to underlying regexec().
- "git checkout -m other" while on a branch that does not have any commit segfaulted, instead of failing.
- "git branch -a other" should have diagnosed the command as an error.
Other minor documentation updates are also included.
1.6.5.9
Git v1.6.5.9 Release Notes ==========================
Fixes since v1.6.5.8 --------------------
- An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
- "git blame -L $start,$end" segfaulted when too large $start was given.
- "git rev-parse --parseopt --stop-at-non-option" did not stop at non option when --keep-dashdash was in effect.
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
Other minor fixes and documentation updates are included.
1.6.5
GIT v1.6.5 Release Notes ========================
In git 1.7.0, which was planned to be the release after 1.6.5, "git push" into a branch that is currently checked out will be refused by default.
You can choose what should happen upon such a push by setting the configuration variable receive.denyCurrentBranch in the receiving repository.
Also, "git push $there :$killed" to delete the branch $killed in a remote repository $there, when $killed branch is the current branch pointed at by its HEAD, will be refused by default.
You can choose what should happen upon such a push by setting the configuration variable receive.denyDeleteCurrent in the receiving repository.
To ease the transition plan, the receiving repository of such a push running this release will issue a big warning when the configuration variable is missing. Please refer to:
https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
for more details on the reason why this change is needed and the transition plan.
Updates since v1.6.4 --------------------
(subsystems)
- various updates to gitk, git-svn and gitweb.
(portability)
- more improvements on mingw port.
- mingw will also give FRSX as the default value for the LESS environment variable when the user does not have one.
- initial support to compile git on Windows with MSVC.
(performance)
- On major platforms, the system can be compiled to use with Linus’s block-sha1 implementation of the SHA-1 hash algorithm, which outperforms the default fallback implementation we borrowed from Mozilla.
- Unnecessary inefficiency in deepening of a shallow repository has been removed.
- "git clone" does not grab objects that it does not need (i.e. referenced only from refs outside refs/heads and refs/tags hierarchy) anymore.
- The "git" main binary used to link with libcurl, which then dragged in a large number of external libraries. When using basic plumbing commands in scripts, this unnecessarily slowed things down. We now implement http/https/ftp transfer as a separate executable as we used to.
- "git clone" run locally hardlinks or copies the files in .git/ to newly created repository. It used to give new mtime to copied files, but this delayed garbage collection to trigger unnecessarily in the cloned repository. We now preserve mtime for these files to avoid this issue.
(usability, bells and whistles)
- Human writable date format to various options, e.g. --since=yesterday, master@{2000.09.17}, are taught to infer some omitted input properly.
- A few programs gave verbose "advice" messages to help uninitiated people when issuing error messages. An infrastructure to allow users to squelch them has been introduced, and a few such messages can be silenced now.
- refs/replace/ hierarchy is designed to be usable as a replacement of the "grafts" mechanism, with the added advantage that it can be transferred across repositories.
- "git am" learned to optionally ignore whitespace differences.
- "git am" handles input e-mail files that has CRLF line endings sensibly.
- "git am" learned "--scissors" option to allow you to discard early part of an incoming e-mail.
- "git archive -o output.zip" works without being told what format to use with an explicit "--format=zip".option.
- "git checkout", "git reset" and "git stash" learned to pick and choose to use selected changes you made, similar to "git add -p".
- "git clone" learned a "-b" option to pick a HEAD to check out different from the remote’s default branch.
- "git clone" learned --recursive option.
- "git clone" from a local repository on a different filesystem used to copy individual object files without preserving the old timestamp, giving them extra lifetime in the new repository until they gc’ed.
- "git commit --dry-run $args" is a new recommended way to ask "what would happen if I try to commit with these arguments."
- "git commit --dry-run" and "git status" shows conflicted paths in a separate section to make them easier to spot during a merge.
- "git cvsimport" now supports password-protected pserver access even when the password is not taken from ~/.cvspass file.
- "git fast-export" learned --no-data option that can be useful when reordering commits and trees without touching the contents of blobs.
- "git fast-import" has a pair of new front-end in contrib/ area.
- "git init" learned to mkdir/chdir into a directory when given an extra argument (i.e. "git init this").
- "git instaweb" optionally can use mongoose as the web server.
- "git log --decorate" can optionally be told with --decorate=full to give the reference name in full.
- "git merge" issued an unnecessarily scary message when it detected that the merge may have to touch the path that the user has local uncommitted changes to. The message has been reworded to make it clear that the command aborted, without doing any harm.
- "git push" can be told to be --quiet.
- "git push" pays attention to url.$base.pushInsteadOf and uses a URL that is derived from the URL used for fetching.
- informational output from "git reset" that lists the locally modified paths is made consistent with that of "git checkout $another_branch".
- "git submodule" learned to give submodule name to scripts run with "foreach" subcommand.
- various subcommands to "git submodule" learned --recursive option.
- "git submodule summary" learned --files option to compare the work tree vs the commit bound at submodule path, instead of comparing the index.
- "git upload-pack", which is the server side support for "git clone" and "git fetch", can call a new post-upload-pack hook for statistics purposes.
(developers)
- With GIT_TEST_OPTS="--root=/p/a/t/h", tests can be run outside the source directory; using tmpfs may give faster turnaround.
- With NO_PERL_MAKEMAKER set, DESTDIR= is now honoured, so you can build for one location, and install into another location to tar it up.
Fixes since v1.6.4 ------------------
All of the fixes in v1.6.4.X maintenance series are included in this release, unless otherwise noted.
1.6.6.1
Git v1.6.6.1 Release Notes ==========================
Fixes since v1.6.6 ------------------
- "git blame" did not work well when commit lacked the author name.
- "git branch -a name" wasn’t diagnosed as an error.
- "git count-objects" did not handle packfiles that are bigger than 4G on platforms with 32-bit off_t.
- "git checkout -m other" while on a branch that does not have any commit segfaulted, instead of failing.
- "git fast-import" choked when fed a tag that do not point at a commit.
- "git grep" finding from work tree files could have fed garbage to the underlying regexec(3).
- "git grep -L" didn’t show empty files (they should never match, and they should always appear in -L output as unmatching).
- "git rebase -i" did not abort cleanly if it failed to launch the editor.
- "git reset --hard" did not work correctly when GIT_WORK_TREE environment variable is used to point at the root of the true work tree.
- http-backend was not listed in the command list in the documentation.
- Building on FreeBSD (both 7 and 8) needs OLD_ICONV set in the Makefile
- "git checkout -m some-branch" while on an unborn branch crashed.
Other minor documentation updates are included.
1.6.6.2
Git v1.6.6.2 Release Notes ==========================
Fixes since v1.6.6.1 --------------------
- recursive merge didn’t correctly diagnose its own programming errors, and instead caused the caller to segfault.
- The new "smart http" aware clients probed the web servers to see if they support smart http, but did not fall back to dumb http transport correctly with some servers.
- Time based reflog syntax e.g. "@{yesterday}" didn’t diagnose a misspelled time specification and instead assumed "@{now}".
- "git archive HEAD — no-such-directory" produced an empty archive without complaining.
- "git blame -L start,end — file" misbehaved when given a start that is larger than the number of lines in the file.
- "git checkout -m" didn’t correctly call custom merge backend supplied by the end user.
- "git config -f <file>" misbehaved when run from a subdirectory.
- "git cvsserver" didn’t like having regex metacharacters (e.g. ’+’) in CVSROOT environment.
- "git fast-import" did not correctly handle large blobs that may bust the pack size limit.
- "git gui" is supposed to work even when launched from inside a .git directory.
- "git gui" misbehaved when applying a hunk that ends with deletion.
- "git imap-send" did not honor imap.preformattedHTML as documented.
- "git log" family incorrectly showed the commit notes unconditionally by mistake, which was especially irritating when running "git log --oneline".
- "git status" shouldn’t require an write access to the repository.
Other minor documentation updates are included.
1.6.6.3
Git v1.6.6.3 Release Notes ==========================
Fixes since v1.6.6.2 --------------------
- An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
- "git bisect $path" did not correctly diagnose an error when given a non-existent path.
- "git blame -L $start,$end" segfaulted when too large $start was given.
- "git imap-send" did not write draft box with CRLF line endings per RFC.
- "git rev-parse --parseopt --stop-at-non-option" did not stop at non option when --keep-dashdash was in effect.
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
Other minor fixes and documentation updates are included.
1.6.6
Git v1.6.6 Release Notes ========================
Notes on behaviour change -------------------------
- In this release, "git fsck" defaults to "git fsck --full" and checks packfiles, and because of this it will take much longer to complete than before. If you prefer a quicker check only on loose objects (the old default), you can say "git fsck --no-full". This has been supported by 1.5.4 and newer versions of git, so it is safe to write it in your script even if you use slightly older git on some of your machines.
Preparing yourselves for compatibility issues in 1.7.0 ------------------------------------------------------
In git 1.7.0, which is planned to be the release after 1.6.6, there will be a handful of behaviour changes that will break backward compatibility.
These changes were discussed long time ago and existing behaviours have been identified as more problematic to the userbase than keeping them for the sake of backward compatibility.
When necessary, a transition strategy for existing users has been designed not to force them running around setting configuration variables and updating their scripts in order to either keep the traditional behaviour or adjust to the new behaviour, on the day their sysadmin decides to install the new version of git. When we switched from "git-foo" to "git foo" in 1.6.0, even though the change had been advertised and the transition guide had been provided for a very long time, the users procrastinated during the entire transition period, and ended up panicking on the day their sysadmins updated their git installation. We are trying to avoid repeating that unpleasantness in the 1.7.0 release.
For changes decided to be in 1.7.0, commands that will be affected have been much louder to strongly discourage such procrastination, and they continue to be in this release. If you have been using recent versions of git, you would have seen warnings issued when you used features whose behaviour will change, with a clear instruction on how to keep the existing behaviour if you want to. You hopefully are already well prepared.
Of course, we have also been giving "this and that will change in 1.7.0; prepare yourselves" warnings in the release notes and announcement messages for the past few releases. Let’s see how well users will fare this time.
- "git push" into a branch that is currently checked out (i.e. pointed by HEAD in a repository that is not bare) will be refused by default.
Similarly, "git push $there :$killed" to delete the branch $killed
in a remote repository $there, when $killed branch is the current
branch pointed at by its HEAD, will be refused by default.
Setting the configuration variables receive.denyCurrentBranch and
receive.denyDeleteCurrent to 'ignore' in the receiving repository
can be used to override these safety features. Versions of git
since 1.6.2 have issued a loud warning when you tried to do these
operations without setting the configuration, so repositories of
people who still need to be able to perform such a push should
already have been future proofed.
Please refer to:
https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/GitFaq.html#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
for more details on the reason why this change is needed and the
transition process that already took place so far.
- "git send-email" will not make deep threads by default when sending a patch series with more than two messages. All messages will be sent as a reply to the first message, i.e. cover letter. Git 1.6.6 (this release) will issue a warning about the upcoming default change, when it uses the traditional "deep threading" behaviour as the built-in default. To squelch the warning but still use the "deep threading" behaviour, give --chain-reply-to option or set sendemail.chainreplyto to true.
It has been possible to configure send-email to send "shallow thread"
by setting sendemail.chainreplyto configuration variable to false.
The only thing 1.7.0 release will do is to change the default when
you haven't configured that variable.
- "git status" will not be "git commit --dry-run". This change does not affect you if you run the command without pathspec.
Nobody sane found the current behaviour of "git status Makefile" useful
nor meaningful, and it confused users. "git commit --dry-run" has been
provided as a way to get the current behaviour of this command since
1.6.5.
- "git diff" traditionally treated various "ignore whitespace" options only as a way to filter the patch output. "git diff --exit-code -b" exited with non-zero status even if all changes were about changing the amount of whitespace and nothing else. and "git diff -b" showed the "diff --git" header line for such a change without patch text.
In 1.7.0, the "ignore whitespaces" will affect the semantics of the
diff operation itself. A change that does not affect anything but
whitespaces will be reported with zero exit status when run with
--exit-code, and there will not be "diff --git" header for such a
change.
Updates since v1.6.5 --------------------
(subsystems)
- various gitk updates including use of themed widgets under Tk 8.5, Japanese translation, a fix to a bug when running "gui blame" from a subdirectory, etc.
- various git-gui updates including new translations, wm states fixes, Tk bug workaround after quitting, improved heuristics to trigger gc, etc.
- various git-svn updates.
- "git fetch" over http learned a new mode that is different from the traditional "dumb commit walker".
(portability)
- imap-send can be built on mingw port.
(performance)
- "git diff -B" has smaller memory footprint.
(usability, bells and whistles)
- The object replace mechanism can be bypassed with --no-replace-objects global option given to the "git" program.
- In configuration files, a few variables that name paths can begin with ~/ and ~username/ and they are expanded as expected.
- "git subcmd -h" now shows short usage help for many more subcommands.
- "git bisect reset" can reset to an arbitrary commit.
- "git checkout frotz" when there is no local branch "frotz" but there is only one remote tracking branch "frotz" is taken as a request to start the named branch at the corresponding remote tracking branch.
- "git commit -c/-C/--amend" can be told with a new "--reset-author" option to ignore authorship information in the commit it is taking the message from.
- "git describe" can be told to add "-dirty" suffix with "--dirty" option.
- "git diff" learned --submodule option to show a list of one-line logs instead of differences between the commit object names.
- "git diff" learned to honor diff.color.func configuration to paint function name hint printed on the hunk header "@@ -j,k +l,m @@" line in the specified color.
- "git fetch" learned --all and --multiple options, to run fetch from many repositories, and --prune option to remove remote tracking branches that went stale. These make "git remote update" and "git remote prune" less necessary (there is no plan to remove "remote update" nor "remote prune", though).
- "git fsck" by default checks the packfiles (i.e. "--full" is the default); you can turn it off with "git fsck --no-full".
- "git grep" can use -F (fixed strings) and -i (ignore case) together.
- import-tars contributed fast-import frontend learned more types of compressed tarballs.
- "git instaweb" knows how to talk with mod_cgid to apache2.
- "git log --decorate" shows the location of HEAD as well.
- "git log" and "git rev-list" learned to take revs and pathspecs from the standard input with the new "--stdin" option.
- "--pretty=format" option to "log" family of commands learned:
-
to wrap text with the "%w()" specifier.
-
to show reflog information with "%g[sdD]" specifier.
- "git notes" command to annotate existing commits.
- "git merge" (and "git pull") learned --ff-only option to make it fail if the merge does not result in a fast-forward.
- "git mergetool" learned to use p4merge.
- "git rebase -i" learned "reword" that acts like "edit" but immediately starts an editor to tweak the log message without returning control to the shell, which is done by "edit" to give an opportunity to tweak the contents.
- "git send-email" can be told with "--envelope-sender=auto" to use the same address as "From:" address as the envelope sender address.
- "git send-email" will issue a warning when it defaults to the --chain-reply-to behaviour without being told by the user and instructs to prepare for the change of the default in 1.7.0 release.
- In "git submodule add <repository> <path>", <path> is now optional and inferred from <repository> the same way "git clone <repository>" does.
- "git svn" learned to read SVN 1.5+ and SVK merge tickets.
- "git svn" learned to recreate empty directories tracked only by SVN.
- "gitweb" can optionally render its "blame" output incrementally (this requires JavaScript on the client side).
Fixes since v1.6.5 ------------------
All of the fixes in v1.6.5.X maintenance series are included in this release, unless otherwise noted.
1.7.0.1
Git v1.7.0.1 Release Notes ==========================
Fixes since v1.7.0 ------------------
- In a freshly created repository "rev-parse HEAD^0" complained that it is dangling symref, even though "rev-parse HEAD" didn’t.
- "git show :no-such-name" tried to access the index without bounds check, leading to a potential segfault.
- Message from "git cherry-pick" was harder to read and use than necessary when it stopped due to conflicting changes.
- We referred to ".git/refs/" throughout the documentation when we meant to talk about abstract notion of "ref namespace". Because people’s repositories often have packed refs these days, this was confusing.
- "git diff --output=/path/that/cannot/be/written" did not correctly error out.
- "git grep -e -pattern-that-begin-with-dash paths…" could not be spelled as "git grep — -pattern-that-begin-with-dash paths…" which would be a GNU way to use "--" as "end of options".
- "git grep" compiled with threading support tried to access an uninitialized mutex on boxes with a single CPU.
- "git stash pop -q --index" failed because the unnecessary --index option was propagated to "git stash drop" that is internally run at the end.
And other minor fixes and documentation updates.
1.7.0.2
Git v1.7.0.2 Release Notes ==========================
Fixes since v1.7.0.1 --------------------
- GIT_PAGER was not honored consistently by some scripted Porcelains, most notably "git am".
- updating working tree files after telling git to add them to the index and while it is still working created garbage object files in the repository without diagnosing it as an error.
- "git bisect — pathspec…" did not diagnose an error condition properly when the simplification with given pathspec made the history empty.
- "git rev-list --cherry-pick A…B" now has an obvious optimization when the histories haven’t diverged (i.e. when one end is an ancestor of the other).
- "git diff --quiet -w" did not work as expected.
- "git fast-import" didn’t work with a large input, as it lacked support for producing the pack index in v2 format.
- "git imap-send" didn’t use CRLF line endings over the imap protocol when storing its payload to the draft box, violating RFC 3501.
- "git log --format=’%w(x,y,z)%b’" and friends that rewrap message has been optimized for utf-8 payload.
- Error messages generated on the receiving end did not come back to "git push".
- "git status" in 1.7.0 lacked the optimization we used to have in 1.6.X series to speed up scanning of large working tree.
- "gitweb" did not diagnose parsing errors properly while reading its configuration file.
And other minor fixes and documentation updates.
1.7.0.3
Git v1.7.0.3 Release Notes ==========================
Fixes since v1.7.0.2 --------------------
- Object files are created in a more ACL friendly way in repositories where group permission is ACL controlled.
- "git add -i" didn’t handle a deleted path very well.
- "git blame" padded line numbers with one extra SP when the total number of lines was one less than multiple of ten due to an off-by-one error.
- "git fetch --all/--multi" used to discard information for remotes that are fetched earlier.
- "git log -g branch" misbehaved when there was no entries in the reflog for the named branch.
- "git mailinfo" (hence "git am") incorrectly removed initial indent from paragraphs.
- "git prune" and "git reflog" (hence "git gc" as well) didn’t honor an instruction never to expire by setting gc.reflogexpire to never.
- "git push" misbehaved when branch.<name>.merge was configured without matching branch.<name>.remote.
And other minor fixes and documentation updates.
1.7.0.4
Git v1.7.0.4 Release Notes ==========================
Fixes since v1.7.0.3 --------------------
- Optimized ntohl/htonl on big-endian machines were broken.
- Color values given to "color.<cmd>.<slot>" configuration can now have more than one attributes (e.g. "bold ul").
- "git add -u nonexistent-path" did not complain.
- "git apply --whitespace=fix" didn’t work well when an early patch in a patch series adds trailing blank lines and a later one depended on such a block of blank lines at the end.
- "git fast-export" didn’t check error status and stop when marks file cannot be opened.
- "git format-patch --ignore-if-in-upstream" gave unwarranted errors when the range was empty, instead of silently finishing.
- "git remote prune" did not detect remote tracking refs that became dangling correctly.
And other minor fixes and documentation updates.
1.7.0.5
Git v1.7.0.5 Release Notes ==========================
Fixes since v1.7.0.4 --------------------
- "git daemon" failed to compile on platforms without sockaddr_storage type.
- Output from "git rev-list --pretty=oneline" was unparsable when a commit did not have any message, which is abnormal but possible in a repository converted from foreign scm.
- "git stash show <commit-that-is-not-a-stash>" gave an error message that was not so useful. Reworded the message to "<it> is not a stash".
- Python scripts in contrib/ area now start with "#!/usr/bin/env python" to honor user’s PATH.
- "git imap-send" used to mistake any line that begins with "From " as a message separator in format-patch output.
- Smart http server backend failed to report an internal server error and infinitely looped instead after output pipe was closed.
And other minor fixes and documentation updates.
1.7.0.6
Git v1.7.0.6 Release Notes ==========================
Fixes since v1.7.0.5 --------------------
- "git diff --stat" used "int" to count the size of differences, which could result in overflowing.
- "git rev-list --abbrev-commit" defaulted to 40-byte abbreviations, unlike newer tools in the git toolset.
And other minor fixes and documentation updates.
1.7.0.7
Git v1.7.0.7 Release Notes ==========================
Fixes since v1.7.0.6 --------------------
- "make NO_CURL=NoThanks install" was broken.
- An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
- "git config --path conf.var" to attempt to expand a variable conf.var that uses "~/" short-hand segfaulted when $HOME environment variable was not set.
And other minor fixes and documentation updates.
1.7.0.8
Git v1.7.0.8 Release Notes ==========================
This is primarily to backport support for the new "add.ignoreErrors" name given to the existing "add.ignore-errors" configuration variable.
The next version, Git 1.7.4, and future versions, will support both old and incorrect name and the new corrected name, but without this backport, users who want to use the new name "add.ignoreErrors" in their repositories cannot use older versions of Git.
1.7.0.9
Git v1.7.0.9 Release Notes ==========================
Fixes since v1.7.0.8 --------------------
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
1.7.0
Git v1.7.0 Release Notes ========================
Notes on behaviour change -------------------------
- "git push" into a branch that is currently checked out (i.e. pointed at by HEAD in a repository that is not bare) is refused by default.
Similarly, "git push $there :$killed" to delete the branch $killed
in a remote repository $there, when $killed branch is the current
branch pointed at by its HEAD, will be refused by default.
Setting the configuration variables receive.denyCurrentBranch and
receive.denyDeleteCurrent to 'ignore' in the receiving repository
can be used to override these safety features.
- "git send-email" does not make deep threads by default when sending a patch series with more than two messages. All messages will be sent as a reply to the first message, i.e. cover letter.
It has been possible already to configure send-email to send "shallow thread"
by setting sendemail.chainreplyto configuration variable to false. The
only thing this release does is to change the default when you haven't
configured that variable.
- "git status" is not "git commit --dry-run" anymore. This change does not affect you if you run the command without argument.
- "git diff" traditionally treated various "ignore whitespace" options only as a way to filter the patch output. "git diff --exit-code -b" exited with non-zero status even if all changes were about changing the amount of whitespace and nothing else; and "git diff -b" showed the "diff --git" header line for such a change without patch text.
In this release, the "ignore whitespaces" options affect the semantics
of the diff operation. A change that does not affect anything but
whitespaces is reported with zero exit status when run with
--exit-code, and there is no "diff --git" header for such a change.
- External diff and textconv helpers are now executed using the shell. This makes them consistent with other programs executed by git, and allows you to pass command-line parameters to the helpers. Any helper paths containing spaces or other metacharacters now need to be shell-quoted. The affected helpers are GIT_EXTERNAL_DIFF in the environment, and diff..command and diff..textconv in the config file.
- The --max-pack-size argument to ’git repack’, ’git pack-objects’, and ’git fast-import’ was assuming the provided size to be expressed in MiB, unlike the corresponding config variable and other similar options accepting a size value. It is now expecting a size expressed in bytes, with a possible unit suffix of ’k’, ’m’, or ’g’.
Updates since v1.6.6 --------------------
(subsystems)
- "git fast-import" updates; adds "option" and "feature" to detect the mismatch between fast-import and the frontends that produce the input stream.
- "git svn" support of subversion "merge tickets" and miscellaneous fixes.
- "gitk" and "git gui" translation updates.
- "gitweb" updates (code clean-up, load checking etc.)
(portability)
- Some more MSVC portability patches for msysgit port.
- Minimum Pthreads emulation for msysgit port.
(performance)
- More performance improvement patches for msysgit port.
(usability, bells and whistles)
- More commands learned "--quiet" and "--[no-]progress" options.
- Various commands given by the end user (e.g. diff.type.textconv, and GIT_EDITOR) can be specified with command line arguments. E.g. it is now possible to say "[diff "utf8doc"] textconv = nkf -w".
- "sparse checkout" feature allows only part of the work tree to be checked out.
- HTTP transfer can use authentication scheme other than basic (i.e./e.g. digest).
- Switching from a version of superproject that used to have a submodule to another version of superproject that no longer has it did not remove the submodule directory when it should (namely, when you are not interested in the submodule at all and didn’t clone/checkout).
- A new attribute conflict-marker-size can be used to change the size of the conflict markers from the default 7; this is useful when tracked contents (e.g. git-merge documentation) have strings that resemble the conflict markers.
- A new syntax "<branch>@{upstream}" can be used on the command line to substitute the name of the "upstream" of the branch. Missing branch defaults to the current branch, so "git fetch && git merge @{upstream}" will be equivalent to "git pull".
- "git am --resolved" has a synonym "git am --continue".
- "git branch --set-upstream" can be used to update the (surprise!) upstream, i.e. where the branch is supposed to pull and merge from (or rebase onto).
- "git checkout A…B" is a way to detach HEAD at the merge base between A and B.
- "git checkout -m path" to reset the work tree file back into the conflicted state works even when you already ran "git add path" and resolved the conflicts.
- "git commit --date=’<date>’" can be used to override the author date just like "git commit --author=’<name> <email>’" can be used to override the author identity.
- "git commit --no-status" can be used to omit the listing of the index and the work tree status in the editor used to prepare the log message.
- "git commit" warns a bit more aggressively until you configure user.email, whose default value almost always is not (and fundamentally cannot be) what you want.
- "git difftool" has been extended to make it easier to integrate it with gitk.
- "git fetch --all" can now be used in place of "git remote update".
- "git grep" does not rely on external grep anymore. It can use more than one thread to accelerate the operation.
- "git grep" learned "--quiet" option.
- "git log" and friends learned "--glob=heads/*" syntax that is a more flexible way to complement "--branches/--tags/--remotes".
- "git merge" learned to pass options specific to strategy-backends. E.g.
- "git merge -Xsubtree=path/to/directory" can be used to tell the subtree strategy how much to shift the trees explicitly.
- "git merge -Xtheirs" can be used to auto-merge as much as possible, while discarding your own changes and taking merged version in conflicted regions.
- "git push" learned "git push origin --delete branch", a syntactic sugar for "git push origin :branch".
- "git push" learned "git push --set-upstream origin forker:forkee" that lets you configure your "forker" branch to later pull from "forkee" branch at "origin".
- "git rebase --onto A…B" means the history is replayed on top of the merge base between A and B.
- "git rebase -i" learned new action "fixup" that squashes the change but does not affect existing log message.
- "git rebase -i" also learned --autosquash option that is useful together with the new "fixup" action.
- "git remote" learned set-url subcommand that updates (surprise!) url for an existing remote nickname.
- "git rerere" learned "forget path" subcommand. Together with "git checkout -m path" it will be useful when you recorded a wrong resolution.
- Use of "git reset --merge" has become easier when resetting away a conflicted mess left in the work tree.
- "git rerere" had rerere.autoupdate configuration but there was no way to countermand it from the command line; --no-rerere-autoupdate option given to "merge", "revert", etc. fixes this.
- "git status" learned "-s(hort)" output format.
(developers)
- The infrastructure to build foreign SCM interface has been updated.
- Many more commands are now built-in.
- THREADED_DELTA_SEARCH is no more. If you build with threads, delta compression will always take advantage of it.
Fixes since v1.6.6 ------------------
All of the fixes in v1.6.6.X maintenance series are included in this release, unless otherwise noted.
- "git branch -d branch" used to refuse deleting the branch even when the branch is fully merged to its upstream branch if it is not merged to the current branch. It now deletes it in such a case.
- "filter-branch" command incorrectly said --prune-empty and --filter-commit were incompatible; the latter should be read as --commit-filter.
- When using "git status" or asking "git diff" to compare the work tree with something, they used to consider that a checked-out submodule with uncommitted changes is not modified; this could cause people to forget committing these changes in the submodule before committing in the superproject. They now consider such a change as a modification and "git diff" will append a "-dirty" to the work tree side when generating patch output or when used with the --submodule option.
1.7.1.1
Git v1.7.1.1 Release Notes ==========================
Fixes since v1.7.1 ------------------
- Authentication over http transport can now be made lazily, in that the request can first go to a URL without username, get a 401 response and then the client will ask for the username to use.
- We used to mistakenly think "../work" is a subdirectory of the current directory when we are in "../work-xyz".
- The attribute mechanism now allows an entry that uses an attribute macro that set/unset one attribute, immediately followed by an overriding setting; this makes attribute macros much easier to use.
- We didn’t recognize timezone "Z" as a synonym for "UTC" (75b37e70).
- In 1.7.0, read-tree and user commands that use the mechanism such as checkout and merge were fixed to handle switching between branches one of which has a file while the other has a directory at the same path correctly even when there are some "confusing" pathnames in them. But the algorithm used for this fix was suboptimal and had a terrible performance degradation especially in larger trees.
- "git am -3" did not show diagnosis when the patch in the message was corrupt.
- After "git apply --whitespace=fix" removed trailing blank lines in an patch in a patch series, it failed to apply later patches that depend on the presence of such blank lines.
- "git bundle --stdin" segfaulted.
- "git checkout" and "git rebase" overwrote paths that are marked "assume unchanged".
- "git commit --amend" on a commit with an invalid author-name line that lacks the display name didn’t work.
- "git describe" did not tie-break tags that point at the same commit correctly; newer ones are preferred by paying attention to the tagger date now.
- "git diff" used to tell underlying xdiff machinery to work very hard to minimize the output, but this often was spending too many extra cycles for very little gain.
- "git diff --color" did not paint extended diff headers per line (i.e. the coloring escape sequence didn’t end at the end of line), which confused "less -R".
- "git fetch" over HTTP verifies the downloaded packfiles more robustly.
- The memory usage by "git index-pack" (run during "git fetch" and "git push") got leaner.
- "GIT_DIR=foo.git git init --bare bar.git" created foo.git instead of bar.git.
- "git log --abbrev=$num --format=’%h’ ignored --abbrev=$num.
- "git ls-files ../out/side/cwd" refused to work.
- "git merge --log" used to replace the custom message given by "-m" with the shortlog, instead of appending to it.
- "git notes copy" without any other argument segfaulted.
- "git pull" accepted "--dry-run", gave it to underlying "git fetch" but ignored the option itself, resulting in a bogus attempt to merge unrelated commit.
- "git rebase" did not faithfully reproduce a malformed author ident, that is often seen in a repository converted from foreign SCMs.
- "git reset --hard" started from a wrong directory and a working tree in a nonstandard location is in use got confused.
- "git send-email" lacked a way to specify the domainname used in the EHLO/HELO exchange, causing rejected connection from picky servers. It learned --smtp-domain option to solve this issue.
- "git send-email" did not declare a content-transfer-encoding and content-type even when its payload needs to be sent in 8-bit.
- "git show -C -C" and other corner cases lost diff metainfo output in 1.7.0.
- "git stash" incorrectly lost paths in the working tree that were previously removed from the index.
- "git status" stopped refreshing the index by mistake in 1.7.1.
- "git status" showed excess "hints" even when advice.statusHints is set to false.
And other minor fixes and documentation updates.
1.7.1.2
Git v1.7.1.2 Release Notes ==========================
Fixes since v1.7.1.1 --------------------
- "git commit" did not honor GIT_REFLOG_ACTION environment variable, resulting reflog messages for cherry-pick and revert actions to be recorded as "commit".
- "git clone/fetch/pull" issued an incorrect error message when a ref and a symref that points to the ref were updated at the same time. This obviously would update them to the same value, and should not result in an error condition.
- "git diff" inside a tree with many pathnames that have certain characters has become very slow in 1.7.0 by mistake.
- "git rev-parse --parseopt --stop-at-non-option" did not stop at non option when --keep-dashdash was in effect.
- An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
- "git config --path conf.var" to attempt to expand a variable conf.var that uses "~/" short-hand segfaulted when $HOME environment variable was not set.
And other minor fixes and documentation updates.
1.7.1.3
Git v1.7.1.3 Release Notes ==========================
This is primarily to backport support for the new "add.ignoreErrors" name given to the existing "add.ignore-errors" configuration variable.
The next version, Git 1.7.4, and future versions, will support both old and incorrect name and the new corrected name, but without this backport, users who want to use the new name "add.ignoreErrors" in their repositories cannot use older versions of Git.
1.7.1.4
Git v1.7.1.4 Release Notes ==========================
Fixes since v1.7.1.3 --------------------
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
1.7.1
Git v1.7.1 Release Notes ========================
Updates since v1.7.0 --------------------
- Eric Raymond is the maintainer of updated CIAbot scripts, in contrib/.
- gitk updates.
- Some commands (e.g. svn and http interfaces) that interactively ask for a password can be told to use an external program given via GIT_ASKPASS.
- Conflict markers that lead the common ancestor in diff3-style output now have a label, which hopefully would help third-party tools that expect one.
- Comes with an updated bash-completion script.
- "git am" learned "--keep-cr" option to handle inputs that are a mixture of changes to files with and without CRLF line endings.
- "git cvsimport" learned -R option to leave revision mapping between CVS revisions and resulting git commits.
- "git diff --submodule" notices and describes dirty submodules.
- "git for-each-ref" learned %(symref), %(symref:short) and %(flag) tokens.
- "git hash-object --stdin-paths" can take "--no-filters" option now.
- "git init" can be told to look at init.templatedir configuration variable (obviously that has to come from either /etc/gitconfig or $HOME/.gitconfig).
- "git grep" learned "--no-index" option, to search inside contents that are not managed by git.
- "git grep" learned --color=auto/always/never.
- "git grep" learned to paint filename and line-number in colors.
- "git log -p --first-parent -m" shows one-parent diff for merge commits, instead of showing combined diff.
- "git merge-file" learned to use custom conflict marker size and also to use the "union merge" behaviour.
- "git notes" command has been rewritten in C and learned many commands and features to help you carry notes forward across rebases and amends.
- "git request-pull" identifies the commit the request is relative to in a more readable way.
- "git reset" learned "--keep" option that lets you discard commits near the tip while preserving your local changes in a way similar to how "git checkout branch" does.
- "git status" notices and describes dirty submodules.
- "git svn" should work better when interacting with repositories with CRLF line endings.
- "git imap-send" learned to support CRAM-MD5 authentication.
- "gitweb" installation procedure can use "minified" js/css files better.
- Various documentation updates.
Fixes since v1.7.0 ------------------
All of the fixes in v1.7.0.X maintenance series are included in this release, unless otherwise noted.
- "git add frotz/nitfol" did not complain when the entire frotz/ directory was ignored.
- "git diff --stat" used "int" to count the size of differences, which could result in overflowing.
- "git rev-list --pretty=oneline" didn’t terminate a record with LF for commits without any message.
- "git rev-list --abbrev-commit" defaulted to 40-byte abbreviations, unlike newer tools in the git toolset.
1.7.10.1
Git v1.7.10.1 Release Notes ===========================
Additions since v1.7.10 -----------------------
Localization message files for Danish and German have been added.
Fixes since v1.7.10 -------------------
- "git add -p" is not designed to deal with unmerged paths but did not exclude them and tried to apply funny patches only to fail.
- "git blame" started missing quite a few changes from the origin since we stopped using the diff minimization by default in v1.7.2 era.
- When PATH contains an unreadable directory, alias expansion code did not kick in, and failed with an error that said "git-subcmd" was not found.
- "git clean -d -f" (not "-d -f -f") is supposed to protect nested working trees of independent git repositories that exist in the current project working tree from getting removed, but the protection applied only to such working trees that are at the top-level of the current project by mistake.
- When "git commit --template F" errors out because the user did not touch the message, it claimed that it aborts due to "empty message", which was utterly wrong.
- The regexp configured with diff.wordregex was incorrectly reused across files.
- An age-old corner case bug in combine diff (only triggered with -U0 and the hunk at the beginning of the file needs to be shown) has been fixed.
- Rename detection logic used to match two empty files as renames during merge-recursive, leading to unnatural mismerges.
- The parser in "fast-import" did not diagnose ":9" style references that is not followed by required SP/LF as an error.
- When "git fetch" encounters repositories with too many references, the command line of "fetch-pack" that is run by a helper e.g. remote-curl, may fail to hold all of them. Now such an internal invocation can feed the references through the standard input of "fetch-pack".
- "git fetch" that recurses into submodules on demand did not check if it needs to go into submodules when non branches (most notably, tags) are fetched.
- "log -p --graph" used with "--stat" had a few formatting error.
- Running "notes merge --commit" failed to perform correctly when run from any directory inside $GIT_DIR/. When "notes merge" stops with conflicts, $GIT_DIR/NOTES_MERGE_WORKTREE is the place a user edits to resolve it.
- The ’push to upstream’ implementation was broken in some corner cases. "git push $there" without refspec, when the current branch is set to push to a remote different from $there, used to push to $there using the upstream information to a remote unrelated to $there.
- Giving "--continue" to a conflicted "rebase -i" session skipped a commit that only results in changes to submodules.
Also contains minor fixes and documentation updates.
1.7.10.2
Git v1.7.10.2 Release Notes ===========================
Fixes since v1.7.10.1 ---------------------
- The test scaffolding for git-daemon was flaky.
- The test scaffolding for fast-import was flaky.
- The filesystem boundary was not correctly reported when .git directory discovery stopped at a mount point.
- HTTP transport that requires authentication did not work correctly when multiple connections are used simultaneously.
- Minor memory leak during unpack_trees (hence "merge" and "checkout" to check out another branch) has been plugged.
- In the older days, the header "Conflicts:" in "cherry-pick" and "merge" was separated by a blank line from the list of paths that follow for readability, but when "merge" was rewritten in C, we lost it by mistake. Remove the newline from "cherry-pick" to make them match again.
- The command line parser choked "git cherry-pick $name" when $name can be both revision name and a pathname, even though $name can never be a path in the context of the command.
- The "include.path" facility in the configuration mechanism added in 1.7.10 forgot to interpret "~/path" and "~user/path" as it should.
- "git config --rename-section" to rename an existing section into a bogus one did not check the new name.
- The "diff --no-index" codepath used limited-length buffers, risking pathnames getting truncated. Update it to use the strbuf API.
- The report from "git fetch" said "new branch" even for a non branch ref.
- The http-backend (the server side of the smart http transfer) used to overwrite GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL with the value obtained from REMOTE_USER unconditionally, making it impossible for the server side site-specific customization to use different identity sources to affect the names logged. It now uses REMOTE_USER only as a fallback value.
- "log --graph" was not very friendly with "--stat" option and its output had line breaks at wrong places.
- Octopus merge strategy did not reduce heads that are recorded in the final commit correctly.
- "git push" over smart-http lost progress output a few releases ago; this release resurrects it.
- The error and advice messages given by "git push" when it fails due to non-ff were not very helpful to new users; it has been broken into three cases, and each is given a separate advice message.
- The insn sheet given by "rebase -i" did not make it clear that the insn lines can be re-ordered to affect the order of the commits in the resulting history.
- "git repack" used to write out unreachable objects as loose objects when repacking, even if such loose objects will immediately pruned due to its age.
- A contrib script "rerere-train" did not work out of the box unless user futzed with her $PATH.
- "git rev-parse --show-prefix" used to emit nothing when run at the top-level of the working tree, but now it gives a blank line.
- The i18n of error message "git stash save" was not properly done.
- "git submodule" used a sed script that some platforms mishandled.
- When using a Perl script on a system where "perl" found on user’s $PATH could be ancient or otherwise broken, we allow builders to specify the path to a good copy of Perl with $PERL_PATH. The gitweb test forgot to use that Perl when running its test.
Also contains minor fixes and documentation updates.
1.7.10.3
Git v1.7.10.3 Release Notes ===========================
Fixes since v1.7.10.2 ---------------------
- The message file for German translation has been updated a bit.
- Running "git checkout" on an unborn branch used to corrupt HEAD.
- When checking out another commit from an already detached state, we used to report all commits that are not reachable from any of the refs as lossage, but some of them might be reachable from the new HEAD, and there is no need to warn about them.
- Some time ago, "git clone" lost the progress output for its "checkout" phase; when run without any "--quiet" option, it should give progress to the lengthy operation.
- The directory path used in "git diff --no-index", when it recurses down, was broken with a recent update after v1.7.10.1 release.
- "log -z --pretty=tformat:…" did not terminate each record with NUL. The fix is not entirely correct when the output also asks for --patch and/or --stat, though.
- The DWIM behaviour for "log --pretty=format:%gd -g" was somewhat broken and gave undue precedence to configured log.date, causing "git stash list" to show "stash@{time stamp string}".
- "git status --porcelain" ignored "--branch" option by mistake. The output for "git status --branch -z" was also incorrect and did not terminate the record for the current branch name with NUL as asked.
- When a submodule repository uses alternate object store mechanism, some commands that were started from the superproject did not notice it and failed with "No such object" errors. The subcommands of "git submodule" command that recursed into the submodule in a separate process were OK; only the ones that cheated and peeked directly into the submodule’s repository from the primary process were affected.
Also contains minor fixes and documentation updates.
1.7.10.4
Git v1.7.10.4 Release Notes ===========================
Fixes since v1.7.10.3 ---------------------
- The message file for Swedish translation has been updated a bit.
- A name taken from mailmap was copied into an internal buffer incorrectly and could overrun the buffer if it is too long.
- A malformed commit object that has a header line chomped in the middle could kill git with a NULL pointer dereference.
- The progress indicator for a large "git checkout" was sent to stderr even if it is not a terminal.
- "git grep -e ’$pattern’", unlike the case where the patterns are read from a file, did not treat individual lines in the given pattern argument as separate regular expressions as it should.
- When "git rebase" was given a bad commit to replay the history on, its error message did not correctly give the command line argument it had trouble parsing.
Also contains minor fixes and documentation updates.
1.7.10.5
Git v1.7.10.5 Release Notes ===========================
Fixes since v1.7.10.4 ---------------------
- "git fast-export" did not give a readable error message when the same mark erroneously appeared twice in the --import-marks input.
- "git rebase -p" used to pay attention to rebase.autosquash which was wrong. "git rebase -p -i" should, but "git rebase -p" by itself should not.
1.7.10
Git v1.7.10 Release Notes =========================
Compatibility Notes -------------------
- From this release on, the "git merge" command in an interactive session will start an editor when it automatically resolves the merge for the user to explain the resulting commit, just like the "git commit" command does when it wasn’t given a commit message.
If you have a script that runs "git merge" and keeps its standard
input and output attached to the user's terminal, and if you do not
want the user to explain the resulting merge commits, you can
export GIT_MERGE_AUTOEDIT environment variable set to "no", like
this:
#!/bin/sh
GIT_MERGE_AUTOEDIT=no
export GIT_MERGE_AUTOEDIT
to disable this behavior (if you want your users to explain their
merge commits, you do not have to do anything). Alternatively, you
can give the "--no-edit" option to individual invocations of the
"git merge" command if you know everybody who uses your script has
Git v1.7.8 or newer.
- The "--binary/-b" options to "git am" have been a no-op for quite a while and were deprecated in mid 2008 (v1.6.0). When you give these options to "git am", it will now warn and ask you not to use them.
- When you do not tell which branches and tags to push to the "git push" command in any way, the command used "matching refs" rule to update remote branches and tags with branches and tags with the same name you locally have. In future versions of Git, this will change to push out only your current branch according to either the "upstream" or the "current" rule. Although "upstream" may be more powerful once the user understands Git better, the semantics "current" gives is simpler and easier to understand for beginners and may be a safer and better default option. We haven’t decided yet which one to switch to.
Updates since v1.7.9 --------------------
UI, Workflows & Features
-
various "gitk" updates.
-
show the path to the top level directory in the window title
-
update preference edit dialog
-
display file list correctly when directories are given on command line
-
make "git-describe" output in the log message into a clickable link
-
avoid matching the UNIX timestamp part when searching all fields
-
give preference to symbolic font names like sans & monospace
-
allow comparing two commits using a mark
-
"gitk" honors log.showroot configuration.
-
- Teams for localizing the messages from the Porcelain layer of commands are starting to form, thanks to Jiang Xin who volunteered to be the localization coordinator. Translated messages for simplified Chinese, Swedish and Portuguese are available.
- The configuration mechanism learned an "include" facility; an assignment to the include.path pseudo-variable causes the named file to be included in-place when Git looks up configuration variables.
- A content filter (clean/smudge) used to be just a way to make the recorded contents "more useful", and allowed to fail; a filter can now optionally be marked as "required".
- Options whose names begin with "--no-" (e.g. the "--no-verify" option of the "git commit" command) can be negated by omitting "no-" from its name, e.g. "git commit --verify".
- "git am" learned to pass "-b" option to underlying "git mailinfo", so that a bracketed string other than "PATCH" at the beginning can be kept.
- "git clone" learned "--single-branch" option to limit cloning to a single branch (surprise!); tags that do not point into the history of the branch are not fetched.
- "git clone" learned to detach the HEAD in the resulting repository when the user specifies a tag with "--branch" (e.g., "--branch=v1.0"). Clone also learned to print the usual "detached HEAD" advice in such a case, similar to "git checkout v1.0".
- When showing a patch while ignoring whitespace changes, the context lines are taken from the postimage, in order to make it easier to view the output.
- "git diff --stat" learned to adjust the width of the output on wider terminals, and give more columns to pathnames as needed.
- "diff-highlight" filter (in contrib/) was updated to produce more aesthetically pleasing output.
- "fsck" learned "--no-dangling" option to omit dangling object information.
- "git log -G" and "git log -S" learned to pay attention to the "-i" option. With "-i", "log -G" ignores the case when finding patch hunks that introduce or remove a string that matches the given pattern. Similarly with "-i", "log -S" ignores the case when finding the commit the given block of text appears or disappears from the file.
- "git merge" in an interactive session learned to spawn the editor by default to let the user edit the auto-generated merge message, to encourage people to explain their merges better. Legacy scripts can export GIT_MERGE_AUTOEDIT=no to retain the historical behavior. Both "git merge" and "git pull" can be given --no-edit from the command line to accept the auto-generated merge message.
- The advice message given when the user didn’t give enough clue on what to merge to "git pull" and "git merge" has been updated to be more concise and easier to understand.
- "git push" learned the "--prune" option, similar to "git fetch".
- The whole directory that houses a top-level superproject managed by "git submodule" can be moved to another place.
- "git symbolic-ref" learned the "--short" option to abbreviate the refname it shows unambiguously.
- "git tag --list" can be given "--points-at <object>" to limit its output to those that point at the given object.
- "gitweb" allows intermediate entries in the directory hierarchy that leads to a project to be clicked, which in turn shows the list of projects inside that directory.
- "gitweb" learned to read various pieces of information for the repositories lazily, instead of reading everything that could be needed (including the ones that are not necessary for a specific task).
- Project search in "gitweb" shows the substring that matched in the project name and description highlighted.
- HTTP transport learned to authenticate with a proxy if needed.
- A new script "diffall" is added to contrib/; it drives an external tool to perform a directory diff of two Git revisions in one go, unlike "difftool" that compares one file at a time.
Foreign Interface
- Improved handling of views, labels and branches in "git-p4" (in contrib).
- "git-p4" (in contrib) suffered from unnecessary merge conflicts when p4 expanded the embedded $RCS$-like keywords; it can be now told to unexpand them.
- Some "git-svn" updates.
- "vcs-svn"/"svn-fe" learned to read dumps with svn-deltas and support incremental imports.
- "git difftool/mergetool" learned to drive DeltaWalker.
Performance
- Unnecessary calls to parse_object() "git upload-pack" makes in response to "git fetch", have been eliminated, to help performance in repositories with excessive number of refs.
Internal Implementation (please report possible regressions)
- Recursive call chains in "git index-pack" to deal with long delta chains have been flattened, to reduce the stack footprint.
- Use of add_extra_ref() API is now gone, to make it possible to cleanly restructure the overall refs API.
- The command line parser of "git pack-objects" now uses parse-options API.
- The test suite supports the new "test_pause" helper function.
- Parallel to the test suite, there is a beginning of performance benchmarking framework.
- t/Makefile is adjusted to prevent newer versions of GNU make from running tests in seemingly random order.
- The code to check if a path points at a file beyond a symbolic link has been restructured to be thread-safe.
- When pruning directories that has become empty during "git prune" and "git prune-packed", call closedir() that iterates over a directory before rmdir() it.
Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.9 ------------------
Unless otherwise noted, all the fixes since v1.7.9 in the maintenance releases are contained in this release (see release notes to them for details).
- Build with NO_PERL_MAKEMAKER was broken and Git::I18N did not work with versions of Perl older than 5.8.3. (merge 5eb660e ab/perl-i18n later to maint).
- "git tag -s" honored "gpg.program" configuration variable since 1.7.9, but "git tag -v" and "git verify-tag" didn’t. (merge a2c2506 az/verify-tag-use-gpg-config later to maint).
- "configure" script learned to take "--with-sane-tool-path" from the command line to record SANE_TOOL_PATH (used to avoid broken platform tools in /usr/bin) in config.mak.autogen. This may be useful for people on Solaris who have saner tools outside /usr/xpg[46]/bin.
- zsh port of bash completion script needed another workaround.
1.7.11.1
Git v1.7.11.1 Release Notes ===========================
Fixes since v1.7.11 -------------------
- The cross links in the HTML version of manual pages were broken.
Also contains minor typofixes and documentation updates.
1.7.11.2
Git v1.7.11.2 Release Notes ===========================
Fixes since v1.7.11.1 ---------------------
- On Cygwin, the platform pread(2) is not thread safe, just like our own compat/ emulation, and cannot be used in the index-pack program. Makefile variable NO_THREAD_SAFE_PREAD can be defined to avoid use of this function in a threaded program.
- "git add" allows adding a regular file to the path where a submodule used to exist, but "git update-index" does not allow an equivalent operation to Porcelain writers.
- "git archive" incorrectly computed the header checksum; the symptom was observed only when using pathnames with hi-bit set.
- "git blame" did not try to make sure that the abbreviated commit object names in its output are unique.
- Running "git bundle verify" on a bundle that records a complete history said "it requires these 0 commits".
- "git clone --single-branch" to clone a single branch did not limit the cloning to the specified branch.
- "git diff --no-index" did not correctly handle relative paths and did not correctly give exit codes when run under "--quiet" option.
- "git diff --no-index" did not work with pagers correctly.
- "git diff COPYING HEAD:COPYING" gave a nonsense error message that claimed that the tree-ish HEAD did not have COPYING in it.
- When "git log" gets "--simplify-merges/by-decoration" together with "--first-parent", the combination of these options makes the simplification logic to use in-core commit objects that haven’t been examined for relevance, either producing incorrect result or taking too long to produce any output. Teach the simplification logic to ignore commits that the first-parent traversal logic ignored when both are in effect to work around the issue.
- "git ls-files --exclude=t -i" did not consider anything under t/ as excluded, as it did not pay attention to exclusion of leading paths while walking the index. Other two users of excluded() are also updated.
- "git request-pull $url dev" when the tip of "dev" branch was tagged with "ext4-for-linus" used the contents from the tag in the output but still asked the "dev" branch to be pulled, not the tag.
Also contains minor typofixes and documentation updates.
1.7.11.3
Git v1.7.11.3 Release Notes ===========================
Fixes since v1.7.11.3 ---------------------
- The error message from "git push $there :bogo" (and its equivalent "git push $there --delete bogo") mentioned that we tried and failed to guess what ref is being deleted based on the LHS of the refspec, which we don’t.
- A handful of files and directories we create had tighter than necessary permission bits when the user wanted to have group writability (e.g. by setting "umask 002").
- "commit --amend" used to refuse amending a commit with an empty log message, with or without "--allow-empty-message".
- "git commit --amend --only --" was meant to allow "Clever" people to rewrite the commit message without making any change even when they have already changes for the next commit added to their index, but it never worked as advertised since it was introduced in 1.3.0 era.
- Even though the index can record pathnames longer than 1<<12 bytes, in some places we were not comparing them in full, potentially replacing index entries instead of adding.
- "git show"’s auto-walking behaviour was an unreliable and unpredictable hack; it now behaves just like "git log" does when it walks.
- "git diff", "git status" and anything that internally uses the comparison machinery was utterly broken when the difference involved a file with "-" as its name. This was due to the way "git diff --no-index" was incorrectly bolted on to the system, making any comparison that involves a file "-" at the root level incorrectly read from the standard input.
- We did not have test to make sure "git rebase" without extra options filters out an empty commit in the original history.
- "git fast-export" produced an input stream for fast-import without properly quoting pathnames when they contain SPs in them.
- "git checkout --detach", when you are still on an unborn branch, should be forbidden, but it wasn’t.
- Some implementations of Perl terminates "lines" with CRLF even when the script is operating on just a sequence of bytes. Make sure to use "$PERL_PATH", the version of Perl the user told Git to use, in our tests to avoid unnecessary breakages in tests.
Also contains minor typofixes and documentation updates.
1.7.11.4
Git v1.7.11.4 Release Notes ===========================
Fixes since v1.7.11.3 ---------------------
- "$GIT_DIR/COMMIT_EDITMSG" file that is used to hold the commit log message user edits was not documented.
- The advise() function did not use varargs correctly to format its message.
- When "git am" failed, old timers knew to check .git/rebase-apply/patch to see what went wrong, but we never told the users about it.
- "git commit-tree" learned a more natural "-p <parent> <tree>" order of arguments long time ago, but recently forgot it by mistake.
- "git diff --no-ext-diff" did not output anything for a typechange filepair when GIT_EXTERNAL_DIFF is in effect.
- In 1.7.9 era, we taught "git rebase" about the raw timestamp format but we did not teach the same trick to "filter-branch", which rolled a similar logic on its own.
- When "git submodule add" clones a submodule repository, it can get confused where to store the resulting submodule repository in the superproject’s .git/ directory when there is a symbolic link in the path to the current directory.
Also contains minor typofixes and documentation updates.
1.7.11.5
Git v1.7.11.5 Release Notes ===========================
Fixes since v1.7.11.4 ---------------------
- The Makefile rule to create assembly output (primarily for debugging purposes) did not create it next to the source.
- The code to avoid mistaken attempt to add the object directory itself as its own alternate could read beyond end of a string while comparison.
- On some architectures, "block-sha1" did not compile correctly when compilers inferred alignment guarantees from our source we did not intend to make.
- When talking to a remote running ssh on IPv6 enabled host, whose address is spelled as "[HOST]:PORT", we did not parse the address correctly and failed to connect.
- git-blame.el (in compat/) have been updated to use Elisp more correctly.
- "git checkout <branchname>" to come back from a detached HEAD state incorrectly computed reachability of the detached HEAD, resulting in unnecessary warnings.
- "git mergetool" did not support --tool-help option to give the list of supported backends, like "git difftool" does.
- "git grep" stopped spawning an external "grep" long time ago, but a duplicated test to check internal and external "grep" was left behind.
Also contains minor typofixes and documentation updates.
1.7.11.6
Git v1.7.11.6 Release Notes ===========================
Fixes since v1.7.11.5 ---------------------
- "ciabot" script (in contrib/) has been updated with extensive documentation.
- "git foo" errored out with "Not a directory" when the user had a non-directory on $PATH, and worse yet it masked an alias "foo" from running.
- When the user exports a non-default IFS without HT, scripts that rely on being able to parse "ls-files -s | while read a b c…" started to fail. Protect them from such a misconfiguration.
- When the user gives an argument that can be taken as both a revision name and a pathname without disambiguating with "--", we used to give a help message "Use '--’ to separate". The message has been clarified to show where that '--’ goes on the command line.
- Documentation for the configuration file format had a confusing example.
- Older parts of the documentation described as if having a regular file in .git/refs/ hierarchy were the only way to have branches and tags, which is not true for quite some time.
- It was generally understood that "--long-option"s to many of our subcommands can be abbreviated to the unique prefix, but it was not easy to find it described for new readers of the documentation set.
- The "--topo-order", "--date-order" (and the lack of either means the default order) options to "rev-list" and "log" family of commands were poorly described in the documentation.
- "git commit --amend" let the user edit the log message and then died when the human-readable committer name was given insufficiently by getpwent(3).
- The exit status code from "git config" was way overspecified while being incorrect. The implementation has been updated to give the documented status for a case that was documented, and introduce a new code for "all other errors".
- The output from "git diff -B" for a file that ends with an incomplete line did not put "\ No newline…" on a line of its own.
- "git diff" had a confusion between taking data from a path in the working tree and taking data from an object that happens to have name 0{40} recorded in a tree.
- The "--rebase" option to "git pull" can be abbreviated to "-r", but we didn’t document it.
- When "git push" triggered the automatic gc on the receiving end, a message from "git prune" that said it was removing cruft leaked to the standard output, breaking the communication protocol.
- The reflog entries left by "git rebase" and "git rebase -i" were inconsistent (the interactive one gave an abbreviated object name).
- "git send-email" did not unquote encoded words that appear on the header correctly, and lost "_" from strings.
- "git stash apply/pop" did not trigger "rerere" upon conflicts unlike other mergy operations.
- "git submodule <cmd> path" did not error out when the path to the submodule was misspelt.
- "git submodule update -f" did not update paths in the working tree that has local changes. (merge 01d4721 sz/submodule-force-update later to maint).
- "gitweb" when used with PATH_INFO failed to notice directories with SP (and other characters that need URL-style quoting) in them.
- Fallback ’getpass’ implementation made unportable use of stdio API.
- A utility shell function test_seq has been added as a replacement for the ’seq’ utility found on some platforms.
1.7.11.7
Git v1.7.11.7 Release Notes ===========================
Fixes since v1.7.11.6 ---------------------
- The synopsis said "checkout [-B branch]" to make it clear the branch name is a parameter to the option, but the heading for the option description was "-B::", not "-B branch::", making the documentation misleading.
- Git ships with a fall-back regexp implementation for platforms with buggy regexp library, but it was easy for people to keep using their platform regexp. A new test has been added to check this.
- "git apply -p0" did not parse pathnames on "diff --git" line correctly. This caused patches that had pathnames in no other places to be mistakenly rejected (most notably, binary patch that does not rename nor change mode). Textual patches, renames or mode changes have preimage and postimage pathnames in different places in a form that can be parsed unambiguously and did not suffer from this problem.
- After "gitk" showed the contents of a tag, neither "Reread references" nor "Reload" did not update what is shown as the contents of it, when the user overwrote the tag with "git tag -f".
- "git for-each-ref" did not correctly support more than one --sort option.
- "git log .." errored out saying it is both rev range and a path when there is no disambiguating "--" is on the command line. Update the command line parser to interpret ".." as a path in such a case.
- Pushing to smart HTTP server with recent Git fails without having the username in the URL to force authentication, if the server is configured to allow GET anonymously, while requiring authentication for POST.
- "git show --format=’%ci’" did not give timestamp correctly for commits created without human readable name on "committer" line. (merge e27ddb6 jc/maint-ident-missing-human-name later to maint).
- "git show --quiet" ought to be a synonym for "git show -s", but wasn’t.
1.7.11
Git v1.7.11 Release Notes =========================
Updates since v1.7.10 ---------------------
UI, Workflows & Features
- A new mode for push, "simple", which is a cross between "current" and "upstream", has been introduced. "git push" without any refspec will push the current branch out to the same name at the remote repository only when it is set to track the branch with the same name over there. The plan is to make this mode the new default value when push.default is not configured.
- A couple of commands learned the "--column" option to produce columnar output.
- A third-party tool "git subtree" is distributed in contrib/
- A remote helper that acts as a proxy and caches ssl session for the https:// transport is added to the contrib/ area.
- Error messages given when @{u} is used for a branch without its upstream configured have been clarified.
- Even with the "-q"uiet option, "checkout" used to report setting up tracking. Also "branch" learned the "-q"uiet option to squelch informational message.
- Your build platform may support hardlinks but you may prefer not to use them, e.g. when installing to DESTDIR to make a tarball and untarring on a filesystem that has poor support for hardlinks. There is a Makefile option NO_INSTALL_HARDLINKS for you.
- The smart-http backend used to always override GIT_COMMITTER_* variables with REMOTE_USER and REMOTE_ADDR, but these variables are now preserved when set.
- "git am" learned the "--include" option, which is an opposite of existing the "--exclude" option.
- When "git am -3" needs to fall back to an application of the patch to a synthesized preimage followed by a 3-way merge, the paths that needed such treatment are now reported to the end user, so that the result in them can be eyeballed with extra care.
- The output from "diff/log --stat" used to always allocate 4 columns to show the number of modified lines, but not anymore.
- "git difftool" learned the "--dir-diff" option to spawn external diff tools that can compare two directory hierarchies at a time after populating two temporary directories, instead of running an instance of the external tool once per a file pair.
- The "fmt-merge-msg" command learned to list the primary contributors involved in the side topic you are merging in a comment in the merge commit template.
- "git rebase" learned to optionally keep commits that do not introduce any change in the original history.
- "git push --recurse-submodules" learned to optionally look into the histories of submodules bound to the superproject and push them out.
- A ’snapshot’ request to "gitweb" honors If-Modified-Since: header, based on the commit date.
- "gitweb" learned to highlight the patch it outputs even more.
Foreign Interface
- "git svn" used to die with unwanted SIGPIPE when talking with an HTTP server that uses keep-alive.
- "git svn" learned to use platform specific authentication providers, e.g. gnome-keyring, kwallet, etc.
- "git p4" has been moved out of the contrib/ area and has seen more work on importing labels as tags from (and exporting tags as labels to) p4.
Performance and Internal Implementation (please report possible regressions)
- Bash completion script (in contrib/) have been cleaned up to make future work on it simpler.
- An experimental "version 4" format of the index file has been introduced to reduce on-disk footprint and I/O overhead.
- "git archive" learned to produce its output without reading the blob object it writes out in memory in its entirety.
- "git index-pack" that runs when fetching or pushing objects to complete the packfile on the receiving end learned to use multiple threads to do its job when available.
- The code to compute hash values for lines used by the internal diff engine was optimized on little-endian machines, using the same trick the kernel folks came up with.
- "git apply" had some memory leaks plugged.
- Setting up a revision traversal with many starting points was inefficient as these were placed in a date-order priority queue one-by-one. Now they are collected in the queue unordered first, and sorted immediately before getting used.
- More lower-level commands learned to use the streaming API to read from the object store without keeping everything in core.
- The weighting parameters to suggestion command name typo have been tweaked, so that "git tags" will suggest "tag?" and not "stage?".
- Because "sh" on the user’s PATH may be utterly broken on some systems, run-command API now uses SHELL_PATH, not /bin/sh, when spawning an external command (not applicable to Windows port).
- The API to iterate over the refs/ hierarchy has been tweaked to allow walking only a subset of it more efficiently.
Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.10 -------------------
Unless otherwise noted, all the fixes since v1.7.10 in the maintenance releases are contained in this release (see release notes to them for details).
- "git submodule init" used to report "registered for path …" even for submodules that were registered earlier. (cherry-pick c1c259e jl/submodule-report-new-path-once later to maint).
- "git diff --stat" used to fully count a binary file with modified execution bits whose contents is unmodified, which was not quite right.
1.7.12.1
Git 1.7.12.1 Release Notes ==========================
Fixes since v1.7.12 -------------------
- "git apply -p0" did not parse pathnames on "diff --git" line correctly. This caused patches that had pathnames in no other places to be mistakenly rejected (most notably, binary patch that does not rename nor change mode). Textual patches, renames or mode changes have preimage and postimage pathnames in different places in a form that can be parsed unambiguously and did not suffer from this problem.
- "git cherry-pick A C B" used to replay changes in A and then B and then C if these three commits had committer timestamps in that order, which is not what the user who said "A C B" naturally expects.
- "git commit --amend" let the user edit the log message and then died when the human-readable committer name was given insufficiently by getpwent(3).
- Some capabilities were asked by fetch-pack even when upload-pack did not advertise that they are available. fetch-pack has been fixed not to do so.
- "git diff" had a confusion between taking data from a path in the working tree and taking data from an object that happens to have name 0{40} recorded in a tree.
- "git for-each-ref" did not correctly support more than one --sort option.
- "git log .." errored out saying it is both rev range and a path when there is no disambiguating "--" is on the command line. Update the command line parser to interpret ".." as a path in such a case.
- The "--topo-order", "--date-order" (and the lack of either means the default order) options to "rev-list" and "log" family of commands were poorly described in the documentation.
- "git prune" without "-v" used to warn about leftover temporary files (which is an indication of an earlier aborted operation).
- Pushing to smart HTTP server with recent Git fails without having the username in the URL to force authentication, if the server is configured to allow GET anonymously, while requiring authentication for POST.
- The reflog entries left by "git rebase" and "git rebase -i" were inconsistent (the interactive one gave an abbreviated object name).
- When "git push" triggered the automatic gc on the receiving end, a message from "git prune" that said it was removing cruft leaked to the standard output, breaking the communication protocol.
- "git show --quiet" ought to be a synonym for "git show -s", but wasn’t.
- "git show --format=’%ci’" did not give timestamp correctly for commits created without human readable name on "committer" line.
- "git send-email" did not unquote encoded words that appear on the header correctly, and lost "_" from strings.
- The interactive prompt "git send-email" gives was error prone. It asked "What e-mail address do you want to use?" with the address it guessed (correctly) the user would want to use in its prompt, tempting the user to say "y". But the response was taken as "No, please use ’y’ as the e-mail address instead", which is most certainly not what the user meant.
- "gitweb" when used with PATH_INFO failed to notice directories with SP (and other characters that need URL-style quoting) in them.
- When the user gives an argument that can be taken as both a revision name and a pathname without disambiguating with "--", we used to give a help message "Use '--’ to separate". The message has been clarified to show where that '--’ goes on the command line.
- When the user exports a non-default IFS without HT, scripts that rely on being able to parse "ls-files -s | while read a b c…" started to fail. Protect them from such a misconfiguration.
- The attribute system may be asked for a path that itself or its leading directories no longer exists in the working tree, and it is fine if we cannot open .gitattribute file in such a case. Failure to open per-directory .gitattributes with error status other than ENOENT and ENOTDIR should be diagnosed, but it wasn’t.
- After "gitk" showed the contents of a tag, neither "Reread references" nor "Reload" did not update what is shown as the contents of it, when the user overwrote the tag with "git tag -f".
- "ciabot" script (in contrib/) has been updated with extensive documentation.
- "git-jump" script (in contrib/) did not work well when diff.noprefix or diff.mnemonicprefix is in effect.
- Older parts of the documentation described as if having a regular file in .git/refs/ hierarchy were the only way to have branches and tags, which is not true for quite some time.
- A utility shell function test_seq has been added as a replacement for the ’seq’ utility found on some platforms.
- Compatibility wrapper to learn the maximum number of file descriptors we can open around sysconf(_SC_OPEN_MAX) and getrlimit(RLIMIT_NO_FILE) has been introduced for portability.
- We used curl_easy_strerror() without checking version of cURL, breaking the build for versions before curl 7.12.0.
- Code to work around MacOS X UTF-8 gotcha has been cleaned up.
- Fallback ’getpass’ implementation made unportable use of stdio API.
- The "--rebase" option to "git pull" can be abbreviated to "-r", but we didn’t document it.
- It was generally understood that "--long-option"s to many of our subcommands can be abbreviated to the unique prefix, but it was not easy to find it described for new readers of the documentation set.
- The synopsis said "checkout [-B branch]" to make it clear the branch name is a parameter to the option, but the heading for the option description was "-B::", not "-B branch::", making the documentation misleading.
Also contains numerous documentation updates.
1.7.12.2
Git 1.7.12.2 Release Notes ==========================
Fixes since v1.7.12.1 ---------------------
- When "git am" is fed an input that has multiple "Content-type: …" header, it did not grok charset= attribute correctly.
- Even during a conflicted merge, "git blame $path" always meant to blame uncommitted changes to the "working tree" version; make it more useful by showing cleanly merged parts as coming from the other branch that is being merged.
- "git blame MAKEFILE" run in a history that has "Makefile" but not "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got confused on a case insensitive filesystem and failed to do so.
- "git fetch --all", when passed "--no-tags", did not honor the "--no-tags" option while fetching from individual remotes (the same issue existed with "--tags", but combination "--all --tags" makes much less sense than "--all --no-tags").
- "git log/diff/format-patch --stat" showed the "N line(s) added" comment in user’s locale and caused careless submitters to send patches with such a line in them to projects whose project language is not their language, mildly irritating others. Localization to the line has been disabled for now.
- "git log --all-match --grep=A --grep=B" ought to show commits that mention both A and B, but when these three options are used with --author or --committer, it showed commits that mention either A or B (or both) instead.
- The subcommand to remove the definition of a remote in "git remote" was named "rm" even though all other subcommands were spelled out. Introduce "git remote remove" to remove confusion, and keep "rm" as a backward compatible synonym.
Also contains a handful of documentation updates.
1.7.12.3
Git 1.7.12.3 Release Notes ==========================
Fixes since v1.7.12.2 ---------------------
- "git am" mishandled a patch attached as application/octet-stream (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not honored correctly.
- It was unclear in the documentation for "git blame" that it is unnecessary for users to use the "--follow" option.
- A repository created with "git clone --single" had its fetch refspecs set up just like a clone without "--single", leading the subsequent "git fetch" to slurp all the other branches, defeating the whole point of specifying "only this branch".
- "git fetch" over http had an old workaround for an unlikely server misconfiguration; it turns out that this hurts debuggability of the configuration in general, and has been reverted.
- "git fetch" over http advertised that it supports "deflate", which is much less common, and did not advertise the more common "gzip" on its Accept-Encoding header.
- "git receive-pack" (the counterpart to "git push") did not give progress output while processing objects it received to the user when run over the smart-http protocol.
- "git status" honored the ignore=dirty settings in .gitmodules but "git commit" didn’t.
Also contains a handful of documentation updates.
1.7.12.4
Git 1.7.12.4 Release Notes ==========================
Fixes since v1.7.12.3 ---------------------
- "git fetch" over the dumb-http revision walker could segfault when curl’s multi interface was used.
- It was possible to give specific paths for "asciidoc" and other tools in the documentation toolchain, but not for "xmlto".
- "gitweb" did not give the correct committer timezone in its feed output due to a typo.
- The "-Xours" (and similarly -Xtheirs) backend option to "git merge -s recursive" was ignored for binary files. Now it is honored.
- The "binary" synthetic attribute made "diff" to treat the path as binary, but not "merge".
Also contains many documentation updates.
1.7.12
Git v1.7.12 Release Notes =========================
Updates since v1.7.11 ---------------------
UI, Workflows & Features
- Git can be told to normalize pathnames it read from readdir(3) and all arguments it got from the command line into precomposed UTF-8 (assuming that they come as decomposed UTF-8), in order to work around issues on Mac OS.
I think there still are other places that need conversion
(e.g. paths that are read from stdin for some commands), but this
should be a good first step in the right direction.
- Per-user $HOME/.gitconfig file can optionally be stored in $HOME/.config/git/config instead, which is in line with XDG.
- The value of core.attributesfile and core.excludesfile default to $HOME/.config/git/attributes and $HOME/.config/git/ignore respectively when these files exist.
- Logic to disambiguate abbreviated object names have been taught to take advantage of object types that are expected in the context, e.g. XXXXXX in the "git describe" output v1.2.3-gXXXXXX must be a commit object, not a blob nor a tree. This will help us prolong the lifetime of abbreviated object names.
- "git apply" learned to wiggle the base version and perform three-way merge when a patch does not exactly apply to the version you have.
- Scripted Porcelain writers now have access to the credential API via the "git credential" plumbing command.
- "git help" used to always default to "man" format even on platforms where "man" viewer is not widely available.
- "git clone --local $path" started its life as an experiment to optionally use link/copy when cloning a repository on the disk, but we didn’t deprecate it after we made the option a no-op to always use the optimization. The command learned "--no-local" option to turn this off, as a more explicit alternative over use of file:// URL.
- "git fetch" and friends used to say "remote side hung up unexpectedly" when they failed to get response they expect from the other side, but one common reason why they don’t get expected response is that the remote repository does not exist or cannot be read. The error message in this case was updated to give better hints to the user.
- "git help -w $cmd" can show HTML version of documentation for "git-$cmd" by setting help.htmlpath to somewhere other than the default location where the build procedure installs them locally; the variable can even point at a http:// URL.
- "git rebase [-i] --root $tip" can now be used to rewrite all the history leading to "$tip" down to the root commit.
- "git rebase -i" learned "-x <cmd>" to insert "exec <cmd>" after each commit in the resulting history.
- "git status" gives finer classification to various states of paths in conflicted state and offer advice messages in its output.
- "git submodule" learned to deal with nested submodule structure where a module is contained within a module whose origin is specified as a relative URL to its superproject’s origin.
- A rather heavy-ish "git completion" script has been split to create a separate "git prompting" script, to help lazy-autoloading of the completion part while making prompting part always available.
- "gitweb" pays attention to various forms of credits that are similar to "Signed-off-by:" lines in the commit objects and highlights them accordingly.
Foreign Interface
- "mediawiki" remote helper (in contrib/) learned to handle file attachments.
- "git p4" now uses "Jobs:" and "p4 move" when appropriate.
- vcs-svn has been updated to clean-up compilation, lift 32-bit limitations, etc.
Performance, Internal Implementation, etc. (please report possible regressions)
- Some tests showed false failures caused by a bug in ecryptofs.
- We no longer use AsciiDoc7 syntax in our documentation and favor a more modern style.
- "git am --rebasing" codepath was taught to grab authorship, log message and the patch text directly out of existing commits. This will help rebasing commits that have confusing "diff" output in their log messages.
- "git index-pack" and "git pack-objects" use streaming API to read from the object store to avoid having to hold a large blob object in-core while they are doing their thing.
- Code to match paths with exclude patterns learned to avoid calling fnmatch() by comparing fixed leading substring literally when possible.
- "git log -n 1 — rarely-touched-path" was spending unnecessary cycles after showing the first change to find the next one, only to discard it.
- "git svn" got a large-looking code reorganization at the last minute before the code freeze.
Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.11 -------------------
Unless otherwise noted, all the fixes since v1.7.11 in the maintenance releases are contained in this release (see release notes to them for details).
- "git submodule add" was confused when the superproject did not have its repository in its usual place in the working tree and GIT_DIR and GIT_WORK_TREE was used to access it.
- "git commit --amend" let the user edit the log message and then died when the human-readable committer name was given insufficiently by getpwent(3).
1.7.2.1
Git v1.7.2.1 Release Notes ==========================
Fixes since v1.7.2 ------------------
- "git instaweb" wasn’t useful when your Apache was installed under a name other than apache2 (e.g. "httpd").
- Similarly, "git web—browse" (invoked by "git help -w") learned that chrome browser is sometimes called google-chrome.
- An overlong line after ".gitdir: " in a git file caused out of bounds access to an array on the stack.
- "git config --path conf.var" to attempt to expand a variable conf.var that uses "~/" short-hand segfaulted when $HOME environment variable was not set.
- Documentation on Cygwin failed to build.
- The error message from "git pull blarg" when ’blarg’ is an unknown remote name has been improved.
And other minor fixes and documentation updates.
1.7.2.2
Git v1.7.2.2 Release Notes ==========================
Fixes since v1.7.2.1 --------------------
- Object transfer over smart http transport deadlocked the client when the remote HTTP server returned a failure, instead of erroring it out.
- git-gui honors custom textconv filters when showing diff and blame;
- git diff --relative=subdir (without the necessary trailing /) did not work well;
- "git diff-files -p --submodule" was recently broken;
- "git checkout -b n ’:/token’" did not work;
- "git index-pack" (hence "git fetch/clone/pull/push") enabled the object replacement machinery by mistake (it never should have);
And other minor fixes and documentation updates.
1.7.2.3
Git v1.7.2.3 Release Notes ==========================
Fixes since v1.7.2.2 --------------------
- When people try insane things such as delta-compressing 4GiB files, we threw an assertion failure.
- "git archive" gave the full commit ID for "$Format:%h$".
- "git for-each-ref --format=’%(objectname:short)’" has been completely broken for a long time.
- "git gc" incorrectly pruned a rerere record that was created long time ago but still is actively and repeatedly used.
- "git log --follow -M -p" was seriously broken in 1.7.2, reporting assertion failure.
- Running "git log" with an incorrect option started pager nevertheless, forcing the user to dismiss it.
- "git rebase" did not work well when the user has diff.renames configuration variable set.
- An earlier (and rather old) fix to "git rebase" against a rebased upstream broke a more normal, non rebased upstream case rather badly, attempting to re-apply patches that are already accepted upstream.
- "git submodule sync" forgot to update the superproject’s config file when submodule URL changed.
- "git pack-refs --all --prune" did not remove a directory that has become empty.
1.7.2.4
Git v1.7.2.4 Release Notes ==========================
This is primarily to backport support for the new "add.ignoreErrors" name given to the existing "add.ignore-errors" configuration variable.
The next version, Git 1.7.4, and future versions, will support both old and incorrect name and the new corrected name, but without this backport, users who want to use the new name "add.ignoreErrors" in their repositories cannot use older versions of Git.
1.7.2.5
Git v1.7.2.5 Release Notes ==========================
Fixes since v1.7.2.4 --------------------
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
1.7.2
Git v1.7.2 Release Notes ========================
Updates since v1.7.1 --------------------
- core.eol configuration and text/eol attributes are the new way to control the end of line conventions for files in the working tree.
- core.autocrlf has been made safer - it will now only handle line endings for new files and files that are LF-only in the repository. To normalize content that has been checked in with CRLF, use the new eol/text attributes.
- The whitespace rules used in "git apply --whitespace" and "git diff" gained a new member in the family (tab-in-indent) to help projects with policy to indent only with spaces.
- When working from a subdirectory, by default, git does not look for its metadirectory ".git" across filesystems, primarily to help people who have invocations of git in their custom PS1 prompts, as being outside of a git repository would look for ".git" all the way up to the root directory, and NFS mounts are often slow. DISCOVERY_ACROSS_FILESYSTEM environment variable can be used to tell git not to stop at a filesystem boundary.
- Usage help messages generated by parse-options library (i.e. most of the Porcelain commands) are sent to the standard output now.
- ’:/<string>’ notation to look for a commit now takes regular expression and it is not anchored at the beginning of the commit log message anymore (this is a backward incompatible change).
- "git" wrapper learned "-c name=value" option to override configuration variable from the command line.
- Improved portability for various platforms including older SunOS, HP-UX 10/11, AIX, Tru64, etc. and platforms with Python 2.4.
- The message from "git am -3" has been improved when conflict resolution ended up making the patch a no-op.
- "git blame" applies the textconv filter to the contents it works on, when available.
- "git checkout --orphan newbranch" is similar to "-b newbranch" but prepares to create a root commit that is not connected to any existing commit.
- "git cherry-pick" learned to pick a range of commits (e.g. "cherry-pick A..B" and "cherry-pick --stdin"), so did "git revert"; these do not support the nicer sequencing control "rebase [-i]" has, though.
- "git cherry-pick" and "git revert" learned --strategy option to specify the merge strategy to be used when performing three-way merges.
- "git cvsserver" can be told to use pserver; its password file can be stored outside the repository.
- The output from the textconv filter used by "git diff" can be cached to speed up their reuse.
- "git diff --word-diff=<mode>" extends the existing "--color-words" option, making it more useful in color-challenged environments.
- The regexp to detect function headers used by "git diff" for PHP has been enhanced for visibility modifiers (public, protected, etc.) to better support PHP5.
- "diff.noprefix" configuration variable can be used to implicitly ask for "diff --no-prefix" behaviour.
- "git for-each-ref" learned "%(objectname:short)" that gives the object name abbreviated.
- "git format-patch" learned --signature option and format.signature configuration variable to customize the e-mail signature used in the output.
- Various options to "git grep" (e.g. --count, --name-only) work better with binary files.
- "git grep" learned "-Ovi" to open the files with hits in your editor.
- "git help -w" learned "chrome" and "chromium" browsers.
- "git log --decorate" shows commit decorations in various colours.
- "git log --follow <path>" follows across copies (it used to only follow renames). This may make the processing more expensive.
- "git log --pretty=format:<template>" specifier learned "% <something>" magic that inserts a space only when %<something> expands to a non-empty string; this is similar to "%+<something>" magic, but is useful in a context to generate a single line output.
- "git notes prune" learned "-n" (dry-run) and "-v" options, similar to what "git prune" has.
- "git patch-id" can be fed a mbox without getting confused by the signature line in the format-patch output.
- "git remote" learned "set-branches" subcommand.
- "git rev-list A..B" learned --ancestry-path option to further limit the result to the commits that are on the ancestry chain between A and B (i.e. commits that are not descendants of A are excluded).
- "git show -5" is equivalent to "git show --do-walk 5"; this is similar to the update to make "git show master..next" walk the history, introduced in 1.6.4.
- "git status [-s] --ignored" can be used to list ignored paths.
- "git status -s -b" shows the current branch in the output.
- "git status" learned "--ignore-submodules" option.
- Various "gitweb" enhancements and clean-ups, including syntax highlighting, "plackup" support for instaweb, .fcgi suffix to run it as FastCGI script, etc.
- The test harness has been updated to produce TAP-friendly output.
- Many documentation improvement patches are also included.
Fixes since v1.7.1 ------------------
All of the fixes in v1.7.1.X maintenance series are included in this release, unless otherwise noted.
- We didn’t URL decode "file:///path/to/repo" correctly when path/to/repo had percent-encoded characters (638794c, 9d2e942, ce83eda, 3c73a1d).
- "git clone" did not configure remote.origin.url correctly for bare clones (df61c889).
- "git diff --graph" works better with "--color-words" and other options (81fa024..4297c0a).
- "git diff" could show ambiguous abbreviation of blob object names on its "index" line (3e5a188).
- "git reset --hard" started from a wrong directory and a working tree in a nonstandard location is in use got confused (560fb6a1).
- "git read-tree -m A B" used to switch to branch B while retaining local changes added an incorrect cache-tree information (b1f47514).
1.7.3.1
Git v1.7.3.1 Release Notes ==========================
Fixes since v1.7.3 ------------------
- "git stash show stash@{$n}" was accidentally broken in 1.7.3 ("git stash show" without any argument still worked, though).
- "git stash branch $branch stash@{$n}" was accidentally broken in 1.7.3 and started dropping the named stash even when branch creation failed.
And other minor fixes and documentation updates.
1.7.3.2
Git v1.7.3.2 Release Notes ==========================
This is primarily to push out many documentation fixes accumulated since the 1.7.3.1 release.
1.7.3.3
Git v1.7.3.3 Release Notes ==========================
In addition to the usual fixes, this release also includes support for the new "add.ignoreErrors" name given to the existing "add.ignore-errors" configuration variable.
The next version, Git 1.7.4, and future versions, will support both old and incorrect name and the new corrected name, but without this backport, users who want to use the new name "add.ignoreErrors" in their repositories cannot use older versions of Git.
Fixes since v1.7.3.2 --------------------
- "git apply" segfaulted when a bogus input is fed to it.
- Running "git cherry-pick --ff" on a root commit segfaulted.
- "diff", "blame" and friends incorrectly applied textconv filters to symlinks.
- Highlighting of whitespace breakage in "diff" output was showing incorrect amount of whitespaces when blank-at-eol is set and the line consisted only of whitespaces and a TAB.
- "diff" was overly inefficient when trying to find the line to use for the function header (i.e. equivalent to --show-c-function of GNU diff).
- "git imap-send" depends on libcrypto but our build rule relied on the linker to implicitly link it via libssl, which was wrong.
- "git merge-file" can be called from within a subdirectory now.
- "git repack -f" expanded and recompressed non-delta objects in the existing pack, which was wasteful. Use new "-F" option if you really want to (e.g. when changing the pack.compression level).
- "git rev-list --format="…%x00…" incorrectly chopped its output at NUL.
- "git send-email" did not correctly remove duplicate mail addresses from the Cc: header that appear on the To: header.
- The completion script (in contrib/completion) ignored lightweight tags in __git_ps1().
- "git-blame" mode (in contrib/emacs) didn’t say (require ’format-spec) even though it depends on it; it didn’t work with Emacs 22 or older unless Gnus is used.
- "git-p4" (in contrib/) did not correctly handle deleted files.
Other minor fixes and documentation updates are also included.
1.7.3.4
Git v1.7.3.4 Release Notes ==========================
Fixes since v1.7.3.3 --------------------
- Smart HTTP transport used to incorrectly retry redirected POST request with GET request.
- "git apply" did not correctly handle patches that only change modes if told to apply while stripping leading paths with -p option.
- "git apply" can deal with patches with timezone formatted with a colon between the hours and minutes part (e.g. "-08:00" instead of "-0800").
- "git checkout" removed an untracked file "foo" from the working tree when switching to a branch that contains a tracked path "foo/bar". Prevent this, just like the case where the conflicting path were "foo" (c752e7f..7980872d).
- "git cherry-pick" or "git revert" refused to work when a path that would be modified by the operation was stat-dirty without a real difference in the contents of the file.
- "git diff --check" reported an incorrect line number for added blank lines at the end of file.
- "git imap-send" failed to build under NO_OPENSSL.
- Setting log.decorate configuration variable to "0" or "1" to mean "false" or "true" did not work.
- "git push" over dumb HTTP protocol did not work against WebDAV servers that did not terminate a collection name with a slash.
- "git tag -v" did not work with GPG signatures in rfc1991 mode.
- The post-receive-email sample hook was accidentally broken in 1.7.3.3 update.
- "gitweb" can sometimes be tricked into parrotting a filename argument given in a request without properly quoting.
Other minor fixes and documentation updates are also included.
1.7.3.5
Git 1.7.3.5 Release Notes =========================
- The xfuncname pattern used by "git diff" and "git grep" to show the last notable line in context were broken for python and ruby for a long time.
- "git merge" into an unborn branch removed an untracked file "foo" from the working tree when merged branch had "foo" (this fix was already in 1.7.3.3 but was omitted from the release notes by mistake).
- "git status -s" did not quote unprintable characters in paths as documented.
- "git am --abort" used to always reset to the commit at the beginning of the last "am" invocation that has stopped, losing any unrelated commits that may have been made since then. Now it refrains from doing so and instead issues a warning.
- "git blame" incorrectly reused bogusly cached result of textconv filter for files from the working tree.
- "git commit" used to abort after the user edited the log message when the committer information was not correctly set up. It now aborts before starting the editor.
- "git commit --date=invalid" used to silently ignore the incorrectly specified date; it is now diagnosed as an error.
- "git rebase --skip" to skip the last commit in a series used to fail to run post-rewrite hook and to copy notes from old commits that have successfully been rebased so far. Now it do (backmerge ef88ad2).
- "gitweb" tried to show a wrong feed logo when none was specified.
1.7.3
Git v1.7.3 Release Notes ========================
Updates since v1.7.2 --------------------
- git-gui, now at version 0.13.0, got various updates and a new maintainer, Pat Thoyts.
- Gitweb allows its configuration to change per each request; it used to read the configuration once upon startup.
- When git finds a corrupt object, it now reports the file that contains it.
- "git checkout -B <it>" is a shorter way to say "git branch -f <it>" followed by "git checkout <it>".
- When "git checkout" or "git merge" refuse to proceed in order to protect local modification to your working tree, they used to stop after showing just one path that might be lost. They now show all, in a format that is easier to read.
- "git clean" learned "-e" ("--exclude") option.
- Hunk headers produced for C# files by "git diff" and friends show more relevant context than before.
- diff.ignoresubmodules configuration variable can be used to squelch the differences in submodules reported when running commands (e.g. "diff", "status", etc.) at the superproject level.
- http.useragent configuration can be used to lie who you are to your restrictive firewall.
- "git rebase --strategy <s>" learned "-X" option to pass extra options that are understood by the chosen merge strategy.
- "git rebase -i" learned "exec" that you can insert into the insn sheet to run a command between its steps.
- "git rebase" between branches that have many binary changes that do not conflict should be faster.
- "git rebase -i" peeks into rebase.autosquash configuration and acts as if you gave --autosquash from the command line.
Also contains various documentation updates.
Fixes since v1.7.2 ------------------
All of the fixes in v1.7.2.X maintenance series are included in this release, unless otherwise noted.
- "git merge -s recursive" (which is the default) did not handle cases where a directory becomes a file (or vice versa) very well.
- "git fetch" and friends were accidentally broken for url with "" in its path, e.g. "git://git.gnome.org/gtk".
- "git fetch $url" (i.e. without refspecs) was broken for quite some time, if the current branch happen to be tracking some remote.
- "git ls-tree dir dirgarbage", when "dir" was a directory, incorrectly recursed into "dir".
- "git note remove" created unnecessary extra commit when named object did not have any note to begin with.
- "git rebase" did not work well if you had diff.noprefix configured.
- "git -c foo=bar subcmd" did not work well for subcmd that is not implemented as a built-in command.
1.7.4.1
Git v1.7.4.1 Release Notes ==========================
Fixes since v1.7.4 ------------------
- On Windows platform, the codepath to spawn a new child process forgot to first flush the output buffer.
- "git bundle" did not use OFS_DELTA encoding, making its output a few per-cent larger than necessarily.
- The option to tell "git clone" to recurse into the submodules was misspelled with an underscore "--recurse_submodules".
- "git diff --cached HEAD" before the first commit does what an end user would expect (namely, show what would be committed without further "git add").
- "git fast-import" didn’t accept the command to ask for "notes" feature to be present in its input stream, even though it was capable of the feature.
- "git fsck" gave up scanning loose object files in directories with garbage files.
And other minor fixes and documentation updates.
1.7.4.2
Git v1.7.4.2 Release Notes ==========================
Fixes since v1.7.4.1 --------------------
- Many documentation updates to match "git cmd -h" output and the git-cmd manual page.
- We used to keep one file descriptor open for each and every packfile that we have a mmap window on it (read: "in use"), even when for very tiny packfiles. We now close the file descriptor early when the entire packfile fits inside one mmap window.
- "git bisect visualize" tried to run "gitk" in windowing environments even when "gitk" is not installed, resulting in a strange error message.
- "git clone /no/such/path" did not fail correctly.
- "git commit" did not correctly error out when the user asked to use a non existent file as the commit message template.
- "git diff --stat -B" ran on binary files counted the changes in lines, which was nonsensical.
- "git diff -M" opportunistically detected copies, which was not necessarily a good thing, especially when it is internally run by recursive merge.
- "git difftool" didn’t tell (g)vimdiff that the files it is reading are to be opened read-only.
- "git merge" didn’t pay attention to prepare-commit-msg hook, even though if a merge is conflicted and manually resolved, the subsequent "git commit" would have triggered the hook, which was inconsistent.
- "git patch-id" (and commands like "format-patch --ignore-in-upstream" that use it as their internal logic) handled changes to files that end with incomplete lines incorrectly.
- The official value to tell "git push" to push the current branch back to update the upstream branch it forked from is now called "upstream". The old name "tracking" is and will be supported.
- "git submodule update" used to honor the --merge/--rebase option (or corresponding configuration variables) even for a newly cloned subproject, which made no sense (so/submodule-no-update-first-time).
- gitweb’s "highlight" interface mishandled tabs.
- gitweb didn’t understand timezones with GMT offset that is not multiple of a whole hour.
- gitweb had a few forward-incompatible syntactic constructs and also used incorrect variable when showing the file mode in a diff.
And other minor fixes and documentation updates.
1.7.4.3
Git v1.7.4.3 Release Notes ==========================
Fixes since v1.7.4.2 --------------------
- "git apply" used to confuse lines updated by previous hunks as lines that existed before when applying a hunk, contributing misapplication of patches with offsets.
- "git branch --track" (and "git checkout --track --branch") used to allow setting up a random non-branch that does not make sense to follow as the "upstream". The command correctly diagnoses it as an error.
- "git checkout $other_branch" silently removed untracked symbolic links in the working tree that are in the way in order to check out paths under it from the named branch.
- "git cvsimport" did not bail out immediately when the cvs server cannot be reached, spewing unnecessary error messages that complain about the server response that it never got.
- "git diff --quiet" did not work very well with the "--diff-filter" option.
- "git grep -n" lacked a long-hand synonym --line-number.
- "git stash apply" reported the result of its operation by running "git status" from the top-level of the working tree; it should (and now does) run it from the user’s working directory.
And other minor fixes and documentation updates.
1.7.4.4
Git v1.7.4.4 Release Notes ==========================
Fixes since v1.7.4.3 --------------------
- Compilation of sha1_file.c on BSD platforms were broken due to our recent use of getrlimit() without including <sys/resource.h>.
- "git config" did not diagnose incorrect configuration variable names.
- "git format-patch" did not wrap a long subject line that resulted from rfc2047 encoding.
- "git instaweb" should work better again with plackup.
- "git log --max-count=4 -Sfoobar" now shows 4 commits that changes the number of occurrences of string "foobar"; it used to scan only for 4 commits and then emitted only matching ones.
- "git log --first-parent --boundary $c^..$c" segfaulted on a merge.
- "git pull" into an empty branch should have behaved as if fast-forwarding from emptiness to the version being pulled, with the usual protection against overwriting untracked files.
- "git submodule" that is run while a merge in the superproject is in conflicted state tried to process each conflicted submodule up to three times.
- "git status" spent all the effort to notice racily-clean index entries but didn’t update the index file to help later operations go faster in some cases.
And other minor fixes and documentation updates.
1.7.4.5
Git v1.7.4.5 Release Notes ==========================
This contains only minor documentation fixes accumulated since 1.7.4.4.
1.7.4
Git v1.7.4 Release Notes ========================
Updates since v1.7.3 --------------------
- The documentation Makefile now assumes by default asciidoc 8 and docbook-xsl >= 1.73. If you have older versions, you can set ASCIIDOC7 and ASCIIDOC_ROFF, respectively.
- The option parsers of various commands that create new branches (or rename existing ones to a new name) were too loose and users were allowed to give a branch a name that begins with a dash by creative abuse of their command line options, which only led to burning themselves. The name of a branch cannot begin with a dash now.
- System-wide fallback default attributes can be stored in /etc/gitattributes; the core.attributesfile configuration variable can be used to customize the path to this file.
- The thread structure generated by "git send-email" has changed slightly. Setting the cover letter of the latest series as a reply to the cover letter of the previous series with --in-reply-to used to make the new cover letter and all the patches replies to the cover letter of the previous series; this has been changed to make the patches in the new series replies to the new cover letter.
- The Bash completion script in contrib/ has been adjusted to be usable with Bash 4 (options with ’=value’ didn’t complete). It has been also made usable with zsh.
- Different pagers can be chosen depending on which subcommand is being run under the pager, using the "pager.<subcommand>" variable.
- The hardcoded tab-width of 8 that is used in whitespace breakage checks is now configurable via the attributes mechanism.
- Support of case insensitive filesystems (i.e. "core.ignorecase") has been improved. For example, the gitignore mechanism didn’t pay attention to case insensitivity.
- The <tree>:<path> syntax for naming a blob in a tree, and the :<path> syntax for naming a blob in the index (e.g. "master:Makefile", ":hello.c") have been extended. You can start <path> with "./" to implicitly have the (sub)directory you are in prefixed to the lookup. Similarly, ":../Makefile" from a subdirectory would mean "the Makefile of the parent directory in the index".
- "git blame" learned the --show-email option to display the e-mail addresses instead of the names of authors.
- "git commit" learned the --fixup and --squash options to help later invocation of interactive rebase.
- Command line options to "git cvsimport" whose names are in capital letters (-A, -M, -R and -S) can now be specified as the default in the .git/config file by their longer names (cvsimport.authorsFile, cvsimport.mergeRegex, cvsimport.trackRevisions, cvsimport.ignorePaths).
- "git daemon" can be built in the MinGW environment.
- "git daemon" can take more than one --listen option to listen to multiple addresses.
- "git describe --exact-match" was optimized not to read commit objects unnecessarily.
- "git diff" and "git grep" learned what functions and subroutines in Fortran, Pascal and Perl look like.
- "git fetch" learned the "--recurse-submodules" option.
- "git mergetool" tells vim/gvim to show a three-way diff by default (use vimdiff2/gvimdiff2 as the tool name for old behavior).
- "git log -G<pattern>" limits the output to commits whose change has added or deleted lines that match the given pattern.
- "git read-tree" with no argument as a way to empty the index is deprecated; we might want to remove it in the future. Users can use the new --empty option to be more explicit instead.
- "git repack -f" does not spend cycles to recompress objects in the non-delta representation anymore (use -F if you really mean it e.g. after you changed the core.compression variable setting).
- "git merge --log" used to limit the resulting merge log to 20 entries; this is now customizable by giving e.g. "--log=47".
- "git merge" may work better when all files were moved out of a directory in one branch while a new file is created in place of that directory in the other branch.
- "git merge" learned the "--abort" option, synonymous to "git reset --merge" when a merge is in progress.
- "git notes" learned the "merge" subcommand to merge notes refs. In addition to the default manual conflict resolution, there are also several notes merge strategies for automatically resolving notes merge conflicts.
- "git rebase --autosquash" can use SHA-1 object names to name the commit which is to be fixed up (e.g. "fixup! e83c5163").
- The default "recursive" merge strategy learned the --rename-threshold option to influence the rename detection, similar to the -M option of "git diff". From the "git merge" frontend, the "-X<strategy option>" interface, e.g. "git merge -Xrename-threshold=50% …", can be used to trigger this.
- The "recursive" strategy also learned to ignore various whitespace changes; the most notable is -Xignore-space-at-eol.
- "git send-email" learned "--to-cmd", similar to "--cc-cmd", to read the recipient list from a command output.
- "git send-email" learned to read and use "To:" from its input files.
- you can extend "git shell", which is often used on boxes that allow git-only login over ssh as login shell, with a custom set of commands.
- The current branch name in "git status" output can be colored differently from the generic header color by setting the "color.status.branch" variable.
- "git submodule sync" updates metainformation for all submodules, not just the ones that have been checked out.
- gitweb can use a custom ’highlight’ command with its configuration file.
- other gitweb updates.
Also contains various documentation updates.
Fixes since v1.7.3 ------------------
All of the fixes in the v1.7.3.X maintenance series are included in this release, unless otherwise noted.
- "git push --progress" shows progress indicators now.
- "git rebase -i" showed a confusing error message when given a branch name that does not exist.
- "git repack" places its temporary packs under $GIT_OBJECT_DIRECTORY/pack instead of $GIT_OBJECT_DIRECTORY/ to avoid cross directory renames.
- "git submodule update --recursive --other-flags" passes flags down to its subinvocations.
1.7.5.1
Git v1.7.5.1 Release Notes ==========================
Fixes since v1.7.5 ------------------
- When an object "$tree:$path" does not exist, if $path does exist in the subtree of $tree that corresponds to the subdirectory the user is in, git now suggests using "$tree:./$path" in addition to the advice to use the full path from the root of the working tree.
- The "--date=relative" output format used to say "X years, 12 months" when it should have said "X+1 years".
- The smart-HTTP transfer was broken in 1.7.5 when the client needs to issue a small POST (which uses content-length) and then a large POST (which uses chunked) back to back.
- "git clean" used to fail on an empty directory that is not readable, even though rmdir(2) could remove such a directory. Now we attempt it as the last resort.
- The "--dirstat" option of "diff" family of commands used to totally ignore a change that only rearranged lines within a file. Such a change now counts as at least a minimum but non zero change.
- The "--dirstat" option of "diff" family of commands used to use the pathname in the original, instead of the pathname in the result, when renames are involved.
- "git pack-object" did not take core.bigfilethreashold into account (unlike fast-import); now it does.
- "git reflog" ignored options like "--format=.." on the command line.
- "git stash apply" used to refuse to work if there was any change in the working tree, even when the change did not overlap with the change the stash recorded.
- "git stash apply @{99999}" was not diagnosed as an error, even when you did not have that many stash entries.
- An error message from "git send-email" to diagnose a broken SMTP connection configuration lacked a space between "hello=<smtp-domain>" and "port=<smtp-server-port>".
And other minor fixes and documentation updates.
1.7.5.2
Git v1.7.5.2 Release Notes ==========================
The release notes to 1.7.5.1 forgot to mention:
- "git stash -p --no-keep-index" and "git stash --no-keep-index -p" now mean the same thing.
- "git upload-pack" (hence "git push" over git native protocol) had a subtle race condition that could lead to a deadlock.
Fixes since v1.7.5.1 --------------------
- "git add -p" did not work correctly when a hunk is split and then one of them was given to the editor.
- "git add -u" did not resolve a conflict where our history deleted and their history modified the same file, and the working tree resolved to keep a file.
- "git cvsimport" did not know that CVSNT stores its password file in a location different from the traditional CVS.
- "git diff-files" did not show the mode information from the working tree side of an unmerged path correctly.
- "git diff -M --cached" used to use unmerged path as a possible rename source candidate, which made no sense.
- The option name parser in "git fast-import" used prefix matches for some options where it shouldn’t, and accepted non-existent options, e.g. "--relative-marksmith" or "--forceps".
- "git format-patch" did not quote RFC822 special characters in the email address (e.g From: Junio C. Hamano <jch@example.com>, not From: "Junio C. Hamano" <jch@example.com>).
- "git format-patch" when run with "--quiet" option used to produce a nonsense result that consists of alternating empty output.
- In "git merge", per-branch branch.<name>.mergeoptions configuration variables did not override the fallback default merge.<option> configuration variables such as merge.ff, merge.log, etc.
- "git merge-one-file" did not honor GIT_WORK_TREE settings when handling a "both sides added, differently" conflict.
- "git mergetool" did not handle conflicted submoudules gracefully.
- "git-p4" (in contrib) used a wrong base image while merge a file that was added on both branches differently.
- "git rebase -i -p" failed to preserve the history when there is a redundant merge created with the --no-ff option.
And other minor fixes and documentation updates.
1.7.5.3
Git v1.7.5.3 Release Notes ==========================
Fixes since v1.7.5.2 --------------------
- The bash completion scripts should correctly work using zsh’s bash completion emulation layer now.
- Setting $(prefix) in config.mak did not affect where etc/gitconfig file is read from, even though passing it from the command line of $(MAKE) did.
- The logic to handle "&" (expand to UNIX username) in GECOS field miscounted the length of the name it formatted.
- "git cherry-pick -s resolve" failed to cherry-pick a root commit.
- "git diff --word-diff" misbehaved when diff.suppress-blank-empty was in effect.
- "git log --stdin path" with an input that has additional pathspec used to corrupt memory.
- "git send-pack" (hence "git push") over smart-HTTP protocol could deadlock when the client side pack-object died early.
- Compressed tarball gitweb generates used to be made with the timestamp of the tarball generation; this was bad because snapshot from the same tree should result in a same tarball.
And other minor fixes and documentation updates.
1.7.5.4
Git v1.7.5.4 Release Notes ==========================
Fixes since v1.7.5.3 --------------------
- The single-key mode of "git add -p" was easily fooled into thinking that it was told to add everything (’a’) when up-arrow was pressed by mistake.
- Setting a git command that uses custom configuration via "-c var=val" as an alias caused a crash due to a realloc(3) failure.
- "git diff -C -C" used to disable the rename detection entirely when there are too many copy candidate paths in the tree; now it falls back to "-C" when doing so would keep the copy candidate paths under the rename detection limit.
- "git rerere" did not diagnose a corrupt MERGE_RR file in some cases.
And other minor fixes and documentation updates.
1.7.5
Git v1.7.5 Release Notes ========================
Updates since v1.7.4 --------------------
- Various MinGW portability fixes.
- Various git-p4 enhancements (in contrib).
- Various vcs-svn, git-svn and gitk enhancements and fixes.
- Various git-gui updates (0.14.0).
- Update to more modern HP-UX port.
- The codebase is getting prepared for i18n/l10n; no translated strings nor translation mechanism in the code yet, but the strings are being marked for l10n.
- The bash completion script can now complete symmetric difference for "git diff" command, e.g. "git diff …bra<TAB>".
- The default minimum length of abbreviated and unique object names can now be configured by setting the core.abbrev configuration variable.
- "git apply -v" reports offset lines when the patch does not apply at the exact location recorded in the diff output.
- "git config" used to be also known as "git repo-config", but the old name is now officially deprecated.
- "git checkout --detach <commit>" is a more user friendly synonym for "git checkout <commit>^0".
- "git checkout" performed on detached HEAD gives a warning and advice when the commit being left behind will become unreachable from any branch or tag.
- "git cherry-pick" and "git revert" can be told to use a custom merge strategy, similar to "git rebase".
- "git cherry-pick" remembers which commit failed to apply when it is stopped by conflicts, making it unnecessary to use "commit -c $commit" to conclude it.
- "git cvsimport" bails out immediately when the cvs server cannot be reached, without spewing unnecessary error messages that complain about the server response it never got.
- "git fetch" vs "git upload-pack" transfer learned ’no-done’ protocol extension to save one round-trip after the content negotiation is done. This saves one HTTP RPC, reducing the overall latency for a trivial fetch.
- "git fetch" can be told to recursively fetch submodules on-demand.
- "git grep -f <filename>" learned to treat "-" as "read from the standard input stream".
- "git grep --no-index" did not honor pathspecs correctly, returning paths outside the specified area.
- "git init" learned the --separate-git-dir option to allow the git directory for a new repository created elsewhere and linked via the gitdir mechanism. This is primarily to help submodule support later to switch between a branch of superproject that has the submodule and another that does not.
- "git log" type commands now understand globbing pathspecs. You can say "git log — ’*.txt’" for example.
- "git log" family of commands learned --cherry and --cherry-mark options that can be used to view two diverged branches while omitting or highlighting equivalent changes that appear on both sides of a symmetric difference (e.g. "log --cherry A…B").
- A lazy "git merge" that didn’t say what to merge used to be an error. When run on a branch that has an upstream defined, however, the command now merges from the configured upstream.
- "git mergetool" learned how to drive "beyond compare 3" as well.
- "git rerere forget" without pathspec used to forget all the saved conflicts that relate to the current merge; it now requires you to give it pathspecs.
- "git rev-list --objects $revs — $pathspec" now limits the objects listed in its output properly with the pathspec, in preparation for narrow clones.
- "git push" with no parameters gives better advice messages when "tracking" is used as the push.default semantics or there is no remote configured yet.
- A possible value to the "push.default" configuration variable, ’tracking’, gained a synonym that more naturally describes what it does, ’upstream’.
- "git rerere" learned a new subcommand "remaining" that is similar to "status" and lists the paths that had conflicts which are known to rerere, but excludes the paths that have already been marked as resolved in the index from its output. "git mergetool" has been updated to use this facility.
Also contains various documentation updates.
Fixes since v1.7.4 ------------------
All of the fixes in the v1.7.4.X maintenance series are included in this release, unless otherwise noted.
- "git fetch" from a client that is mostly following the remote needlessly told all of its refs to the server for both sides to compute the set of objects that need to be transferred efficiently, instead of stopping when the server heard enough. In a project with many tags, this turns out to be extremely wasteful, especially over the smart HTTP transport (sp/maint-{upload,fetch}-pack-stop-early~1).
- "git fetch" run from a repository that uses the same repository as its alternate object store as the repository it is fetching from did not tell the server that it already has access to objects reachable from the refs in their common alternate object store, causing it to fetch unnecessary objects (jc/maint-fetch-alt).
- "git remote add --mirror" created a configuration that is suitable for doing both a mirror fetch and a mirror push at the same time, which made little sense. We now warn and require the command line to specify either --mirror=fetch or --mirror=push.
1.7.6.1
Git v1.7.6.1 Release Notes ==========================
Fixes since v1.7.6 ------------------
- Various codepaths that invoked zlib deflate/inflate assumed that these functions can compress or uncompress more than 4GB data in one call on platforms with 64-bit long, which has been corrected.
- "git unexecutable" reported that "unexecutable" was not found, even though the actual error was that "unexecutable" was found but did not have a proper she-bang line to be executed.
- Error exits from $PAGER were silently ignored.
- "git checkout -b <branch>" was confused when attempting to create a branch whose name ends with "-g" followed by hexadecimal digits, and refused to work.
- "git checkout -b <branch>" sometimes wrote a bogus reflog entry, causing later "git checkout -" to fail.
- "git diff --cc" learned to correctly ignore binary files.
- "git diff -c/--cc" mishandled a deletion that resolves a conflict, and looked in the working tree instead.
- "git fast-export" forgot to quote pathnames with unsafe characters in its output.
- "git fetch" over smart-http transport used to abort when the repository was updated between the initial connection and the subsequent object transfer.
- "git fetch" did not recurse into submodules in subdirectories.
- "git ls-tree" did not error out when asked to show a corrupt tree.
- "git pull" without any argument left an extra whitespace after the command name in its reflog.
- "git push --quiet" was not really quiet.
- "git rebase -i -p" incorrectly dropped commits from side branches.
- "git reset [<commit>] paths…" did not reset the index entry correctly for unmerged paths.
- "git submodule add" did not allow a relative repository path when the superproject did not have any default remote url.
- "git submodule foreach" failed to correctly give the standard input to the user-supplied command it invoked.
- submodules that the user has never showed interest in by running "git submodule init" was incorrectly marked as interesting by "git submodule sync".
- "git submodule update --quiet" was not really quiet.
- "git tag -l <glob>…" did not take multiple glob patterns from the command line.
1.7.6.2
Git v1.7.6.2 Release Notes ==========================
Fixes since v1.7.6.1 --------------------
- v1.7.6.1 broke "git push --quiet"; it used to be a no-op against an old version of Git running on the other end, but v1.7.6.1 made it abort.
1.7.6.3
Git v1.7.6.3 Release Notes ==========================
Fixes since v1.7.6.2 --------------------
- "git -c var=value subcmd" misparsed the custom configuration when value contained an equal sign.
- "git fetch" had a major performance regression, wasting many needless cycles in a repository where there is no submodules present. This was especially bad, when there were many refs.
- "git reflog $refname" did not default to the "show" subcommand as the documentation advertised the command to do.
- "git reset" did not leave meaningful log message in the reflog.
- "git status --ignored" did not show ignored items when there is no untracked items.
- "git tag --contains $commit" was unnecessarily inefficient.
Also contains minor fixes and documentation updates.
1.7.6.4
Git v1.7.6.4 Release Notes ==========================
Fixes since v1.7.6.3 --------------------
- The error reporting logic of "git am" when the command is fed a file whose mail-storage format is unknown was fixed.
- "git branch --set-upstream @{-1} foo" did not expand @{-1} correctly.
- "git check-ref-format --print" used to parrot a candidate string that began with a slash (e.g. /refs/heads/master) without stripping it, to make the result a suitably normalized string the caller can append to "$GIT_DIR/".
- "git clone" failed to clone locally from a ".git" file that itself is not a directory but is a pointer to one.
- "git clone" from a local repository that borrows from another object store using a relative path in its objects/info/alternates file did not adjust the alternates in the resulting repository.
- "git describe --dirty" did not refresh the index before checking the state of the working tree files.
- "git ls-files ../$path" that is run from a subdirectory reported errors incorrectly when there is no such path that matches the given pathspec.
- "git mergetool" could loop forever prompting when nothing can be read from the standard input.
Also contains minor fixes and documentation updates.
1.7.6.5
Git v1.7.6.5 Release Notes ==========================
Fixes since v1.7.6.4 --------------------
- The date parser did not accept timezone designators that lack minutes part and also has a colon between "hh:mm".
- After fetching from a remote that has very long refname, the reporting output could have corrupted by overrunning a static buffer.
- "git mergetool" did not use its arguments as pathspec, but as a path to the file that may not even have any conflict.
- "git name-rev --all" tried to name all objects, naturally failing to describe many blobs and trees, instead of showing only commits as advertised in its documentation.
- "git remote rename $a $b" were not careful to match the remote name against $a (i.e. source side of the remote nickname).
- "gitweb" used to produce a non-working link while showing the contents of a blob, when JavaScript actions are enabled.
Also contains minor fixes and documentation updates.
1.7.6.6
Git v1.7.6.6 Release Notes ==========================
Fixes since v1.7.6.5 --------------------
- The code to look up attributes for paths reused entries from a wrong directory when two paths in question are in adjacent directories and the name of the one directory is a prefix of the other.
- When producing a "thin pack" (primarily used in bundles and smart HTTP transfers) out of a fully packed repository, we unnecessarily avoided sending recent objects as a delta against objects we know the other side has.
Also contains minor fixes and documentation updates.
1.7.6
Git v1.7.6 Release Notes ========================
Updates since v1.7.5 --------------------
- Various git-svn updates.
- Updates the way content tags are handled in gitweb. Also adds a UI to choose common timezone for displaying the dates.
- Similar to branch names, tagnames that begin with "-" are now disallowed.
- Clean-up of the C part of i18n (but not l10n---please wait) continues.
- The scripting part of the codebase is getting prepared for i18n/l10n.
- Pushing and pulling from a repository with large number of refs that point to identical commits are optimized by not listing the same commit during the common ancestor negotiation exchange with the other side.
- Adding a file larger than core.bigfilethreshold (defaults to 1/2 Gig) using "git add" will send the contents straight to a packfile without having to hold it and its compressed representation both at the same time in memory.
- Processes spawned by "[alias] <name> = !process" in the configuration can inspect GIT_PREFIX environment variable to learn where in the working tree the original command was invoked.
- A magic pathspec ":/" tells a command that limits its operation to the current directory when ran from a subdirectory to work on the entire working tree. In general, ":/path/to/file" would be relative to the root of the working tree hierarchy.
After "git reset --hard; edit Makefile; cd t/", "git add -u" would
be a no-op, but "git add -u :/" would add the updated contents of
the Makefile at the top level. If you want to name a path in the
current subdirectory whose unusual name begins with ":/", you can
name it by "./:/that/path" or by "\:/that/path".
- "git blame" learned "--abbrev[=<n>]" option to control the minimum number of hexdigits shown for commit object names.
- "git blame" learned "--line-porcelain" that is less efficient but is easier to parse.
- Aborting "git commit --interactive" discards updates to the index made during the interactive session.
- "git commit" learned a "--patch" option to directly jump to the per-hunk selection UI of the interactive mode.
- "git diff" and its family of commands learned --dirstat=0 to show directories that contribute less than 0.1% of changes.
- "git diff" and its family of commands learned --dirstat=lines mode to assess damage to the directory based on number of lines in the patch output, not based on the similarity numbers.
- "git format-patch" learned "--quiet" option to suppress the output of the names of generated files.
- "git format-patch" quotes people’s names when it has RFC822 special characters in it, e.g. "Junio C. Hamano" <jch@example.com>. Earlier it was up to the user to do this when using its output.
- "git format-patch" can take an empty --subject-prefix now.
- "git grep" learned the "-P" option to take pcre regular expressions.
- "git log" and friends learned a new "--notes" option to replace the "--show-notes" option. Unlike "--show-notes", "--notes=<ref>" does not imply showing the default notes.
- They also learned a log.abbrevCommit configuration variable to augment the --abbrev-commit command line option.
- "git ls-remote" learned "--exit-code" option to consider it a different kind of error when no remote ref to be shown.
- "git merge" learned "-" as a short-hand for "the previous branch", just like the way "git checkout -" works.
- "git merge" uses "merge.ff" configuration variable to decide to always create a merge commit (i.e. --no-ff, aka merge.ff=no), refuse to create a merge commit (i.e. --ff-only, aka merge.ff=only). Setting merge.ff=yes (or not setting it at all) restores the default behaviour of allowing fast-forward to happen when possible.
- p4-import (from contrib) learned a new option --preserve-user.
- "git read-tree -m" learned "--dry-run" option that reports if a merge would fail without touching the index nor the working tree.
- "git rebase" that does not specify on top of which branch to rebase the current branch now uses @{upstream} of the current branch.
- "git rebase" finished either normally or with --abort did not update the reflog for HEAD to record the event to come back to where it started from.
- "git remote add -t only-this-branch --mirror=fetch" is now allowed. Earlier a fetch-mode mirror meant mirror everything, but now it only means refs are not renamed.
- "git rev-list --count" used with "--cherry-mark" counts the cherry-picked commits separately, producing more a useful output.
- "git submodule update" learned "--force" option to get rid of local changes in submodules and replace them with the up-to-date version.
- "git status" and friends ignore .gitmodules file while the file is still in a conflicted state during a merge, to avoid using information that is not final and possibly corrupt with conflict markers.
Also contains various documentation updates and minor miscellaneous changes.
Fixes since v1.7.5 ------------------
Unless otherwise noted, all the fixes in 1.7.5.X maintenance track are included in this release.
- "git config" used to choke with an insanely long line. (merge ef/maint-strbuf-init later)
- "git diff --quiet" did not work well with --diff-filter. (merge jk/diff-not-so-quick later)
- "git status -z" did not default to --porcelain output format. (merge bc/maint-status-z-to-use-porcelain later)
1.7.7.1
Git v1.7.7.1 Release Notes ==========================
Fixes since v1.7.7 ------------------
- On some BSD systems, adding +s bit on directories is detrimental (it is not necessary on BSD to begin with). "git init --shared" has been updated to take this into account without extra makefile settings on platforms the Makefile knows about.
- After incorrectly written third-party tools store a tag object in HEAD, git diagnosed it as a repository corruption and refused to proceed in order to avoid spreading the damage. We now gracefully recover from such a situation by pretending as if the commit that is pointed at by the tag were in HEAD.
- "git apply --whitespace=error" did not bother to report the exact line number in the patch that introduced new blank lines at the end of the file.
- "git apply --index" did not check corrupted patch.
- "git checkout $tree $directory/" resurrected paths locally removed or modified only in the working tree in $directory/ that did not appear in $directory of the given $tree. They should have been kept intact.
- "git diff $tree $path" used to apply the pathspec at the output stage, reading the whole tree, wasting resources.
- The code to check for updated submodules during a "git fetch" of the superproject had an unnecessary quadratic loop.
- "git fetch" from a large bundle did not enable the progress output.
- When "git fsck --lost-and-found" found that an empty blob object in the object store is unreachable, it incorrectly reported an error after writing the lost blob out successfully.
- "git filter-branch" did not refresh the index before checking that the working tree was clean.
- "git grep $tree" when run with multiple threads had an unsafe access to the object database that should have been protected with mutex.
- The "--ancestry-path" option to "git log" and friends misbehaved in a history with complex criss-cross merges and showed an uninteresting side history as well.
- Test t1304 assumed LOGNAME is always set, which may not be true on some systems.
- Tests with --valgrind failed to find "mergetool" scriptlets.
- "git patch-id" miscomputed the patch-id in a patch that has a line longer than 1kB.
- When an "exec" insn failed after modifying the index and/or the working tree during "rebase -i", we now check and warn that the changes need to be cleaned up.
1.7.7.2
Git v1.7.7.2 Release Notes ==========================
Fixes since v1.7.7.1 --------------------
- We used to drop error messages from libcurl on certain kinds of errors.
- Error report from smart HTTP transport, when the connection was broken in the middle of a transfer, showed a useless message on a corrupt packet.
- "git fetch --prune" was unsafe when used with refspecs from the command line.
- The attribute mechanism did not use case insensitive match when core.ignorecase was set.
- "git bisect" did not notice when it failed to update the working tree to the next commit to be tested.
- "git config --bool --get-regexp" failed to separate the variable name and its value "true" when the variable is defined without "= true".
- "git remote rename $a $b" were not careful to match the remote name against $a (i.e. source side of the remote nickname).
- "git mergetool" did not use its arguments as pathspec, but as a path to the file that may not even have any conflict.
- "git diff --[num]stat" used to use the number of lines of context different from the default, potentially giving different results from "git diff | diffstat" and confusing the users.
- "git pull" and "git rebase" did not work well even when GIT_WORK_TREE is set correctly with GIT_DIR if the current directory is outside the working tree.
- "git send-email" did not honor the configured hostname when restarting the HELO/EHLO exchange after switching TLS on.
- "gitweb" used to produce a non-working link while showing the contents of a blob, when JavaScript actions are enabled.
1.7.7.3
Git v1.7.7.3 Release Notes ==========================
Fixes since v1.7.7.2 --------------------
- Adjust the "quick-install-doc" procedures as preformatted html/manpage are no longer in the source repository.
- The logic to optimize the locality of the data in a pack introduced in 1.7.7 was grossly inefficient.
- The logic to filter out forked projects in the project list in "gitweb" was broken for some time.
- "git branch -m/-M" advertised to update RENAME_REF ref in the commit log message that introduced the feature but not anywhere in the documentation, and never did update such a ref anyway. This undocumented misfeature that did not exist has been excised.
1.7.7.4
Git v1.7.7.4 Release Notes ==========================
Fixes since v1.7.7.3 --------------------
- A few header dependencies were missing from the Makefile.
- Some newer parts of the code used C99 VA_ARGS while we still try to cater to older compilers.
- "git name-rev --all" tried to name all objects, naturally failing to describe many blobs and trees, instead of showing only commits as advertised in its documentation.
1.7.7.5
Git v1.7.7.5 Release Notes ==========================
Fixes since v1.7.7.4 --------------------
- After fetching from a remote that has very long refname, the reporting output could have corrupted by overrunning a static buffer.
- "git checkout" and "git merge" treated in-tree .gitignore and exclude file in $GIT_DIR/info/ directory inconsistently when deciding which untracked files are ignored and expendable.
Also contains minor fixes and documentation updates.
1.7.7.6
Git v1.7.7.6 Release Notes ==========================
Fixes since v1.7.7.5 --------------------
- The code to look up attributes for paths reused entries from a wrong directory when two paths in question are in adjacent directories and the name of the one directory is a prefix of the other.
- A wildcard that matches deeper hierarchy given to the "diff-index" command, e.g. "git diff-index HEAD — ’*.txt’", incorrectly reported additions of matching files even when there is no change.
- When producing a "thin pack" (primarily used in bundles and smart HTTP transfers) out of a fully packed repository, we unnecessarily avoided sending recent objects as a delta against objects we know the other side has.
Also contains minor fixes and documentation updates.
1.7.7.7
Git v1.7.7.7 Release Notes ==========================
Fixes since v1.7.7.6 --------------------
- An error message from ’git bundle’ had an unmatched single quote pair in it.
- ’git diff --histogram’ option was not described.
- ’git imap-send’ carried an unused dead code.
Also contains minor fixes and documentation updates.
1.7.7
Git v1.7.7 Release Notes ========================
Updates since v1.7.6 --------------------
- The scripting part of the codebase is getting prepared for i18n/l10n.
- Interix, Cygwin and Minix ports got updated.
- Various updates to git-p4 (in contrib/), fast-import, and git-svn.
- Gitweb learned to read from /etc/gitweb-common.conf when it exists, before reading from gitweb_config.perl or from /etc/gitweb.conf (this last one is read only when per-repository gitweb_config.perl does not exist).
- Various codepaths that invoked zlib deflate/inflate assumed that these functions can compress or uncompress more than 4GB data in one call on platforms with 64-bit long, which has been corrected.
- Git now recognizes loose objects written by other implementations that use a non-standard window size for zlib deflation (e.g. Agit running on Android with 4kb window). We used to reject anything that was not deflated with 32kb window.
- Interaction between the use of pager and coloring of the output has been improved, especially when a command that is not built-in was involved.
- "git am" learned to pass the "--exclude=<path>" option through to underlying "git apply".
- You can now feed many empty lines before feeding an mbox file to "git am".
- "git archive" can be told to pass the output to gzip compression and produce "archive.tar.gz".
- "git bisect" can be used in a bare repository (provided that the test you perform per each iteration does not need a working tree, of course).
- The length of abbreviated object names in "git branch -v" output now honors the core.abbrev configuration variable.
- "git check-attr" can take relative paths from the command line.
- "git check-attr" learned an "--all" option to list the attributes for a given path.
- "git checkout" (both the code to update the files upon checking out a different branch and the code to checkout a specific set of files) learned to stream the data from object store when possible, without having to read the entire contents of a file into memory first. An earlier round of this code that is not in any released version had a large leak but now it has been plugged.
- "git clone" can now take a "--config key=value" option to set the repository configuration options that affect the initial checkout.
- "git commit <paths>…" now lets you feed relative pathspecs that refer to outside your current subdirectory.
- "git diff --stat" learned a --stat-count option to limit the output of a diffstat report.
- "git diff" learned a "--histogram" option to use a different diff generation machinery stolen from jgit, which might give better performance.
- "git diff" had a weird worst case behaviour that can be triggered when comparing files with potentially many places that could match.
- "git fetch", "git push" and friends no longer show connection errors for addresses that couldn’t be connected to when at least one address succeeds (this is arguably a regression but a deliberate one).
- "git grep" learned "--break" and "--heading" options, to let users mimic the output format of "ack".
- "git grep" learned a "-W" option that shows wider context using the same logic used by "git diff" to determine the hunk header.
- Invoking the low-level "git http-fetch" without "-a" option (which git itself never did—normal users should not have to worry about this) is now deprecated.
- The "--decorate" option to "git log" and its family learned to highlight grafted and replaced commits.
- "git rebase master topci" no longer spews usage hints after giving the "fatal: no such branch: topci" error message.
- The recursive merge strategy implementation got a fairly large fix for many corner cases that may rarely happen in real world projects (it has been verified that none of the 16000+ merges in the Linux kernel history back to v2.6.12 is affected with the corner case bugs this update fixes).
- "git stash" learned an "--include-untracked option".
- "git submodule update" used to stop at the first error updating a submodule; it now goes on to update other submodules that can be updated, and reports the ones with errors at the end.
- "git push" can be told with the "--recurse-submodules=check" option to refuse pushing of the supermodule, if any of its submodules’ commits hasn’t been pushed out to their remotes.
- "git upload-pack" and "git receive-pack" learned to pretend that only a subset of the refs exist in a repository. This may help a site to put many tiny repositories into one repository (this would not be useful for larger repositories as repacking would be problematic).
- "git verify-pack" has been rewritten to use the "index-pack" machinery that is more efficient in reading objects in packfiles.
- test scripts for gitweb tried to run even when CGI-related perl modules are not installed; they now exit early when the latter are unavailable.
Also contains various documentation updates and minor miscellaneous changes.
Fixes since v1.7.6 ------------------
Unless otherwise noted, all fixes in the 1.7.6.X maintenance track are included in this release.
- "git branch -m" and "git checkout -b" incorrectly allowed the tip of the branch that is currently checked out updated.
1.7.8.1
Git v1.7.8.1 Release Notes ==========================
Fixes since v1.7.8 ------------------
- In some codepaths (notably, checkout and merge), the ignore patterns recorded in $GIT_DIR/info/exclude were not honored. They now are.
- "git apply --check" did not error out when given an empty input without any patch.
- "git archive" mistakenly allowed remote clients to ask for commits that are not at the tip of any ref.
- "git checkout" and "git merge" treated in-tree .gitignore and exclude file in $GIT_DIR/info/ directory inconsistently when deciding which untracked files are ignored and expendable.
- LF-to-CRLF streaming filter used when checking out a large-ish blob fell into an infinite loop with a rare input.
- The function header pattern for files with "diff=cpp" attribute did not consider "type *funcname(type param1,…" as the beginning of a function.
- The error message from "git diff" and "git status" when they fail to inspect changes in submodules did not report which submodule they had trouble with.
- After fetching from a remote that has very long refname, the reporting output could have corrupted by overrunning a static buffer.
- "git pack-objects" avoids creating cyclic dependencies among deltas when seeing a broken packfile that records the same object in both the deflated form and as a delta.
Also contains minor fixes and documentation updates.
1.7.8.2
Git v1.7.8.2 Release Notes ==========================
Fixes since v1.7.8.1 --------------------
- Porcelain commands like "git reset" did not distinguish deletions and type-changes from ordinary modification, and reported them with the same ’M’ moniker. They now use ’D’ (for deletion) and ’T’ (for type-change) to match "git status -s" and "git diff --name-status".
- The configuration file parser used for sizes (e.g. bigFileThreshold) did not correctly interpret ’g’ suffix.
- The replacement implementation for snprintf used on platforms with native snprintf that is broken did not use va_copy correctly.
- LF-to-CRLF streaming filter replaced all LF with CRLF, which might be technically correct but not friendly to people who are trying to recover from earlier mistakes of using CRLF in the repository data in the first place. It now refrains from doing so for LF that follows a CR.
- git native connection going over TCP (not over SSH) did not set SO_KEEPALIVE option which failed to receive link layer errors.
- "git branch -m <current branch> HEAD" is an obvious no-op but was not allowed.
- "git checkout -m" did not recreate the conflicted state in a "both sides added, without any common ancestor version" conflict situation.
- "git cherry-pick $commit" (not a range) created an unnecessary sequencer state and interfered with valid workflow to use the command during a session to cherry-pick multiple commits.
- You could make "git commit" segfault by giving the "--no-message" option.
- "fast-import" did not correctly update an existing notes tree, possibly corrupting the fan-out.
- "git fetch-pack" accepted unqualified refs that do not begin with refs/ by mistake and compensated it by matching the refspec with tail-match, which was doubly wrong. This broke fetching from a repository with a funny named ref "refs/foo/refs/heads/master" and a ’master’ branch with "git fetch-pack refs/heads/master", as the command incorrectly considered the former a "match".
- "git log --follow" did not honor the rename threshold score given with the -M option (e.g. "-M50%").
- "git mv" gave suboptimal error/warning messages when it overwrites target files. It also did not pay attention to "-v" option.
- Authenticated "git push" over dumb HTTP were broken with a recent change and failed without asking for password when username is given.
- "git push" to an empty repository over HTTP were broken with a recent change to the ref handling.
- "git push -v" forgot how to be verbose by mistake. It now properly becomes verbose when asked to.
- When a "reword" action in "git rebase -i" failed to run "commit --amend", we did not give the control back to the user to resolve the situation, and instead kept the original commit log message.
Also contains minor fixes and documentation updates.
1.7.8.3
Git v1.7.8.3 Release Notes ==========================
Fixes since v1.7.8.2 --------------------
- Attempt to fetch from an empty file pretending it to be a bundle did not error out correctly.
- gitweb did not correctly fall back to configured $fallback_encoding that is not ’latin1’.
- "git clone --depth $n" did not catch a non-number given as $n as an error.
Also contains minor fixes and documentation updates.
1.7.8.4
Git v1.7.8.4 Release Notes ==========================
Fixes since v1.7.8.3 --------------------
- The code to look up attributes for paths reused entries from a wrong directory when two paths in question are in adjacent directories and the name of the one directory is a prefix of the other.
- A wildcard that matches deeper hierarchy given to the "diff-index" command, e.g. "git diff-index HEAD — ’*.txt’", incorrectly reported additions of matching files even when there is no change.
- When producing a "thin pack" (primarily used in bundles and smart HTTP transfers) out of a fully packed repository, we unnecessarily avoided sending recent objects as a delta against objects we know the other side has.
- "git send-email" did not properly treat sendemail.multiedit as a boolean (e.g. setting it to "false" did not turn it off).
Also contains minor fixes and documentation updates.
1.7.8.5
Git v1.7.8.5 Release Notes ==========================
Fixes since v1.7.8.4 --------------------
- Dependency on our thread-utils.h header file was missing for objects that depend on it in the Makefile.
- "git am" when fed an empty file did not correctly finish reading it when it attempts to guess the input format.
- "git grep -P" (when PCRE is enabled in the build) did not match the beginning and the end of the line correctly with ^ and $.
- "git rebase -m" tried to run "git notes copy" needlessly when nothing was rewritten.
Also contains minor fixes and documentation updates.
1.7.8.6
Git v1.7.8.6 Release Notes ==========================
Fixes since v1.7.8.5 --------------------
- An error message from ’git bundle’ had an unmatched single quote pair in it.
- ’git diff --histogram’ option was not described.
- Documentation for ’git rev-list’ had minor formatting errors.
- ’git imap-send’ carried an unused dead code.
- The way ’git fetch’ implemented its connectivity check over received objects was overly pessimistic, and wasted a lot of cycles.
- Various minor backports of fixes from the ’master’ and the ’maint’ branch.
Also contains minor fixes and documentation updates.
1.7.8
Git v1.7.8 Release Notes ========================
Updates since v1.7.7 --------------------
- Some git-svn, git-gui, git-p4 (in contrib) and msysgit updates.
- Updates to bash completion scripts.
- The build procedure has been taught to take advantage of computed dependency automatically when the compiler supports it.
- The date parser now accepts timezone designators that lack minutes part and also has a colon between "hh:mm".
- The contents of the /etc/mailname file, if exists, is used as the default value of the hostname part of the committer/author e-mail.
- "git am" learned how to read from patches generated by Hg.
- "git archive" talking with a remote repository can report errors from the remote side in a more informative way.
- "git branch" learned an explicit --list option to ask for branches listed, optionally with a glob matching pattern to limit its output.
- "git check-attr" learned "--cached" option to look at .gitattributes files from the index, not from the working tree.
- Variants of "git cherry-pick" and "git revert" that take multiple commits learned to "--continue" and "--abort".
- "git daemon" gives more human readable error messages to clients using ERR packets when appropriate.
- Errors at the network layer is logged by "git daemon".
- "git diff" learned "--minimal" option to spend extra cycles to come up with a minimal patch output.
- "git diff" learned "--function-context" option to show the whole function as context that was affected by a change.
- "git difftool" can be told to skip launching the tool for a path by answering ’n’ to its prompt.
- "git fetch" learned to honor transfer.fsckobjects configuration to validate the objects that were received from the other end, just like "git receive-pack" (the receiving end of "git push") does.
- "git fetch" makes sure that the set of objects it received from the other end actually completes the history before updating the refs. "git receive-pack" (the receiving end of "git push") learned to do the same.
- "git fetch" learned that fetching/cloning from a regular file on the filesystem is not necessarily a request to unpack a bundle file; the file could be ".git" with "gitdir: <path>" in it.
- "git for-each-ref" learned "%(contents:subject)", "%(contents:body)" and "%(contents:signature)". The last one is useful for signed tags.
- "git grep" used to incorrectly pay attention to .gitignore files scattered in the directory it was working in even when "--no-index" option was used. It no longer does this. The "--exclude-standard" option needs to be given to explicitly activate the ignore mechanism.
- "git grep" learned "--untracked" option, where given patterns are searched in untracked (but not ignored) files as well as tracked files in the working tree, so that matches in new but not yet added files do not get missed.
- The recursive merge backend no longer looks for meaningless existing merges in submodules unless in the outermost merge.
- "git log" and friends learned "--children" option.
- "git ls-remote" learned to respond to "-h"(elp) requests.
- "mediawiki" remote helper can interact with (surprise!) MediaWiki with "git fetch" & "git push".
- "git merge" learned the "--edit" option to allow users to edit the merge commit log message.
- "git rebase -i" can be told to use special purpose editor suitable only for its insn sheet via sequence.editor configuration variable.
- "git send-email" learned to respond to "-h"(elp) requests.
- "git send-email" allows the value given to sendemail.aliasfile to begin with "~/" to refer to the $HOME directory.
- "git send-email" forces use of Authen::SASL::Perl to work around issues between Authen::SASL::Cyrus and AUTH PLAIN/LOGIN.
- "git stash" learned "--include-untracked" option to stash away untracked/ignored cruft from the working tree.
- "git submodule clone" does not leak an error message to the UI level unnecessarily anymore.
- "git submodule update" learned to honor "none" as the value for submodule.<name>.update to specify that the named submodule should not be checked out by default.
- When populating a new submodule directory with "git submodule init", the $GIT_DIR metainformation directory for submodules is created inside $GIT_DIR/modules/<name>/ directory of the superproject and referenced via the gitfile mechanism. This is to make it possible to switch between commits in the superproject that has and does not have the submodule in the tree without re-cloning.
- "gitweb" leaked unescaped control characters from syntax hiliter outputs.
- "gitweb" can be told to give custom string at the end of the HTML HEAD element.
- "gitweb" now has its own manual pages.
Also contains other documentation updates and minor code cleanups.
Fixes since v1.7.7 ------------------
Unless otherwise noted, all fixes in the 1.7.7.X maintenance track are included in this release.
- HTTP transport did not use pushurl correctly, and also did not tell what host it is trying to authenticate with when asking for credentials. (merge deba493 jk/http-auth later to maint).
- "git blame" was aborted if started from an uncommitted content and the path had the textconv filter in effect. (merge 8518088 ss/blame-textconv-fake-working-tree later to maint).
- Adding many refs to the local repository in one go (e.g. "git fetch" that fetches many tags) and looking up a ref by name in a repository with too many refs were unnecessarily slow. (merge 17d68a54d jp/get-ref-dir-unsorted later to maint).
- Report from "git commit" on untracked files was confused under core.ignorecase option. (merge 395c7356 jk/name-hash-dirent later to maint).
- "git merge" did not understand ":/<pattern>" as a way to name a commit.
" "git push" on the receiving end used to call post-receive and post-update
hooks for attempted removal of non-existing refs.
(merge 160b81ed ph/push-to-delete-nothing later to maint).
- Help text for "git remote set-url" and "git remote set-branches" were misspelled. (merge c49904e fc/remote-seturl-usage-fix later to maint). (merge 656cdf0 jc/remote-setbranches-usage-fix later to maint).
1.7.9.1
Git v1.7.9.1 Release Notes ==========================
Fixes since v1.7.9 ------------------
- The makefile allowed environment variable X seep into it result in command names suffixed with unnecessary strings.
- The set of included header files in compat/inet-{ntop,pton} wrappers was updated for Windows some time ago, but in a way that broke Solaris build.
- rpmbuild noticed an unpackaged but installed *.mo file and failed.
- Subprocesses spawned from various git programs were often left running to completion even when the top-level process was killed.
- "git add -e" learned not to show a diff for an otherwise unmodified submodule that only has uncommitted local changes in the patch prepared by for the user to edit.
- Typo in "git branch --edit-description my-tpoic" was not diagnosed.
- Using "git grep -l/-L" together with options -W or --break may not make much sense as the output is to only count the number of hits and there is no place for file breaks, but the latter options made "-l/-L" to miscount the hits.
- "git log --first-parent $pathspec" did not stay on the first parent chain and veered into side branch from which the whole change to the specified paths came.
- "git merge --no-edit $tag" failed to honor the --no-edit option.
- "git merge --ff-only $tag" failed because it cannot record the required mergetag without creating a merge, but this is so common operation for branch that is used only to follow the upstream, so it was changed to allow fast-forwarding without recording the mergetag.
- "git mergetool" now gives an empty file as the common base version to the backend when dealing with the "both sides added, differently" case.
- "git push -q" was not sufficiently quiet.
- When "git push" fails to update any refs, the client side did not report an error correctly to the end user.
- "rebase" and "commit --amend" failed to work on commits with ancient timestamps near year 1970.
- When asking for a tag to be pulled, "request-pull" did not show the name of the tag prefixed with "tags/", which would have helped older clients.
- "git submodule add $path" forgot to recompute the name to be stored in .gitmodules when the submodule at $path was once added to the superproject and already initialized.
- Many small corner case bugs on "git tag -n" was corrected.
Also contains minor fixes and documentation updates.
1.7.9.2
Git v1.7.9.2 Release Notes ==========================
Fixes since v1.7.9.1 --------------------
- Bash completion script (in contrib/) did not like a pattern that begins with a dash to be passed to __git_ps1 helper function.
- Adaptation of the bash completion script (in contrib/) for zsh incorrectly listed all subcommands when "git <TAB><TAB>" was given to ask for list of porcelain subcommands.
- The build procedure for profile-directed optimized binary was not working very well.
- Some systems need to explicitly link -lcharset to get locale_charset().
- t5541 ignored user-supplied port number used for HTTP server testing.
- The error message emitted when we see an empty loose object was not phrased correctly.
- The code to ask for password did not fall back to the terminal input when GIT_ASKPASS is set but does not work (e.g. lack of X with GUI askpass helper).
- We failed to give the true terminal width to any subcommand when they are invoked with the pager, i.e. "git -p cmd".
- map_user() was not rewriting its output correctly, which resulted in the user visible symptom that "git blame -e" sometimes showed excess ’>’ at the end of email addresses.
- "git checkout -b" did not allow switching out of an unborn branch.
- When you have both …/foo and …/foo.git, "git clone …/foo" did not favor the former but the latter.
- "git commit" refused to create a commit when entries added with "add -N" remained in the index, without telling Git what their content in the next commit should be. We should have created the commit without these paths.
- "git diff --stat" said "files", "insertions", and "deletions" even when it is showing one "file", one "insertion" or one "deletion".
- The output from "git diff --stat" for two paths that have the same amount of changes showed graph bars of different length due to the way we handled rounding errors.
- "git grep" did not pay attention to -diff (hence -binary) attribute.
- The transport programs (fetch, push, clone)ignored --no-progress and showed progress when sending their output to a terminal.
- Sometimes error status detected by a check in an earlier phase of "git receive-pack" (the other end of "git push") was lost by later checks, resulting in false indication of success.
- "git rev-list --verify" sometimes skipped verification depending on the phase of the moon, which dates back to 1.7.8.x series.
- Search box in "gitweb" did not accept non-ASCII characters correctly.
- Search interface of "gitweb" did not show multiple matches in the same file correctly.
Also contains minor fixes and documentation updates.
1.7.9.3
Git v1.7.9.3 Release Notes ==========================
Fixes since v1.7.9.2 --------------------
- "git p4" (in contrib/) submit the changes to a wrong place when the "--use-client-spec" option is set.
- The config.mak.autogen generated by optional autoconf support tried to link the binary with -lintl even when libintl.h is missing from the system.
- When the filter driver exits before reading the content before the main git process writes the contents to be filtered to the pipe to it, the latter could be killed with SIGPIPE instead of ignoring such an event as an error.
- "git add --refresh <pathspec>" used to warn about unmerged paths outside the given pathspec.
- The bulk check-in codepath in "git add" streamed contents that needs smudge/clean filters without running them, instead of punting and delegating to the codepath to run filters after slurping everything to core.
- "git branch --with $that" assumed incorrectly that the user will never ask the question with nonsense value in $that.
- "git bundle create" produced a corrupt bundle file upon seeing commits with excessively long subject line.
- When a remote helper exits before reading the blank line from the main git process to signal the end of commands, the latter could be killed with SIGPIPE. Instead we should ignore such event as a non-error.
- The commit log template given with "git merge --edit" did not have a short instructive text like what "git commit" gives.
- "git rev-list --verify-objects -q" omitted the extra verification it needs to do over "git rev-list --objects -q" by mistake.
- "gitweb" used to drop warnings in the log file when "heads" view is accessed in a repository whose HEAD does not point at a valid branch.
- An invalid regular expression pattern given by an end user made "gitweb" to return garbled response.
Also contains minor fixes and documentation updates.
1.7.9.4
Git v1.7.9.4 Release Notes ==========================
Fixes since v1.7.9.3 --------------------
- The code to synthesize the fake ancestor tree used by 3-way merge fallback in "git am" was not prepared to read a patch created with a non-standard -p<num> value.
- "git bundle" did not record boundary commits correctly when there are many of them.
- "git diff-index" and its friends at the plumbing level showed the "diff --git" header and nothing else for a path whose cached stat info is dirty without actual difference when asked to produce a patch. This was a longstanding bug that we could have fixed long time ago.
- "gitweb" did use quotemeta() to prepare search string when asked to do a fixed-string project search, but did not use it by mistake and used the user-supplied string instead.
Also contains minor fixes and documentation updates.
1.7.9.5
Git v1.7.9.5 Release Notes ==========================
Fixes since v1.7.9.4 --------------------
- When "git config" diagnoses an error in a configuration file and shows the line number for the offending line, it miscounted if the error was at the end of line.
- "git fast-import" accepted "ls" command with an empty path by mistake.
- Various new-ish output decoration modes of "git grep" were not documented in the manual’s synopsis section.
- The "remaining" subcommand to "git rerere" was not documented.
- "gitweb" used to drop warnings in the log file when "heads" view is accessed in a repository whose HEAD does not point at a valid branch.
Also contains minor fixes and documentation updates.
1.7.9.6
Git v1.7.9.6 Release Notes ==========================
Fixes since v1.7.9.5 --------------------
- "git merge $tag" to merge an annotated tag always opens the editor during an interactive edit session. v1.7.10 series introduced an environment variable GIT_MERGE_AUTOEDIT to help older scripts decline this behaviour, but the maintenance track should also support it.
Also contains minor fixes and documentation updates.
1.7.9.7
Git v1.7.9.7 Release Notes ==========================
Fixes since v1.7.9.6 --------------------
- An error message from ’git bundle’ had an unmatched single quote pair in it.
- The way ’git fetch’ implemented its connectivity check over received objects was overly pessimistic, and wasted a lot of cycles.
Also contains minor fixes and documentation updates.
1.7.9
Git v1.7.9 Release Notes ========================
Updates since v1.7.8 --------------------
- gitk updates accumulated since early 2011.
- git-gui updated to 0.16.0.
- git-p4 (in contrib/) updates.
- Git uses gettext to translate its most common interface messages into the user’s language if translations are available and the locale is appropriately set. Distributors can drop new PO files in po/ to add new translations.
- The code to handle username/password for HTTP transactions used in "git push" & "git fetch" learned to talk "credential API" to external programs to cache or store them, to allow integration with platform native keychain mechanisms.
- The input prompts in the terminal use our own getpass() replacement when possible. HTTP transactions used to ask for the username without echoing back what was typed, but with this change you will see it as you type.
- The internals of "revert/cherry-pick" have been tweaked to prepare building more generic "sequencer" on top of the implementation that drives them.
- "git rev-parse FETCH_HEAD" after "git fetch" without specifying what to fetch from the command line will now show the commit that would be merged if the command were "git pull".
- "git add" learned to stream large files directly into a packfile instead of writing them into individual loose object files.
- "git checkout -B <current branch> <elsewhere>" is a more intuitive way to spell "git reset --keep <elsewhere>".
- "git checkout" and "git merge" learned "--no-overwrite-ignore" option to tell Git that untracked and ignored files are not expendable.
- "git commit --amend" learned "--no-edit" option to say that the user is amending the tree being recorded, without updating the commit log message.
- "git commit" and "git reset" re-learned the optimization to prime the cache-tree information in the index, which makes it faster to write a tree object out after the index entries are updated.
- "git commit" detects and rejects an attempt to stuff NUL byte in the commit log message.
- "git commit" learned "-S" to GPG-sign the commit; this can be shown with the "--show-signature" option to "git log".
- fsck and prune are relatively lengthy operations that still go silent while making the end-user wait. They learned to give progress output like other slow operations.
- The set of built-in function-header patterns for various languages knows MATLAB.
- "git log --format=’<format>’" learned new %g[nNeE] specifiers to show information from the reflog entries when walking the reflog (i.e. with "-g").
- "git pull" can be used to fetch and merge an annotated/signed tag, instead of the tip of a topic branch. The GPG signature from the signed tag is recorded in the resulting merge commit for later auditing.
- "git log" learned "--show-signature" option to show the signed tag that was merged that is embedded in the merge commit. It also can show the signature made on the commit with "git commit -S".
- "git branch --edit-description" can be used to add descriptive text to explain what a topic branch is about.
- "git fmt-merge-msg" learned to take the branch description into account when preparing a merge summary that "git merge" records when merging a local branch.
- "git request-pull" has been updated to convey more information useful for integrators to decide if a topic is worth merging and what is pulled is indeed what the requestor asked to pull, including:
-
the tip of the branch being requested to be merged;
-
the branch description describing what the topic is about;
-
the contents of the annotated tag, when requesting to pull a tag.
- "git pull" learned to notice ’pull.rebase’ configuration variable, which serves as a global fallback for setting ’branch.<name>.rebase’ configuration variable per branch.
- "git tag" learned "--cleanup" option to control how the whitespaces and empty lines in tag message are cleaned up.
- "gitweb" learned to show side-by-side diff.
Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.8 ------------------
Unless otherwise noted, all the fixes since v1.7.8 in the maintenance releases are contained in this release (see release notes to them for details).
1.8.0.1
Git v1.8.0.1 Release Notes ==========================
Fixes since v1.8.0 ------------------
- The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently.
- The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "a" as if it were a C-string asking for a BEL output.
- "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file.
- "git log -F -E --grep=’<ere>’" failed to use the given <ere> pattern as extended regular expression, and instead looked for the string literally.
- "git grep -e pattern <tree>" asked the attribute system to read "<tree>:.gitattributes" file in the working tree, which was nonsense.
- A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead.
- Earlier we fixed documentation to hyphenate "remote-tracking branch" to clarify that these are not a remote entity, but unhyphenated spelling snuck in to a few places since then.
- "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.
- The refs/replace hierarchy was not mentioned in the repository-layout docs.
- Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptors to wait on and the http transport ended up sleeping for minutes in select(2) system call. A workaround has been added for this.
- Various rfc2047 quoting issues around a non-ASCII name on the From: line in the output from format-patch have been corrected.
- "git diff -G<pattern>" did not honor textconv filter when looking for changes.
- Bash completion script (in contrib/) did not correctly complete a lazy "git checkout $name_of_remote_tracking_branch_that_is_unique" command line.
- RSS feed from "gitweb" had a xss hole in its title output.
- "git config --path $key" segfaulted on "[section] key" (a boolean "true" spelled without "=", not "[section] key = true").
- "git checkout -b foo" while on an unborn branch did not say "Switched to a new branch ’foo’" like other cases.
Also contains other minor fixes and documentation updates.
1.8.0.2
Git v1.8.0.2 Release Notes ==========================
Fixes since v1.8.0.1 --------------------
- Various codepaths have workaround for a common misconfiguration to spell "UTF-8" as "utf8", but it was not used uniformly. Most notably, mailinfo (which is used by "git am") lacked this support.
- We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output.
- When "--stat-count" hides a diffstat for binary contents, the total number of added and removed lines at the bottom was computed incorrectly.
- When "--stat-count" hides a diffstat for unmerged paths, the total number of affected files at the bottom of the "diff --stat" output was computed incorrectly.
- "diff --shortstat" miscounted the total number of affected files when there were unmerged paths.
- "git p4" used to try expanding malformed "$keyword$" that spans across multiple lines.
- "git update-ref -d --deref SYM" to delete a ref through a symbolic ref that points to it did not remove it correctly.
- Syntax highlighting in "gitweb" was not quite working.
Also contains other minor fixes and documentation updates.
1.8.0.3
Git v1.8.0.3 Release Notes ==========================
Fixes since v1.8.0.2 --------------------
- "git log -p -S<string>" did not apply the textconv filter while looking for the <string>.
- In the documentation, some invalid example e-mail addresses were formatted into mailto: links.
Also contains many documentation updates backported from the ’master’ branch that is preparing for the upcoming 1.8.1 release.
1.8.0
Git v1.8.0 Release Notes ========================
Backward compatibility notes ----------------------------
In the next major release (not this one), we will change the behavior of the "git push" command.
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). We will use the "simple" semantics that pushes the current branch to the branch with the same name, only when the current branch is set to integrate with that remote branch. There is a user preference configuration variable "push.default" to change this, and "git push" will warn about the upcoming change until you set this variable in this release.
"git branch --set-upstream" is deprecated and may be removed in a relatively distant future. "git branch [-u|--set-upstream-to]" has been introduced with a saner order of arguments.
Updates since v1.7.12 ---------------------
UI, Workflows & Features
- A credential helper for Win32 to allow access to the keychain of the logged-in user has been added.
- An initial port to HP NonStop.
- A credential helper to allow access to the Gnome keyring has been added.
- When "git am" sanitizes the "Subject:" line, we strip the prefix from "Re: subject" and also from a less common "re: subject", but left the even less common "RE: subject" intact. Now we strip that too.
- It was tempting to say "git branch --set-upstream origin/master", but that tells Git to arrange the local branch "origin/master" to integrate with the currently checked out branch, which is highly unlikely what the user meant. The option is deprecated; use the new "--set-upstream-to" (with a short-and-sweet "-u") option instead.
- "git cherry-pick" learned the "--allow-empty-message" option to allow it to replay a commit without any log message.
- After "git cherry-pick -s" gave control back to the user asking help to resolve conflicts, concluding "git commit" used to need to be run with "-s" if the user wants to sign it off; now the command leaves the sign-off line in the log template.
- "git daemon" learned the "--access-hook" option to allow an external command to decline service based on the client address, repository path, etc.
- "git difftool --dir-diff" learned to use symbolic links to prepare a temporary copy of the working tree when available.
- "git grep" learned to use a non-standard pattern type by default if a configuration variable tells it to.
- Accumulated updates to "git gui" has been merged.
- "git log -g" learned the "--grep-reflog=<pattern>" option to limit its output to commits with a reflog message that matches the given pattern.
- "git merge-base" learned the "--is-ancestor A B" option to tell if A is an ancestor of B. The result is indicated by its exit status code.
- "git mergetool" now allows users to override the actual command used with the mergetool.$name.cmd configuration variable even for built-in mergetool backends.
- "git rebase -i" learned the "--edit-todo" option to open an editor to edit the instruction sheet.
Foreign Interface
- "git svn" has been updated to work with SVN 1.7.
- "git p4" learned the "--conflicts" option to specify what to do when encountering a conflict during "p4 submit".
Performance, Internal Implementation, etc.
- Git ships with a fall-back regexp implementation for platforms with buggy regexp library, but it was easy for people to keep using their platform regexp by mistake. A new test has been added to check this.
- The "check-docs" build target has been updated and greatly simplified.
- The test suite is run under MALLOC_CHECK_ when running with a glibc that supports the feature.
- The documentation in the TeXinfo format was using indented output for materials meant to be examples that are better typeset in monospace.
- Compatibility wrapper around some mkdir(2) implementations that reject parameters with trailing slash has been introduced.
- Compatibility wrapper for systems that lack usable setitimer() has been added.
- The option parsing of "git checkout" had error checking, dwim and defaulting missing options, all mixed in the code, and issuing an appropriate error message with useful context was getting harder. The code has been reorganized to allow giving a proper diagnosis when the user says "git checkout -b -t foo bar" (e.g. "-t" is not a good name for a branch).
- Many internal uses of a "git merge-base" equivalent were only to see if one commit fast-forwards to the other, which did not need the full set of merge bases to be computed. They have been updated to use less expensive checks.
- The heuristics to detect and silently convert latin1 to utf8 when we were told to use utf-8 in the log message has been transplanted from "mailinfo" to "commit" and "commit-tree".
- Messages given by "git <subcommand> -h" from many subcommands have been marked for translation.
Also contains minor documentation updates and code clean-ups.
Fixes since v1.7.12 -------------------
Unless otherwise noted, all the fixes since v1.7.12 in the maintenance track are contained in this release (see release notes to them for details).
- The attribute system may be asked for a path that itself or its leading directories no longer exists in the working tree, and it is fine if we cannot open .gitattribute file in such a case. Failure to open per-directory .gitattributes with error status other than ENOENT and ENOTDIR should be diagnosed, but it wasn’t.
- When looking for $HOME/.gitconfig etc., it is OK if we cannot read them because they do not exist, but we did not diagnose existing files that we cannot read.
- When "git am" is fed an input that has multiple "Content-type: …" header, it did not grok charset= attribute correctly.
- "git am" mishandled a patch attached as application/octet-stream (e.g. not text/*); Content-Transfer-Encoding (e.g. base64) was not honored correctly.
- "git blame MAKEFILE" run in a history that has "Makefile" but not "MAKEFILE" should say "No such file MAKEFILE in HEAD", but got confused on a case insensitive filesystem and failed to do so.
- Even during a conflicted merge, "git blame $path" always meant to blame uncommitted changes to the "working tree" version; make it more useful by showing cleanly merged parts as coming from the other branch that is being merged.
- It was unclear in the documentation for "git blame" that it is unnecessary for users to use the "--follow" option.
- Output from "git branch -v" contains "(no branch)" that could be localized, but the code to align it along with the names of branches was counting in bytes, not in display columns.
- "git cherry-pick A C B" used to replay changes in A and then B and then C if these three commits had committer timestamps in that order, which is not what the user who said "A C B" naturally expects.
- A repository created with "git clone --single" had its fetch refspecs set up just like a clone without "--single", leading the subsequent "git fetch" to slurp all the other branches, defeating the whole point of specifying "only this branch".
- Documentation talked about "first line of commit log" when it meant the title of the commit. The description was clarified by defining how the title is decided and rewording the casual mention of "first line" to "title".
- "git cvsimport" did not thoroughly cleanse tag names that it inferred from the names of the tags it obtained from CVS, which caused "git tag" to barf and stop the import in the middle.
- Earlier we made the diffstat summary line that shows the number of lines added/deleted localizable, but it was found irritating having to see them in various languages on a list whose discussion language is English, and this change has been reverted.
- "git fetch --all", when passed "--no-tags", did not honor the "--no-tags" option while fetching from individual remotes (the same issue existed with "--tags", but the combination "--all --tags" makes much less sense than "--all --no-tags").
- "git fetch" over http had an old workaround for an unlikely server misconfiguration; it turns out that this hurts debuggability of the configuration in general, and has been reverted.
- "git fetch" over http advertised that it supports "deflate", which is much less common, and did not advertise the more common "gzip" on its Accept-Encoding header.
- "git fetch" over the dumb-http revision walker could segfault when curl’s multi interface was used.
- "git gc --auto" notified the user that auto-packing has triggered even under the "--quiet" option.
- After "gitk" showed the contents of a tag, neither "Reread references" nor "Reload" updated what is shown as the contents of it when the user overwrote the tag with "git tag -f".
- "git log --all-match --grep=A --grep=B" ought to show commits that mention both A and B, but when these three options are used with --author or --committer, it showed commits that mention either A or B (or both) instead.
- The "-Xours" backend option to "git merge -s recursive" was ignored for binary files.
- "git p4", when "--use-client-spec" and "--detect-branches" are used together, misdetected branches.
- "git receive-pack" (the counterpart to "git push") did not give progress output while processing objects it received to the user when run over the smart-http protocol.
- When you misspell the command name you give to the "exec" action in the "git rebase -i" instruction sheet you were told that ’rebase’ is not a git subcommand from "git rebase --continue".
- The subcommand in "git remote" to remove a defined remote was "rm" and the command did not take a fully-spelled "remove".
- The interactive prompt that "git send-email" gives was error prone. It asked "What e-mail address do you want to use?" with the address it guessed (correctly) the user would want to use in its prompt, tempting the user to say "y". But the response was taken as "No, please use ’y’ as the e-mail address instead", which is most certainly not what the user meant.
- "git show --format=’%ci’" did not give the timestamp correctly for commits created without human readable name on the "committer" line.
- "git show --quiet" ought to be a synonym for "git show -s", but wasn’t.
- "git submodule frotz" was not diagnosed as "frotz" being an unknown subcommand to "git submodule"; the user instead got a complaint that "git submodule status" was run with an unknown path "frotz".
- "git status" honored the ignore=dirty settings in .gitmodules but "git commit" didn’t.
- "gitweb" did not give the correct committer timezone in its feed output due to a typo.
1.8.1.1
Git 1.8.1.1 Release Notes =========================
Fixes since v1.8.1 ------------------
- The attribute mechanism didn’t allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does.
- When attempting to read the XDG-style $HOME/.config/git/config and finding that $HOME/.config/git is a file, we gave a wrong error message, instead of treating the case as "a custom config file does not exist there" and moving on.
- After failing to create a temporary file using mkstemp(), failing pathname was not reported correctly on some platforms.
- http transport was wrong to ask for the username when the authentication is done by certificate identity.
- The behaviour visible to the end users was confusing, when they attempt to kill a process spawned in the editor that was in turn launched by Git with SIGINT (or SIGQUIT), as Git would catch that signal and die. We ignore these signals now.
- A child process that was killed by a signal (e.g. SIGINT) was reported in an inconsistent way depending on how the process was spawned by us, with or without a shell in between.
- After "git add -N" and then writing a tree object out of the index, the cache-tree data structure got corrupted.
- "git apply" misbehaved when fixing whitespace breakages by removing excess trailing blank lines in some corner cases.
- A tar archive created by "git archive" recorded a directory in a way that made NetBSD’s implementation of "tar" sometimes unhappy.
- When "git clone --separate-git-dir=$over_there" is interrupted, it failed to remove the real location of the $GIT_DIR it created. This was most visible when interrupting a submodule update.
- "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
- The "log --graph" codepath fell into infinite loop in some corner cases.
- "git merge" started calling prepare-commit-msg hook like "git commit" does some time ago, but forgot to pay attention to the exit status of the hook.
- "git pack-refs" that ran in parallel to another process that created new refs had a race that can lose new ones.
- When a line to be wrapped has a solid run of non space characters whose length exactly is the wrap width, "git shortlog -w" failed to add a newline after such a line.
- The way "git svn" asked for password using SSH_ASKPASS and GIT_ASKPASS was not in line with the rest of the system.
- "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
- "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
- When autoconf is used, any build on a different commit always ran "config.status --recheck" even when unnecessary.
- Some scripted programs written in Python did not get updated when PYTHON_PATH changed.
- We have been carrying a translated and long-unmaintained copy of an old version of the tutorial; removed.
- Portability issues in many self-test scripts have been addressed.
Also contains other minor fixes and documentation updates.
1.8.1.2
Git 1.8.1.2 Release Notes =========================
Fixes since v1.8.1.1 --------------------
- An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
- Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
- Command line completion leaked an unnecessary error message while looking for possible matches with paths in <tree-ish>.
- "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
- When users spelled "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
Also contains various documentation fixes.
1.8.1.3
Git 1.8.1.3 Release Notes =========================
Fixes since v1.8.1.2 --------------------
- The attribute mechanism didn’t allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The fix for this in 1.8.1.2 had performance degradations.
- Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
- Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
- A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
- We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
- "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
- Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
- "git cherry-pick" did not replay a root commit to an unborn branch.
- We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
- "git rebase --preserve-merges" lost empty merges in recent versions of Git.
- Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
- A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
Also contains various documentation fixes.
1.8.1.4
Git 1.8.1.4 Release Notes =========================
Fixes since v1.8.1.3 --------------------
- "git imap-send" talking over imaps: valid certificate from the other end, but did not check if the certificate matched the host it thought it was talking to.
Also contains various documentation fixes.
1.8.1.5
Git 1.8.1.5 Release Notes =========================
Fixes since v1.8.1.4 --------------------
- Given a string with a multi-byte character that begins with ’-’ on the command line where an option is expected, the option parser used just one byte of the unknown letter when reporting an error.
- In v1.8.1, the attribute parser was tightened too restrictive to error out upon seeing an entry that begins with an ! (exclamation), which may confuse users to expect a "negative match", which does not exist. This has been demoted to a warning; such an entry is still ignored.
- "git apply --summary" has been taught to make sure the similarity value shown in its output is sensible, even when the input had a bogus value.
- "git clean" showed what it was going to do, but sometimes ended up finding that it was not allowed to do so, which resulted in a confusing output (e.g. after saying that it will remove an untracked directory, it found an embedded git repository there which it is not allowed to remove). It now performs the actions and then reports the outcome more faithfully.
- "git clone" used to allow --bare and --separate-git-dir=$there options at the same time, which was nonsensical.
- "git cvsimport" mishandled timestamps at DST boundary.
- We used to have an arbitrary 32 limit for combined diff input, resulting in incorrect number of leading colons shown when showing the "--raw --cc" output.
- The smart HTTP clients forgot to verify the content-type that comes back from the server side to make sure that the request is being handled properly.
- "git help remote-helpers" failed to find the documentation.
- "gitweb" pages served over HTTPS, when configured to show picon or gravatar, referred to these external resources to be fetched via HTTP, resulting in mixed contents warning in browsers.
Also contains various documentation fixes.
1.8.1.6
Git 1.8.1.6 Release Notes =========================
Fixes since v1.8.1.5 --------------------
- An earlier change to the attribute system introduced at v1.8.1.2 by mistake stopped a pattern "dir" (without trailing slash) from matching a directory "dir" (it only wanted to allow pattern "dir/" to also match).
- The code to keep track of what directory names are known to Git on platforms with case insensitive filesystems can get confused upon a hash collision between these pathnames and looped forever.
- When the "--prefix" option is used to "checkout-index", the code did not pick the correct output filter based on the attribute setting.
- The logic used by "git diff -M --stat" to shorten the names of files before and after a rename did not work correctly when the common prefix and suffix between the two filenames overlapped.
- "git update-index -h" did not do the usual "-h(elp)" thing.
- perl/Git.pm::cat_blob slurped everything in core only to write it out to a file descriptor, which was not a very smart thing to do.
- The SSL peer verification done by "git imap-send" did not ask for Server Name Indication (RFC 4366), failing to connect SSL/TLS sites that serve multiple hostnames on a single IP.
- "git bundle verify" did not say "records a complete history" for a bundle that does not have any prerequisites.
Also contains various documentation fixes.
1.8.1
Git v1.8.1 Release Notes ========================
Backward compatibility notes ----------------------------
In the next major release (not this one), we will change the behavior of the "git push" command.
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). We will use the "simple" semantics that pushes the current branch to the branch with the same name, only when the current branch is set to integrate with that remote branch. There is a user preference configuration variable "push.default" to change this, and "git push" will warn about the upcoming change until you set this variable in this release.
"git branch --set-upstream" is deprecated and may be removed in a relatively distant future. "git branch [-u|--set-upstream-to]" has been introduced with a saner order of arguments to replace it.
Updates since v1.8.0 --------------------
UI, Workflows & Features
- Command-line completion scripts for tcsh and zsh have been added.
- "git-prompt" scriptlet (in contrib/completion) can be told to paint pieces of the hints in the prompt string in colors.
- Some documentation pages that used to ship only in the plain text format are now formatted in HTML as well.
- We used to have a workaround for a bug in ancient "less" that causes it to exit without any output when the terminal is resized. The bug has been fixed in "less" version 406 (June 2007), and the workaround has been removed in this release.
- When "git checkout" checks out a branch, it tells the user how far behind (or ahead) the new branch is relative to the remote tracking branch it builds upon. The message now also advises how to sync them up by pushing or pulling. This can be disabled with the advice.statusHints configuration variable.
- "git config --get" used to diagnose presence of multiple definitions of the same variable in the same configuration file as an error, but it now applies the "last one wins" rule used by the internal configuration logic. Strictly speaking, this may be an API regression but it is expected that nobody will notice it in practice.
- A new configuration variable "diff.context" can be used to give the default number of context lines in the patch output, to override the hardcoded default of 3 lines.
- "git format-patch" learned the "--notes=<ref>" option to give notes for the commit after the three-dash lines in its output.
- "git log -p -S<string>" now looks for the <string> after applying the textconv filter (if defined); earlier it inspected the contents of the blobs without filtering.
- "git log --grep=<pcre>" learned to honor the "grep.patterntype" configuration set to "perl".
- "git replace -d <object>" now interprets <object> as an extended SHA-1 (e.g. HEAD~4 is allowed), instead of only accepting full hex object name.
- "git rm $submodule" used to punt on removing a submodule working tree to avoid losing the repository embedded in it. Because recent git uses a mechanism to separate the submodule repository from the submodule working tree, "git rm" learned to detect this case and removes the submodule working tree when it is safe to do so.
- "git send-email" used to prompt for the sender address, even when the committer identity is well specified (e.g. via user.name and user.email configuration variables). The command no longer gives this prompt when not necessary.
- "git send-email" did not allow non-address garbage strings to appear after addresses on Cc: lines in the patch files (and when told to pick them up to find more recipients), e.g.
Cc: Stable Kernel <stable@k.org> # for v3.2 and up
The command now strips " # for v3.2 and up" part before adding the
remainder of this line to the list of recipients.
- "git submodule add" learned to add a new submodule at the same path as the path where an unrelated submodule was bound to in an existing revision via the "--name" option.
- "git submodule sync" learned the "--recursive" option.
- "diff.submodule" configuration variable can be used to give custom default value to the "git diff --submodule" option.
- "git symbolic-ref" learned the "-d $symref" option to delete the named symbolic ref, which is more intuitive way to spell it than "update-ref -d --no-deref $symref".
Foreign Interface
- "git cvsimport" can be told to record timezones (other than GMT) per-author via its author info file.
- The remote helper interface to interact with subversion repositories (one of the GSoC 2012 projects) has been merged.
- A new remote-helper interface for Mercurial has been added to contrib/remote-helpers.
- The documentation for git(1) was pointing at a page at an external site for the list of authors that no longer existed. The link has been updated to point at an alternative site.
Performance, Internal Implementation, etc.
- Compilation on Cygwin with newer header files are supported now.
- A couple of low-level implementation updates on MinGW.
- The logic to generate the initial advertisement from "upload-pack" (i.e. what is invoked by "git fetch" on the other side of the connection) to list what refs are available in the repository has been optimized.
- The logic to find set of attributes that match a given path has been optimized.
- Use preloadindex in "git diff-index" and "git update-index", which has a nice speedup on systems with slow stat calls (and even on Linux).
Also contains minor documentation updates and code clean-ups.
Fixes since v1.8.0 ------------------
Unless otherwise noted, all the fixes since v1.8.0 in the maintenance track are contained in this release (see release notes to them for details).
- The configuration parser had an unnecessary hardcoded limit on variable names that was not checked consistently.
- The "say" function in the test scaffolding incorrectly allowed "echo" to interpret "a" as if it were a C-string asking for a BEL output.
- "git mergetool" feeds /dev/null as a common ancestor when dealing with an add/add conflict, but p4merge backend cannot handle it. Work it around by passing a temporary empty file.
- "git log -F -E --grep=’<ere>’" failed to use the given <ere> pattern as extended regular expression, and instead looked for the string literally.
- "git grep -e pattern <tree>" asked the attribute system to read "<tree>:.gitattributes" file in the working tree, which was nonsense.
- A symbolic ref refs/heads/SYM was not correctly removed with "git branch -d SYM"; the command removed the ref pointed by SYM instead.
- Update "remote tracking branch" in the documentation to "remote-tracking branch".
- "git pull --rebase" run while the HEAD is detached tried to find the upstream branch of the detached HEAD (which by definition does not exist) and emitted unnecessary error messages.
- The refs/replace hierarchy was not mentioned in the repository-layout docs.
- Various rfc2047 quoting issues around a non-ASCII name on the From: line in the output from format-patch have been corrected.
- Sometimes curl_multi_timeout() function suggested a wrong timeout value when there is no file descriptor to wait on and the http transport ended up sleeping for minutes in select(2) system call. A workaround has been added for this.
- For a fetch refspec (or the result of applying wildcard on one), we always want the RHS to map to something inside "refs/" hierarchy, but the logic to check it was not exactly right. (merge 5c08c1f jc/maint-fetch-tighten-refname-check later to maint).
- "git diff -G<pattern>" did not honor textconv filter when looking for changes.
- Some HTTP servers ask for auth only during the actual packing phase (not in ls-remote phase); this is not really a recommended configuration, but the clients used to fail to authenticate with such servers. (merge 2e736fd jk/maint-http-half-auth-fetch later to maint).
- "git p4" used to try expanding malformed "$keyword$" that spans across multiple lines.
- Syntax highlighting in "gitweb" was not quite working.
- RSS feed from "gitweb" had a xss hole in its title output.
- "git config --path $key" segfaulted on "[section] key" (a boolean "true" spelled without "=", not "[section] key = true").
- "git checkout -b foo" while on an unborn branch did not say "Switched to a new branch ’foo’" like other cases.
- Various codepaths have workaround for a common misconfiguration to spell "UTF-8" as "utf8", but it was not used uniformly. Most notably, mailinfo (which is used by "git am") lacked this support.
- We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output.
- When "--stat-count" hides a diffstat for binary contents, the total number of added and removed lines at the bottom was computed incorrectly.
- When "--stat-count" hides a diffstat for unmerged paths, the total number of affected files at the bottom of the "diff --stat" output was computed incorrectly.
- "diff --shortstat" miscounted the total number of affected files when there were unmerged paths.
- "update-ref -d --deref SYM" to delete a ref through a symbolic ref that points to it did not remove it correctly.
1.8.2.1
Git v1.8.2.1 Release Notes ==========================
Fixes since v1.8.2 ------------------
- An earlier change to the attribute system introduced at v1.8.1.2 by mistake stopped a pattern "dir" (without trailing slash) from matching a directory "dir" (it only wanted to allow pattern "dir/" to also match).
- Verification of signed tags were not done correctly when not in C or en/US locale.
- ’git commit -m "$msg"’ used to add an extra newline even when $msg already ended with one.
- The "--match=<pattern>" option of "git describe", when used with "--all" to allow refs that are not annotated tags to be used as a base of description, did not restrict the output from the command to those that match the given pattern.
- An aliased command spawned from a bare repository that does not say it is bare with "core.bare = yes" is treated as non-bare by mistake.
- When "format-patch" quoted a non-ascii strings on the header files, it incorrectly applied rfc2047 and chopped a single character in the middle of it.
- "git archive" reports a failure when asked to create an archive out of an empty tree. It would be more intuitive to give an empty archive back in such a case.
- "git tag -f <tag>" always said "Updated tag ’<tag>’" even when creating a new tag (i.e. not overwriting nor updating).
- "git cmd — ’:(top’" was not diagnosed as an invalid syntax, and instead the parser kept reading beyond the end of the string.
- The code to keep track of what directory names are known to Git on platforms with case insensitive filesystems can get confused upon a hash collision between these pathnames and looped forever.
- The logic used by "git diff -M --stat" to shorten the names of files before and after a rename did not work correctly when the common prefix and suffix between the two filenames overlapped.
- "git submodule update", when recursed into sub-submodules, did not accumulate the prefix paths.
- "git am $maildir/" applied messages in an unexpected order; sort filenames read from the maildir/ in a way that is more likely to sort messages in the order the writing MUA meant to, by sorting numeric segment in numeric order and non-numeric segment in alphabetical order.
- When export-subst is used, "zip" output recorded incorrect size of the file.
- Some platforms and users spell UTF-8 differently; retry with the most official "UTF-8" when the system does not understand the user-supplied encoding name that are the common alternative spellings of UTF-8.
- "git branch" did not bother to check nonsense command line parameters and issue errors in many cases.
- "git update-index -h" did not do the usual "-h(elp)" thing.
- perl/Git.pm::cat_blob slurped everything in core only to write it out to a file descriptor, which was not a very smart thing to do.
- The SSL peer verification done by "git imap-send" did not ask for Server Name Indication (RFC 4366), failing to connect SSL/TLS sites that serve multiple hostnames on a single IP.
- "git index-pack" had a buffer-overflow while preparing an informational message when the translated version of it was too long.
- Clarify in the documentation "what" gets pushed to "where" when the command line to "git push" does not say these explicitly.
- In "git reflog expire", REACHABLE bit was not cleared from the correct objects.
- The "--color=<when>" argument to the commands in the diff family was described poorly.
- The arguments given to pre-rebase hook were not documented.
- The v4 index format was not documented.
- The "--match=<pattern>" argument "git describe" takes uses glob pattern but it wasn’t obvious from the documentation.
- Some sources failed to compile on systems that lack NI_MAXHOST in their system header (e.g. z/OS).
- Add an example use of "--env-filter" in "filter-branch" documentation.
- "git bundle verify" did not say "records a complete history" for a bundle that does not have any prerequisites.
- In the v1.8.0 era, we changed symbols that do not have to be global to file scope static, but a few functions in graph.c were used by CGit from sideways bypassing the entry points of the API the in-tree users use.
- "git merge-tree" had a typo in the logic to detect d/f conflicts, which caused it to segfault in some cases.
1.8.2.2
Git v1.8.2.2 Release Notes ==========================
Fixes since v1.8.2.1 --------------------
- Zsh completion forgot that ’%’ character used to signal untracked files needs to be escaped with another ’%’.
- A commit object whose author or committer ident are malformed crashed some code that trusted that a name, an email and an timestamp can always be found in it.
- The new core.commentchar configuration was not applied to a few places.
- "git pull --rebase" did not pass "-v/-q" options to underlying "git rebase".
- When receive-pack detects error in the pack header it received in order to decide which of unpack-objects or index-pack to run, it returned without closing the error stream, which led to a hang sideband thread.
- "git diff --diff-algorithm=algo" was understood by the command line parser, but "git diff --diff-algorithm algo" was not.
- "git log -S/-G" started paying attention to textconv filter, but there was no way to disable this. Make it honor --no-textconv option.
- "git merge $(git rev-parse v1.8.2)" behaved quite differently from "git merge v1.8.2", as if v1.8.2 were written as v1.8.2^0 and did not pay much attention to the annotated tag payload. Make the code notice the type of the tag object, in addition to the dwim_ref() based classification the current code uses (i.e. the name appears in refs/tags/) to decide when to special case merging of tags.
- "git cherry-pick" and "git revert" can take more than one commit on the command line these days, but it was not mentioned on the usage text.
- Perl scripts like "git-svn" closed (not redirecting to /dev/null) the standard error stream, which is not a very smart thing to do. Later open may return file descriptor #2 for unrelated purpose, and error reporting code may write into them.
- "git apply --whitespace=fix" was not prepared to see a line getting longer after fixing whitespaces (e.g. tab-in-indent aka Python).
- "git diff/log --cc" did not work well with options that ignore whitespace changes.
- Documentation on setting up a http server that requires authentication only on the push but not fetch has been clarified.
- A few bugfixes to "git rerere" working on corner case merge conflicts have been applied.
- "git bundle" did not like a bundle created using a commit without any message as its one of the prerequisites.
1.8.2.3
Git v1.8.2.3 Release Notes ==========================
Fixes since v1.8.2.2 --------------------
- "rev-list --stdin" and friends kept bogus pointers into the input buffer around as human readable object names. This was not a huge problem but was exposed by a new change that uses these names in error output.
- When "git difftool" drove "kdiff3", it mistakenly passed --auto option that was meant while resolving merge conflicts.
- "git remote add" command did not diagnose extra command line arguments as an error and silently ignored them.
Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.
1.8.2
Git v1.8.2 Release Notes ========================
Backward compatibility notes (this release) -------------------------------------------
"git push $there tag v1.2.3" used to allow replacing a tag v1.2.3 that already exists in the repository $there, if the rewritten tag you are pushing points at a commit that is a descendant of a commit that the old tag v1.2.3 points at. This was found to be error prone and starting with this release, any attempt to update an existing ref under refs/tags/ hierarchy will fail, without "--force".
When "git add -u" and "git add -A" that does not specify what paths to add on the command line is run from inside a subdirectory, the scope of the operation has always been limited to the subdirectory. Many users found this counter-intuitive, given that "git commit -a" and other commands operate on the entire tree regardless of where you are. In this release, these commands give a warning message that suggests the users to use "git add -u/-A ." when they want to limit the scope to the current directory; doing so will squelch the message, while training their fingers.
Backward compatibility notes (for Git 2.0) ------------------------------------------
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" semantics that pushes the current branch to the branch with the same name, only when the current branch is set to integrate with that remote branch. There is a user preference configuration variable "push.default" to change this. If you are an old-timer who is used to the "matching" semantics, you can set it to "matching" to keep the traditional behaviour. If you want to live in the future early, you can set it to "simple" today without waiting for Git 2.0.
When "git add -u" and "git add -A", that does not specify what paths to add on the command line is run from inside a subdirectory, these commands will operate on the entire tree in Git 2.0 for consistency with "git commit -a" and other commands. Because there will be no mechanism to make "git add -u" behave as if "git add -u .", it is important for those who are used to "git add -u" (without pathspec) updating the index only for paths in the current subdirectory to start training their fingers to explicitly say "git add -u ." when they mean it before Git 2.0 comes.
Updates since v1.8.1 --------------------
UI, Workflows & Features
- Initial ports to QNX and z/OS UNIX System Services have started.
- Output from the tests is coloured using "green is okay, yellow is questionable, red is bad and blue is informative" scheme.
- Mention of "GIT/Git/git" in the documentation have been updated to be more uniform and consistent. The name of the system and the concept it embodies is "Git"; the command the users type is "git". All-caps "GIT" was merely a way to imitate "Git" typeset in small caps in our ASCII text only documentation and to be avoided.
- The completion script (in contrib/completion) used to let the default completer to suggest pathnames, which gave too many irrelevant choices (e.g. "git add" would not want to add an unmodified path). It learnt to use a more git-aware logic to enumerate only relevant ones.
- In bare repositories, "git shortlog" and other commands now read mailmap files from the tip of the history, to help running these tools in server settings.
- Color specifiers, e.g. "%C(blue)Hello%C(reset)", used in the "--format=" option of "git log" and friends can be disabled when the output is not sent to a terminal by prefixing them with "auto,", e.g. "%C(auto,blue)Hello%C(auto,reset)".
- Scripts can ask Git that wildcard patterns in pathspecs they give do not have any significance, i.e. take them as literal strings.
- The patterns in .gitignore and .gitattributes files can have /, as a pattern that matches 0 or more levels of subdirectory. E.g. "foo//bar" matches "bar" in "foo" itself or in a subdirectory of "foo".
- When giving arguments without "--" disambiguation, object names that come earlier on the command line must not be interpretable as pathspecs and pathspecs that come later on the command line must not be interpretable as object names. This disambiguation rule has been tweaked so that ":/" (no other string before or after) is always interpreted as a pathspec; "git cmd — :/" is no longer needed, you can just say "git cmd :/".
- Various "hint" lines Git gives when it asks the user to edit messages in the editor are commented out with ’’ by default. The core.commentchar configuration variable can be used to customize this ’’ to a different character.
- "git add -u" and "git add -A" without pathspec issues warning to make users aware that they are only operating on paths inside the subdirectory they are in. Use ":/" (everything from the top) or "." (everything from the $cwd) to disambiguate.
- "git blame" (and "git diff") learned the "--no-follow" option.
- "git branch" now rejects some nonsense combinations of command line arguments (e.g. giving more than one branch name to rename) with more case-specific error messages.
- "git check-ignore" command to help debugging .gitignore files has been added.
- "git cherry-pick" can be used to replay a root commit to an unborn branch.
- "git commit" can be told to use --cleanup=whitespace by setting the configuration variable commit.cleanup to ’whitespace’.
- "git diff" and other Porcelain commands can be told to use a non-standard algorithm by setting diff.algorithm configuration variable.
- "git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch.
- "git format-patch" now detects more cases in which a whole branch is being exported, and uses the description for the branch, when asked to write a cover letter for the series.
- "git format-patch" learned "-v $count" option, and prepends a string "v$count-" to the names of its output files, and also automatically sets the subject prefix to "PATCH v$count". This allows patches from rerolled series to be stored under different names and makes it easier to reuse cover letter messages.
- "git log" and friends can be told with --use-mailmap option to rewrite the names and email addresses of people using the mailmap mechanism.
- "git log --cc --graph" now shows the combined diff output with the ancestry graph.
- "git log --grep=<pattern>" honors i18n.logoutputencoding to look for the pattern after fixing the log message to the specified encoding.
- "git mergetool" and "git difftool" learned to list the available tool backends in a more consistent manner.
- "git mergetool" is aware of TortoiseGitMerge now and uses it over TortoiseMerge when available.
- "git push" now requires "-f" to update a tag, even if it is a fast-forward, as tags are meant to be fixed points.
- Error messages from "git push" when it stops to prevent remote refs from getting overwritten by mistake have been improved to explain various situations separately.
- "git push" will stop without doing anything if the new "pre-push" hook exists and exits with a failure.
- When "git rebase" fails to generate patches to be applied (e.g. due to oom), it failed to detect the failure and instead behaved as if there were nothing to do. A workaround to use a temporary file has been applied, but we probably would want to revisit this later, as it hurts the common case of not failing at all.
- Input and preconditions to "git reset" has been loosened where appropriate. "git reset $fromtree Makefile" requires $fromtree to be any tree (it used to require it to be a commit), for example. "git reset" (without options or parameters) used to error out when you do not have any commits in your history, but it now gives you an empty index (to match non-existent commit you are not even on).
- "git status" says what branch is being bisected or rebased when able, not just "bisecting" or "rebasing".
- "git submodule" started learning a new mode to integrate with the tip of the remote branch (as opposed to integrating with the commit recorded in the superproject’s gitlink).
- "git upload-pack" which implements the service "ls-remote" and "fetch" talk to can be told to hide ref hierarchies the server side internally uses (and that clients have no business learning about) with transfer.hiderefs configuration.
Foreign Interface
- "git fast-export" has been updated for its use in the context of the remote helper interface.
- A new remote helper to interact with bzr has been added to contrib/.
- "git p4" got various bugfixes around its branch handling. It is also made usable with Python 2.4/2.5. In addition, its various portability issues for Cygwin have been addressed.
- The remote helper to interact with Hg in contrib/ has seen a few fixes.
Performance, Internal Implementation, etc.
- "git fsck" has been taught to be pickier about entries in tree objects that should not be there, e.g. ".", ".git", and "..".
- Matching paths with common forms of pathspecs that contain wildcard characters has been optimized further.
- We stopped paying attention to $GIT_CONFIG environment that points at a single configuration file from any command other than "git config" quite a while ago, but "git clone" internally set, exported, and then unexported the variable during its operation unnecessarily.
- "git reset" internals has been reworked and should be faster in general. We tried to be careful not to break any behaviour but there could be corner cases, especially when running the command from a conflicted state, that we may have missed.
- The implementation of "imap-send" has been updated to reuse xml quoting code from http-push codepath, and lost a lot of unused code.
- There is a simple-minded checker for the test scripts in t/ directory to catch most common mistakes (it is not enabled by default).
- You can build with USE_WILDMATCH=YesPlease to use a replacement implementation of pattern matching logic used for pathname-like things, e.g. refnames and paths in the repository. This new implementation is not expected change the existing behaviour of Git in this release, except for "git for-each-ref" where you can now say "refs//master" and match with both refs/heads/master and refs/remotes/origin/master. We plan to use this new implementation in wider places (e.g. "git ls-files ’/Makefile’ may find Makefile at the top-level, and "git log ’*/t.sh’" may find commits that touch a shell script whose name begins with "t" at any level) in future versions of Git, but we are not there yet. By building with USE_WILDMATCH, using the resulting Git daily and reporting when you find breakages, you can help us get closer to that goal.
- Some reimplementations of Git do not write all the stat info back to the index due to their implementation limitations (e.g. jgit). A configuration option can tell Git to ignore changes to most of the stat fields and only pay attention to mtime and size, which these implementations can reliably update. This can be used to avoid excessive revalidation of contents.
- Some platforms ship with old version of expat where xmlparse.h needs to be included instead of expat.h; the build procedure has been taught about this.
- "make clean" on platforms that cannot compute header dependencies on the fly did not work with implementations of "rm" that do not like an empty argument list.
Also contains minor documentation updates and code clean-ups.
Fixes since v1.8.1 ------------------
Unless otherwise noted, all the fixes since v1.8.1 in the maintenance track are contained in this release (see release notes to them for details).
- An element on GIT_CEILING_DIRECTORIES list that does not name the real path to a directory (i.e. a symbolic link) could have caused the GIT_DIR discovery logic to escape the ceiling.
- When attempting to read the XDG-style $HOME/.config/git/config and finding that $HOME/.config/git is a file, we gave a wrong error message, instead of treating the case as "a custom config file does not exist there" and moving on.
- The behaviour visible to the end users was confusing, when they attempt to kill a process spawned in the editor that was in turn launched by Git with SIGINT (or SIGQUIT), as Git would catch that signal and die. We ignore these signals now. (merge 0398fc34 pf/editor-ignore-sigint later to maint).
- A child process that was killed by a signal (e.g. SIGINT) was reported in an inconsistent way depending on how the process was spawned by us, with or without a shell in between.
- After failing to create a temporary file using mkstemp(), failing pathname was not reported correctly on some platforms.
- We used to stuff "user@" and then append what we read from /etc/mailname to come up with a default e-mail ident, but a bug lost the "user@" part.
- The attribute mechanism didn’t allow limiting attributes to be applied to only a single directory itself with "path/" like the exclude mechanism does. The initial implementation of this that was merged to ’maint’ and 1.8.1.2 was with a severe performance degradations and needs to merge a fix-up topic.
- The smart HTTP clients forgot to verify the content-type that comes back from the server side to make sure that the request is being handled properly.
- "git am" did not parse datestamp correctly from Hg generated patch, when it is run in a locale outside C (or en).
- "git apply" misbehaved when fixing whitespace breakages by removing excess trailing blank lines.
- "git apply --summary" has been taught to make sure the similarity value shown in its output is sensible, even when the input had a bogus value.
- A tar archive created by "git archive" recorded a directory in a way that made NetBSD’s implementation of "tar" sometimes unhappy.
- "git archive" did not record uncompressed size in the header when streaming a zip archive, which confused some implementations of unzip.
- "git archive" did not parse configuration values in tar.* namespace correctly. (merge b3873c3 jk/config-parsing-cleanup later to maint).
- Attempt to "branch --edit-description" an existing branch, while being on a detached HEAD, errored out.
- "git clean" showed what it was going to do, but sometimes end up finding that it was not allowed to do so, which resulted in a confusing output (e.g. after saying that it will remove an untracked directory, it found an embedded git repository there which it is not allowed to remove). It now performs the actions and then reports the outcome more faithfully.
- When "git clone --separate-git-dir=$over_there" is interrupted, it failed to remove the real location of the $GIT_DIR it created. This was most visible when interrupting a submodule update.
- "git cvsimport" mishandled timestamps at DST boundary.
- We used to have an arbitrary 32 limit for combined diff input, resulting in incorrect number of leading colons shown when showing the "--raw --cc" output.
- "git fetch --depth" was broken in at least three ways. The resulting history was deeper than specified by one commit, it was unclear how to wipe the shallowness of the repository with the command, and documentation was misleading. (merge cfb70e1 nd/fetch-depth-is-broken later to maint).
- "git log --all -p" that walked refs/notes/textconv/ ref can later try to use the textconv data incorrectly after it gets freed.
- We forgot to close the file descriptor reading from "gpg" output, killing "git log --show-signature" on a long history.
- The way "git svn" asked for password using SSH_ASKPASS and GIT_ASKPASS was not in line with the rest of the system.
- The --graph code fell into infinite loop when asked to do what the code did not expect.
- http transport was wrong to ask for the username when the authentication is done by certificate identity.
- "git pack-refs" that ran in parallel to another process that created new refs had a nasty race.
- Rebasing the history of superproject with change in the submodule has been broken since v1.7.12.
- After "git add -N" and then writing a tree object out of the index, the cache-tree data structure got corrupted.
- "git clone" used to allow --bare and --separate-git-dir=$there options at the same time, which was nonsensical.
- "git rebase --preserve-merges" lost empty merges in recent versions of Git.
- "git merge --no-edit" computed who were involved in the work done on the side branch, even though that information is to be discarded without getting seen in the editor.
- "git merge" started calling prepare-commit-msg hook like "git commit" does some time ago, but forgot to pay attention to the exit status of the hook.
- A failure to push due to non-ff while on an unborn branch dereferenced a NULL pointer when showing an error message.
- When users spell "cc:" in lowercase in the fake "header" in the trailer part, "git send-email" failed to pick up the addresses from there. As e-mail headers field names are case insensitive, this script should follow suit and treat "cc:" and "Cc:" the same way.
- Output from "git status --ignored" showed an unexpected interaction with "--untracked".
- "gitweb", when sorting by age to show repositories with new activities first, used to sort repositories with absolutely nothing in it early, which was not very useful.
- "gitweb"’s code to sanitize control characters before passing it to "highlight" filter lost known-to-be-safe control characters by mistake.
- "gitweb" pages served over HTTPS, when configured to show picon or gravatar, referred to these external resources to be fetched via HTTP, resulting in mixed contents warning in browsers.
- When a line to be wrapped has a solid run of non space characters whose length exactly is the wrap width, "git shortlog -w" failed to add a newline after such a line.
- Command line completion leaked an unnecessary error message while looking for possible matches with paths in <tree-ish>.
- Command line completion for "tcsh" emitted an unwanted space after completing a single directory name.
- Command line completion code was inadvertently made incompatible with older versions of bash by using a newer array notation.
- "git push" was taught to refuse updating the branch that is currently checked out long time ago, but the user manual was left stale. (merge 50995ed wk/man-deny-current-branch-is-default-these-days later to maint).
- Some shells do not behave correctly when IFS is unset; work it around by explicitly setting it to the default value.
- Some scripted programs written in Python did not get updated when PYTHON_PATH changed. (cherry-pick 96a4647fca54031974cd6ad1 later to maint).
- When autoconf is used, any build on a different commit always ran "config.status --recheck" even when unnecessary.
- A fix was added to the build procedure to work around buggy versions of ccache broke the auto-generation of dependencies, which unfortunately is still relevant because some people use ancient distros.
- The autoconf subsystem passed --mandir down to generated config.mak.autogen but forgot to do the same for --htmldir. (merge 55d9bf0 ct/autoconf-htmldir later to maint).
- A change made on v1.8.1.x maintenance track had a nasty regression to break the build when autoconf is used. (merge 7f1b697 jn/less-reconfigure later to maint).
- We have been carrying a translated and long-unmaintained copy of an old version of the tutorial; removed.
- t0050 had tests expecting failures from a bug that was fixed some time ago.
- t4014, t9502 and t0200 tests had various portability issues that broke on OpenBSD.
- t9020 and t3600 tests had various portability issues.
- t9200 runs "cvs init" on a directory that already exists, but a platform can configure this fail for the current user (e.g. you need to be in the cvsadmin group on NetBSD 6.0).
- t9020 and t9810 had a few non-portable shell script construct.
- Scripts to test bash completion was inherently flaky as it was affected by whatever random things the user may have on $PATH.
- An element on GIT_CEILING_DIRECTORIES could be a "logical" pathname that uses a symbolic link to point at somewhere else (e.g. /home/me that points at /net/host/export/home/me, and the latter directory is automounted). Earlier when Git saw such a pathname e.g. /home/me on this environment variable, the "ceiling" mechanism did not take effect. With this release (the fix has also been merged to the v1.8.1.x maintenance series), elements on GIT_CEILING_DIRECTORIES are by default checked for such aliasing coming from symbolic links. As this needs to actually resolve symbolic links for each element on the GIT_CEILING_DIRECTORIES, you can disable this mechanism for some elements by listing them after an empty element on the GIT_CEILING_DIRECTORIES. e.g. Setting /home/me::/home/him to GIT_CEILING_DIRECTORIES makes Git resolve symbolic links in /home/me when checking if the current directory is under /home/me, but does not do so for /home/him. (merge 7ec30aa mh/maint-ceil-absolute later to maint).
1.8.3.1
Git v1.8.3.1 Release Notes ==========================
Fixes since v1.8.3 ------------------
- When $HOME is misconfigured to point at an unreadable directory, we used to complain and die. The check has been loosened.
- Handling of negative exclude pattern for directories "!dir" was broken in the update to v1.8.3.
Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.
1.8.3.2
Git v1.8.3.2 Release Notes ==========================
Fixes since v1.8.3.1 --------------------
- Cloning with "git clone --depth N" while fetch.fsckobjects (or transfer.fsckobjects) is set to true did not tell the cut-off points of the shallow history to the process that validates the objects and the history received, causing the validation to fail.
- "git checkout foo" DWIMs the intended "upstream" and turns it into "git checkout -t -b foo remotes/origin/foo". This codepath has been updated to correctly take existing remote definitions into account.
- "git fetch" into a shallow repository from a repository that does not know about the shallow boundary commits (e.g. a different fork from the repository the current shallow repository was cloned from) did not work correctly.
- "git subtree" (in contrib/) had one codepath with loose error checks to lose data at the remote side.
- "git log --ancestry-path A…B" did not work as expected, as it did not pay attention to the fact that the merge base between A and B was the bottom of the range being specified.
- "git diff -c -p" was not showing a deleted line from a hunk when another hunk immediately begins where the earlier one ends.
- "git merge @{-1}~22" was rewritten to "git merge frotz@{1}
22" incorrectly when your previous branch was "frotz" (it should be rewritten to "git merge frotz22" instead).
- "git commit --allow-empty-message -m ’’" should not start an editor.
- "git push --[no-]verify" was not documented.
- An entry for "file://" scheme in the enumeration of URL types Git can take in the HTML documentation was made into a clickable link by mistake.
- zsh prompt script that borrowed from bash prompt script did not work due to slight differences in array variable notation between these two shells.
- The bash prompt code (in contrib/) displayed the name of the branch being rebased when "rebase -i/-m/-p" modes are in use, but not the plain vanilla "rebase".
- "git push $there HEAD:branch" did not resolve HEAD early enough, so it was easy to flip it around while push is still going on and push out a branch that the user did not originally intended when the command was started.
- "difftool --dir-diff" did not copy back changes made by the end-user in the diff tool backend to the working tree in some cases.
1.8.3.3
Git v1.8.3.3 Release Notes ==========================
Fixes since v1.8.3.2 --------------------
- "git apply" parsed patches that add new files, generated by programs other than Git, incorrectly. This is an old breakage in v1.7.11.
- Older cURL wanted piece of memory we call it with to be stable, but we updated the auth material after handing it to a call.
- "git pull" into nothing trashed "local changes" that were in the index.
- Many "git submodule" operations did not work on a submodule at a path whose name is not in ASCII.
- "cherry-pick" had a small leak in its error codepath.
- Logic used by git-send-email to suppress cc mishandled names like "A U. Thor" <author@example.xz>, where the human readable part needs to be quoted (the user input may not have the double quotes around the name, and comparison was done between quoted and unquoted strings). It also mishandled names that need RFC2047 quoting.
- "gitweb" forgot to clear a global variable $search_regexp upon each request, mistakenly carrying over the previous search to a new one when used as a persistent CGI.
- The wildmatch engine did not honor WM_CASEFOLD option correctly.
- "git log -c --follow $path" segfaulted upon hitting the commit that renamed the $path being followed.
- When a reflog notation is used for implicit "current branch", e.g. "git log @{u}", we did not say which branch and worse said "branch ’’" in the error messages.
- Mac OS X does not like to write(2) more than INT_MAX number of bytes; work it around by chopping write(2) into smaller pieces.
- Newer MacOS X encourages the programs to compile and link with their CommonCrypto, not with OpenSSL.
Also contains various minor documentation updates.
1.8.3.4
Git v1.8.3.4 Release Notes ==========================
This update is mostly to propagate documentation fixes and test updates from the master front back to the maintenance track.
Fixes since v1.8.3.3 --------------------
- The bisect log listed incorrect commits when bisection ends with only skipped ones.
- The test coverage framework was left broken for some time.
- The test suite for HTTP transport did not run with Apache 2.4.
- "git diff" used to fail when core.safecrlf is set and the working tree contents had mixed CRLF/LF line endings. Committing such a content must be prohibited, but "git diff" should help the user to locate and fix such problems without failing.
1.8.3
Git v1.8.3 Release Notes ========================
Backward compatibility notes (for Git 2.0) ------------------------------------------
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" semantics that pushes only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch. Use the user preference configuration variable "push.default" to change this. If you are an old-timer who is used to the "matching" semantics, you can set the variable to "matching" to keep the traditional behaviour. If you want to live in the future early, you can set it to "simple" today without waiting for Git 2.0.
When "git add -u" (and "git add -A") is run inside a subdirectory and does not specify which paths to add on the command line, it will operate on the entire tree in Git 2.0 for consistency with "git commit -a" and other commands. There will be no mechanism to make plain "git add -u" behave like "git add -u .". Current users of "git add -u" (without a pathspec) should start training their fingers to explicitly say "git add -u ." before Git 2.0 comes. A warning is issued when these commands are run without a pathspec and when you have local changes outside the current directory, because the behaviour in Git 2.0 will be different from today’s version in such a situation.
In Git 2.0, "git add <path>" will behave as "git add -A <path>", so that "git add dir/" will notice paths you removed from the directory and record the removal. Versions before Git 2.0, including this release, will keep ignoring removals, but the users who rely on this behaviour are encouraged to start using "git add --ignore-removal <path>" now before 2.0 is released.
Updates since v1.8.2 --------------------
Foreign interface
- remote-hg and remote-bzr helpers (in contrib/ since v1.8.2) have been updated; especially, the latter has been done in an accelerated schedule (read: we may not have merged to this release if we were following the usual "cook sufficiently in next before unleashing it to the world" workflow) in order to help Emacs folks, whose primary SCM seems to be stagnating.
UI, Workflows & Features
- A handful of updates applied to gitk, including an addition of "revert" action, showing dates in tags in a nicer way, making colors configurable, and support for -G’pickaxe’ search.
- The prompt string generator (in contrib/completion/) learned to show how many changes there are in total and how many have been replayed during a "git rebase" session.
- "git branch --vv" learned to paint the name of the branch it integrates with in a different color (color.branch.upstream, which defaults to blue).
- In a sparsely populated working tree, "git checkout <pathspec>" no longer unmarks paths that match the given pathspec that were originally ignored with "--sparse" (use --ignore-skip-worktree-bits option to resurrect these paths out of the index if you really want to).
- "git log --format" specifier learned %C(auto) token that tells Git to use color when interpolating %d (decoration), %h (short commit object name), etc. for terminal output.
- "git bisect" leaves the final outcome as a comment in its bisect log file.
- "git clone --reference" can now refer to a gitfile "textual symlink" that points at the real location of the repository.
- "git count-objects" learned "--human-readable" aka "-H" option to show various large numbers in Ki/Mi/GiB scaled as necessary.
- "git cherry-pick $blob" and "git cherry-pick $tree" are nonsense, and a more readable error message e.g. "can’t cherry-pick a tree" is given (we used to say "expected exactly one commit").
- The "--annotate" option to "git send-email" can be turned on (or off) by default with sendemail.annotate configuration variable (you can use --no-annotate from the command line to override it).
- The "--cover-letter" option to "git format-patch" can be turned on (or off) by default with format.coverLetter configuration variable. By setting it to ’auto’, you can turn it on only for a series with two or more patches.
- The bash completion support (in contrib/) learned that cherry-pick takes a few more options than it already knew about.
- "git help" learned "-g" option to show the list of guides just like list of commands are given with "-a".
- A triangular "pull from one place, push to another place" workflow is supported better by new remote.pushdefault (overrides the "origin" thing) and branch..pushremote (overrides the branch..remote) configuration variables.
- "git status" learned to report that you are in the middle of a revert session, just like it does for a cherry-pick and a bisect session.
- The handling by "git branch --set-upstream-to" against various forms of erroneous inputs was suboptimal and has been improved.
- When the interactive access to git-shell is not enabled, it issues a message meant to help the system administrator to enable it. An explicit way has been added to issue custom messages to refuse an access over the network to help the end users who connect to the service expecting an interactive shell.
- In addition to the case where the user edits the log message with the "e)dit" option of "am -i", replace the "Applying: this patch" message with the final log message contents after applymsg hook munges it.
- "git status" suggests users to look into using --untracked=no option when it takes too long.
- "git status" shows a bit more information during a rebase/bisect session.
- "git fetch" learned to fetch a commit at the tip of an unadvertised ref by specifying a raw object name from the command line when the server side supports this feature.
- Output from "git log --graph" works better with submodule log output now.
- "git count-objects -v" learned to report leftover temporary packfiles and other garbage in the object store.
- A new read-only credential helper (in contrib/) to interact with the .netrc/.authinfo files has been added.
- "git send-email" can be used with the credential helper system.
- There was no Porcelain way to say "I no longer am interested in this submodule", once you express your interest in a submodule with "submodule init". "submodule deinit" is the way to do so.
- "git pull --rebase" learned to pass "-v/-q" options to underlying "git rebase".
- The new "--follow-tags" option tells "git push" to push relevant annotated tags when pushing branches out.
- "git merge" and "git pull" can optionally be told to inspect and reject when merging a commit that does not carry a trusted GPG signature.
- "git mergetool" now feeds files to the "p4merge" backend in the order that matches the p4 convention, where "theirs" is usually shown on the left side, which is the opposite from what other backends expect.
- "show/log" now honors gpg.program configuration just like other parts of the code that use GnuPG.
- "git log" that shows the difference between the parent and the child has been optimized somewhat.
- "git difftool" allows the user to write into the temporary files being shown; if the user makes changes to the working tree at the same time, it now refrains from overwriting the copy in the working tree and leaves the temporary file so that changes can be merged manually.
- There was no good way to ask "I have a random string that came from outside world. I want to turn it into a 40-hex object name while making sure such an object exists". A new peeling suffix ^{object} can be used for that purpose, together with "rev-parse --verify".
Performance, Internal Implementation, etc.
- Updates for building under msvc.
- A handful of issues in the code that traverses the working tree to find untracked and/or ignored files have been fixed, and the general codepath involved in "status -u" and "clean" have been cleaned up and optimized.
- The stack footprint of some codepaths that access an object from a pack has been shrunk.
- The logic to coalesce the same lines removed from the parents in the output from "diff -c/--cc" has been updated, but with O(n^2) complexity, so this might turn out to be undesirable.
- The code to enforce permission bits on files in $GIT_DIR/ for shared repositories has been simplified.
- A few codepaths know how much data they need to put in the hashtables they use when they start, but still began with small tables and repeatedly grew and rehashed them.
- The API to walk reflog entries from the latest to older, which was necessary for operations such as "git checkout -", was cumbersome to use correctly and also inefficient.
- Codepaths that inspect log-message-to-be and decide when to add a new Signed-off-by line in various commands have been consolidated.
- The pkt-line API, implementation and its callers have been cleaned up to make them more robust.
- The Cygwin port has a faster-but-lying lstat(2) emulation whose incorrectness does not matter in practice except for a few codepaths, and setting permission bits on directories is a codepath that needs to use a more correct one.
- "git checkout" had repeated pathspec matches on the same paths, which have been consolidated. Also a bug in "git checkout dir/" that is started from an unmerged index has been fixed.
- A few bugfixes to "git rerere" working on corner case merge conflicts have been applied.
Also contains various documentation updates and code clean-ups.
Fixes since v1.8.2 ------------------
Unless otherwise noted, all the fixes since v1.8.2 in the maintenance track are contained in this release (see release notes to them for details).
- Recent versions of File::Temp (used by "git svn") started blowing up when its tempfile sub is called as a class method; updated the callsite to call it as a plain vanilla function to fix it. (merge eafc2dd hb/git-pm-tempfile later to maint).
- Various subcommands of "git remote" simply ignored extraneous command line arguments instead of diagnosing them as errors.
- When receive-pack detects an error in the pack header it received in order to decide which of unpack-objects or index-pack to run, it returned without closing the error stream, which led to a hung sideband thread.
- Zsh completion forgot that the ’%’ character used to signal untracked files needs to be escaped with another ’%’.
- A commit object whose author or committer ident are malformed crashed some code that trusted that a name, an email and a timestamp can always be found in it.
- When "upload-pack" fails while generating a pack in response to "git fetch" (or "git clone"), the receiving side had a programming error that triggered the die handler recursively.
- "rev-list --stdin" and friends kept bogus pointers into the input buffer around as human readable object names. This was not a huge problem but was exposed by a new change that uses these names in error output.
- Smart-capable HTTP servers were not restricted via the GIT_NAMESPACE mechanism when talking with commit-walking clients, like they are when talking with smart HTTP clients. (merge 6130f86 jk/http-dumb-namespaces later to maint).
- "git merge-tree" did not omit a merge result that is identical to the "our" side in certain cases. (merge aacecc3 jk/merge-tree-added-identically later to maint).
- Perl scripts like "git-svn" closed (instead of redirecting to /dev/null) the standard error stream, which is not a very smart thing to do. A later open may return file descriptor #2 for an unrelated purpose, and error reporting code may write into it.
- "git show-branch" was not prepared to show a very long run of ancestor operators e.g. foobar2
2222…^24 correctly.
- "git diff --diff-algorithm algo" is also understood as "git diff --diff-algorithm=algo".
- The new core.commentchar configuration was not applied in a few places.
- "git bundle" erroneously bailed out when parsing a valid bundle containing a prerequisite commit without a commit message.
- "git log -S/-G" started paying attention to textconv filter, but there was no way to disable this. Make it honor the --no-textconv option.
- When used with the "-d temporary-directory" option, "git filter-branch" failed to come back to the original working tree to perform the final clean-up procedure.
- "git merge $(git rev-parse v1.8.2)" behaved quite differently from "git merge v1.8.2", as if v1.8.2 were written as v1.8.2^0 and did not pay much attention to the annotated tag payload. Make the code notice the type of the tag object, in addition to the dwim_ref() based classification the current code uses (i.e. the name appears in refs/tags/) to decide when to special-case tag merging.
- Fix a 1.8.1.x regression that stopped matching "dir" (without a trailing slash) to a directory "dir".
- "git apply --whitespace=fix" was not prepared to see a line getting longer after fixing whitespaces (e.g. tab-in-indent aka Python).
- The prompt string generator (in contrib/completion/) did not notice when we are in a middle of a "git revert" session.
- "submodule summary --summary-limit" option did not support the "--option=value" form.
- "index-pack --fix-thin" used an uninitialized value to compute the delta depths of objects it appends to the resulting pack.
- "index-pack --verify-stat" used a few counters outside the protection of a mutex, possibly showing incorrect numbers.
- The code to keep track of what directory names are known to Git on platforms with case insensitive filesystems could get confused upon a hash collision between these pathnames and would loop forever.
- Recent optimizations broke shallow clones.
- "git cmd — ’:(top’" was not diagnosed as an invalid syntax, and instead the parser kept reading beyond the end of the string.
- "git tag -f <tag>" always said "Updated tag ’<tag>’" even when creating a new tag (i.e. neither overwriting nor updating).
- "git p4" did not behave well when the path to the root of the P4 client was not its real path. (merge bbd8486 pw/p4-symlinked-root later to maint).
- "git archive" reported a failure when asked to create an archive out of an empty tree. It is more intuitive to give an empty archive back in such a case.
- When "format-patch" quoted a non-ascii string in header files, it incorrectly applied rfc2047 and chopped a single character in the middle of the string.
- An aliased command spawned from a bare repository that does not say it is bare with "core.bare = yes" was treated as non-bare by mistake.
- In "git reflog expire", the REACHABLE bit was not cleared from the correct objects.
- The logic used by "git diff -M --stat" to shorten the names of files before and after a rename did not work correctly when the common prefix and suffix between the two filenames overlapped.
- The "--match=<pattern>" option of "git describe", when used with "--all" to allow refs that are not annotated tags to be a base of description, did not restrict the output from the command to those refs that match the given pattern.
- Clarify in the documentation "what" gets pushed to "where" when the command line to "git push" does not say these explicitly.
- The "--color=<when>" argument to the commands in the diff family was described poorly.
- The arguments given to the pre-rebase hook were not documented.
- The v4 index format was not documented.
- The "--match=<pattern>" argument "git describe" takes uses glob pattern but it wasn’t obvious from the documentation.
- Some sources failed to compile on systems that lack NI_MAXHOST in their system header (e.g. z/OS).
- Add an example use of "--env-filter" in "filter-branch" documentation.
- "git bundle verify" did not say "records a complete history" for a bundle that does not have any prerequisites.
- In the v1.8.0 era, we changed symbols that do not have to be global to file scope static, but a few functions in graph.c were used by CGit sideways, bypassing the entry points of the API the in-tree users use.
- "git update-index -h" did not do the usual "-h(elp)" thing.
- "git index-pack" had a buffer-overflow while preparing an informational message when the translated version of it was too long.
- ’git commit -m "$msg"’ used to add an extra newline even when $msg already ended with one.
- The SSL peer verification done by "git imap-send" did not ask for Server Name Indication (RFC 4366), failing to connect to SSL/TLS sites that serve multiple hostnames on a single IP.
- perl/Git.pm::cat_blob slurped everything in core only to write it out to a file descriptor, which was not a very smart thing to do.
- "git branch" did not bother to check nonsense command line parameters. It now issues errors in many cases.
- Verification of signed tags was not done correctly when not in C or en/US locale.
- Some platforms and users spell UTF-8 differently; retry with the most official "UTF-8" when the system does not understand the user-supplied encoding name that is a common alternative spelling of UTF-8.
- When export-subst is used, "zip" output recorded an incorrect size of the file.
- "git am $maildir/" applied messages in an unexpected order; sort filenames read from the maildir/ in a way that is more likely to sort the messages in the order the writing MUA meant to, by sorting numeric segments in numeric order and non-numeric segments in alphabetical order.
- "git submodule update", when recursed into sub-submodules, did not accumulate the prefix paths.
1.8.4.1
Git v1.8.4.1 Release Notes ==========================
Fixes since v1.8.4 ------------------
- Some old versions of bash do not grok some constructs like ’printf -v varname’ which the prompt and completion code started to use recently. The completion and prompt scripts have been adjusted to work better with these old versions of bash.
- In FreeBSD’s and NetBSD’s "sh", a return in a dot script in a function returns from the function, not only in the dot script, breaking "git rebase" on these platforms (regression introduced in 1.8.4-rc1).
- "git rebase -i" and other scripted commands were feeding a random, data dependent error message to ’echo’ and expecting it to come out literally.
- Setting the "submodule.<name>.path" variable to the empty "true" caused the configuration parser to segfault.
- Output from "git log --full-diff — <pathspec>" looked strange because comparison was done with the previous ancestor that touched the specified <pathspec>, causing the patches for paths outside the pathspec to show more than the single commit has changed.
- The auto-tag-following code in "git fetch" tries to reuse the same transport twice when the serving end does not cooperate and does not give tags that point to commits that are asked for as part of the primary transfer. Unfortunately, Git-aware transport helper interface is not designed to be used more than once, hence this did not work over smart-http transfer. Fixed.
- Send a large request to read(2)/write(2) as a smaller but still reasonably large chunks, which would improve the latency when the operation needs to be killed and incidentally works around broken 64-bit systems that cannot take a 2GB write or read in one go.
- A ".mailmap" file that ends with an incomplete line, when read from a blob, was not handled properly.
- The recent "short-cut clone connectivity check" topic broke a shallow repository when a fetch operation tries to auto-follow tags.
- When send-email comes up with an error message to die with upon failure to start an SSL session, it tried to read the error string from a wrong place.
- A call to xread() was used without a loop to cope with short read in the codepath to stream large blobs to a pack.
- On platforms with fgetc() and friends defined as macros, the configuration parser did not compile.
- New versions of MediaWiki introduced a new API for returning more than 500 results in response to a query, which would cause the MediaWiki remote helper to go into an infinite loop.
- Subversion’s serf access method (the only one available in Subversion 1.8) for http and https URLs in skelta mode tells its caller to open multiple files at a time, which made "git svn fetch" complain that "Temp file with moniker ’svn_delta’ already in use" instead of fetching.
Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.
1.8.4.2
Git v1.8.4.2 Release Notes ==========================
Fixes since v1.8.4.1 --------------------
- "git clone" gave some progress messages to the standard output, not to the standard error, and did not allow suppressing them with the "--no-progress" option.
- "format-patch --from=<whom>" forgot to omit unnecessary in-body from line, i.e. when <whom> is the same as the real author.
- "git shortlog" used to choke and die when there is a malformed commit (e.g. missing authors); it now simply ignore such a commit and keeps going.
- "git merge-recursive" did not parse its "--diff-algorithm=" command line option correctly.
- "git branch --track" had a minor regression in v1.8.3.2 and later that made it impossible to base your local work on anything but a local branch of the upstream repository you are tracking from.
- "git ls-files -k" needs to crawl only the part of the working tree that may overlap the paths in the index to find killed files, but shared code with the logic to find all the untracked files, which made it unnecessarily inefficient.
- When there is no sufficient overlap between old and new history during a "git fetch" into a shallow repository, objects that the sending side knows the receiving end has were unnecessarily sent.
- When running "fetch -q", a long silence while the sender side computes the set of objects to send can be mistaken by proxies as dropped connection. The server side has been taught to send a small empty messages to keep the connection alive.
- When the webserver responds with "405 Method Not Allowed", "git http-backend" should tell the client what methods are allowed with the "Allow" header.
- "git cvsserver" computed the permission mode bits incorrectly for executable files.
- The implementation of "add -i" has a crippling code to work around ActiveState Perl limitation but it by mistake also triggered on Git for Windows where MSYS perl is used.
- We made sure that we notice the user-supplied GIT_DIR is actually a gitfile, but did not do the same when the default ".git" is a gitfile.
- When an object is not found after checking the packfiles and then loose object directory, read_sha1_file() re-checks the packfiles to prevent racing with a concurrent repacker; teach the same logic to has_sha1_file().
- The commit object names in the insn sheet that was prepared at the beginning of "rebase -i" session can become ambiguous as the rebasing progresses and the repository gains more commits. Make sure the internal record is kept with full 40-hex object names.
- "git rebase --preserve-merges" internally used the merge machinery and as a side effect, left merge summary message in the log, but when rebasing, there should not be a need for merge summary.
- "git rebase -i" forgot that the comment character can be configurable while reading its insn sheet.
Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.
1.8.4.3
Git v1.8.4.3 Release Notes ==========================
Fixes since v1.8.4.2 --------------------
- The interaction between use of Perl in our test suite and NO_PERL has been clarified a bit.
- A fast-import stream expresses a pathname with funny characters by quoting them in C style; remote-hg remote helper (in contrib/) forgot to unquote such a path.
- One long-standing flaw in the pack transfer protocol used by "git clone" was that there was no way to tell the other end which branch "HEAD" points at, and the receiving end needed to guess. A new capability has been defined in the pack protocol to convey this information so that cloning from a repository with more than one branches pointing at the same commit where the HEAD is at now reliably sets the initial branch in the resulting repository.
- We did not handle cases where http transport gets redirected during the authorization request (e.g. from http:// to https://).
- "git rev-list --objects v1.0 v1.0" gave v1.0 tag itself in the output, but "git rev-list --objects v1.0^..v1.0" did not.
- The fall-back parsing of commit objects with broken author or committer lines were less robust than ideal in picking up the timestamps.
- Bash prompting code to deal with an SVN remote as an upstream were coded in a way not supported by older Bash versions (3.x).
- "git checkout topic", when there is not yet a local "topic" branch but there is a unique remote-tracking branch for a remote "topic" branch, pretended as if "git checkout -t -b topic remote/$r/topic" (for that unique remote $r) was run. This hack however was not implemented for "git checkout topic --".
- Coloring around octopus merges in "log --graph" output was screwy.
- We did not generate HTML version of documentation to "git subtree" in contrib/.
- The synopsis section of "git unpack-objects" documentation has been clarified a bit.
- An ancient How-To on serving Git repositories on an HTTP server lacked a warning that it has been mostly superseded with more modern way.
Also contains a handful of trivial code clean-ups, documentation updates, updates to the test suite, etc.
1.8.4.4
Git v1.8.4.4 Release Notes ==========================
Fixes since v1.8.4.3 --------------------
- The fix in v1.8.4.3 to the pack transfer protocol to propagate the target of symbolic refs broke "git clone/git fetch" from a repository with too many symbolic refs. As a hotfix/workaround, we transfer only the information on HEAD.
1.8.4.5
Git v1.8.4.5 Release Notes ==========================
Fixes since v1.8.4.4 --------------------
- Recent update to remote-hg that attempted to make it work better with non ASCII pathnames fed Unicode strings to the underlying Hg API, which was wrong.
- "git submodule init" copied "submodule.$name.update" settings from .gitmodules to .git/config without making sure if the suggested value was sensible.
1.8.4
Git v1.8.4 Release Notes ========================
Backward compatibility notes (for Git 2.0) ------------------------------------------
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" semantics that pushes:
- only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch, if you are pushing to the same remote as you fetch from; or
- only the current branch to the branch with the same name, if you are pushing to a remote that is not where you usually fetch from.
Use the user preference configuration variable "push.default" to change this. If you are an old-timer who is used to the "matching" semantics, you can set the variable to "matching" to keep the traditional behaviour. If you want to live in the future early, you can set it to "simple" today without waiting for Git 2.0.
When "git add -u" (and "git add -A") is run inside a subdirectory and does not specify which paths to add on the command line, it will operate on the entire tree in Git 2.0 for consistency with "git commit -a" and other commands. There will be no mechanism to make plain "git add -u" behave like "git add -u .". Current users of "git add -u" (without a pathspec) should start training their fingers to explicitly say "git add -u ." before Git 2.0 comes. A warning is issued when these commands are run without a pathspec and when you have local changes outside the current directory, because the behaviour in Git 2.0 will be different from today’s version in such a situation.
In Git 2.0, "git add <path>" will behave as "git add -A <path>", so that "git add dir/" will notice paths you removed from the directory and record the removal. Versions before Git 2.0, including this release, will keep ignoring removals, but the users who rely on this behaviour are encouraged to start using "git add --ignore-removal <path>" now before 2.0 is released.
Updates since v1.8.3 --------------------
Foreign interfaces, subsystems and ports.
- Cygwin port has been updated for more recent Cygwin 1.7.
- "git rebase -i" now honors --strategy and -X options.
- Git-gui has been updated to its 0.18.0 version.
- MediaWiki remote helper (in contrib/) has been updated to use the credential helper interface from Git.pm.
- Update build for Cygwin 1.[57]. Torsten Bögershausen reports that this is fine with Cygwin 1.7 (cf. <51A606A0.5060101@web.de>) so let’s try moving it ahead.
- The credential helper to talk to keychain on OS X (in contrib/) has been updated to kick in not just when talking http/https but also imap(s) and smtp.
- Remote transport helper has been updated to report errors and maintain ref hierarchy used to keep track of its own state better.
- With "export" remote-helper protocol, (1) a push that tries to update a remote ref whose name is different from the pushing side does not work yet, and (2) the helper may not know how to do --dry-run; these problematic cases are disabled for now.
- git-remote-hg/bzr (in contrib/) updates.
- git-remote-mw (in contrib/) hints users to check the certificate, when https:// connection failed.
- git-remote-mw (in contrib/) adds a command to allow previewing the contents locally before pushing it out, when working with a MediaWiki remote.
UI, Workflows & Features
- Sample "post-receive-email" hook script got an enhanced replacement "multimail" (in contrib/).
- Also in contrib/ is a new "contacts" script that runs "git blame" to find out the people who may be interested in a set of changes.
- "git clean" command learned an interactive mode.
- The "--head" option to "git show-ref" was only to add "HEAD" to the list of candidate refs to be filtered by the usual rules (e.g. "--heads" that only show refs under refs/heads). The meaning of the option has been changed to always show "HEAD" regardless of what filtering will be applied to any other ref.
This is a backward incompatible change and might cause breakages to
people's existing scripts.
- "git show -s" was less discoverable than it should have been. It now has a natural synonym "git show --no-patch".
- "git check-mailmap" is a new command that lets you map usernames and e-mail addresses through the mailmap mechanism, just like many built-in commands do.
- "git name-rev" learned to name an annotated tag object back to its tagname; "git name-rev $(git rev-parse v1.0.0)" gives "tags/v1.0.0", for example.
- "git cat-file --batch-check=<format>" is added, primarily to allow on-disk footprint of objects in packfiles (often they are a lot smaller than their true size, when expressed as deltas) to be reported.
- "git rebase [-i]" used to leave just "rebase" as its reflog messages for some operations. They have been reworded to be more informative.
- In addition to the choice from "rebase, merge, or checkout-detach", "submodule update" can allow a custom command to be used in to update the working tree of submodules via the "submodule.*.update" configuration variable.
- "git submodule update" can optionally clone the submodule repositories shallowly.
- "git format-patch" learned "--from[=whom]" option, which sets the "From: " header to the specified person (or the person who runs the command, if "=whom" part is missing) and move the original author information to an in-body From: header as necessary.
- The configuration variable "merge.ff" was cleary a tri-state to choose one from "favor fast-forward when possible", "always create a merge even when the history could fast-forward" and "do not create any merge, only update when the history fast-forwards", but the command line parser did not implement the usual convention of "last one wins, and command line overrides the configuration" correctly.
- "gitweb" learned to optionally place extra links that point at the levels higher than the Gitweb pages themselves in the breadcrumbs, so that it can be used as part of a larger installation.
- "git log --format=" now honors i18n.logoutputencoding configuration variable.
- The "push.default=simple" mode of "git push" has been updated to behave like "current" without requiring a remote tracking information, when you push to a remote that is different from where you fetch from (i.e. a triangular workflow).
- Having multiple "fixup!" on a line in the rebase instruction sheet did not work very well with "git rebase -i --autosquash".
- "git log" learned the "--author-date-order" option, with which the output is topologically sorted and commits in parallel histories are shown intermixed together based on the author timestamp.
- Various subcommands of "git submodule" refused to run from anywhere other than the top of the working tree of the superproject, but they have been taught to let you run from a subdirectory.
- "git diff" learned a mode that ignores hunks whose change consists only of additions and removals of blank lines, which is the same as "diff -B" (ignore blank lines) of GNU diff.
- "git rm" gives a single message followed by list of paths to report multiple paths that cannot be removed.
- "git rebase" can be told with ":/look for this string" syntax commits to replay the changes onto and where the work to be replayed begins.
- Many tutorials teach users to set "color.ui" to "auto" as the first thing after you set "user.name/email" to introduce yourselves to Git. Now the variable defaults to "auto".
- On Cygwin, "cygstart" is now recognised as a possible way to start a web browser (used in "help -w" and "instaweb" among others).
- "git status" learned status.branch and status.short configuration variables to use --branch and --short options by default (override with --no-branch and --no-short options from the command line).
- "git cmd <name>", when <name> happens to be a 40-hex string, directly uses the 40-hex string as an object name, even if a ref "refs/<some hierarchy>/<name>" exists. This disambiguation order is unlikely to change, but we should warn about the ambiguity just like we warn when more than one refs/ hierarchies share the same name.
- "git rebase" learned "--[no-]autostash" option to save local changes instead of refusing to run (to which people’s normal response was to stash them and re-run). This introduced a corner case breakage to "git am --abort" but it has been fixed.
- "check-ignore" (new feature since 1.8.2) has been updated to work more like "check-attr" over bidi-pipes.
- "git describe" learned "--first-parent" option to limit its closest tagged commit search to the first-parent chain.
- "git merge foo" that might have meant "git merge origin/foo" is diagnosed with a more informative error message.
- "git log -L<line>,<range>:<filename>" has been added. This may still have leaks and rough edges, though.
- We used the approxidate() parser for "--expire=<timestamp>" options of various commands, but it is better to treat --expire=all and --expire=now a bit more specially than using the current timestamp. "git gc" and "git reflog" have been updated with a new parsing function for expiry dates.
- Updates to completion (both bash and zsh) helpers.
- The behaviour of the "--chain-reply-to" option of "git send-email" have changed at 1.7.0, and we added a warning/advice message to help users adjust to the new behaviour back then, but we kept it around for too long. The message has finally been removed.
- "git fetch origin master" unlike "git fetch origin" or "git fetch" did not update "refs/remotes/origin/master"; this was an early design decision to keep the update of remote tracking branches predictable, but in practice it turns out that people find it more convenient to opportunistically update them whenever we have a chance, and we have been updating them when we run "git push" which already breaks the original "predictability" anyway.
- The configuration variable core.checkstat was advertised in the documentation but the code expected core.statinfo instead. For now, we accept both core.checkstat and core.statinfo, but the latter will be removed in the longer term.
Performance, Internal Implementation, etc.
- On Cygwin, we used to use our own lstat(2) emulation that is allegedly faster than the platform one in codepaths where some of the information it returns did not matter, but it started to bite us in a few codepaths where the trick it uses to cheat does show breakages. This emulation has been removed and we use the native lstat(2) emulation supplied by Cygwin now.
- The function attributes extensions are used to catch mistakes in use of our own variadic functions that use NULL sentinel at the end (i.e. like execl(3)) and format strings (i.e. like printf(3)).
- The code to allow configuration data to be read from in-tree blob objects is in. This may help working in a bare repository and submodule updates.
- Fetching between repositories with many refs employed O(n^2) algorithm to match up the common objects, which has been corrected.
- The original way to specify remote repository using .git/branches/ used to have a nifty feature. The code to support the feature was still in a function but the caller was changed not to call it 5 years ago, breaking that feature and leaving the supporting code unreachable. The dead code has been removed.
- "git pack-refs" that races with new ref creation or deletion have been susceptible to lossage of refs under right conditions, which has been tightened up.
- We read loose and packed references in two steps, but after deciding to read a loose ref but before actually opening it to read it, another process racing with us can unlink it, which would cause us to barf. The codepath has been updated to retry when such a race is detected, instead of outright failing.
- Uses of the platform fnmatch(3) function (many places in the code, matching pathspec, .gitignore and .gitattributes to name a few) have been replaced with wildmatch, allowing "foo/**/bar" that would match foo/bar, foo/a/bar, foo/a/b/bar, etc.
- Memory ownership and lifetime rules for what for-each-ref feeds to its callbacks have been clarified (in short, "you do not own it, so make a copy if you want to keep it").
- The revision traversal logic to improve culling of irrelevant parents while traversing a mergy history has been updated.
- Some leaks in unpack-trees (used in merge, cherry-pick and other codepaths) have been plugged.
- The codepath to read from marks files in fast-import/export did not have to accept anything but 40-hex representation of the object name. Further, fast-export did not need full in-core object representation to have parsed wen reading from them. These codepaths have been optimized by taking advantage of these access patterns.
- Object lookup logic, when the object hashtable starts to become crowded, has been optimized.
- When TEST_OUTPUT_DIRECTORY setting is used, it was handled somewhat inconsistently between the test framework and t/Makefile, and logic to summarize the results looked at a wrong place.
- "git clone" uses a lighter-weight implementation when making sure that the history behind refs are complete.
- Many warnings from sparse source checker in compat/ area has been squelched.
- The code to reading and updating packed-refs file has been updated, correcting corner case bugs.
Also contains various documentation updates and code clean-ups.
Fixes since v1.8.3 ------------------
Unless otherwise noted, all the fixes since v1.8.3 in the maintenance track are contained in this release (see release notes to them for details).
- Newer Net::SMTP::SSL module does not want the user programs to use the default behaviour to let server certificate go without verification, so by default enable the verification with a mechanism to turn it off if needed. (merge 35035bb rr/send-email-ssl-verify later to maint).
- When "git" is spawned in such a way that any of the low 3 file descriptors is closed, our first open() may yield file descriptor 2, and writing error message to it would screw things up in a big way. (merge a11c396 tr/protect-low-3-fds later to maint).
- The mailmap mechanism unnecessarily downcased the e-mail addresses in the output, and also ignored the human name when it is a single character name. (merge bd23794 jc/mailmap-case-insensitivity later to maint).
- In two places we did not check return value (expected to be a file descriptor) correctly. (merge a77f106 tr/fd-gotcha-fixes later to maint).
- Logic to auto-detect character encodings in the commit log message did not reject overlong and invalid UTF-8 characters. (merge 81050ac bc/commit-invalid-utf8 later to maint).
- Pass port number as a separate argument when "send-email" initializes Net::SMTP, instead of as a part of the hostname, i.e. host:port. This allows GSSAPI codepath to match with the hostname given. (merge 1a741bf bc/send-email-use-port-as-separate-param later to maint).
- "git diff" refused to even show difference when core.safecrlf is set to true (i.e. error out) and there are offending lines in the working tree files. (merge 5430bb2 jc/maint-diff-core-safecrlf later to maint).
- A test that should have failed but didn’t revealed a bug that needs to be corrected. (merge 94d75d1 jc/t1512-fix later to maint).
- An overlong path to a .git directory may have overflown the temporary path buffer used to create a name for lockfiles. (merge 2fbd4f9 mh/maint-lockfile-overflow later to maint).
- Invocations of "git checkout" used internally by "git rebase" were counted as "checkout", and affected later "git checkout -", which took the user to an unexpected place. (merge 3bed291 rr/rebase-checkout-reflog later to maint).
- The configuration variable column.ui was poorly documented. (merge 5e62cc1 rr/column-doc later to maint).
- "git name-rev --refs=tags/v*" were forbidden, which was a bit inconvenient (you had to give a pattern to match refs fully, like --refs=refs/tags/v*). (merge 98c5c4a nk/name-rev-abbreviated-refs later to maint).
- "git apply" parsed patches that add new files, generated by programs other than Git, incorrectly. This is an old breakage in v1.7.11 and will need to be merged down to the maintenance tracks.
- Older cURL wanted piece of memory we call it with to be stable, but we updated the auth material after handing it to a call.
- "git pull" into nothing trashed "local changes" that were in the index, and this avoids it.
- Many "git submodule" operations do not work on a submodule at a path whose name is not in ASCII.
- "cherry-pick" had a small leak in an error codepath.
- Logic used by git-send-email to suppress cc mishandled names like "A U. Thor" <author@example.xz>, where the human readable part needs to be quoted (the user input may not have the double quotes around the name, and comparison was done between quoted and unquoted strings). It also mishandled names that need RFC2047 quoting.
- Call to discard_cache/discard_index (used when we use different contents of the index in-core, in many operations like commit, apply, and merge) used to leak memory that held the array of index entries, which has been plugged. (merge a0fc4db rs/discard-index-discard-array later to maint).
- "gitweb" forgot to clear a global variable $search_regexp upon each request, mistakenly carrying over the previous search to a new one when used as a persistent CGI.
- The wildmatch engine did not honor WM_CASEFOLD option correctly.
- "git log -c --follow $path" segfaulted upon hitting the commit that renamed the $path being followed.
- When a reflog notation is used for implicit "current branch", we did not say which branch and worse said "branch ’’".
- "difftool --dir-diff" did not copy back changes made by the end-user in the diff tool backend to the working tree in some cases.
- "git push $there HEAD:branch" did not resolve HEAD early enough, so it was easy to flip it around while push is still going on and push out a branch that the user did not originally intended when the command was started.
- The bash prompt code (in contrib/) displayed the name of the branch being rebased when "rebase -i/-m/-p" modes are in use, but not the plain vanilla "rebase".
- Handling of negative exclude pattern for directories "!dir" was broken in the update to v1.8.3.
- zsh prompt script that borrowed from bash prompt script did not work due to slight differences in array variable notation between these two shells.
- An entry for "file://" scheme in the enumeration of URL types Git can take in the HTML documentation was made into a clickable link by mistake.
- "git push --[no-]verify" was not documented.
- Stop installing the git-remote-testpy script that is only used for testing.
- "git commit --allow-empty-message -m ’’" should not start an editor.
- "git merge @{-1}~22" was rewritten to "git merge frotz@{1}
22" incorrectly when your previous branch was "frotz" (it should be rewritten to "git merge frotz22" instead).
- "git diff -c -p" was not showing a deleted line from a hunk when another hunk immediately begins where the earlier one ends.
- "git log --ancestry-path A…B" did not work as expected, as it did not pay attention to the fact that the merge base between A and B was the bottom of the range being specified.
- Mac OS X does not like to write(2) more than INT_MAX number of bytes; work it around by chopping write(2) into smaller pieces.
- Newer MacOS X encourages the programs to compile and link with their CommonCrypto, not with OpenSSL.
- "git clone foo/bar:baz" cannot be a request to clone from a remote over git-over-ssh specified in the scp style. This case is now detected and clones from a local repository at "foo/bar:baz".
- When $HOME is misconfigured to point at an unreadable directory, we used to complain and die. Loosen the check.
- "git subtree" (in contrib/) had one codepath with loose error checks to lose data at the remote side.
- "git fetch" into a shallow repository from a repository that does not know about the shallow boundary commits (e.g. a different fork from the repository the current shallow repository was cloned from) did not work correctly.
- "git checkout foo" DWIMs the intended "upstream" and turns it into "git checkout -t -b foo remotes/origin/foo". This codepath has been updated to correctly take existing remote definitions into account.
1.8.5.1
Git v1.8.5.1 Release Notes ==========================
Fixes since v1.8.5 ------------------
- "git submodule init" copied "submodule.$name.update" settings from .gitmodules to .git/config without making sure if the suggested value was sensible.
1.8.5.2
Git v1.8.5.2 Release Notes ==========================
Fixes since v1.8.5.1 --------------------
- "git diff — ’:(icase)makefile’" was unnecessarily rejected at the command line parser.
- "git cat-file --batch-check=ok" did not check the existence of the named object.
- "git am --abort" sometimes complained about not being able to write a tree with an 0{40} object in it.
- Two processes creating loose objects at the same time could have failed unnecessarily when the name of their new objects started with the same byte value, due to a race condition.
Also contains typofixes, documentation updates and trivial code clean-ups.
1.8.5.3
Git v1.8.5.3 Release Notes ==========================
Fixes since v1.8.5.2 --------------------
- The "--[no-]informative-errors" options to "git daemon" were parsed a bit too loosely, allowing any other string after these option names.
- A "gc" process running as a different user should be able to stop a new "gc" process from starting.
- An earlier "clean-up" introduced an unnecessary memory leak to the credential subsystem.
- "git mv A B/", when B does not exist as a directory, should error out, but it didn’t.
- "git rev-parse <revs> — <paths>" did not implement the usual disambiguation rules the commands in the "git log" family used in the same way.
- "git cat-file --batch=", an admittedly useless command, did not behave very well.
Also contains typofixes, documentation updates and trivial code clean-ups.
1.8.5.4
Git v1.8.5.4 Release Notes ==========================
Fixes since v1.8.5.3 --------------------
- "git fetch --depth=0" was a no-op, and was silently ignored. Diagnose it as an error.
- Remote repository URL expressed in scp-style host:path notation are parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks to connect to user’s home directory on host at address ::1.
- "git commit -v" appends the patch to the log message before editing, and then removes the patch when the editor returned control. However, the patch was not stripped correctly when the first modified path was a submodule.
- "git mv A B/", when B does not exist as a directory, should error out, but it didn’t.
- When we figure out how many file descriptors to allocate for keeping packfiles open, a system with non-working getrlimit() could cause us to die(), but because we make this call only to get a rough estimate of how many is available and we do not even attempt to use up all file descriptors available ourselves, it is nicer to fall back to a reasonable low value rather than dying.
- "git log --decorate" did not handle a tag pointed by another tag nicely.
- "git add -A" (no other arguments) in a totally empty working tree used to emit an error.
- There is no reason to have a hardcoded upper limit of the number of parents for an octopus merge, created via the graft mechanism, but there was.
- The implementation of ’git stash $cmd "stash@{…}"’ did not quote the stash argument properly and left it split at IFS whitespace.
- The documentation to "git pull" hinted there is an "-m" option because it incorrectly shared the documentation with "git merge".
Also contains typofixes, documentation updates and trivial code clean-ups.
1.8.5.5
Git v1.8.5.5 Release Notes ==========================
Fixes since v1.8.5.4 --------------------
- The pathspec matching code, while comparing two trees (e.g. "git diff A B — path1 path2") was too aggressive and failed to match some paths when multiple pathspecs were involved.
- "git repack --max-pack-size=8g" stopped being parsed correctly when the command was reimplemented in C.
- A recent update to "git send-email" broke platforms where /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path (e.g. Fedora rawhide).
- A handful of bugs around interpreting $branch@{upstream} notation and its lookalike, when $branch part has interesting characters, e.g. "@", and ":", have been fixed.
- "git clone" would fail to clone from a repository that has a ref directly under "refs/", e.g. "refs/stash", because different validation paths do different things on such a refname. Loosen the client side’s validation to allow such a ref.
- "git log --left-right A…B" lost the "leftness" of commits reachable from A when A is a tag as a side effect of a recent bugfix. This is a regression in 1.8.4.x series.
- "git merge-base --octopus" used to leave cleaning up suboptimal result to the caller, but now it does the clean-up itself.
- "git mv A B/", when B does not exist as a directory, should error out, but it didn’t.
Also contains typofixes, documentation updates and trivial code clean-ups.
1.8.5.6
Git v1.8.5.6 Release Notes ==========================
Fixes since v1.8.5.5 --------------------
- We used to allow committing a path ".Git/config" with Git that is running on a case sensitive filesystem, but an attempt to check out such a path with Git that runs on a case insensitive filesystem would have clobbered ".git/config", which is definitely not what the user would have expected. Git now prevents you from tracking a path with ".Git" (in any case combination) as a path component.
- On Windows, certain path components that are different from ".git" are mapped to ".git", e.g. "git~1/config" is treated as if it were ".git/config". HFS+ has a similar issue, where certain unicode codepoints are ignored, e.g. ".gu200cit/config" is treated as if it were ".git/config". Pathnames with these potential issues are rejected on the affected systems. Git on systems that are not affected by this issue (e.g. Linux) can also be configured to reject them to ensure cross platform interoperability of the hosted projects.
- "git fsck" notices a tree object that records such a path that can be confused with ".git", and with receive.fsckObjects configuration set to true, an attempt to "git push" such a tree object will be rejected. Such a path may not be a problem on a well behaving filesystem but in order to protect those on HFS+ and on case insensitive filesystems, this check is enabled on all platforms.
A big "thanks!" for bringing this issue to us goes to our friends in the Mercurial land, namely, Matt Mackall and Augie Fackler.
Also contains typofixes, documentation updates and trivial code clean-ups.
1.8.5
Git v1.8.5 Release Notes ========================
Backward compatibility notes (for Git 2.0) ------------------------------------------
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" semantics, which pushes:
- only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch, if you are pushing to the same remote as you fetch from; or
- only the current branch to the branch with the same name, if you are pushing to a remote that is not where you usually fetch from.
Use the user preference configuration variable "push.default" to change this. If you are an old-timer who is used to the "matching" semantics, you can set the variable to "matching" to keep the traditional behaviour. If you want to live in the future early, you can set it to "simple" today without waiting for Git 2.0.
When "git add -u" (and "git add -A") is run inside a subdirectory and does not specify which paths to add on the command line, it will operate on the entire tree in Git 2.0 for consistency with "git commit -a" and other commands. There will be no mechanism to make plain "git add -u" behave like "git add -u .". Current users of "git add -u" (without a pathspec) should start training their fingers to explicitly say "git add -u ." before Git 2.0 comes. A warning is issued when these commands are run without a pathspec and when you have local changes outside the current directory, because the behaviour in Git 2.0 will be different from today’s version in such a situation.
In Git 2.0, "git add <path>" will behave as "git add -A <path>", so that "git add dir/" will notice paths you removed from the directory and record the removal. Versions before Git 2.0, including this release, will keep ignoring removals, but the users who rely on this behaviour are encouraged to start using "git add --ignore-removal <path>" now before 2.0 is released.
The default prefix for "git svn" will change in Git 2.0. For a long time, "git svn" created its remote-tracking branches directly under refs/remotes, but it will place them under refs/remotes/origin/ unless it is told otherwise with its --prefix option.
Updates since v1.8.4 --------------------
Foreign interfaces, subsystems and ports.
- "git-svn" has been taught to use the serf library, which is the only option SVN 1.8.0 offers us when talking the HTTP protocol.
- "git-svn" talking over an https:// connection using the serf library dumped core due to a bug in the serf library that SVN uses. Work around it on our side, even though the SVN side is being fixed.
- On MacOS X, we detected if the filesystem needs the "pre-composed unicode strings" workaround, but did not automatically enable it. Now we do.
- remote-hg remote helper misbehaved when interacting with a local Hg repository relative to the home directory, e.g. "clone hg::~/there".
- imap-send ported to OS X uses Apple’s security framework instead of OpenSSL’s.
- "git fast-import" treats an empty path given to "ls" as the root of the tree.
UI, Workflows & Features
- xdg-open can be used as a browser backend for "git web-browse" (hence to show "git help -w" output), when available.
- "git grep" and "git show" pay attention to the "--textconv" option when these commands are told to operate on blob objects (e.g. "git grep -e pattern --textconv HEAD:Makefile").
- "git replace" helper no longer allows an object to be replaced with another object of a different type to avoid confusion (you can still manually craft such a replacement using "git update-ref", as an escape hatch).
- "git status" no longer prints the dirty status information of submodules for which submodule.$name.ignore is set to "all".
- "git rebase -i" honours core.abbrev when preparing the insn sheet for editing.
- "git status" during a cherry-pick shows which original commit is being picked.
- Instead of typing four capital letters "HEAD", you can say "@" now, e.g. "git log @".
- "git check-ignore" follows the same rule as "git add" and "git status" in that the ignore/exclude mechanism does not take effect on paths that are already tracked. With the "--no-index" option, it can be used to diagnose which paths that should have been ignored have been mistakenly added to the index.
- Some irrelevant "advice" messages that are shared with "git status" output have been removed from the commit log template.
- "update-refs" learned a "--stdin" option to read multiple update requests and perform them in an all-or-none fashion.
- Just like "make -C <directory>", "git -C <directory> …" tells Git to go there before doing anything else.
- Just like "git checkout -" knows to check out, and "git merge -" knows to merge, the branch you were previously on, "git cherry-pick" now understands "git cherry-pick -" to pick from the previous branch.
- "git status" now omits the prefix to make its output a comment in a commit log editor, which is not necessary for human consumption. Scripts that parse the output of "git status" are advised to use "git status --porcelain" instead, as its format is stable and easier to parse.
- The ref syntax "foo^{tag}" (with the literal string "{tag}") peels a tag ref to itself, i.e. it’s a no-op., and fails if "foo" is not a tag. "git rev-parse --verify v1.0^{tag}" is a more convenient way than "test $(git cat-file -t v1.0) = tag" to check if v1.0 is a tag.
- "git branch -v -v" (and "git status") did not distinguish among a branch that is not based on any other branch, a branch that is in sync with its upstream branch, and a branch that is configured with an upstream branch that no longer exists.
- Earlier we started rejecting any attempt to add the 0{40} object name to the index and to tree objects, but it sometimes is necessary to allow this to be able to use tools like filter-branch to correct such broken tree objects. "filter-branch" can again be used to do this.
- "git config" did not provide a way to set or access numbers larger than a native "int" on the platform; it now provides 64-bit signed integers on all platforms.
- "git pull --rebase" always chose to do the bog-standard flattening rebase. You can tell it to run "rebase --preserve-merges" with "git pull --rebase=preserve" or by setting "pull.rebase" configuration to "preserve".
- "git push --no-thin" actually disables the "thin pack transfer" optimization.
- Magic pathspecs like ":(icase)makefile" (matches both Makefile and makefile) and ":(glob)foo/**/bar" (matches "bar" in "foo" and any subdirectory of "foo") can be used in more places.
- The "http.*" variables can now be specified for individual URLs. For example,
[http]
sslVerify = true
[http "https://weak.example.com/"]
sslVerify = false
would flip http.sslVerify off only when talking to that specific
site.
- "git mv A B" when moving a submodule has been taught to relocate the submodule’s working tree and to adjust the paths in the .gitmodules file.
- "git blame" can now take more than one -L option to discover the origin of multiple blocks of lines.
- The http transport clients can optionally ask to save cookies with the http.savecookies configuration variable.
- "git push" learned a more fine grained control over a blunt "--force" when requesting a non-fast-forward update with the "--force-with-lease=<refname>:<expected object name>" option.
- "git diff --diff-filter=<classes of changes>" can now take lowercase letters (e.g. "--diff-filter=d") to mean "show everything but these classes". "git diff-files -q" is now a deprecated synonym for "git diff-files --diff-filter=d".
- "git fetch" (hence "git pull" as well) learned to check "fetch.prune" and "remote.*.prune" configuration variables and to behave as if the "--prune" command line option was given.
- "git check-ignore -z" applied the NUL termination to both its input (with --stdin) and its output, but "git check-attr -z" ignored the option on the output side. Make both honor -z on the input and output side the same way.
- "git whatchanged" may still be used by old timers, but mention of it in documents meant for new users will only waste readers’ time wondering what the difference is between it and "git log". Make it less prominent in the general part of the documentation and explain that it is merely a "git log" with different default behaviour in its own document.
Performance, Internal Implementation, etc.
- "git for-each-ref" when asking for merely the object name does not have to parse the object pointed at by the refs; the codepath has been optimized.
- The HTTP transport will try to use TCP keepalive when able.
- "git repack" is now written in C.
- Build procedure for MSVC has been updated.
- If a build-time fallback is set to "cat" instead of "less", we should apply the same "no subprocess or pipe" optimization as we apply to user-supplied GIT_PAGER=cat.
- Many commands use a --dashed-option as an operation mode selector (e.g. "git tag --delete") that excludes other operation modes (e.g. "git tag --delete --verify" is nonsense) and that cannot be negated (e.g. "git tag --no-delete" is nonsense). The parse-options API learned a new OPT_CMDMODE macro to make it easier to implement such a set of options.
- OPT_BOOLEAN() in the parse-options API was misdesigned to be "counting up" but many subcommands expect it to behave as "on/off". Update them to use OPT_BOOL() which is a proper boolean.
- "git gc" exits early without doing any work when it detects that another instance of itself is already running.
- Under memory pressure and/or file descriptor pressure, we used to close pack windows that are not used and also closed filehandles to open but unused packfiles. These are now controlled separately to better cope with the load.
Also contains various documentation updates and code clean-ups.
Fixes since v1.8.4 ------------------
Unless otherwise noted, all the fixes since v1.8.4 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- An ancient How-To on serving Git repositories on an HTTP server lacked a warning that it has been mostly superseded with a more modern way. (merge 6d52bc3 sc/doc-howto-dumb-http later to maint).
- The interaction between the use of Perl in our test suite and NO_PERL has been clarified a bit. (merge f8fc0ee jn/test-prereq-perl-doc later to maint).
- The synopsis section of the "git unpack-objects" documentation has been clarified a bit. (merge 61e2e22 vd/doc-unpack-objects later to maint).
- We did not generate the HTML version of the documentation to "git subtree" in contrib/. (merge 95c62fb jk/subtree-install-fix later to maint).
- A fast-import stream expresses a pathname with funny characters by quoting them in C style; the remote-hg remote helper forgot to unquote such a path. (merge 1136265 ap/remote-hg-unquote-cquote later to maint).
- "git reset -p HEAD" has a codepath to special-case it to behave differently from resetting to contents of other commits, but a recent change broke it.
- Coloring around octopus merges in "log --graph" output was screwy. (merge 339c17b hn/log-graph-color-octopus later to maint).
- "git checkout topic", when there is not yet a local "topic" branch but there is a unique remote-tracking branch for a remote "topic" branch, pretended as if "git checkout -t -b topic remote/$r/topic" (for that unique remote $r) was run. This hack however was not implemented for "git checkout topic --". (merge bca3969 mm/checkout-auto-track-fix later to maint).
- One long-standing flaw in the pack transfer protocol used by "git clone" was that there was no way to tell the other end which branch "HEAD" points at, and the receiving end needed to guess. A new capability has been defined in the pack protocol to convey this information so that cloning from a repository with more than one branch pointing at the same commit where the HEAD is at now reliably sets the initial branch in the resulting repository. (merge 360a326 jc/upload-pack-send-symref later to maint).
- We did not handle cases where the http transport gets redirected during the authorization request (e.g. from http:// to https://). (merge 70900ed jk/http-auth-redirects later to maint).
- Bash prompting code to deal with an SVN remote as an upstream was coded in a way unsupported by older Bash versions (3.x). (merge 52ec889 sg/prompt-svn-remote-fix later to maint).
- The fall-back parsing of commit objects with broken author or committer lines was less robust than ideal in picking up the timestamps. (merge 03818a4 jk/split-broken-ident later to maint).
- "git rev-list --objects v1.0 v1.0" gave the v1.0 tag itself in the output, but "git rev-list --objects v1.0^..v1.0" did not. (merge 895c5ba jc/revision-range-unpeel later to maint).
- "git clone" wrote some progress messages to standard output, not to standard error, and did not suppress them with the --no-progress option. (merge 643f918 jk/clone-progress-to-stderr later to maint).
- "format-patch --from=<whom>" forgot to omit an unnecessary in-body from line, i.e. when <whom> is the same as the real author. (merge 662cc30 jk/format-patch-from later to maint).
- "git shortlog" used to choke and die when there is a malformed commit (e.g. missing authors); it now simply ignores such a commit and keeps going. (merge cd4f09e jk/shortlog-tolerate-broken-commit later to maint).
- "git merge-recursive" did not parse its "--diff-algorithm=" command line option correctly. (merge 6562928 jk/diff-algo later to maint).
- When running "fetch -q", a long silence while the sender side computes the set of objects to send can be mistaken by proxies as dropped connection. The server side has been taught to send a small empty messages to keep the connection alive. (merge 115dedd jk/upload-pack-keepalive later to maint).
- "git rebase" had a portability regression in v1.8.4 that triggered a bug in some BSD shell implementations. (merge 99855dd mm/rebase-continue-freebsd-WB later to maint).
- "git branch --track" had a minor regression in v1.8.3.2 and later that made it impossible to base your local work on anything but a local branch of the upstream repository you are tracking. (merge b0f49ff jh/checkout-auto-tracking later to maint).
- When the web server responds with "405 Method Not Allowed", "git http-backend" should tell the client what methods are allowed with the "Allow" header. (merge 9247be0 bc/http-backend-allow-405 later to maint).
- When there is no sufficient overlap between old and new history during a "git fetch" into a shallow repository, objects that the sending side knows the receiving end has were unnecessarily sent. (merge f21d2a7 nd/fetch-into-shallow later to maint).
- "git cvsserver" computed the permission mode bits incorrectly for executable files. (merge 1b48d56 jc/cvsserver-perm-bit-fix later to maint).
- When send-email obtains an error message to die with upon failure to start an SSL session, it tried to read the error string from a wrong place. (merge 6cb0c88 bc/send-email-ssl-die-message-fix later to maint).
- The implementation of "add -i" has some crippling code to work around an ActiveState Perl limitation but it by mistake also triggered on Git for Windows where MSYS perl is used. (merge df17e77 js/add-i-mingw later to maint).
- We made sure that we notice when the user-supplied GIT_DIR is actually a gitfile, but did not do the same when the default ".git" is a gitfile. (merge 487a2b7 nd/git-dir-pointing-at-gitfile later to maint).
- When an object is not found after checking the packfiles and the loose object directory, read_sha1_file() re-checks the packfiles to prevent racing with a concurrent repacker; teach the same logic to has_sha1_file(). (merge 45e8a74 jk/has-sha1-file-retry-packed later to maint).
- "git ls-files -k" needs to crawl only the part of the working tree that may overlap the paths in the index to find killed files, but shared code with the logic to find all the untracked files, which made it unnecessarily inefficient. (merge 680be04 jc/ls-files-killed-optim later to maint).
- The shortened commit object names in the insn sheet that is prepared at the beginning of a "rebase -i" session can become ambiguous as the rebasing progresses and the repository gains more commits. Make sure the internal record is kept with full 40-hex object names. (merge 75c6976 es/rebase-i-no-abbrev later to maint).
- "git rebase --preserve-merges" internally used the merge machinery and as a side effect left the merge summary message in the log, but when rebasing there is no need for the merge summary. (merge a9f739c rt/rebase-p-no-merge-summary later to maint).
- A call to xread() was used without a loop around it to cope with short reads in the codepath to stream new contents to a pack. (merge e92527c js/xread-in-full later to maint).
- "git rebase -i" forgot that the comment character is configurable while reading its insn sheet. (merge 7bca7af es/rebase-i-respect-core-commentchar later to maint).
- The mailmap support code read past the allocated buffer when the mailmap file ended with an incomplete line. (merge f972a16 jk/mailmap-incomplete-line later to maint).
- We used to send a large request to read(2)/write(2) as a single system call, which was bad from the latency point of view when the operation needs to be killed, and also triggered an error on broken 64-bit systems that refuse to read or write more than 2GB in one go. (merge a487916 sp/clip-read-write-to-8mb later to maint).
- "git fetch" that auto-followed tags incorrectly reused the connection with Git-aware transport helper (like the sample "ext::" helper shipped with Git). (merge 0f73f8b jc/transport-do-not-use-connect-twice-in-fetch later to maint).
- "git log --full-diff — <pathspec>" showed a huge diff for paths outside the given <pathspec> for each commit, instead of showing the change relative to the parent of the commit. "git reflog -p" had a similar problem. (merge 838f9a1 tr/log-full-diff-keep-true-parents later to maint).
- Setting a submodule.*.path configuration variable to true (without giving "= value") caused Git to segfault. (merge 4b05440 jl/some-submodule-config-are-not-boolean later to maint).
- "git rebase -i" (there could be others, as the root cause is pretty generic) fed a random, data dependent string to ’echo’ and expected it to come out literally, corrupting its error message. (merge 89b0230 mm/no-shell-escape-in-die-message later to maint).
- Some people still use rather old versions of bash, which cannot grok some constructs like ’printf -v varname’ which the prompt and completion code started to use recently. (merge a44aa69 bc/completion-for-bash-3.0 later to maint).
- Code to read configuration from a blob object did not compile on platforms with fgetc() etc. implemented as macros. (merge 49d6cfa hv/config-from-blob later to maint-1.8.3).
- The recent "short-cut clone connectivity check" topic broke a shallow repository when a fetch operation tries to auto-follow tags. (merge 6da8bdc nd/fetch-pack-shallow-fix later to maint-1.8.3).
1.9.0
Git v1.9.0 Release Notes ========================
Backward compatibility notes ----------------------------
"git submodule foreach $cmd $args" used to treat "$cmd $args" the same way "ssh" did, concatenating them into a single string and letting the shell unquote. Careless users who forget to sufficiently quote $args get their argument split at $IFS whitespaces by the shell, and got unexpected results due to this. Starting from this release, the command line is passed directly to the shell, if it has an argument.
Read-only support for experimental loose-object format, in which users could optionally choose to write their loose objects for a short while between v1.4.3 and v1.5.3 era, has been dropped.
The meanings of the "--tags" option to "git fetch" has changed; the command fetches tags in addition to what is fetched by the same command line without the option.
The way "git push $there $what" interprets the $what part given on the command line, when it does not have a colon that explicitly tells us what ref at the $there repository is to be updated, has been enhanced.
A handful of ancient commands that have long been deprecated are finally gone (repo-config, tar-tree, lost-found, and peek-remote).
Backward compatibility notes (for Git 2.0.0) --------------------------------------------
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default will change to the "simple" semantics, which pushes:
- only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch, if you are pushing to the same remote as you fetch from; or
- only the current branch to the branch with the same name, if you are pushing to a remote that is not where you usually fetch from.
Use the user preference configuration variable "push.default" to change this. If you are an old-timer who is used to the "matching" semantics, you can set the variable to "matching" to keep the traditional behaviour. If you want to live in the future early, you can set it to "simple" today without waiting for Git 2.0.
When "git add -u" (and "git add -A") is run inside a subdirectory and does not specify which paths to add on the command line, it will operate on the entire tree in Git 2.0 for consistency with "git commit -a" and other commands. There will be no mechanism to make plain "git add -u" behave like "git add -u .". Current users of "git add -u" (without a pathspec) should start training their fingers to explicitly say "git add -u ." before Git 2.0 comes. A warning is issued when these commands are run without a pathspec and when you have local changes outside the current directory, because the behaviour in Git 2.0 will be different from today’s version in such a situation.
In Git 2.0, "git add <path>" will behave as "git add -A <path>", so that "git add dir/" will notice paths you removed from the directory and record the removal. Versions before Git 2.0, including this release, will keep ignoring removals, but the users who rely on this behaviour are encouraged to start using "git add --ignore-removal <path>" now before 2.0 is released.
The default prefix for "git svn" will change in Git 2.0. For a long time, "git svn" created its remote-tracking branches directly under refs/remotes, but it will place them under refs/remotes/origin/ unless it is told otherwise with its --prefix option.
Updates since v1.8.5 --------------------
Foreign interfaces, subsystems and ports.
- The HTTP transport, when talking GSS-Negotiate, uses "100 Continue" response to avoid having to rewind and resend a large payload, which may not be always doable.
- Various bugfixes to remote-bzr and remote-hg (in contrib/).
- The build procedure is aware of MirBSD now.
- Various "git p4", "git svn" and "gitk" updates.
UI, Workflows & Features
- Fetching from a shallowly-cloned repository used to be forbidden, primarily because the codepaths involved were not carefully vetted and we did not bother supporting such usage. This release attempts to allow object transfer out of a shallowly-cloned repository in a more controlled way (i.e. the receiver becomes a shallow repository with a truncated history).
- Just like we give a reasonable default for "less" via the LESS environment variable, we now specify a reasonable default for "lv" via the "LV" environment variable when spawning the pager.
- Two-level configuration variable names in "branch." and "remote." hierarchies, whose variables are predominantly three-level, were not completed by hitting a <TAB> in bash and zsh completions.
- Fetching a ’frotz’ branch with "git fetch", while a ’frotz/nitfol’ remote-tracking branch from an earlier fetch was still there, would error out, primarily because the command was not told that it is allowed to lose any information on our side. "git fetch --prune" now can be used to remove ’frotz/nitfol’ to make room for fetching and storing the ’frotz’ remote-tracking branch.
- "diff.orderfile=<file>" configuration variable can be used to pretend as if the "-O<file>" option were given from the command line of "git diff", etc.
- The negative pathspec syntax allows "git log — . ’:!dir’" to tell us "I am interested in everything but ’dir’ directory".
- "git difftool" shows how many different paths there are in total, and how many of them have been shown so far, to indicate progress.
- "git push origin master" used to push our ’master’ branch to update the ’master’ branch at the ’origin’ repository. This has been enhanced to use the same ref mapping "git push origin" would use to determine what ref at the ’origin’ to be updated with our ’master’. For example, with this configuration
[remote "origin"]
push = refs/heads/*:refs/review/*
that would cause "git push origin" to push out our local branches
to corresponding refs under refs/review/ hierarchy at 'origin',
"git push origin master" would update 'refs/review/master' over
there. Alternatively, if push.default is set to 'upstream' and our
'master' is set to integrate with 'topic' from the 'origin' branch,
running "git push origin" while on our 'master' would update their
'topic' branch, and running "git push origin master" while on any
of our branches does the same.
- "gitweb" learned to treat ref hierarchies other than refs/heads as if they are additional branch namespaces (e.g. refs/changes/ in Gerrit).
- "git for-each-ref --format=…" learned a few formatting directives; e.g. "%(color:red)%(HEAD)%(color:reset) %(refname:short) %(subject)".
- The command string given to "git submodule foreach" is passed directly to the shell, without being eval’ed. This is a backward incompatible change that may break existing users.
- "git log" and friends learned the "--exclude=<glob>" option, to allow people to say "list history of all branches except those that match this pattern" with "git log --exclude=’/’ --branches".
- "git rev-parse --parseopt" learned a new "--stuck-long" option to help scripts parse options with an optional parameter.
Performance, Internal Implementation, etc.
- When parsing a 40-hex string into the object name, the string is checked to see if it can be interpreted as a ref so that a warning can be given for ambiguity. The code kicked in even when the core.warnambiguousrefs is set to false to squelch this warning, in which case the cycles spent to look at the ref namespace were an expensive no-op, as the result was discarded without being used.
- The naming convention of the packfiles has been updated; it used to be based on the enumeration of names of the objects that are contained in the pack, but now it also depends on how the packed result is represented—packing the same set of objects using different settings (or delta order) would produce a pack with different name.
- "git diff --no-index" mode used to unnecessarily attempt to read the index when there is one.
- The deprecated parse-options macro OPT_BOOLEAN has been removed; use OPT_BOOL or OPT_COUNTUP in new code.
- A few duplicate implementations of prefix/suffix string comparison functions have been unified to starts_with() and ends_with().
- The new PERLLIB_EXTRA makefile variable can be used to specify additional directories Perl modules (e.g. the ones necessary to run git-svn) are installed on the platform when building.
- "git merge-base" learned the "--fork-point" mode, that implements the same logic used in "git pull --rebase" to find a suitable fork point out of the reflog entries for the remote-tracking branch the work has been based on. "git rebase" has the same logic that can be triggered with the "--fork-point" option.
- A third-party "receive-pack" (the responder to "git push") can advertise the "no-thin" capability to tell "git push" not to use the thin-pack optimization. Our receive-pack has always been capable of accepting and fattening a thin-pack, and will continue not to ask "git push" to use a non-thin pack.
Also contains various documentation updates and code clean-ups.
Fixes since v1.8.5 ------------------
Unless otherwise noted, all the fixes since v1.8.5 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- The pathspec matching code, while comparing two trees (e.g. "git diff A B — path1 path2") was too aggressive and failed to match some paths when multiple pathspecs were involved.
- "git repack --max-pack-size=8g" stopped being parsed correctly when the command was reimplemented in C.
- An earlier update in v1.8.4.x to "git rev-list --objects" with negative ref had a performance regression. (merge 200abe7 jk/mark-edges-uninteresting later to maint).
- A recent update to "git send-email" broke platforms where /etc/ssl/certs/ directory exists but cannot be used as SSL_ca_path (e.g. Fedora rawhide).
- A handful of bugs around interpreting $branch@{upstream} notation and its lookalike, when $branch part has interesting characters, e.g. "@", and ":", have been fixed.
- "git clone" would fail to clone from a repository that has a ref directly under "refs/", e.g. "refs/stash", because different validation paths do different things on such a refname. Loosen the client side’s validation to allow such a ref.
- "git log --left-right A…B" lost the "leftness" of commits reachable from A when A is a tag as a side effect of a recent bugfix. This is a regression in 1.8.4.x series.
- documentations to "git pull" hinted there is an "-m" option because it incorrectly shared the documentation with "git merge".
- "git diff A B submod" and "git diff A B submod/" ought to have done the same for a submodule "submod", but didn’t.
- "git clone $origin foobarbaz" on Windows failed to create the leading directories (i.e. a moral-equivalent of "mkdir -p").
- "submodule..update=checkout", when propagated from .gitmodules to .git/config, turned into a "submodule..update=none", which did not make much sense. (merge efa8fd7 fp/submodule-checkout-mode later to maint).
- The implementation of ’git stash $cmd "stash@{…}"’ did not quote the stash argument properly and left it split at IFS whitespace.
- The "--[no-]informative-errors" options to "git daemon" were parsed a bit too loosely, allowing any other string after these option names.
- There is no reason to have a hardcoded upper limit for the number of parents of an octopus merge, created via the graft mechanism, but there was.
- The basic test used to leave unnecessary trash directories in the t/ directory. (merge 738a8be jk/test-framework-updates later to maint).
- "git merge-base --octopus" used to leave cleaning up suboptimal result to the caller, but now it does the clean-up itself.
- A "gc" process running as a different user should be able to stop a new "gc" process from starting, but it didn’t.
- An earlier "clean-up" introduced an unnecessary memory leak.
- "git add -A" (no other arguments) in a totally empty working tree used to emit an error.
- "git log --decorate" did not handle a tag pointed by another tag nicely.
- When we figure out how many file descriptors to allocate for keeping packfiles open, a system with non-working getrlimit() could cause us to die(), but because we make this call only to get a rough estimate of how many are available and we do not even attempt to use up all available file descriptors ourselves, it is nicer to fall back to a reasonable low value rather than dying.
- read_sha1_file(), that is the workhorse to read the contents given an object name, honoured object replacements, but there was no corresponding mechanism to sha1_object_info() that was used to obtain the metainfo (e.g. type & size) about the object. This led callers to weird inconsistencies. (merge 663a856 cc/replace-object-info later to maint).
- "git cat-file --batch=", an admittedly useless command, did not behave very well.
- "git rev-parse <revs> — <paths>" did not implement the usual disambiguation rules the commands in the "git log" family used in the same way.
- "git mv A B/", when B does not exist as a directory, should error out, but it didn’t.
- A workaround to an old bug in glibc prior to glibc 2.17 has been retired; this would remove a side effect of the workaround that corrupts system error messages in non-C locales.
- "git commit -v" appends the patch to the log message before editing, and then removes the patch when the editor returned control. However, the patch was not stripped correctly when the first modified path was a submodule.
- "git fetch --depth=0" was a no-op, and was silently ignored. Diagnose it as an error.
- Remote repository URLs expressed in scp-style host:path notation are parsed more carefully (e.g. "foo/bar:baz" is local, "[::1]:/~user" asks to connect to user’s home directory on host at address ::1.
- "git diff — ’:(icase)makefile’" was unnecessarily rejected at the command line parser.
- "git cat-file --batch-check=ok" did not check the existence of the named object.
- "git am --abort" sometimes complained about not being able to write a tree with an 0{40} object in it.
- Two processes creating loose objects at the same time could have failed unnecessarily when the name of their new objects started with the same byte value, due to a race condition.
1.9.1
Git v1.9.1 Release Notes ========================
Fixes since v1.9.0 ------------------
- "git clean -d pathspec" did not use the given pathspec correctly and ended up cleaning too much.
- "git difftool" misbehaved when the repository is bound to the working tree with the ".git file" mechanism, where a textual file ".git" tells us where it is.
- "git push" did not pay attention to branch.*.pushremote if it is defined earlier than remote.pushdefault; the order of these two variables in the configuration file should not matter, but it did by mistake.
- Codepaths that parse timestamps in commit objects have been tightened.
- "git diff --external-diff" incorrectly fed the submodule directory in the working tree to the external diff driver when it knew it is the same as one of the versions being compared.
- "git reset" needs to refresh the index when working in a working tree (it can also be used to match the index to the HEAD in an otherwise bare repository), but it failed to set up the working tree properly, causing GIT_WORK_TREE to be ignored.
- "git check-attr" when working on a repository with a working tree did not work well when the working tree was specified via the --work-tree (and obviously with --git-dir) option.
- "merge-recursive" was broken in 1.7.7 era and stopped working in an empty (temporary) working tree, when there are renames involved. This has been corrected.
- "git rev-parse" was loose in rejecting command line arguments that do not make sense, e.g. "--default" without the required value for that option.
- include.path variable (or any variable that expects a path that can use ~username expansion) in the configuration file is not a boolean, but the code failed to check it.
- "git diff --quiet — pathspec1 pathspec2" sometimes did not return correct status value.
- Attempting to deepen a shallow repository by fetching over smart HTTP transport failed in the protocol exchange, when no-done extension was used. The fetching side waited for the list of shallow boundary commits after the sending end stopped talking to it.
- Allow "git cmd path/", when the ’path’ is where a submodule is bound to the top-level working tree, to match ’path’, despite the extra and unnecessary trailing slash (such a slash is often given by command line completion).
1.9.2
Git v1.9.2 Release Notes ========================
Fixes since v1.9.1 ------------------
- Documentation and in-code comments had many instances of mistaken use of "nor", which have been corrected.
- "git fetch --prune", when the right-hand-side of multiple fetch refspecs overlap (e.g. storing "refs/heads/" to "refs/remotes/origin/", while storing "refs/frotz/" to "refs/remotes/origin/fr/"), aggressively thought that lack of "refs/heads/fr/otz" on the origin site meant we should remove "refs/remotes/origin/fr/otz" from us, without checking their "refs/frotz/otz" first.
Note that such a configuration is inherently unsafe (think what
should happen when "refs/heads/fr/otz" does appear on the origin
site), but that is not a reason not to be extra careful.
- "git update-ref --stdin" did not fail a request to create a ref when the ref already existed.
- "git diff --no-index -Mq a b" fell into an infinite loop.
- When it is not necessary to edit a commit log message (e.g. "git commit -m" is given a message without specifying "-e"), we used to disable the spawning of the editor by overriding GIT_EDITOR, but this means all the uses of the editor, other than to edit the commit log message, are also affected.
- "git status --porcelain --branch" showed its output with labels "ahead/behind/gone" translated to the user’s locale.
- "git mv" that moves a submodule forgot to adjust the array that uses to keep track of which submodules were to be moved to update its configuration.
- Length limit for the pathname used when removing a path in a deep subdirectory has been removed to avoid buffer overflows.
- The test helper lib-terminal always run an actual test_expect_* when included, which screwed up with the use of skil-all that may have to be done later.
- "git index-pack" used a wrong variable to name the keep-file in an error message when the file cannot be written or closed.
- "rebase -i" produced a broken insn sheet when the title of a commit happened to contain ’n’ (or ended with ’c’) due to a careless use of ’echo’.
- There were a few instances of ’git-foo’ remaining in the documentation that should have been spelled ’git foo’.
- Serving objects from a shallow repository needs to write a new file to hold the temporary shallow boundaries but it was not cleaned when we exit due to die() or a signal.
- When "git stash pop" stops after failing to apply the stash (e.g. due to conflicting changes), the stash is not dropped. State that explicitly in the output to let the users know.
- The labels in "git status" output that describe the nature of conflicts (e.g. "both deleted") were limited to 20 bytes, which was too short for some l10n (e.g. fr).
1.9.3
Git v1.9.3 Release Notes ========================
Fixes since v1.9.2 ------------------
- "git p4" dealing with changes in binary files were broken by a change in 1.9 release.
- The shell prompt script (in contrib/), when using the PROMPT_COMMAND interface, used an unsafe construct when showing the branch name in $PS1.
- "git rebase" used a POSIX shell construct FreeBSD /bin/sh does not work well with.
- Some more Unicode codepoints defined in Unicode 6.3 as having zero width have been taught to our display column counting logic.
- Some tests used shell constructs that did not work well on FreeBSD.
1.9.4
Git v1.9.4 Release Notes ========================
Fixes since v1.9.3 ------------------
- Commands that take pathspecs on the command line misbehaved when the pathspec is given as an absolute pathname (which is a practice not particularly encouraged) that points at a symbolic link in the working tree.
- An earlier fix to the shell prompt script (in contrib/) for using the PROMPT_COMMAND interface did not correctly check if the extra code path needs to trigger, causing the branch name not to appear when ’promptvars’ option is disabled in bash or PROMPT_SUBST is unset in zsh.
1.9.5
Git v1.9.5 Release Notes ========================
Fixes since v1.9.4 ------------------
- We used to allow committing a path ".Git/config" with Git that is running on a case sensitive filesystem, but an attempt to check out such a path with Git that runs on a case insensitive filesystem would have clobbered ".git/config", which is definitely not what the user would have expected. Git now prevents you from tracking a path with ".Git" (in any case combination) as a path component.
- On Windows, certain path components that are different from ".git" are mapped to ".git", e.g. "git~1/config" is treated as if it were ".git/config". HFS+ has a similar issue, where certain unicode codepoints are ignored, e.g. ".gu200cit/config" is treated as if it were ".git/config". Pathnames with these potential issues are rejected on the affected systems. Git on systems that are not affected by this issue (e.g. Linux) can also be configured to reject them to ensure cross platform interoperability of the hosted projects.
- "git fsck" notices a tree object that records such a path that can be confused with ".git", and with receive.fsckObjects configuration set to true, an attempt to "git push" such a tree object will be rejected. Such a path may not be a problem on a well behaving filesystem but in order to protect those on HFS+ and on case insensitive filesystems, this check is enabled on all platforms.
A big "thanks!" for bringing this issue to us goes to our friends in the Mercurial land, namely, Matt Mackall and Augie Fackler.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.0.0
Git v2.0 Release Notes ======================
Backward compatibility notes ----------------------------
When "git push [$there]" does not say what to push, we have used the traditional "matching" semantics so far (all your branches were sent to the remote as long as there already are branches of the same name over there). In Git 2.0, the default is now the "simple" semantics, which pushes:
- only the current branch to the branch with the same name, and only when the current branch is set to integrate with that remote branch, if you are pushing to the same remote as you fetch from; or
- only the current branch to the branch with the same name, if you are pushing to a remote that is not where you usually fetch from.
You can use the configuration variable "push.default" to change this. If you are an old-timer who wants to keep using the "matching" semantics, you can set the variable to "matching", for example. Read the documentation for other possibilities.
When "git add -u" and "git add -A" are run inside a subdirectory without specifying which paths to add on the command line, they operate on the entire tree for consistency with "git commit -a" and other commands (these commands used to operate only on the current subdirectory). Say "git add -u ." or "git add -A ." if you want to limit the operation to the current directory.
"git add <path>" is the same as "git add -A <path>" now, so that "git add dir/" will notice paths you removed from the directory and record the removal. In older versions of Git, "git add <path>" used to ignore removals. You can say "git add --ignore-removal <path>" to add only added or modified paths in <path>, if you really want to.
The "-q" option to "git diff-files", which does NOT mean "quiet", has been removed (it told Git to ignore deletion, which you can do with "git diff-files --diff-filter=d").
"git request-pull" lost a few "heuristics" that often led to mistakes.
The default prefix for "git svn" has changed in Git 2.0. For a long time, "git svn" created its remote-tracking branches directly under refs/remotes, but it now places them under refs/remotes/origin/ unless it is told otherwise with its "--prefix" option.
Updates since v1.9 series -------------------------
UI, Workflows & Features
- The "multi-mail" post-receive hook (in contrib/) has been updated to a more recent version from upstream.
- The "remote-hg/bzr" remote-helper interfaces (used to be in contrib/) are no more. They are now maintained separately as third-party plug-ins in their own repositories.
- "git gc --aggressive" learned "--depth" option and "gc.aggressiveDepth" configuration variable to allow use of a less insane depth than the built-in default value of 250.
- "git log" learned the "--show-linear-break" option to show where a single strand-of-pearls is broken in its output.
- The "rev-parse --parseopt" mechanism used by scripted Porcelains to parse command-line options and to give help text learned to take the argv-help (the placeholder string for an option parameter, e.g. "key-id" in "--gpg-sign=<key-id>").
- The pattern to find where the function begins in C/C used in "diff" and "grep -p" has been updated to improve viewing C sources.
- "git rebase" learned to interpret a lone "-" as "@{-1}", the branch that we were previously on.
- "git commit --cleanup=<mode>" learned a new mode, scissors.
- "git tag --list" output can be sorted using "version sort" with "--sort=version:refname".
- Discard the accumulated "heuristics" to guess from which branch the result wants to be pulled from and make sure that what the end user specified is not second-guessed by "git request-pull", to avoid mistakes. When you pushed out your ’master’ branch to your public repository as ’for-linus’, use the new "master:for-linus" syntax to denote the branch to be pulled.
- "git grep" learned to behave in a way similar to native grep when "-h" (no header) and "-c" (count) options are given.
- "git push" via transport-helper interface has been updated to allow forced ref updates in a way similar to the natively supported transports.
- The "simple" mode is the default for "git push".
- "git add -u" and "git add -A", when run without any pathspec, is a tree-wide operation even when run inside a subdirectory of a working tree.
- "git add <path>" is the same as "git add -A <path>" now.
- "core.statinfo" configuration variable, which is a never-advertised synonym to "core.checkstat", has been removed.
- The "-q" option to "git diff-files", which does NOT mean "quiet", has been removed (it told Git to ignore deletion, which you can do with "git diff-files --diff-filter=d").
- Server operators can loosen the "tips of refs only" restriction for the remote archive service with the uploadarchive.allowUnreachable configuration option.
- The progress indicators from various time-consuming commands have been marked for i18n/l10n.
- "git notes -C <blob>" diagnoses as an error an attempt to use an object that is not a blob.
- "git config" learned to read from the standard input when "-" is given as the value to its "--file" parameter (attempting an operation to update the configuration in the standard input is rejected, of course).
- Trailing whitespaces in .gitignore files, unless they are quoted for fnmatch(3), e.g. "path\ ", are warned and ignored. Strictly speaking, this is a backward-incompatible change, but very unlikely to bite any sane user and adjusting should be obvious and easy.
- Many commands that create commits, e.g. "pull" and "rebase", learned to take the "--gpg-sign" option on the command line.
- "git commit" can be told to always GPG sign the resulting commit by setting the "commit.gpgsign" configuration variable to "true" (the command-line option "--no-gpg-sign" should override it).
- "git pull" can be told to only accept fast-forward by setting the new "pull.ff" configuration variable.
- "git reset" learned the "-N" option, which does not reset the index fully for paths the index knows about but the tree-ish the command resets to does not (these paths are kept as intend-to-add entries).
Performance, Internal Implementation, etc.
- The compilation options to port to AIX and to MSVC have been updated.
- We started using wildmatch() in place of fnmatch(3) a few releases ago; complete the process and stop using fnmatch(3).
- Uses of curl’s "multi" interface and "easy" interface do not mix well when we attempt to reuse outgoing connections. Teach the RPC over HTTP code, used in the smart HTTP transport, not to use the "easy" interface.
- The bitmap-index feature from JGit has been ported, which should significantly improve performance when serving objects from a repository that uses it.
- The way "git log --cc" shows a combined diff against multiple parents has been optimized.
- The prefixcmp() and suffixcmp() functions are gone. Use starts_with() and ends_with(), and also consider if skip_prefix() suits your needs better when using the former.
Also contains various documentation updates and code clean-ups. Many of them came from flurry of activities as GSoC candidate microproject exercises.
Fixes since v1.9 series -----------------------
Unless otherwise noted, all the fixes since v1.9 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git p4" was broken in 1.9 release to deal with changes in binary files. (merge 749b668 cl/p4-use-diff-tree later to maint).
- The shell prompt script (in contrib/), when using the PROMPT_COMMAND interface, used an unsafe construct when showing the branch name in $PS1. (merge 1e4119c8 rh/prompt-pcmode-avoid-eval-on-refname later to maint).
- "git rebase" used a POSIX shell construct FreeBSD’s /bin/sh does not work well with. (merge 8cd6596 km/avoid-non-function-return-in-rebase later to maint).
- zsh prompt (in contrib/) leaked unnecessary error messages.
- Bash completion (in contrib/) did not complete the refs and remotes correctly given "git pu<TAB>" when "pu" is aliased to "push".
- Some more Unicode code points, defined in Unicode 6.3 as having zero width, have been taught to our display column counting logic. (merge d813ab9 tb/unicode-6.3-zero-width later to maint).
- Some tests used shell constructs that did not work well on FreeBSD (merge ff7a1c6 km/avoid-bs-in-shell-glob later to maint). (merge 00764ca km/avoid-cp-a later to maint).
- "git update-ref --stdin" did not fail a request to create a ref when the ref already existed. (merge b9d56b5 mh/update-ref-batch-create-fix later to maint).
- "git diff --no-index -Mq a b" fell into an infinite loop. (merge ad1c3fb jc/fix-diff-no-index-diff-opt-parse later to maint).
- "git fetch --prune", when the right-hand side of multiple fetch refspecs overlap (e.g. storing "refs/heads/" to "refs/remotes/origin/", while storing "refs/frotz/" to "refs/remotes/origin/fr/"), aggressively thought that lack of "refs/heads/fr/otz" on the origin site meant we should remove "refs/remotes/origin/fr/otz" from us, without checking their "refs/frotz/otz" first.
Note that such a configuration is inherently unsafe (think what
should happen when "refs/heads/fr/otz" does appear on the origin
site), but that is not a reason not to be extra careful.
(merge e6f6371 cn/fetch-prune-overlapping-destination later to maint).
- "git status --porcelain --branch" showed its output with labels "ahead/behind/gone" translated to the user’s locale. (merge 7a76c28 mm/status-porcelain-format-i18n-fix later to maint).
- A stray environment variable $prefix could have leaked into and affected the behaviour of the "subtree" script (in contrib/).
- When it is not necessary to edit a commit log message (e.g. "git commit -m" is given a message without specifying "-e"), we used to disable the spawning of the editor by overriding GIT_EDITOR, but this means all the uses of the editor, other than to edit the commit log message, are also affected. (merge b549be0 bp/commit-p-editor later to maint).
- "git mv" that moves a submodule forgot to adjust the array that uses to keep track of which submodules were to be moved to update its configuration. (merge fb8a4e8 jk/mv-submodules-fix later to maint).
- Length limit for the pathname used when removing a path in a deep subdirectory has been removed to avoid buffer overflows. (merge 2f29e0c mh/remove-subtree-long-pathname-fix later to maint).
- The test helper lib-terminal always run an actual test_expect_* when included, which screwed up with the use of skil-all that may have to be done later. (merge 7e27173 jk/lib-terminal-lazy later to maint).
- "git index-pack" used a wrong variable to name the keep-file in an error message when the file cannot be written or closed. (merge de983a0 nd/index-pack-error-message later to maint).
- "rebase -i" produced a broken insn sheet when the title of a commit happened to contain ’n’ (or ended with ’c’) due to a careless use of ’echo’. (merge cb1aefd us/printf-not-echo later to maint).
- There were a few instances of ’git-foo’ remaining in the documentation that should have been spelled ’git foo’. (merge 3c3e6f5 rr/doc-merge-strategies later to maint).
- Serving objects from a shallow repository needs to write a new file to hold the temporary shallow boundaries, but it was not cleaned when we exit due to die() or a signal. (merge 7839632 jk/shallow-update-fix later to maint).
- When "git stash pop" stops after failing to apply the stash (e.g. due to conflicting changes), the stash is not dropped. State that explicitly in the output to let the users know. (merge 2d4c993 jc/stash-pop-not-popped later to maint).
- The labels in "git status" output that describe the nature of conflicts (e.g. "both deleted") were limited to 20 bytes, which was too short for some l10n (e.g. fr). (merge c7cb333 jn/wt-status later to maint).
- "git clean -d pathspec" did not use the given pathspec correctly and ended up cleaning too much. (merge 1f2e108 jk/clean-d-pathspec later to maint).
- "git difftool" misbehaved when the repository is bound to the working tree with the ".git file" mechanism, where a textual file ".git" tells us where it is. (merge fcfec8b da/difftool-git-files later to maint).
- "git push" did not pay attention to "branch.*.pushremote" if it is defined earlier than "remote.pushdefault"; the order of these two variables in the configuration file should not matter, but it did by mistake. (merge 98b406f jk/remote-pushremote-config-reading later to maint).
- Code paths that parse timestamps in commit objects have been tightened. (merge f80d1f9 jk/commit-dates-parsing-fix later to maint).
- "git diff --external-diff" incorrectly fed the submodule directory in the working tree to the external diff driver when it knew that it is the same as one of the versions being compared. (merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint).
- "git reset" needs to refresh the index when working in a working tree (it can also be used to match the index to the HEAD in an otherwise bare repository), but it failed to set up the working tree properly, causing GIT_WORK_TREE to be ignored. (merge b7756d4 nd/reset-setup-worktree later to maint).
- "git check-attr" when working on a repository with a working tree did not work well when the working tree was specified via the "--work-tree" (and obviously with "--git-dir") option. (merge cdbf623 jc/check-attr-honor-working-tree later to maint).
- "merge-recursive" was broken in 1.7.7 era and stopped working in an empty (temporary) working tree, when there are renames involved. This has been corrected. (merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.)
- "git rev-parse" was loose in rejecting command-line arguments that do not make sense, e.g. "--default" without the required value for that option. (merge a43219f ds/rev-parse-required-args later to maint.)
- "include.path" variable (or any variable that expects a path that can use ~username expansion) in the configuration file is not a boolean, but the code failed to check it. (merge 67beb60 jk/config-path-include-fix later to maint.)
- Commands that take pathspecs on the command line misbehaved when the pathspec is given as an absolute pathname (which is a practice not particularly encouraged) that points at a symbolic link in the working tree. (merge 6127ff6 mw/symlinks later to maint.)
- "git diff --quiet — pathspec1 pathspec2" sometimes did not return the correct status value. (merge f34b205 nd/diff-quiet-stat-dirty later to maint.)
- Attempting to deepen a shallow repository by fetching over smart HTTP transport failed in the protocol exchange, when the no-done extension was used. The fetching side waited for the list of shallow boundary commits after the sending side stopped talking to it. (merge 0232852 nd/http-fetch-shallow-fix later to maint.)
- Allow "git cmd path/", when the ’path’ is where a submodule is bound to the top-level working tree, to match ’path’, despite the extra and unnecessary trailing slash (such a slash is often given by command-line completion). (merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.)
- Documentation and in-code comments had many instances of mistaken use of "nor", which have been corrected. (merge 235e8d5 jl/nor-or-nand-and later to maint).
2.0.1
Git v2.0.1 Release Notes ========================
- We used to unconditionally disable the pager in the pager process we spawn to feed out output, but that prevented people who want to run "less" within "less" from doing so.
-
Tools that read diagnostic output in our standard error stream do not want to see terminal control sequence (e.g. erase-to-eol). Detect them by checking if the standard error stream is connected to a tty.
-
Reworded the error message given upon a failure to open an existing loose object file due to e.g. permission issues; it was reported as the object being corrupt, but that is not quite true.
- "git log -2master" is a common typo that shows two commits starting from whichever random branch that is not ’master’ that happens to be checked out currently.
- The "%<(10,trunc)%s" pretty format specifier in the log family of commands is used to truncate the string to a given length (e.g. 10 in the example) with padding to column-align the output, but did not take into account that number of bytes and number of display columns are different.
- The "mailmap.file" configuration option did not support the tilde expansion (i.e. ~user/path and ~/path).
- The completion scripts (in contrib/) did not know about quite a few options that are common between "git merge" and "git pull", and a couple of options unique to "git merge".
- "--ignore-space-change" option of "git apply" ignored the spaces at the beginning of line too aggressively, which is inconsistent with the option of the same name "diff" and "git diff" have.
- "git blame" miscounted number of columns needed to show localized timestamps, resulting in jaggy left-side-edge of the source code lines in its output.
- "git blame" assigned the blame to the copy in the working-tree if the repository is set to core.autocrlf=input and the file used CRLF line endings.
- "git commit --allow-empty-message -C $commit" did not work when the commit did not have any log message.
- "git diff --find-copies-harder" sometimes pretended as if the mode bits have changed for paths that are marked with assume-unchanged bit.
- "git format-patch" did not enforce the rule that the "--follow" option from the log/diff family of commands must be used with exactly one pathspec.
- "git gc --auto" was recently changed to run in the background to give control back early to the end-user sitting in front of the terminal, but it forgot that housekeeping involving reflogs should be done without other processes competing for accesses to the refs.
- "git grep -O" to show the lines that hit in the pager did not work well with case insensitive search. We now spawn "less" with its "-I" option when it is used as the pager (which is the default).
- We used to disable threaded "git index-pack" on platforms without thread-safe pread(); use a different workaround for such platforms to allow threaded "git index-pack".
- The error reporting from "git index-pack" has been improved to distinguish missing objects from type errors.
- "git mailinfo" used to read beyond the end of header string while parsing an incoming e-mail message to extract the patch.
- On a case insensitive filesystem, merge-recursive incorrectly deleted the file that is to be renamed to a name that is the same except for case differences.
- "git pack-objects" unnecessarily copied the previous contents when extending the hashtable, even though it will populate the table from scratch anyway.
- "git rerere forget" did not work well when merge.conflictstyle was set to a non-default value.
- "git remote rm" and "git remote prune" can involve removing many refs at once, which is not a very efficient thing to do when very many refs exist in the packed-refs file.
- "git log --exclude=<glob> --all | git shortlog" worked as expected, but "git shortlog --exclude=<glob> --all", which is supposed to be identical to the above pipeline, was not accepted at the command line argument parser level.
- The autostash mode of "git rebase -i" did not restore the dirty working tree state if the user aborted the interactive rebase by emptying the insn sheet.
- "git show -s" (i.e. show log message only) used to incorrectly emit an extra blank line after a merge commit.
- "git status", even though it is a read-only operation, tries to update the index with refreshed lstat(2) info to optimize future accesses to the working tree opportunistically, but this could race with a "read-write" operation that modify the index while it is running. Detect such a race and avoid overwriting the index.
- "git status" (and "git commit") behaved as if changes in a modified submodule are not there if submodule.*.ignore configuration is set, which was misleading. The configuration is only to unclutter diff output during the course of development, and should not to hide changes in the "status" output to cause the users forget to commit them.
- The mode to run tests with HTTP server tests disabled was broken.
2.0.2
Git v2.0.2 Release Notes ========================
- Documentation for "git submodule sync" forgot to say that the subcommand can take the "--recursive" option.
- Mishandling of patterns in .gitignore that has trailing SPs quoted with backslashes (e.g. ones that end with "\ ") have been corrected.
- Recent updates to "git repack" started to duplicate objects that are in packfiles marked with .keep flag into the new packfile by mistake.
- "git clone -b brefs/tags/bar" would have mistakenly thought we were following a single tag, even though it was a name of the branch, because it incorrectly used strstr().
- "%G" (nothing after G) is an invalid pretty format specifier, but the parser did not notice it as garbage.
- Code to avoid adding the same alternate object store twice was subtly broken for a long time, but nobody seems to have noticed.
- A handful of code paths had to read the commit object more than once when showing header fields that are usually not parsed. The internal data structure to keep track of the contents of the commit object has been updated to reduce the need for this double-reading, and to allow the caller find the length of the object.
- During "git rebase --merge", a conflicted patch could not be skipped with "--skip" if the next one also conflicted.
2.0.3
Git v2.0.3 Release Notes ========================
- An ancient rewrite passed a wrong pointer to a curl library function in a rarely used code path.
- "filter-branch" left an empty single-parent commit that results when all parents of a merge commit gets mapped to the same commit, even under "--prune-empty".
- "log --show-signature" incorrectly decided the color to paint a mergetag that was and was not correctly validated.
- "log --show-signature" did not pay attention to "--graph" option.
Also a lot of fixes to the tests and some updates to the docs are included.
2.0.4
Git v2.0.4 Release Notes ========================
- An earlier update to v2.0.2 broken output from "git diff-tree", which is fixed in this release.
2.0.5
Git v2.0.5 Release Notes ========================
Fixes since v2.0.4 ------------------
- We used to allow committing a path ".Git/config" with Git that is running on a case sensitive filesystem, but an attempt to check out such a path with Git that runs on a case insensitive filesystem would have clobbered ".git/config", which is definitely not what the user would have expected. Git now prevents you from tracking a path with ".Git" (in any case combination) as a path component.
- On Windows, certain path components that are different from ".git" are mapped to ".git", e.g. "git~1/config" is treated as if it were ".git/config". HFS+ has a similar issue, where certain unicode codepoints are ignored, e.g. ".gu200cit/config" is treated as if it were ".git/config". Pathnames with these potential issues are rejected on the affected systems. Git on systems that are not affected by this issue (e.g. Linux) can also be configured to reject them to ensure cross platform interoperability of the hosted projects.
- "git fsck" notices a tree object that records such a path that can be confused with ".git", and with receive.fsckObjects configuration set to true, an attempt to "git push" such a tree object will be rejected. Such a path may not be a problem on a well behaving filesystem but in order to protect those on HFS+ and on case insensitive filesystems, this check is enabled on all platforms.
A big "thanks!" for bringing this issue to us goes to our friends in the Mercurial land, namely, Matt Mackall and Augie Fackler.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.1.0
Git v2.1 Release Notes ======================
Backward compatibility notes ----------------------------
- The default value we give to the environment variable LESS has been changed from "FRSX" to "FRX", losing "S" (chop long lines instead of wrapping). Existing users who prefer not to see line-wrapped output may want to set
$ git config core.pager "less -S"
to restore the traditional behaviour. It is expected that people
find output from most subcommands easier to read with the new
default, except for "blame" which tends to produce really long
lines. To override the new default only for "git blame", you can
do this:
$ git config pager.blame "less -S"
- A few disused directories in contrib/ have been retired.
Updates since v2.0 ------------------
UI, Workflows & Features
- Since the very beginning of Git, we gave the LESS environment a default value "FRSX" when we spawn "less" as the pager. "S" (chop long lines instead of wrapping) has been removed from this default set of options, because it is more or less a personal taste thing, as opposed to the others that have good justifications (i.e. "R" is very much justified because many kinds of output we produce are colored and "FX" is justified because output we produce is often shorter than a page).
- The logic and data used to compute the display width needed for UTF-8 strings have been updated to match Unicode 7.0 better.
- HTTP-based transports learned to better propagate the error messages from the webserver to the client coming over the HTTP transport.
- The completion script for bash (in contrib/) has been updated to better handle aliases that define a complex sequence of commands.
- The "core.preloadindex" configuration variable is enabled by default, allowing modern platforms to take advantage of their multiple cores.
- "git clone" applies the "if cloning from a local disk, physically copy the repository using hardlinks, unless otherwise told not to with --no-local" optimization when the url.*.insteadOf mechanism rewrites a remote-repository "git clone $URL" into a clone from a local disk.
- "git commit --date=<date>" option learned more timestamp formats, including "--date=now".
- The
core.commentCharconfiguration variable is used to specify a custom comment character (other than the default "#") for the commit message editor. This can be set toautoto attempt to choose a different character that does not conflict with any that already starts a line in the message being edited, for cases like "git commit --amend".
- "git format-patch" learned --signature-file=<file> to add the contents of a file as a signature to the mail message it produces.
- "git grep" learned the grep.fullname configuration variable to force "--full-name" to be the default. This may cause regressions for scripted users who do not expect this new behaviour.
- "git imap-send" learned to ask the credential helper for auth material.
- "git log" and friends now understand the value "auto" for the "log.decorate" configuration variable to enable the "--decorate" option automatically when the output is sent to tty.
- "git merge" without an argument, even when there is an upstream defined for the current branch, refused to run until merge.defaultToUpstream is set to true. Flip the default of that configuration variable to true.
- "git mergetool" learned to drive the vimdiff3 backend.
- mergetool.prompt used to default to ’true’, always asking "do you really want to run the tool on this path?". The default has been changed to ’false’. However, the prompt will still appear if mergetool used its autodetection system to guess which tool to use. Users who explicitly specify or configure a tool will no longer see the prompt by default.
Strictly speaking, this is a backward incompatible change and
users need to explicitly set the variable to 'true' if they want
to be prompted to confirm running the tool on each path.
- "git replace" learned the "--edit" subcommand to create a replacement by editing an existing object.
- "git replace" learned a "--graft" option to rewrite the parents of a commit.
- "git send-email" learned "--to-cover" and "--cc-cover" options, to tell it to copy To: and Cc: headers found in the first input file when emitting later input files.
- "git svn" learned to cope with malformed timestamps with only one digit in the hour part, e.g. 2014-01-07T5:01:02.048176Z, emitted by some broken subversion server implementations.
- "git tag" when editing the tag message shows the name of the tag being edited as a comment in the editor.
- "git tag" learned to pay attention to "tag.sort" configuration, to be used as the default sort order when no --sort=<value> option is given.
- A new "git verify-commit" command, to check GPG signatures in signed commits, in a way similar to "git verify-tag" is used to check signed tags, was added.
Performance, Internal Implementation, etc.
- Build procedure for ’subtree’ (in contrib/) has been cleaned up.
- Support for the profile-feedback build, which has bit-rotted for quite a while, has been updated.
- An experimental format to use two files (the base file and incremental changes relative to it) to represent the index has been introduced; this may reduce I/O cost of rewriting a large index when only small part of the working tree changes.
- Effort to shrink the size of patches Windows folks maintain on top by upstreaming them continues. More tests that are not applicable to the Windows environment are identified and either skipped or made more portable.
- Eradication of "test $condition -a $condition" from our scripts continues.
- The
core.deltabasecachelimitused to default to 16 MiB , but this proved to be too small, and has been bumped to 96 MiB.
- "git blame" has been optimized greatly by reorganising the data structure that is used to keep track of the work to be done.
- "git diff" that compares 3-or-more trees (e.g. parents and the result of a merge) has been optimized.
- The API to update/delete references are being converted to handle updates to multiple references in a transactional way. As an example, "update-ref --stdin [-z]" has been updated to use this API.
- skip_prefix() and strip_suffix() API functions are used a lot more widely throughout the codebase now.
- Parts of the test scripts can be skipped by using a range notation, e.g. "sh t1234-test.sh --run=’1-4 6 8-’" to omit test piece 5 and 7 and run everything else.
Also contains various documentation updates and code clean-ups.
Fixes since v2.0 ----------------
Unless otherwise noted, all the fixes since v2.0 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- We used to unconditionally disable the pager in the pager process we spawn to feed out output, but that prevented people who want to run "less" within "less" from doing so. (merge c0459ca je/pager-do-not-recurse later to maint).
- Tools that read diagnostic output in our standard error stream do not want to see terminal control sequence (e.g. erase-to-eol). Detect them by checking if the standard error stream is connected to a tty. (merge 38de156 mn/sideband-no-ansi later to maint).
- Mishandling of patterns in .gitignore that have trailing SPs quoted with backslashes (e.g. ones that end with "\ ") has been corrected. (merge 97c1364be6b pb/trim-trailing-spaces later to maint).
- Reworded the error message given upon a failure to open an existing loose object file due to e.g. permission issues; it was reported as the object being corrupt, but that is not quite true. (merge d6c8a05 jk/report-fail-to-read-objects-better later to maint).
- "git log -2master" is a common typo that shows two commits starting from whichever random branch that is not ’master’ that happens to be checked out currently. (merge e3fa568 jc/revision-dash-count-parsing later to maint).
- Code to avoid adding the same alternate object store twice was subtly broken for a long time, but nobody seems to have noticed. (merge 80b4785 rs/fix-alt-odb-path-comparison later to maint). (merge 539e750 ek/alt-odb-entry-fix later to maint).
- The "%<(10,trunc)%s" pretty format specifier in the log family of commands is used to truncate the string to a given length (e.g. 10 in the example) with padding to column-align the output, but did not take into account that number of bytes and number of display columns are different. (merge 7d50987 as/pretty-truncate later to maint).
- "%G" (nothing after G) is an invalid pretty format specifier, but the parser did not notice it as garbage. (merge 958b2eb jk/pretty-G-format-fixes later to maint).
- A handful of code paths had to read the commit object more than once when showing header fields that are usually not parsed. The internal data structure to keep track of the contents of the commit object has been updated to reduce the need for this double-reading, and to allow the caller find the length of the object. (merge 218aa3a jk/commit-buffer-length later to maint).
- The "mailmap.file" configuration option did not support tilde expansion (i.e. ~user/path and ~/path). (merge 9352fd5 ow/config-mailmap-pathname later to maint).
- The completion scripts (in contrib/) did not know about quite a few options that are common between "git merge" and "git pull", and a couple of options unique to "git merge". (merge 8fee872 jk/complete-merge-pull later to maint).
- The unix-domain socket used by the sample credential cache daemon tried to unlink an existing stale one at a wrong path, if the path to the socket was given as an overlong path that does not fit in the sun_path member of the sockaddr_un structure. (merge 2869b3e rs/fix-unlink-unix-socket later to maint).
- An ancient rewrite passed a wrong pointer to a curl library function in a rarely used code path. (merge 479eaa8 ah/fix-http-push later to maint).
- "--ignore-space-change" option of "git apply" ignored the spaces at the beginning of lines too aggressively, which is inconsistent with the option of the same name that "diff" and "git diff" have. (merge 14d3bb4 jc/apply-ignore-whitespace later to maint).
- "git blame" miscounted the number of columns needed to show localized timestamps, resulting in a jaggy left-side-edge for the source code lines in its output. (merge dd75553 jx/blame-align-relative-time later to maint).
- "git blame" assigned the blame to the copy in the working-tree if the repository is set to core.autocrlf=input and the file used CRLF line endings. (merge 4d4813a bc/blame-crlf-test later to maint).
- "git clone -b brefs/tags/bar" would have mistakenly thought we were following a single tag, even though it was a name of the branch, because it incorrectly used strstr(). (merge 60a5f5f jc/fix-clone-single-starting-at-a-tag later to maint).
- "git commit --allow-empty-message -C $commit" did not work when the commit did not have any log message. (merge 076cbd6 jk/commit-C-pick-empty later to maint).
- "git diff --find-copies-harder" sometimes pretended as if the mode bits have changed for paths that are marked with the assume-unchanged bit. (merge 5304810 jk/diff-files-assume-unchanged later to maint).
- "filter-branch" left an empty single-parent commit that results when all parents of a merge commit get mapped to the same commit, even under "--prune-empty". (merge 79bc4ef cb/filter-branch-prune-empty-degenerate-merges later to maint).
- "git format-patch" did not enforce the rule that the "--follow" option from the log/diff family of commands must be used with exactly one pathspec. (merge dd63f16 jk/diff-follow-must-take-one-pathspec later to maint).
- "git gc --auto" was recently changed to run in the background to give control back early to the end-user sitting in front of the terminal, but it forgot that housekeeping involving reflogs should be done without other processes competing for accesses to the refs. (merge 62aad18 nd/daemonize-gc later to maint).
- "git grep -O" to show the lines that hit in the pager did not work well with case insensitive search. We now spawn "less" with its "-I" option when it is used as the pager (which is the default). (merge f7febbe sk/spawn-less-case-insensitively-from-grep-O-i later to maint).
- We used to disable threaded "git index-pack" on platforms without thread-safe pread(); use a different workaround for such platforms to allow threaded "git index-pack". (merge 3953949 nd/index-pack-one-fd-per-thread later to maint).
- The error reporting from "git index-pack" has been improved to distinguish missing objects from type errors. (merge 77583e7 jk/index-pack-report-missing later to maint).
- "log --show-signature" incorrectly decided the color to paint a mergetag that was and was not correctly validated. (merge 42c55ce mg/fix-log-mergetag-color later to maint).
- "log --show-signature" did not pay attention to the "--graph" option. (merge cf3983d zk/log-graph-showsig later to maint).
- "git mailinfo" used to read beyond the ends of header strings while parsing an incoming e-mail message to extract the patch. (merge b1a013d rs/mailinfo-header-cmp later to maint).
- On a case insensitive filesystem, merge-recursive incorrectly deleted the file that is to be renamed to a name that is the same except for case differences. (merge baa37bf dt/merge-recursive-case-insensitive later to maint).
- Merging changes into a file that ends in an incomplete line made the last line into a complete one, even when the other branch did not change anything around the end of file. (merge ba31180 mk/merge-incomplete-files later to maint).
- "git pack-objects" unnecessarily copied the previous contents when extending the hashtable, even though it will populate the table from scratch anyway. (merge fb79947 rs/pack-objects-no-unnecessary-realloc later to maint).
- Recent updates to "git repack" started to duplicate objects that are in packfiles marked with the .keep flag into the new packfile by mistake. (merge d078d85 jk/repack-pack-keep-objects later to maint).
- "git rerere forget" did not work well when merge.conflictstyle was set to a non-default value. (merge de3d8bb fc/rerere-conflict-style later to maint).
- "git remote rm" and "git remote prune" can involve removing many refs at once, which is not a very efficient thing to do when very many refs exist in the packed-refs file. (merge e6bea66 jl/remote-rm-prune later to maint).
- "git log --exclude=<glob> --all | git shortlog" worked as expected, but "git shortlog --exclude=<glob> --all", which is supposed to be identical to the above pipeline, was not accepted at the command line argument parser level. (merge eb07774 jc/shortlog-ref-exclude later to maint).
- The autostash mode of "git rebase -i" did not restore the dirty working tree state if the user aborted the interactive rebase by emptying the insn sheet. (merge ddb5432 rr/rebase-autostash-fix later to maint).
- "git rebase --fork-point" did not filter out patch-identical commits correctly.
- During "git rebase --merge", a conflicted patch could not be skipped with "--skip" if the next one also conflicted. (merge 95104c7 bc/fix-rebase-merge-skip later to maint).
- "git show -s" (i.e. show log message only) used to incorrectly emit an extra blank line after a merge commit. (merge ad2f725 mk/show-s-no-extra-blank-line-for-merges later to maint).
- "git status", even though it is a read-only operation, tries to update the index with refreshed lstat(2) info to optimize future accesses to the working tree opportunistically, but this could race with a "read-write" operation that modifies the index while it is running. Detect such a race and avoid overwriting the index. (merge 426ddee ym/fix-opportunistic-index-update-race later to maint).
- "git status" (and "git commit") behaved as if changes in a modified submodule are not there if submodule.*.ignore configuration is set, which was misleading. The configuration is only to unclutter diff output during the course of development, and not to hide changes in the "status" output to cause the users forget to commit them. (merge c215d3d jl/status-added-submodule-is-never-ignored later to maint).
- Documentation for "git submodule sync" forgot to say that the subcommand can take the "--recursive" option. (merge 9393ae7 mc/doc-submodule-sync-recurse later to maint).
- "git update-index --cacheinfo" in 2.0 release crashed on a malformed command line. (merge c8e1ee4 jc/rev-parse-argh-dashed-multi-words later to maint).
- The mode to run tests with HTTP server tests disabled was broken. (merge afa53fe na/no-http-test-in-the-middle later to maint).
2.1.1
Git v2.1.1 Release Notes ========================
- Git 2.0 had a regression where "git fetch" into a shallowly cloned repository from a repository with bitmap object index enabled did not work correctly. This has been corrected.
- Git 2.0 had a regression which broke (rarely used) "git diff-tree -t". This has been corrected.
- "git log --pretty/format=" with an empty format string did not mean the more obvious "No output whatsoever" but "Use default format", which was counterintuitive. Now it means "nothing shown for the log message part".
- "git -c section.var command" and "git -c section.var= command" should pass the configuration differently (the former should be a boolean true, the latter should be an empty string), but they didn’t work that way. Now it does.
- Applying a patch not generated by Git in a subdirectory used to check the whitespace breakage using the attributes for incorrect paths. Also whitespace checks were performed even for paths excluded via "git apply --exclude=<path>" mechanism.
- "git bundle create" with date-range specification were meant to exclude tags outside the range, but it did not work correctly.
- "git add x" where x that used to be a directory has become a symbolic link to a directory misbehaved.
- The prompt script checked $GIT_DIR/ref/stash file to see if there is a stash, which was a no-no.
- "git checkout -m" did not switch to another branch while carrying the local changes forward when a path was deleted from the index.
- With sufficiently long refnames, fast-import could have overflown an on-stack buffer.
- After "pack-refs --prune" packed refs at the top-level, it failed to prune them.
- "git gc --auto" triggered from "git fetch --quiet" was not quiet.
2.1.2
Git v2.1.2 Release Notes ========================
- "git push" over HTTP transport had an artificial limit on number of refs that can be pushed imposed by the command line length.
- When receiving an invalid pack stream that records the same object twice, multiple threads got confused due to a race.
- An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave.
- Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use.
- "git config --add section.var val" used to lose existing section.var whose value was an empty string.
- "git fsck" failed to report that it found corrupt objects via its exit status in some cases.
2.1.3
Git v2.1.3 Release Notes ========================
- Some MUAs mangled a line in a message that begins with "From " to ">From " when writing to a mailbox file and feeding such an input to "git am" used to lose such a line.
- "git daemon" (with NO_IPV6 build configuration) used to incorrectly use the hostname even when gethostbyname() reported that the given hostname is not found.
- Newer versions of ’meld’ breaks the auto-detection we use to see if they are new enough to support the
--outputoption.
- "git pack-objects" forgot to disable the codepath to generate object reachability bitmap when it needs to split the resulting pack.
- "gitweb" used deprecated CGI::startfrom, which was removed from CGI.pm as of 4.04; use CGI::start_from instead.
- "git log" documentation had an example section marked up not quite correctly, which passed AsciiDoc but failed with AsciiDoctor.
Also contains some documentation updates.
2.1.4
Git v2.1.4 Release Notes ========================
Fixes since v2.1.3 ------------------
- We used to allow committing a path ".Git/config" with Git that is running on a case sensitive filesystem, but an attempt to check out such a path with Git that runs on a case insensitive filesystem would have clobbered ".git/config", which is definitely not what the user would have expected. Git now prevents you from tracking a path with ".Git" (in any case combination) as a path component.
- On Windows, certain path components that are different from ".git" are mapped to ".git", e.g. "git~1/config" is treated as if it were ".git/config". HFS+ has a similar issue, where certain unicode codepoints are ignored, e.g. ".gu200cit/config" is treated as if it were ".git/config". Pathnames with these potential issues are rejected on the affected systems. Git on systems that are not affected by this issue (e.g. Linux) can also be configured to reject them to ensure cross platform interoperability of the hosted projects.
- "git fsck" notices a tree object that records such a path that can be confused with ".git", and with receive.fsckObjects configuration set to true, an attempt to "git push" such a tree object will be rejected. Such a path may not be a problem on a well behaving filesystem but in order to protect those on HFS+ and on case insensitive filesystems, this check is enabled on all platforms.
A big "thanks!" for bringing this issue to us goes to our friends in the Mercurial land, namely, Matt Mackall and Augie Fackler.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.10.0
Git 2.10 Release Notes ======================
Backward compatibility notes ----------------------------
Updates since v2.9 ------------------
UI, Workflows & Features
- "git pull --rebase --verify-signature" learned to warn the user that "--verify-signature" is a no-op when rebasing.
- An upstream project can make a recommendation to shallowly clone some submodules in the .gitmodules file it ships.
- "git worktree add" learned that ’-’ can be used as a short-hand for "@{-1}", the previous branch.
- Update the funcname definition to support css files.
- The completion script (in contrib/) learned to complete "git status" options.
- Messages that are generated by auto gc during "git push" on the receiving end are now passed back to the sending end in such a way that they are shown with "remote: " prefix to avoid confusing the users.
- "git add -i/-p" learned to honor diff.compactionHeuristic experimental knob, so that the user can work on the same hunk split as "git diff" output.
- "upload-pack" allows a custom "git pack-objects" replacement when responding to "fetch/clone" via the uploadpack.packObjectsHook. (merge b738396 jk/upload-pack-hook later to maint).
- Teach format-patch and mailsplit (hence "am") how a line that happens to begin with "From " in the e-mail message is quoted with ">", so that these lines can be restored to their original shape. (merge d9925d1 ew/mboxrd-format-am later to maint).
- "git repack" learned the "--keep-unreachable" option, which sends loose unreachable objects to a pack instead of leaving them loose. This helps heuristics based on the number of loose objects (e.g. "gc --auto"). (merge e26a8c4 jk/repack-keep-unreachable later to maint).
- "log --graph --format=" learned that "%>|(N)" specifies the width relative to the terminal’s left edge, not relative to the area to draw text that is to the right of the ancestry-graph section. It also now accepts negative N that means the column limit is relative to the right border.
- A careless invocation of "git send-email directory/" after editing 0001-change.patch with an editor often ends up sending both 0001-change.patch and its backup file, 0001-change.patch~, causing embarrassment and a minor confusion. Detect such an input and offer to skip the backup files when sending the patches out. (merge 531220b jc/send-email-skip-backup later to maint).
- "git submodule update" that drives many "git clone" could eventually hit flaky servers/network conditions on one of the submodules; the command learned to retry the attempt.
- The output coloring scheme learned two new attributes, italic and strike, in addition to existing bold, reverse, etc.
- "git log" learns log.showSignature configuration variable, and a command line option "--no-show-signature" to countermand it. (merge fce04c3 mj/log-show-signature-conf later to maint).
- More markings of messages for i18n, with updates to various tests to pass GETTEXT_POISON tests.
- "git archive" learned to handle files that are larger than 8GB and commits far in the future than expressible by the traditional US-TAR format. (merge 560b0e8 jk/big-and-future-archive-tar later to maint).
- A new configuration variable core.sshCommand has been added to specify what value for GIT_SSH_COMMAND to use per repository.
- "git worktree prune" protected worktrees that are marked as "locked" by creating a file in a known location. "git worktree" command learned a dedicated command pair to create and remove such a file, so that the users do not have to do this with editor.
- A handful of "git svn" updates.
- "git push" learned to accept and pass extra options to the receiving end so that hooks can read and react to them.
- "git status" learned to suggest "merge --abort" during a conflicted merge, just like it already suggests "rebase --abort" during a conflicted rebase.
- "git jump" script (in contrib/) has been updated a bit. (merge a91e692 jk/git-jump later to maint).
- "git push" and "git clone" learned to give better progress meters to the end user who is waiting on the terminal.
- An entry "git log --decorate" for the tip of the current branch is shown as "HEAD → name" (where "name" is the name of the branch); the arrow is now painted in the same color as "HEAD", not in the color for commits.
- "git format-patch" learned format.from configuration variable to specify the default settings for its "--from" option.
- "git am -3" calls "git merge-recursive" when it needs to fall back to a three-way merge; this call has been turned into an internal subroutine call instead of spawning a separate subprocess.
- The command line completion scripts (in contrib/) now knows about "git branch --delete/--move [--remote]". (merge 2703c22 vs/completion-branch-fully-spelled-d-m-r later to maint).
- "git rev-parse --git-path hooks/<hook>" learned to take core.hooksPath configuration variable (introduced during 2.9 cycle) into account. (merge 9445b49 ab/hooks later to maint).
- "git log --show-signature" and other commands that display the verification status of PGP signature now shows the longer key-id, as 32-bit key-id is so last century.
Performance, Internal Implementation, Development Support etc.
- "git fast-import" learned the same performance trick to avoid creating too small a packfile as "git fetch" and "git push" have, using *.unpackLimit configuration.
- When "git daemon" is run without --[init-]timeout specified, a connection from a client that silently goes offline can hang around for a long time, wasting resources. The socket-level KEEPALIVE has been enabled to allow the OS to notice such failed connections.
- "git upload-pack" command has been updated to use the parse-options API.
- The "git apply" standalone program is being libified; the first step to move many state variables into a structure that can be explicitly (re)initialized to make the machinery callable more than once has been merged.
- HTTP transport gained an option to produce more detailed debugging trace. (merge 73e57aa ep/http-curl-trace later to maint).
- Instead of taking advantage of the fact that a struct string_list that is allocated with all NULs happens to be the INIT_NODUP kind, the users of string_list structures are taught to initialize them explicitly as such, to document their behaviour better. (merge 2721ce2 jk/string-list-static-init later to maint).
- HTTPd tests learned to show the server error log to help diagnosing a failing tests. (merge 44f243d nd/test-lib-httpd-show-error-log-in-verbose later to maint).
- The ownership rule for the piece of memory that hold references to be fetched in "git fetch" was screwy, which has been cleaned up.
- "git bisect" makes an internal call to "git diff-tree" when bisection finds the culprit, but this call did not initialize the data structure to pass to the diff-tree API correctly.
- Further preparatory clean-up for "worktree" feature continues. (merge 0409e0b nd/worktree-cleanup-post-head-protection later to maint).
- Formats of the various data (and how to validate them) where we use GPG signature have been documented.
- A new run-command API function pipe_command() is introduced to sanely feed data to the standard input while capturing data from the standard output and the standard error of an external process, which is cumbersome to hand-roll correctly without deadlocking.
- The codepath to sign data in a prepared buffer with GPG has been updated to use this API to read from the status-fd to check for errors (instead of relying on GPG’s exit status). (merge efee955 jk/gpg-interface-cleanup later to maint).
- Allow t/perf framework to use the features from the most recent version of Git even when testing an older installed version.
- The commands in the "log/diff" family have had an FILE* pointer in the data structure they pass around for a long time, but some codepaths used to always write to the standard output. As a preparatory step to make "git format-patch" available to the internal callers, these codepaths have been updated to consistently write into that FILE* instead.
- Conversion from unsigned char sha1[20] to struct object_id continues.
- Improve the look of the way "git fetch" reports what happened to each ref that was fetched.
- The .c/.h sources are marked as such in our .gitattributes file so that "git diff -W" and friends would work better.
- Code clean-up to avoid using a variable string that compilers may feel untrustable as printf-style format given to write_file() helper function.
- "git p4" used a location outside $GIT_DIR/refs/ to place its temporary branches, which has been moved to refs/git-p4-tmp/.
- Existing autoconf generated test for the need to link with pthread library did not check all the functions from pthread libraries; recent FreeBSD has some functions in libc but not others, and we mistakenly thought linking with libc is enough when it is not.
- When "git fsck" reports a broken link (e.g. a tree object contains a blob that does not exist), both containing object and the object that is referred to were reported with their 40-hex object names. The command learned the "--name-objects" option to show the path to the containing object from existing refs (e.g. "HEAD~24^2:file.txt").
- Allow http daemon tests in Travis CI tests.
- Makefile assumed that -lrt is always available on platforms that want to use clock_gettime() and CLOCK_MONOTONIC, which is not a case for recent Mac OS X. The necessary symbols are often found in libc on many modern systems and having -lrt on the command line, as long as the library exists, had no effect, but when the platform removes librt.a that is a different matter—having -lrt will break the linkage.
This change could be seen as a regression for those who do need to
specify -lrt, as they now specifically ask for NEEDS_LIBRT when
building. Hopefully they are in the minority these days.
- Further preparatory work on the refs API before the pluggable backend series can land.
- Error handling in the codepaths that updates refs has been improved.
- The API to iterate over all the refs (i.e. for_each_ref(), etc.) has been revamped.
- The handling of the "text=auto" attribute has been corrected. $ echo "* text=auto eol=crlf" >.gitattributes used to have the same effect as $ echo "* text eol=crlf" >.gitattributes i.e. declaring all files are text (ignoring "auto"). The combination has been fixed to be equivalent to doing $ git config core.autocrlf true
- Documentation has been updated to show better example usage of the updated "text=auto" attribute.
- A few tests that specifically target "git rebase -i" have been added.
- Dumb http transport on the client side has been optimized. (merge ecba195 ew/http-walker later to maint).
- Users of the parse_options_concat() API function need to allocate extra slots in advance and fill them with OPT_END() when they want to decide the set of supported options dynamically, which makes the code error-prone and hard to read. This has been corrected by tweaking the API to allocate and return a new copy of "struct option" array.
- "git fetch" exchanges batched have/ack messages between the sender and the receiver, initially doubling every time and then falling back to enlarge the window size linearly. The "smart http" transport, being an half-duplex protocol, outgrows the preset limit too quickly and becomes inefficient when interacting with a large repository. The internal mechanism learned to grow the window size more aggressively when working with the "smart http" transport.
- Tests for "git svn" have been taught to reuse the lib-httpd test infrastructure when testing the subversion integration that interacts with subversion repositories served over the http:// protocol. (merge a8a5d25 ew/git-svn-http-tests later to maint).
- "git pack-objects" has a few options that tell it not to pack objects found in certain packfiles, which require it to scan .idx files of all available packs. The codepaths involved in these operations have been optimized for a common case of not having any non-local pack and/or any .kept pack.
- The t3700 test about "add --chmod=-x" have been made a bit more robust and generally cleaned up. (merge 766cdc4 ib/t3700-add-chmod-x-updates later to maint).
- The build procedure learned PAGER_ENV knob that lists what default environment variable settings to export for popular pagers. This mechanism is used to tweak the default settings to MORE on FreeBSD. (merge 995bc22 ew/build-time-pager-tweaks later to maint).
- The http-backend (the server-side component of smart-http transport) used to trickle the HTTP header one at a time. Now these write(2)s are batched. (merge b36045c ew/http-backend-batch-headers later to maint).
- When "git rebase" tries to compare set of changes on the updated upstream and our own branch, it computes patch-id for all of these changes and attempts to find matches. This has been optimized by lazily computing the full patch-id (which is expensive) to be compared only for changes that touch the same set of paths. (merge ba67504 kw/patch-ids-optim later to maint).
- A handful of tests that were broken under gettext-poison build have been fixed.
- The recent i18n patch we added during this cycle did a bit too much refactoring of the messages to avoid word-legos; the repetition has been reduced to help translators.
Also contains various documentation updates and code clean-ups.
Fixes since v2.9 ----------------
Unless otherwise noted, all the fixes since v2.8 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- The commands in
gitlogfamily take %C(auto) in a custom format string. This unconditionally turned the color on, ignoring --no-color or with --color=auto when the output is not connected to a tty; this was corrected to make the format truly behave as "auto".
- "git rev-list --count" whose walk-length is limited with "-n" option did not work well with the counting optimized to look at the bitmap index.
- "git show -W" (extend hunks to cover the entire function, delimited by lines that match the "funcname" pattern) used to show the entire file when a change added an entire function at the end of the file, which has been fixed.
- The documentation set has been updated so that literal commands, configuration variables and environment variables are consistently typeset in fixed-width font and bold in manpages.
- "git svn propset" subcommand that was added in 2.3 days is documented now.
- The documentation tries to consistently spell "GPG"; when referring to the specific program name, "gpg" is used.
- "git reflog" stopped upon seeing an entry that denotes a branch creation event (aka "unborn"), which made it appear as if the reflog was truncated.
- The git-prompt scriptlet (in contrib/) was not friendly with those who uses "set -u", which has been fixed.
- compat/regex code did not cleanly compile.
- A codepath that used alloca(3) to place an unbounded amount of data on the stack has been updated to avoid doing so.
- "git update-index --add --chmod=+x file" may be usable as an escape hatch, but not a friendly thing to force for people who do need to use it regularly. "git add --chmod=+x file" can be used instead.
- Build improvements for gnome-keyring (in contrib/)
- "git status" used to say "working directory" when it meant "working tree".
- Comments about misbehaving FreeBSD shells have been clarified with the version number (9.x and before are broken, newer ones are OK).
- "git cherry-pick A" worked on an unborn branch, but "git cherry-pick A..B" didn’t.
- Fix an unintended regression in v2.9 that breaks "clone --depth" that recurses down to submodules by forcing the submodules to also be cloned shallowly, which many server instances that host upstream of the submodules are not prepared for.
- Fix unnecessarily waste in the idiomatic use of ’: ${VAR=default}’ to set the default value, without enclosing it in double quotes.
- Some platform-specific code had non-ANSI strict declarations of C functions that do not take any parameters, which has been corrected.
- The internal code used to show local timezone offset is not prepared to handle timestamps beyond year 2100, and gave a bogus offset value to the caller. Use a more benign looking +0000 instead and let "git log" going in such a case, instead of aborting.
- One among four invocations of readlink(1) in our test suite has been rewritten so that the test can run on systems without the command (others are in valgrind test framework and t9802).
- t/perf needs /usr/bin/time with GNU extension; the invocation of it is updated to "gtime" on Darwin.
- A bug, which caused "git p4" while running under verbose mode to report paths that are omitted due to branch prefix incorrectly, has been fixed; the command said "Ignoring file outside of prefix" for paths that are inside.
- The top level documentation "git help git" still pointed at the documentation set hosted at now-defunct google-code repository. Update it to point to https://git.github.io/htmldocs/git.html instead.
- A helper function that takes the contents of a commit object and finds its subject line did not ignore leading blank lines, as is commonly done by other codepaths. Make it ignore leading blank lines to match.
- For a long time, we carried an in-code comment that said our colored output would work only when we use fprintf/fputs on Windows, which no longer is the case for the past few years.
- "gc.autoPackLimit" when set to 1 should not trigger a repacking when there is only one pack, but the code counted poorly and did so.
- Add a test to specify the desired behaviour that currently is not available in "git rebase -Xsubtree=…".
- More mark-up updates to typeset strings that are expected to literally typed by the end user in fixed-width font.
- "git commit --amend --allow-empty-message -S" for a commit without any message body could have misidentified where the header of the commit object ends.
- "git rebase -i --autostash" did not restore the auto-stashed change when the operation was aborted.
- Git does not know what the contents in the index should be for a path added with "git add -N" yet, so "git grep --cached" should not show hits (or show lack of hits, with -L) in such a path, but that logic does not apply to "git grep", i.e. searching in the working tree files. But we did so by mistake, which has been corrected.
- "git blame -M" missed a single line that was moved within the file.
- Fix recently introduced codepaths that are involved in parallel submodule operations, which gave up on reading too early, and could have wasted CPU while attempting to write under a corner case condition.
- "git grep -i" has been taught to fold case in non-ascii locales correctly.
- A test that unconditionally used "mktemp" learned that the command is not necessarily available everywhere.
- There are certain house-keeping tasks that need to be performed at the very beginning of any Git program, and programs that are not built-in commands had to do them exactly the same way as "git" potty does. It was easy to make mistakes in one-off standalone programs (like test helpers). A common "main()" function that calls cmd_main() of individual program has been introduced to make it harder to make mistakes. (merge de61ceb jk/common-main later to maint).
- The test framework learned a new helper test_match_signal to check an exit code from getting killed by an expected signal.
- General code clean-up around a helper function to write a single-liner to a file. (merge 7eb6e10 jk/write-file later to maint).
- One part of "git am" had an oddball helper function that called stuff from outside "his" as opposed to calling what we have "ours", which was not gender-neutral and also inconsistent with the rest of the system where outside stuff is usually called "theirs" in contrast to "ours".
- "git blame file" allowed the lineage of lines in the uncommitted, unadded contents of "file" to be inspected, but it refused when "file" did not appear in the current commit. When "file" was created by renaming an existing file (but the change has not been committed), this restriction was unnecessarily tight.
- "git add -N dir/file && git write-tree" produced an incorrect tree when there are other paths in the same directory that sorts after "file".
- "git fetch http://user:pass@host/repo…" scrubbed the userinfo part, but "git push" didn’t.
- "git merge" with renormalization did not work well with merge-recursive, due to "safer crlf" conversion kicking in when it shouldn’t. (merge 1335d76 jc/renormalize-merge-kill-safer-crlf later to maint).
- The use of strbuf in "git rm" to build filename to remove was a bit suboptimal, which has been fixed.
- An age old bug that caused "git diff --ignore-space-at-eol" misbehave has been fixed.
- "git notes merge" had a code to see if a path exists (and fails if it does) and then open the path for writing (when it doesn’t). Replace it with open with O_EXCL.
- "git pack-objects" and "git index-pack" mostly operate with off_t when talking about the offset of objects in a packfile, but there were a handful of places that used "unsigned long" to hold that value, leading to an unintended truncation.
- Recent update to "git daemon" tries to enable the socket-level KEEPALIVE, but when it is spawned via inetd, the standard input file descriptor may not necessarily be connected to a socket. Suppress an ENOTSOCK error from setsockopt().
- Recent FreeBSD stopped making perl available at /usr/bin/perl; switch the default the built-in path to /usr/local/bin/perl on not too ancient FreeBSD releases.
- "git commit --help" said "--no-verify" is only about skipping the pre-commit hook, and failed to say that it also skipped the commit-msg hook.
- "git merge" in Git v2.9 was taught to forbid merging an unrelated lines of history by default, but that is exactly the kind of thing the "--rejoin" mode of "git subtree" (in contrib/) wants to do. "git subtree" has been taught to use the "--allow-unrelated-histories" option to override the default.
- The build procedure for "git persistent-https" helper (in contrib/) has been updated so that it can be built with more recent versions of Go.
- There is an optimization used in "git diff $treeA $treeB" to borrow an already checked-out copy in the working tree when it is known to be the same as the blob being compared, expecting that open/mmap of such a file is faster than reading it from the object store, which involves inflating and applying delta. This however kicked in even when the checked-out copy needs to go through the convert-to-git conversion (including the clean filter), which defeats the whole point of the optimization. The optimization has been disabled when the conversion is necessary.
- "git -c grep.patternType=extended log --basic-regexp" misbehaved because the internal API to access the grep machinery was not designed well.
- Windows port was failing some tests in t4130, due to the lack of inum in the returned values by its lstat(2) emulation.
- The reflog output format is documented better, and a new format --date=unix to report the seconds-since-epoch (without timezone) has been added. (merge 442f6fd jk/reflog-date later to maint).
- "git difftool <paths>…" started in a subdirectory failed to interpret the paths relative to that directory, which has been fixed.
- The characters in the label shown for tags/refs for commits in "gitweb" output are now properly escaped for proper HTML output.
- FreeBSD can lie when asked mtime of a directory, which made the untracked cache code to fall back to a slow-path, which in turn caused tests in t7063 to fail because it wanted to verify the behaviour of the fast-path.
- Squelch compiler warnings for nedmalloc (in compat/) library.
- A small memory leak in the command line parsing of "git blame" has been plugged.
- The API documentation for hashmap was unclear if hashmap_entry can be safely discarded without any other consideration. State that it is safe to do so.
- Not-so-recent rewrite of "git am" that started making internal calls into the commit machinery had an unintended regression, in that no matter how many seconds it took to apply many patches, the resulting committer timestamp for the resulting commits were all the same.
- "git push --force-with-lease" already had enough logic to allow ensuring that such a push results in creation of a ref (i.e. the receiving end did not have another push from sideways that would be discarded by our force-pushing), but didn’t expose this possibility to the users. It does so now. (merge 9eed4f3 jk/push-force-with-lease-creation later to maint).
- The mechanism to limit the pack window memory size, when packing is done using multiple threads (which is the default), is per-thread, but this was not documented clearly. (merge 954176c ms/document-pack-window-memory-is-per-thread later to maint).
- "import-tars" fast-import script (in contrib/) used to ignore a hardlink target and replaced it with an empty file, which has been corrected to record the same blob as the other file the hardlink is shared with. (merge 04e0869 js/import-tars-hardlinks later to maint).
- "git mv dir non-existing-dir/" did not work in some environments the same way as existing mainstream platforms. The code now moves "dir" to "non-existing-dir", without relying on rename("A", "B/") that strips the trailing slash of ’/’. (merge 189d035 js/mv-dir-to-new-directory later to maint).
- The "t/" hierarchy is prone to get an unusual pathname; "make test" has been taught to make sure they do not contain paths that cannot be checked out on Windows (and the mechanism can be reusable to catch pathnames that are not portable to other platforms as need arises). (merge c2cafd3 js/test-lint-pathname later to maint).
- When "git merge-recursive" works on history with many criss-cross merges in "verbose" mode, the names the command assigns to the virtual merge bases could have overwritten each other by unintended reuse of the same piece of memory. (merge 5447a76 rs/pull-signed-tag later to maint).
- "git checkout --detach <branch>" used to give the same advice message as that is issued when "git checkout <tag>" (or anything that is not a branch name) is given, but asking with "--detach" is an explicit enough sign that the user knows what is going on. The advice message has been squelched in this case. (merge 779b88a sb/checkout-explit-detach-no-advice later to maint).
- "git difftool" by default ignores the error exit from the backend commands it spawns, because often they signal that they found differences by exiting with a non-zero status code just like "diff" does; the exit status codes 126 and above however are special in that they are used to signal that the command is not executable, does not exist, or killed by a signal. "git difftool" has been taught to notice these exit status codes. (merge 45a4f5d jk/difftool-command-not-found later to maint).
- On Windows, help.browser configuration variable used to be ignored, which has been corrected. (merge 6db5967 js/no-html-bypass-on-windows later to maint).
- The "git -c var[=val] cmd" facility to append a configuration variable definition at the end of the search order was described in git(1) manual page, but not in git-config(1), which was more likely place for people to look for when they ask "can I make a one-shot override, and if so how?" (merge ae1f709 dg/document-git-c-in-git-config-doc later to maint).
- The tempfile (hence its user lockfile) API lets the caller to open a file descriptor to a temporary file, write into it and then finalize it by first closing the filehandle and then either removing or renaming the temporary file. When the process spawns a subprocess after obtaining the file descriptor, and if the subprocess has not exited when the attempt to remove or rename is made, the last step fails on Windows, because the subprocess has the file descriptor still open. Open tempfile with O_CLOEXEC flag to avoid this (on Windows, this is mapped to O_NOINHERIT). (merge 05d1ed6 bw/mingw-avoid-inheriting-fd-to-lockfile later to maint).
- Correct an age-old calco (is that a typo-like word for calc) in the documentation. (merge 7841c48 ls/packet-line-protocol-doc-fix later to maint).
- Other minor clean-ups and documentation updates (merge 02a8cfa rs/merge-add-strategies-simplification later to maint). (merge af4941d rs/merge-recursive-string-list-init later to maint). (merge 1eb47f1 rs/use-strbuf-add-unique-abbrev later to maint). (merge ddd0bfa jk/tighten-alloc later to maint). (merge ecf30b2 rs/mailinfo-lib later to maint). (merge 0eb75ce sg/reflog-past-root later to maint). (merge 4369523 hv/doc-commit-reference-style later to maint).
2.10.1
Git v2.10.1 Release Notes =========================
Fixes since v2.10 -----------------
- Clarify various ways to specify the "revision ranges" in the documentation.
- "diff-highlight" script (in contrib/) learned to work better with "git log -p --graph" output.
- The test framework left the number of tests and success/failure count in the t/test-results directory, keyed by the name of the test script plus the process ID. The latter however turned out not to serve any useful purpose. The process ID part of the filename has been removed.
- Having a submodule whose ".git" repository is somehow corrupt caused a few commands that recurse into submodules loop forever.
- "git symbolic-ref -d HEAD" happily removes the symbolic ref, but the resulting repository becomes an invalid one. Teach the command to forbid removal of HEAD.
- A test spawned a short-lived background process, which sometimes prevented the test directory from getting removed at the end of the script on some platforms.
- Update a few tests that used to use GIT_CURL_VERBOSE to use the newer GIT_TRACE_CURL.
- Update Japanese translation for "git-gui".
- "git fetch http::/site/path" did not die correctly and segfaulted instead.
- "git commit-tree" stopped reading commit.gpgsign configuration variable that was meant for Porcelain "git commit" in Git 2.9; we forgot to update "git gui" to look at the configuration to match this change.
- "git log --cherry-pick" used to include merge commits as candidates to be matched up with other commits, resulting a lot of wasted time. The patch-id generation logic has been updated to ignore merges to avoid the wastage.
- The http transport (with curl-multi option, which is the default these days) failed to remove curl-easy handle from a curlm session, which led to unnecessary API failures.
- "git diff -W" output needs to extend the context backward to include the header line of the current function and also forward to include the body of the entire current function up to the header line of the next one. This process may have to merge to adjacent hunks, but the code forgot to do so in some cases.
- Performance tests done via "t/perf" did not use the same set of build configuration if the user relied on autoconf generated configuration.
- "git format-patch --base=…" feature that was recently added showed the base commit information after "-- " e-mail signature line, which turned out to be inconvenient. The base information has been moved above the signature line.
- Even when "git pull --rebase=preserve" (and the underlying "git rebase --preserve") can complete without creating any new commit (i.e. fast-forwards), it still insisted on having a usable ident information (read: user.email is set correctly), which was less than nice. As the underlying commands used inside "git rebase" would fail with a more meaningful error message and advice text when the bogus ident matters, this extra check was removed.
- "git gc --aggressive" used to limit the delta-chain length to 250, which is way too deep for gaining additional space savings and is detrimental for runtime performance. The limit has been reduced to 50.
- Documentation for individual configuration variables to control use of color (like
color.grep) said that their default value is ’false’, instead of saying their default is taken fromcolor.ui. When we updated the default value for color.ui from ’false’ to ’auto’ quite a while ago, all of them broke. This has been corrected.
- A shell script example in check-ref-format documentation has been fixed.
- "git checkout <word>" does not follow the usual disambiguation rules when the <word> can be both a rev and a path, to allow checking out a branch ’foo’ in a project that happens to have a file ’foo’ in the working tree without having to disambiguate. This was poorly documented and the check was incorrect when the command was run from a subdirectory.
- Some codepaths in "git diff" used regexec(3) on a buffer that was mmap(2)ed, which may not have a terminating NUL, leading to a read beyond the end of the mapped region. This was fixed by introducing a regexec_buf() helper that takes a <ptr,len> pair with REG_STARTEND extension.
- The procedure to build Git on Mac OS X for Travis CI hardcoded the internal directory structure we assumed HomeBrew uses, which was a no-no. The procedure has been updated to ask HomeBrew things we need to know to fix this.
- When "git rebase -i" is given a broken instruction, it told the user to fix it with "--edit-todo", but didn’t say what the step after that was (i.e. "--continue").
- "git add --chmod=+x" added recently lacked documentation, which has been corrected.
- "git add --chmod=+x <pathspec>" added recently only toggled the executable bit for paths that are either new or modified. This has been corrected to flip the executable bit for all paths that match the given pathspec.
- "git pack-objects --include-tag" was taught that when we know that we are sending an object C, we want a tag B that directly points at C but also a tag A that points at the tag B. We used to miss the intermediate tag B in some cases.
- Documentation around tools to import from CVS was fairly outdated.
- In the codepath that comes up with the hostname to be used in an e-mail when the user didn’t tell us, we looked at ai_canonname field in struct addrinfo without making sure it is not NULL first.
Also contains minor documentation updates and code clean-ups.
2.10.2
Git v2.10.2 Release Notes =========================
Fixes since v2.10.1 -------------------
- The code that parses the format parameter of for-each-ref command has seen a micro-optimization.
- The "graph" API used in "git log --graph" miscounted the number of output columns consumed so far when drawing a padding line, which has been fixed; this did not affect any existing code as nobody tried to write anything after the padding on such a line, though.
- Almost everybody uses DEFAULT_ABBREV to refer to the default setting for the abbreviation, but "git blame" peeked into underlying variable bypassing the macro for no good reason.
- Doc update to clarify what "log -3 --reverse" does.
- The original command line syntax for "git merge", which was "git merge <msg> HEAD <parent>…", has been deprecated for quite some time, and "git gui" was the last in-tree user of the syntax. This is finally fixed, so that we can move forward with the deprecation.
- Codepaths that read from an on-disk loose object were too loose in validating what they are reading is a proper object file and sometimes read past the data they read from the disk, which has been corrected. H/t to Gustavo Grieco for reporting.
- "git worktree", even though it used the default_abbrev setting that ought to be affected by core.abbrev configuration variable, ignored the variable setting. The command has been taught to read the default set of configuration variables to correct this.
- A low-level function verify_packfile() was meant to show errors that were detected without dying itself, but under some conditions it didn’t and died instead, which has been fixed.
- When "git fetch" tries to find where the history of the repository it runs in has diverged from what the other side has, it has a mechanism to avoid digging too deep into irrelevant side branches. This however did not work well over the "smart-http" transport due to a design bug, which has been fixed.
- When we started cURL to talk to imap server when a new enough version of cURL library is available, we forgot to explicitly add imap(s): and the library tried to make HTTP(s) requests instead.
- The ./configure script generated from configure.ac was taught how to detect support of SSL by libcurl better.
- http.emptyauth configuration is a way to allow an empty username to pass when attempting to authenticate using mechanisms like Kerberos. We took an unspecified (NULL) username and sent ":" (i.e. no username, no password) to CURLOPT_USERPWD, but did not do the same when the username is explicitly set to an empty string.
- "git clone" of a local repository can be done at the filesystem level, but the codepath did not check errors while copying and adjusting the file that lists alternate object stores.
- Documentation for "git commit" was updated to clarify that "commit -p <paths>" adds to the current contents of the index to come up with what to commit.
- A stray symbolic link in $GIT_DIR/refs/ directory could make name resolution loop forever, which has been corrected.
- The "submodule.<name>.path" stored in .gitmodules is never copied to .git/config and such a key in .git/config has no meaning, but the documentation described it and submodule.<name>.url next to each other as if both belong to .git/config. This has been fixed.
- Recent git allows submodule.<name>.branch to use a special token "." instead of the branch name; the documentation has been updated to describe it.
- In a worktree connected to a repository elsewhere, created via "git worktree", "git checkout" attempts to protect users from confusion by refusing to check out a branch that is already checked out in another worktree. However, this also prevented checking out a branch, which is designated as the primary branch of a bare repository, in a worktree that is connected to the bare repository. The check has been corrected to allow it.
- "git rebase" immediately after "git clone" failed to find the fork point from the upstream.
- When fetching from a remote that has many tags that are irrelevant to branches we are following, we used to waste way too many cycles when checking if the object pointed at by a tag (that we are not going to fetch!) exists in our repository too carefully.
- The Travis CI configuration we ship ran the tests with --verbose option but this risks non-TAP output that happens to be "ok" to be misinterpreted as TAP signalling a test that passed. This resulted in unnecessary failure. This has been corrected by introducing a new mode to run our tests in the test harness to send the verbose output separately to the log file.
- Some AsciiDoc formatter mishandles a displayed illustration with tabs in it. Adjust a few of them in merge-base documentation to work around them.
Also contains minor documentation updates and code clean-ups.
2.10.3
Git v2.10.3 Release Notes =========================
Fixes since v2.10.2 -------------------
- Extract a small helper out of the function that reads the authors script file "git am" internally uses. This by itself is not useful until a second caller appears in the future for "rebase -i" helper.
- The command-line completion script (in contrib/) learned to complete "git cmd ^mas<HT>" to complete the negative end of reference to "git cmd ^master".
- "git send-email" attempts to pick up valid e-mails from the trailers, but people in real world write non-addresses there, like "Cc: Stable <add@re.ss> # 4.8+", which broke the output depending on the availability and vintage of Mail::Address perl module.
- The code that we have used for the past 10+ years to cycle 4-element ring buffers turns out to be not quite portable in theoretical world.
- "git daemon" used fixed-length buffers to turn URL to the repository the client asked for into the server side directory path, using snprintf() to avoid overflowing these buffers, but allowed possibly truncated paths to the directory. This has been tightened to reject such a request that causes overlong path to be required to serve.
- Recent update to git-sh-setup (a library of shell functions that are used by our in-tree scripted Porcelain commands) included another shell library git-sh-i18n without specifying where it is, relying on the $PATH. This has been fixed to be more explicit by prefixing $(git --exec-path) output in front.
- Fix for a racy false-positive test failure.
- Portability update and workaround for builds on recent Mac OS X.
- Update to the test framework made in 2.9 timeframe broke running the tests under valgrind, which has been fixed.
- Improve the rule to convert "unsigned char [20]" into "struct object_id *" in contrib/coccinelle/
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
Also contains minor documentation updates and code clean-ups.
2.10.4
Git v2.10.4 Release Notes =========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.10.5
Git v2.10.5 Release Notes =========================
Fixes since v2.10.4 -------------------
- "git cvsserver" no longer is invoked by "git daemon" by default, as it is old and largely unmaintained.
- Various Perl scripts did not use safe_pipe_capture() instead of backticks, leaving them susceptible to end-user input. They have been corrected.
Credits go to joernchen <joernchen@phenoelit.de> for finding the unsafe constructs in "git cvsserver", and to Jeff King at GitHub for finding and fixing instances of the same issue in other scripts.
2.11.0
Git 2.11 Release Notes ======================
Backward compatibility notes.
- An empty string used as a pathspec element has always meant ’everything matches’, but it is too easy to write a script that finds a path to remove in $path and run ’git rm "$paht"’ by mistake (when the user meant to give "$path"), which ends up removing everything. This release starts warning about the use of an empty string that is used for ’everything matches’ and asks users to use a more explicit ’.’ for that instead.
The hope is that existing users will not mind this change, and
eventually the warning can be turned into a hard error, upgrading
the deprecation into removal of this (mis)feature.
- The historical argument order "git merge <msg> HEAD <commit>…" has been deprecated for quite some time, and will be removed in the next release (not this one).
- The default abbreviation length, which has historically been 7, now scales as the repository grows, using the approximate number of objects in the repository and a bit of math around the birthday paradox. The logic suggests to use 12 hexdigits for the Linux kernel, and 9 to 10 for Git itself.
Updates since v2.10 -------------------
UI, Workflows & Features
- Comes with new version of git-gui, now at its 0.21.0 tag.
- "git format-patch --cover-letter HEAD^" to format a single patch with a separate cover letter now numbers the output as [PATCH 0/1] and [PATCH 1/1] by default.
- An incoming "git push" that attempts to push too many bytes can now be rejected by setting a new configuration variable at the receiving end.
- "git nosuchcommand --help" said "No manual entry for gitnosuchcommand", which was not intuitive, given that "git nosuchcommand" said "git: ’nosuchcommand’ is not a git command".
- "git clone --recurse-submodules --reference $path $URL" is a way to reduce network transfer cost by borrowing objects in an existing $path repository when cloning the superproject from $URL; it learned to also peek into $path for presence of corresponding repositories of submodules and borrow objects from there when able.
- The "git diff --submodule={short,log}" mechanism has been enhanced to allow "--submodule=diff" to show the patch between the submodule commits bound to the superproject.
- Even though "git hash-objects", which is a tool to take an on-filesystem data stream and put it into the Git object store, can perform "outside-world-to-Git" conversions (e.g. end-of-line conversions and application of the clean-filter), and it has had this feature on by default from very early days, its reverse operation "git cat-file", which takes an object from the Git object store and externalizes it for consumption by the outside world, lacked an equivalent mechanism to run the "Git-to-outside-world" conversion. The command learned the "--filters" option to do so.
- Output from "git diff" can be made easier to read by intelligently selecting which lines are common and which lines are added/deleted when the lines before and after the changed section are the same. A command line option (--indent-heuristic) and a configuration variable (diff.indentHeuristic) are added to help with the experiment to find good heuristics.
- In some projects, it is common to use "[RFC PATCH]" as the subject prefix for a patch meant for discussion rather than application. A new format-patch option "--rfc" is a short-hand for "--subject-prefix=RFC PATCH" to help the participants of such projects.
- "git add --chmod={+,-}x <pathspec>" only changed the executable bit for paths that are either new or modified. This has been corrected to change the executable bit for all paths that match the given pathspec.
- When "git format-patch --stdout" output is placed as an in-body header and it uses RFC2822 header folding, "git am" fails to put the header line back into a single logical line. The underlying "git mailinfo" was taught to handle this properly.
- "gitweb" can spawn "highlight" to show blob contents with (programming) language-specific syntax highlighting, but only when the language is known. "highlight" can however be told to guess the language itself by giving it "--force" option, which has been enabled.
- "git gui" l10n to Portuguese.
- When given an abbreviated object name that is not (or more realistically, "no longer") unique, we gave a fatal error "ambiguous argument". This error is now accompanied by a hint that lists the objects beginning with the given prefix. During the course of development of this new feature, numerous minor bugs were uncovered and corrected, the most notable one of which is that we gave "short SHA1 xxxx is ambiguous." twice without good reason.
- "git log rev^..rev" is an often-used revision range specification to show what was done on a side branch merged at rev. This has gained a short-hand "rev^-1". In general "rev^-$n" is the same as "rev$n rev", i.e. what has happened on other branches while the history leading to nth parent was looking the other way.
- In recent versions of cURL, GSSAPI credential delegation is disabled by default due to CVE-2011-2192; introduce a http.delegation configuration variable to selectively allow enabling this. (merge 26a7b23429 ps/http-gssapi-cred-delegation later to maint).
- "git mergetool" learned to honor "-O<orderfile>" to control the order of paths to present to the end user.
- "git diff/log --ws-error-highlight=<kind>" lacked the corresponding configuration variable (diff.wsErrorHighlight) to set it by default.
- "git ls-files" learned the "--recurse-submodules" option to get a listing of tracked files across submodules (i.e. this only works with the "--cached" option, not for listing untracked or ignored files). This would be a useful tool to sit on the upstream side of a pipe that is read with xargs to work on all working tree files from the top-level superproject.
- A new credential helper that talks via "libsecret" with implementations of XDG Secret Service API has been added to contrib/credential/.
- The GPG verification status shown by the "%G?" pretty format specifier was not rich enough to differentiate a signature made by an expired key, a signature made by a revoked key, etc. New output letters have been assigned to express them.
- In addition to purely abbreviated commit object names, "gitweb" learned to turn "git describe" output (e.g. v2.9.3-599-g2376d31787) into clickable links in its output.
- "git commit" created an empty commit when invoked with an index consisting solely of intend-to-add paths (added with "git add -N"). It now requires the "--allow-empty" option to create such a commit. The same logic prevented "git status" from showing such paths as "new files" in the "Changes not staged for commit" section.
- The smudge/clean filter API spawns an external process to filter the contents of each path that has a filter defined. A new type of "process" filter API has been added to allow the first request to run the filter for a path to spawn a single process, and all filtering is served by this single process for multiple paths, reducing the process creation overhead.
- The user always has to say "stash@{$N}" when naming a single element in the default location of the stash, i.e. reflogs in refs/stash. The "git stash" command learned to accept "git stash apply 4" as a short-hand for "git stash apply stash@{4}".
Performance, Internal Implementation, Development Support etc.
- The delta-base-cache mechanism has been a key to the performance in a repository with a tightly packed packfile, but it did not scale well even with a larger value of core.deltaBaseCacheLimit.
- Enhance "git status --porcelain" output by collecting more data on the state of the index and the working tree files, which may further be used to teach git-prompt (in contrib/) to make fewer calls to git.
- Extract a small helper out of the function that reads the authors script file "git am" internally uses. (merge a77598e jc/am-read-author-file later to maint).
- Lift calls to exit(2) and die() higher in the callchain in sequencer.c files so that more helper functions in it can be used by callers that want to handle error conditions themselves.
- "git am" has been taught to make an internal call to "git apply"’s innards without spawning the latter as a separate process.
- The ref-store abstraction was introduced to the refs API so that we can plug in different backends to store references.
- The "unsigned char sha1[20]" to "struct object_id" conversion continues. Notable changes in this round includes that ce→sha1, i.e. the object name recorded in the cache_entry, turns into an object_id.
- JGit can show a fake ref "capabilities^{}" to "git fetch" when it does not advertise any refs, but "git fetch" was not prepared to see such an advertisement. When the other side disconnects without giving any ref advertisement, we used to say "there may not be a repository at that URL", but we may have seen other advertisements like "shallow" and ".have" in which case we definitely know that a repository is there. The code to detect this case has also been updated.
- Some codepaths in "git pack-objects" were not ready to use an existing pack bitmap; now they are and as a result they have become faster.
- The codepath in "git fsck" to detect malformed tree objects has been updated not to die but keep going after detecting them.
- We call "qsort(array, nelem, sizeof(array[0]), fn)", and most of the time third parameter is redundant. A new QSORT() macro lets us omit it.
- "git pack-objects" in a repository with many packfiles used to spend a lot of time looking for/at objects in them; the accesses to the packfiles are now optimized by checking the most-recently-used packfile first. (merge c9af708b1a jk/pack-objects-optim-mru later to maint).
- Codepaths involved in interacting alternate object stores have been cleaned up.
- In order for the receiving end of "git push" to inspect the received history and decide to reject the push, the objects sent from the sending end need to be made available to the hook and the mechanism for the connectivity check, and this was done traditionally by storing the objects in the receiving repository and letting "git gc" expire them. Instead, store the newly received objects in a temporary area, and make them available by reusing the alternate object store mechanism to them only while we decide if we accept the check, and once we decide, either migrate them to the repository or purge them immediately.
- The require_clean_work_tree() helper was recreated in C when "git pull" was rewritten from shell; the helper is now made available to other callers in preparation for upcoming "rebase -i" work.
- "git upload-pack" had its code cleaned-up and performance improved by reducing use of timestamp-ordered commit-list, which was replaced with a priority queue.
- "git diff --no-index" codepath has been updated not to try to peek into a .git/ directory that happens to be under the current directory, when we know we are operating outside any repository.
- Update of the sequencer codebase to make it reusable to reimplement "rebase -i" continues.
- Git generally does not explicitly close file descriptors that were open in the parent process when spawning a child process, but most of the time the child does not want to access them. As Windows does not allow removing or renaming a file that has a file descriptor open, a slow-to-exit child can even break the parent process by holding onto them. Use O_CLOEXEC flag to open files in various codepaths.
- Update "interpret-trailers" machinery and teach it that people in the real world write all sorts of cruft in the "trailer" that was originally designed to have the neat-o "Mail-Header: like thing" and nothing else.
Also contains various documentation updates and code clean-ups.
Fixes since v2.10 -----------------
Unless otherwise noted, all the fixes since v2.9 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- Clarify various ways to specify the "revision ranges" in the documentation.
- "diff-highlight" script (in contrib/) learned to work better with "git log -p --graph" output.
- The test framework left the number of tests and success/failure count in the t/test-results directory, keyed by the name of the test script plus the process ID. The latter however turned out not to serve any useful purpose. The process ID part of the filename has been removed.
- Having a submodule whose ".git" repository is somehow corrupt caused a few commands that recurse into submodules to loop forever.
- "git symbolic-ref -d HEAD" happily removes the symbolic ref, but the resulting repository becomes an invalid one. Teach the command to forbid removal of HEAD.
- A test spawned a short-lived background process, which sometimes prevented the test directory from getting removed at the end of the script on some platforms.
- Update a few tests that used to use GIT_CURL_VERBOSE to use the newer GIT_TRACE_CURL.
- "git pack-objects --include-tag" was taught that when we know that we are sending an object C, we want a tag B that directly points at C but also a tag A that points at the tag B. We used to miss the intermediate tag B in some cases.
- Update Japanese translation for "git-gui".
- "git fetch http::/site/path" did not die correctly and segfaulted instead.
- "git commit-tree" stopped reading commit.gpgsign configuration variable that was meant for Porcelain "git commit" in Git 2.9; we forgot to update "git gui" to look at the configuration to match this change.
- "git add --chmod={+,-}x" added recently lacked documentation, which has been corrected.
- "git log --cherry-pick" used to include merge commits as candidates to be matched up with other commits, resulting a lot of wasted time. The patch-id generation logic has been updated to ignore merges and avoid the wastage.
- The http transport (with curl-multi option, which is the default these days) failed to remove curl-easy handle from a curlm session, which led to unnecessary API failures.
- There were numerous corner cases in which the configuration files are read and used or not read at all depending on the directory a Git command was run, leading to inconsistent behaviour. The code to set-up repository access at the beginning of a Git process has been updated to fix them. (merge 4d0efa1 jk/setup-sequence-update later to maint).
- "git diff -W" output needs to extend the context backward to include the header line of the current function and also forward to include the body of the entire current function up to the header line of the next one. This process may have to merge two adjacent hunks, but the code forgot to do so in some cases.
- Performance tests done via "t/perf" did not use the right build configuration if the user relied on autoconf generated configuration.
- "git format-patch --base=…" feature that was recently added showed the base commit information after the "-- " e-mail signature line, which turned out to be inconvenient. The base information has been moved above the signature line.
- More i18n.
- Even when "git pull --rebase=preserve" (and the underlying "git rebase --preserve") can complete without creating any new commits (i.e. fast-forwards), it still insisted on having usable ident information (read: user.email is set correctly), which was less than nice. As the underlying commands used inside "git rebase" would fail with a more meaningful error message and advice text when the bogus ident matters, this extra check was removed.
- "git gc --aggressive" used to limit the delta-chain length to 250, which is way too deep for gaining additional space savings and is detrimental for runtime performance. The limit has been reduced to 50.
- Documentation for individual configuration variables to control use of color (like
color.grep) said that their default value is ’false’, instead of saying their default is taken fromcolor.ui. When we updated the default value for color.ui from ’false’ to ’auto’ quite a while ago, all of them broke. This has been corrected.
- The pretty-format specifier "%C(auto)" used by the "log" family of commands to enable coloring of the output is taught to also issue a color-reset sequence to the output.
- A shell script example in check-ref-format documentation has been fixed.
- "git checkout <word>" does not follow the usual disambiguation rules when the <word> can be both a rev and a path, to allow checking out a branch ’foo’ in a project that happens to have a file ’foo’ in the working tree without having to disambiguate. This was poorly documented and the check was incorrect when the command was run from a subdirectory.
- Some codepaths in "git diff" used regexec(3) on a buffer that was mmap(2)ed, which may not have a terminating NUL, leading to a read beyond the end of the mapped region. This was fixed by introducing a regexec_buf() helper that takes a <ptr,len> pair with REG_STARTEND extension.
- The procedure to build Git on Mac OS X for Travis CI hardcoded the internal directory structure we assumed HomeBrew uses, which was a no-no. The procedure has been updated to ask HomeBrew things we need to know to fix this.
- When "git rebase -i" is given a broken instruction, it told the user to fix it with "--edit-todo", but didn’t say what the step after that was (i.e. "--continue").
- Documentation around tools to import from CVS was fairly outdated.
- "git clone --recurse-submodules" lost the progress eye-candy in a recent update, which has been corrected.
- A low-level function verify_packfile() was meant to show errors that were detected without dying itself, but under some conditions it didn’t and died instead, which has been fixed.
- When "git fetch" tries to find where the history of the repository it runs in has diverged from what the other side has, it has a mechanism to avoid digging too deep into irrelevant side branches. This however did not work well over the "smart-http" transport due to a design bug, which has been fixed.
- In the codepath that comes up with the hostname to be used in an e-mail when the user didn’t tell us, we looked at the ai_canonname field in struct addrinfo without making sure it is not NULL first.
- "git worktree", even though it used the default_abbrev setting that ought to be affected by the core.abbrev configuration variable, ignored the variable setting. The command has been taught to read the default set of configuration variables to correct this.
- "git init" tried to record core.worktree in the repository’s ’config’ file when the GIT_WORK_TREE environment variable was set and it was different from where GIT_DIR appears as ".git" at its top, but the logic was faulty when .git is a "gitdir:" file that points at the real place, causing trouble in working trees that are managed by "git worktree". This has been corrected.
- Codepaths that read from an on-disk loose object were too loose in validating that they are reading a proper object file and sometimes read past the data they read from the disk, which has been corrected. H/t to Gustavo Grieco for reporting.
- The original command line syntax for "git merge", which was "git merge <msg> HEAD <parent>…", has been deprecated for quite some time, and "git gui" was the last in-tree user of the syntax. This is finally fixed, so that we can move forward with the deprecation.
- Doc update to clarify what "log -3 --reverse" does.
- Almost everybody uses DEFAULT_ABBREV to refer to the default setting for the abbreviation, but "git blame" peeked into underlying variable bypassing the macro for no good reason.
- The "graph" API used in "git log --graph" miscounted the number of output columns consumed so far when drawing a padding line, which has been fixed; this did not affect any existing code as nobody tried to write anything after the padding on such a line, though.
- The code that parses the format parameter of the for-each-ref command has seen a micro-optimization.
- When we started to use cURL to talk to an imap server, we forgot to explicitly add imap(s): and the library tried to make HTTP(s) requests instead.
- The ./configure script generated from configure.ac was taught how to detect support of SSL by libcurl better.
- The command-line completion script (in contrib/) learned to complete "git cmd ^mas<HT>" to complete the negative end of reference to "git cmd ^master". (merge 49416ad22a cp/completion-negative-refs later to maint).
- The existing "git fetch --depth=<n>" option was hard to use correctly when making the history of an existing shallow clone deeper. A new option, "--deepen=<n>", has been added to make this easier to use. "git clone" also learned "--shallow-since=<date>" and "--shallow-exclude=<tag>" options to make it easier to specify "I am interested only in the recent N months worth of history" and "Give me only the history since that version". (merge cccf74e2da nd/shallow-deepen later to maint).
- "git blame --reverse OLD path" is now DWIMmed to show how lines in path in an old revision OLD have survived up to the current commit. (merge e1d09701a4 jc/blame-reverse later to maint).
- The http.emptyauth configuration variable is a way to allow an empty username to pass when attempting to authenticate using mechanisms like Kerberos. We took an unspecified (NULL) username and sent ":" (i.e. no username, no password) to CURLOPT_USERPWD, but did not do the same when the username is explicitly set to an empty string.
- "git clone" of a local repository can be done at the filesystem level, but the codepath did not check errors while copying and adjusting the file that lists alternate object stores.
- Documentation for "git commit" was updated to clarify that "commit -p <paths>" adds to the current contents of the index to come up with what to commit.
- A stray symbolic link in the $GIT_DIR/refs/ directory could make name resolution loop forever, which has been corrected.
- The "submodule.<name>.path" stored in .gitmodules is never copied to .git/config and such a key in .git/config has no meaning, but the documentation described it next to submodule.<name>.url as if both belong to .git/config. This has been fixed.
- In a worktree created via "git worktree", "git checkout" attempts to protect users from confusion by refusing to check out a branch that is already checked out in another worktree. However, this also prevented checking out a branch which is designated as the primary branch of a bare repository, in a worktree that is connected to the bare repository. The check has been corrected to allow it.
- "git rebase" immediately after "git clone" failed to find the fork point from the upstream.
- When fetching from a remote that has many tags that are irrelevant to branches we are following, we used to waste way too many cycles checking if the object pointed at by a tag (that we are not going to fetch!) exists in our repository too carefully.
- Protect our code from over-eager compilers.
- Recent git allows submodule.<name>.branch to use a special token "." instead of the branch name; the documentation has been updated to describe it.
- "git send-email" attempts to pick up valid e-mails from the trailers, but people in the real world write non-addresses there, like "Cc: Stable <add@re.ss> # 4.8+", which broke the output depending on the availability and vintage of the Mail::Address perl module. (merge dcfafc5214 mm/send-email-cc-cruft-after-address later to maint).
- The Travis CI configuration we ship ran the tests with the --verbose option but this risks non-TAP output that happens to be "ok" to be misinterpreted as TAP signalling a test that passed. This resulted in unnecessary failures. This has been corrected by introducing a new mode to run our tests in the test harness to send the verbose output separately to the log file.
- Some AsciiDoc formatters mishandle a displayed illustration with tabs in it. Adjust a few of them in merge-base documentation to work around them.
- Fixed a minor regression in "git submodule" that was introduced when more helper functions were reimplemented in C. (merge 77b63ac31e sb/submodule-ignore-trailing-slash later to maint).
- The code that we have used for the past 10+ years to cycle 4-element ring buffers turns out to be not quite portable in theoretical world. (merge bb84735c80 rs/ring-buffer-wraparound later to maint).
- "git daemon" used fixed-length buffers to turn URLs to the repository the client asked for into the server side directory paths, using snprintf() to avoid overflowing these buffers, but allowed possibly truncated paths to the directory. This has been tightened to reject such a request that causes an overlong path to be served. (merge 6bdb0083be jk/daemon-path-ok-check-truncation later to maint).
- Recent update to git-sh-setup (a library of shell functions that are used by our in-tree scripted Porcelain commands) included another shell library git-sh-i18n without specifying where it is, relying on the $PATH. This has been fixed to be more explicit by prefixing with $(git --exec-path) output. (merge 1073094f30 ak/sh-setup-dot-source-i18n-fix later to maint).
- Fix for a racy false-positive test failure. (merge fdf4f6c79b as/merge-attr-sleep later to maint).
- Portability update and workaround for builds on recent Mac OS X. (merge a296bc0132 ls/macos-update later to maint).
- Using a %(HEAD) placeholder in "for-each-ref --format=" option caused the command to segfault when on an unborn branch. (merge 84679d470d jc/for-each-ref-head-segfault-fix later to maint).
- "git rebase -i" did not work well with the core.commentchar configuration variable for two reasons, both of which have been fixed. (merge 882cd23777 js/rebase-i-commentchar-fix later to maint).
- Other minor doc, test and build updates and code cleanups. (merge 5c238e29a8 jk/common-main later to maint). (merge 5a5749e45b ak/pre-receive-hook-template-modefix later to maint). (merge 6d834ac8f1 jk/rebase-config-insn-fmt-docfix later to maint). (merge de9f7fa3b0 rs/commit-pptr-simplify later to maint). (merge 4259d693fc sc/fmt-merge-msg-doc-markup-fix later to maint). (merge 28fab7b23d nd/test-helpers later to maint). (merge c2bb0c1d1e rs/cocci later to maint). (merge 3285b7badb ps/common-info-doc later to maint). (merge 2b090822e8 nd/worktree-lock later to maint). (merge 4bd488ea7c jk/create-branch-remove-unused-param later to maint). (merge 974e0044d6 tk/diffcore-delta-remove-unused later to maint).
2.11.1
Git v2.11.1 Release Notes =========================
Fixes since v2.11 -----------------
- The default Travis-CI configuration specifies newer P4 and GitLFS.
- The character width table has been updated to match Unicode 9.0
- Update the isatty() emulation for Windows by updating the previous hack that depended on internals of (older) MSVC runtime.
- "git rev-parse --symbolic" failed with a more recent notation like "HEAD^-1" and "HEAD^!".
- An empty directory in a working tree that can simply be nuked used to interfere while merging or cherry-picking a change to create a submodule directory there, which has been fixed..
- The code in "git push" to compute if any commit being pushed in the superproject binds a commit in a submodule that hasn’t been pushed out was overly inefficient, making it unusable even for a small project that does not have any submodule but have a reasonable number of refs.
- "git push --dry-run --recurse-submodule=on-demand" wasn’t "--dry-run" in the submodules.
- The output from "git worktree list" was made in readdir() order, and was unstable.
- mergetool.<tool>.trustExitCode configuration variable did not apply to built-in tools, but now it does.
- "git p4" LFS support was broken when LFS stores an empty blob.
- Fix a corner case in merge-recursive regression that crept in during 2.10 development cycle.
- Update the error messages from the dumb-http client when it fails to obtain loose objects; we used to give sensible error message only upon 404 but we now forbid unexpected redirects that needs to be reported with something sensible.
- When diff.renames configuration is on (and with Git 2.9 and later, it is enabled by default, which made it worse), "git stash" misbehaved if a file is removed and another file with a very similar content is added.
- "git diff --no-index" did not take "--no-abbrev" option.
- "git difftool --dir-diff" had a minor regression when started from a subdirectory, which has been fixed.
- "git commit --allow-empty --only" (no pathspec) with dirty index ought to be an acceptable way to create a new commit that does not change any paths, but it was forbidden, perhaps because nobody needed it so far.
- A pathname that begins with "//" or "\" on Windows is special but path normalization logic was unaware of it.
- "git pull --rebase", when there is no new commits on our side since we forked from the upstream, should be able to fast-forward without invoking "git rebase", but it didn’t.
- The way to specify hotkeys to "xxdiff" that is used by "git mergetool" has been modernized to match recent versions of xxdiff.
- Unlike "git am --abort", "git cherry-pick --abort" moved HEAD back to where cherry-pick started while picking multiple changes, when the cherry-pick stopped to ask for help from the user, and the user did "git reset --hard" to a different commit in order to re-attempt the operation.
- Code cleanup in shallow boundary computation.
- A recent update to receive-pack to make it easier to drop garbage objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot have a pathname with a colon in it (no surprise!), and this in turn made it impossible to push into a repository at such a path. This has been fixed by introducing a quoting mechanism used when appending such a path to the colon-separated list.
- The function usage_msg_opt() has been updated to say "fatal:" before the custom message programs give, when they want to die with a message about wrong command line options followed by the standard usage string.
- "git index-pack --stdin" needs an access to an existing repository, but "git index-pack file.pack" to generate an .idx file that corresponds to a packfile does not.
- Fix for NDEBUG builds.
- A lazy "git push" without refspec did not internally use a fully specified refspec to perform ’current’, ’simple’, or ’upstream’ push, causing unnecessary "ambiguous ref" errors.
- "git p4" misbehaved when swapping a directory and a symbolic link.
- Even though an fix was attempted in Git 2.9.3 days, but running "git difftool --dir-diff" from a subdirectory never worked. This has been fixed.
- "git p4" that tracks multiple p4 paths imported a single changelist that touches files in these multiple paths as one commit, followed by many empty commits. This has been fixed.
- A potential but unlikely buffer overflow in Windows port has been fixed.
- When the http server gives an incomplete response to a smart-http rpc call, it could lead to client waiting for a full response that will never come. Teach the client side to notice this condition and abort the transfer.
- Some platforms no longer understand "latin-1" that is still seen in the wild in e-mail headers; replace them with "iso-8859-1" that is more widely known when conversion fails from/to it.
- Update the procedure to generate "tags" for developer support.
- Update the definition of the MacOSX test environment used by TravisCI.
- A few git-svn updates.
- Compression setting for producing packfiles were spread across three codepaths, one of which did not honor any configuration. Unify these so that all of them honor core.compression and pack.compression variables the same way.
- "git fast-import" sometimes mishandled while rebalancing notes tree, which has been fixed.
- Recent update to the default abbreviation length that auto-scales lacked documentation update, which has been corrected.
- Leakage of lockfiles in the config subsystem has been fixed.
- It is natural that "git gc --auto" may not attempt to pack everything into a single pack, and there is no point in warning when the user has configured the system to use the pack bitmap, leading to disabling further "gc".
- "git archive" did not read the standard configuration files, and failed to notice a file that is marked as binary via the userdiff driver configuration.
- "git blame --porcelain" misidentified the "previous" <commit, path> pair (aka "source") when contents came from two or more files.
- "git rebase -i" with a recent update started showing an incorrect count when squashing more than 10 commits.
- "git <cmd> @{push}" on a detached HEAD used to segfault; it has been corrected to error out with a message.
- Tighten a test to avoid mistaking an extended ERE regexp engine as a PRE regexp engine.
- Typing ^C to pager, which usually does not kill it, killed Git and took the pager down as a collateral damage in certain process-tree structure. This has been fixed.
Also contains various documentation updates and code clean-ups.
2.11.2
Git v2.11.2 Release Notes =========================
Fixes since v2.11.1 -------------------
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
2.11.3
Git v2.11.3 Release Notes =========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.11.4
Git v2.11.4 Release Notes =========================
Fixes since v2.11.3 -------------------
- "git cvsserver" no longer is invoked by "git daemon" by default, as it is old and largely unmaintained.
- Various Perl scripts did not use safe_pipe_capture() instead of backticks, leaving them susceptible to end-user input. They have been corrected.
Credits go to joernchen <joernchen@phenoelit.de> for finding the unsafe constructs in "git cvsserver", and to Jeff King at GitHub for finding and fixing instances of the same issue in other scripts.
2.12.0
Git 2.12 Release Notes ======================
Backward compatibility notes.
- Use of an empty string that is used for ’everything matches’ is still warned and Git asks users to use a more explicit ’.’ for that instead. The hope is that existing users will not mind this change, and eventually the warning can be turned into a hard error, upgrading the deprecation into removal of this (mis)feature. That is not scheduled to happen in the upcoming release (yet).
- The historical argument order "git merge <msg> HEAD <commit>…" has been deprecated for quite some time, and will be removed in a future release.
- An ancient script "git relink" has been removed.
Updates since v2.11 -------------------
UI, Workflows & Features
- Various updates to "git p4".
- "git p4" didn’t interact with the internal of .git directory correctly in the modern "git-worktree"-enabled world.
- "git branch --list" and friends learned "--ignore-case" option to optionally sort branches and tags case insensitively.
- In addition to %(subject), %(body), "log --pretty=format:…" learned a new placeholder %(trailers).
- "git rebase" learned "--quit" option, which allows a user to remove the metadata left by an earlier "git rebase" that was manually aborted without using "git rebase --abort".
- "git clone --reference $there --recurse-submodules $super" has been taught to guess repositories usable as references for submodules of $super that are embedded in $there while making a clone of the superproject borrow objects from $there; extend the mechanism to also allow submodules of these submodules to borrow repositories embedded in these clones of the submodules embedded in the clone of the superproject.
- Porcelain scripts written in Perl are getting internationalized.
- "git merge --continue" has been added as a synonym to "git commit" to conclude a merge that has stopped due to conflicts.
- Finer-grained control of what protocols are allowed for transports during clone/fetch/push have been enabled via a new configuration mechanism.
- "git shortlog" learned "--committer" option to group commits by committer, instead of author.
- GitLFS integration with "git p4" has been updated.
- The isatty() emulation for Windows has been updated to eradicate the previous hack that depended on internals of (older) MSVC runtime.
- Some platforms no longer understand "latin-1" that is still seen in the wild in e-mail headers; replace them with "iso-8859-1" that is more widely known when conversion fails from/to it.
- "git grep" has been taught to optionally recurse into submodules.
- "git rm" used to refuse to remove a submodule when it has its own git repository embedded in its working tree. It learned to move the repository away to $GIT_DIR/modules/ of the superproject instead, and allow the submodule to be deleted (as long as there will be no loss of local modifications, that is).
- A recent updates to "git p4" was not usable for older p4 but it could be made to work with minimum changes. Do so.
- "git diff" learned diff.interHunkContext configuration variable that gives the default value for its --inter-hunk-context option.
- The prereleaseSuffix feature of version comparison that is used in "git tag -l" did not correctly when two or more prereleases for the same release were present (e.g. when 2.0, 2.0-beta1, and 2.0-beta2 are there and the code needs to compare 2.0-beta1 and 2.0-beta2).
- "git submodule push" learned "--recurse-submodules=only option to push submodules out without pushing the top-level superproject.
- "git tag" and "git verify-tag" learned to put GPG verification status in their "--format=<placeholders>" output format.
- An ancient repository conversion tool left in contrib/ has been removed.
- "git show-ref HEAD" used with "--verify" because the user is not interested in seeing refs/remotes/origin/HEAD, and used with "--head" because the user does not want HEAD to be filtered out, i.e. "git show-ref --head --verify HEAD", did not work as expected.
- "git submodule add" used to be confused and refused to add a locally created repository; users can now use "--force" option to add them. (merge 619acfc78c sb/submodule-add-force later to maint).
- Some people feel the default set of colors used by "git log --graph" rather limiting. A mechanism to customize the set of colors has been introduced.
- "git read-tree" and its underlying unpack_trees() machinery learned to report problematic paths prefixed with the --super-prefix option.
- When a submodule "A", which has another submodule "B" nested within it, is "absorbed" into the top-level superproject, the inner submodule "B" used to be left in a strange state. The logic to adjust the .git pointers in these submodules has been corrected.
- The user can specify a custom update method that is run when "submodule update" updates an already checked out submodule. This was ignored when checking the submodule out for the first time and we instead always just checked out the commit that is bound to the path in the superproject’s index.
- The command line completion (in contrib/) learned that "git diff --submodule=" can take "diff" as a recently added option.
- The "core.logAllRefUpdates" that used to be boolean has been enhanced to take ’always’ as well, to record ref updates to refs other than the ones that are expected to be updated (i.e. branches, remote-tracking branches and notes).
- Comes with more command line completion (in contrib/) for recently introduced options.
Performance, Internal Implementation, Development Support etc.
- Commands that operate on a log message and add lines to the trailer blocks, such as "format-patch -s", "cherry-pick (-x|-s)", and "commit -s", have been taught to use the logic of and share the code with "git interpret-trailer".
- The default Travis-CI configuration specifies newer P4 and GitLFS.
- The "fast hash" that had disastrous performance issues in some corner cases has been retired from the internal diff.
- The character width table has been updated to match Unicode 9.0
- Update the procedure to generate "tags" for developer support.
- The codeflow of setting NOATIME and CLOEXEC on file descriptors Git opens has been simplified.
- "git diff" and its family had two experimental heuristics to shift the contents of a hunk to make the patch easier to read. One of them turns out to be better than the other, so leave only the "--indent-heuristic" option and remove the other one.
- A new submodule helper "git submodule embedgitdirs" to make it easier to move embedded .git/ directory for submodules in a superproject to .git/modules/ (and point the latter with the former that is turned into a "gitdir:" file) has been added.
- "git push \serversharedir" has recently regressed and then fixed. A test has retroactively been added for this breakage.
- Build updates for Cygwin.
- The implementation of "real_path()" was to go there with chdir(2) and call getcwd(3), but this obviously wouldn’t be usable in a threaded environment. Rewrite it to manually resolve relative paths including symbolic links in path components.
- Adjust documentation to help AsciiDoctor render better while not breaking the rendering done by AsciiDoc.
- The sequencer machinery has been further enhanced so that a later set of patches can start using it to reimplement "rebase -i".
- Update the definition of the MacOSX test environment used by TravisCI.
- Rewrite a scripted porcelain "git difftool" in C.
- "make -C t failed" will now run only the tests that failed in the previous run. This is usable only when prove is not use, and gives a useless error message when run after "make clean", but otherwise is serviceable.
- "uchar [40]" to "struct object_id" conversion continues.
Also contains various documentation updates and code clean-ups.
Fixes since v2.10 -----------------
Unless otherwise noted, all the fixes since v2.9 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- We often decide if a session is interactive by checking if the standard I/O streams are connected to a TTY, but isatty() that comes with Windows incorrectly returned true if it is used on NUL (i.e. an equivalent to /dev/null). This has been fixed.
- "git svn" did not work well with path components that are "0", and some configuration variable it uses were not documented.
- "git rev-parse --symbolic" failed with a more recent notation like "HEAD^-1" and "HEAD^!".
- An empty directory in a working tree that can simply be nuked used to interfere while merging or cherry-picking a change to create a submodule directory there, which has been fixed..
- The code in "git push" to compute if any commit being pushed in the superproject binds a commit in a submodule that hasn’t been pushed out was overly inefficient, making it unusable even for a small project that does not have any submodule but have a reasonable number of refs.
- "git push --dry-run --recurse-submodule=on-demand" wasn’t "--dry-run" in the submodules.
- The output from "git worktree list" was made in readdir() order, and was unstable.
- mergetool.<tool>.trustExitCode configuration variable did not apply to built-in tools, but now it does.
- "git p4" LFS support was broken when LFS stores an empty blob.
- A corner case in merge-recursive regression that crept in during 2.10 development cycle has been fixed.
- Transport with dumb http can be fooled into following foreign URLs that the end user does not intend to, especially with the server side redirects and http-alternates mechanism, which can lead to security issues. Tighten the redirection and make it more obvious to the end user when it happens.
- Update the error messages from the dumb-http client when it fails to obtain loose objects; we used to give sensible error message only upon 404 but we now forbid unexpected redirects that needs to be reported with something sensible.
- When diff.renames configuration is on (and with Git 2.9 and later, it is enabled by default, which made it worse), "git stash" misbehaved if a file is removed and another file with a very similar content is added.
- "git diff --no-index" did not take "--no-abbrev" option.
- "git difftool --dir-diff" had a minor regression when started from a subdirectory, which has been fixed.
- "git commit --allow-empty --only" (no pathspec) with dirty index ought to be an acceptable way to create a new commit that does not change any paths, but it was forbidden, perhaps because nobody needed it so far.
- Git 2.11 had a minor regression in "merge --ff-only" that competed with another process that simultaneously attempted to update the index. We used to explain what went wrong with an error message, but the new code silently failed. The error message has been resurrected.
- A pathname that begins with "//" or "\" on Windows is special but path normalization logic was unaware of it.
- "git pull --rebase", when there is no new commits on our side since we forked from the upstream, should be able to fast-forward without invoking "git rebase", but it didn’t.
- The way to specify hotkeys to "xxdiff" that is used by "git mergetool" has been modernized to match recent versions of xxdiff.
- Unlike "git am --abort", "git cherry-pick --abort" moved HEAD back to where cherry-pick started while picking multiple changes, when the cherry-pick stopped to ask for help from the user, and the user did "git reset --hard" to a different commit in order to re-attempt the operation.
- Code cleanup in shallow boundary computation.
- A recent update to receive-pack to make it easier to drop garbage objects made it clear that GIT_ALTERNATE_OBJECT_DIRECTORIES cannot have a pathname with a colon in it (no surprise!), and this in turn made it impossible to push into a repository at such a path. This has been fixed by introducing a quoting mechanism used when appending such a path to the colon-separated list.
- The function usage_msg_opt() has been updated to say "fatal:" before the custom message programs give, when they want to die with a message about wrong command line options followed by the standard usage string.
- "git index-pack --stdin" needs an access to an existing repository, but "git index-pack file.pack" to generate an .idx file that corresponds to a packfile does not.
- Fix for NDEBUG builds.
- A lazy "git push" without refspec did not internally use a fully specified refspec to perform ’current’, ’simple’, or ’upstream’ push, causing unnecessary "ambiguous ref" errors.
- "git p4" misbehaved when swapping a directory and a symbolic link.
- Even though an fix was attempted in Git 2.9.3 days, but running "git difftool --dir-diff" from a subdirectory never worked. This has been fixed.
- "git p4" that tracks multiple p4 paths imported a single changelist that touches files in these multiple paths as one commit, followed by many empty commits. This has been fixed.
- A potential but unlikely buffer overflow in Windows port has been fixed.
- When the http server gives an incomplete response to a smart-http rpc call, it could lead to client waiting for a full response that will never come. Teach the client side to notice this condition and abort the transfer.
- Compression setting for producing packfiles were spread across three codepaths, one of which did not honor any configuration. Unify these so that all of them honor core.compression and pack.compression variables the same way.
- "git fast-import" sometimes mishandled while rebalancing notes tree, which has been fixed.
- Recent update to the default abbreviation length that auto-scales lacked documentation update, which has been corrected.
- Leakage of lockfiles in the config subsystem has been fixed.
- It is natural that "git gc --auto" may not attempt to pack everything into a single pack, and there is no point in warning when the user has configured the system to use the pack bitmap, leading to disabling further "gc".
- "git archive" did not read the standard configuration files, and failed to notice a file that is marked as binary via the userdiff driver configuration.
- "git blame --porcelain" misidentified the "previous" <commit, path> pair (aka "source") when contents came from two or more files.
- "git rebase -i" with a recent update started showing an incorrect count when squashing more than 10 commits.
- "git <cmd> @{push}" on a detached HEAD used to segfault; it has been corrected to error out with a message.
- Running "git add a/b" when "a" is a submodule correctly errored out, but without a meaningful error message. (merge 2d81c48fa7 sb/pathspec-errors later to maint).
- Typing ^C to pager, which usually does not kill it, killed Git and took the pager down as a collateral damage in certain process-tree structure. This has been fixed.
- "git mergetool" without any pathspec on the command line that is run from a subdirectory became no-op in Git v2.11 by mistake, which has been fixed.
- Retire long unused/unmaintained gitview from the contrib/ area. (merge 3120925c25 sb/remove-gitview later to maint).
- Tighten a test to avoid mistaking an extended ERE regexp engine as a PRE regexp engine.
- An error message with an ASCII control character like ’r’ in it can alter the message to hide its early part, which is problematic when a remote side gives such an error message that the local side will relay with a "remote: " prefix. (merge f290089879 jk/vreport-sanitize later to maint).
- "git fsck" inspects loose objects more carefully now. (merge cce044df7f jk/loose-object-fsck later to maint).
- A crashing bug introduced in v2.11 timeframe has been found (it is triggerable only in fast-import) and fixed. (merge abd5a00268 jk/clear-delta-base-cache-fix later to maint).
- With an anticipatory tweak for remotes defined in ~/.gitconfig (e.g. "remote.origin.prune" set to true, even though there may or may not actually be "origin" remote defined in a particular Git repository), "git remote rename" and other commands misinterpreted and behaved as if such a non-existing remote actually existed. (merge e459b073fb js/remote-rename-with-half-configured-remote later to maint).
- A few codepaths had to rely on a global variable when sorting elements of an array because sort(3) API does not allow extra data to be passed to the comparison function. Use qsort_s() when natively available, and a fallback implementation of it when not, to eliminate the need, which is a prerequisite for making the codepath reentrant.
- "git fsck --connectivity-check" was not working at all. (merge a2b22854bd jk/fsck-connectivity-check-fix later to maint).
- After starting "git rebase -i", which first opens the user’s editor to edit the series of patches to apply, but before saving the contents of that file, "git status" failed to show the current state (i.e. you are in an interactive rebase session, but you have applied no steps yet) correctly. (merge df9ded4984 js/status-pre-rebase-i later to maint).
- Test tweak for FreeBSD where /usr/bin/unzip is unsuitable to run our tests but /usr/local/bin/unzip is usable. (merge d98b2c5fce js/unzip-in-usr-bin-workaround later to maint).
- "git p4" did not work well with multiple git-p4.mapUser entries on Windows. (merge c3c2b05776 gv/mingw-p4-mapuser later to maint).
- "git help" enumerates executable files in $PATH; the implementation of "is this file executable?" on Windows has been optimized. (merge c755015f79 hv/mingw-help-is-executable later to maint).
- Test tweaks for those who have default ACL in their git source tree that interfere with the umask test. (merge d549d21307 mm/reset-facl-before-umask-test later to maint).
- Names of the various hook scripts must be spelled exactly, but on Windows, an .exe binary must be named with .exe suffix; notice $GIT_DIR/hooks/<hookname>.exe as a valid <hookname> hook. (merge 235be51fbe js/mingw-hooks-with-exe-suffix later to maint).
- Asciidoctor, an alternative reimplementation of AsciiDoc, still needs some changes to work with documents meant to be formatted with AsciiDoc. "make USE_ASCIIDOCTOR=YesPlease" to use it out of the box to document our pages is getting closer to reality.
- Correct command line completion (in contrib/) on "git svn" (merge 2cbad17642 ew/complete-svn-authorship-options later to maint).
- Incorrect usage help message for "git worktree prune" has been fixed. (merge 2488dcab22 ps/worktree-prune-help-fix later to maint).
- Adjust a perf test to new world order where commands that do require a repository are really strict about having a repository. (merge c86000c1a7 rs/p5302-create-repositories-before-tests later to maint).
- "git log --graph" did not work well with "--name-only", even though other forms of "diff" output were handled correctly. (merge f5022b5fed jk/log-graph-name-only later to maint).
- The push-options given via the "--push-options" option were not passed through to external remote helpers such as "smart HTTP" that are invoked via the transport helper.
- The documentation explained what "git stash" does to the working tree (after stashing away the local changes) in terms of "reset --hard", which was exposing an unnecessary implementation detail. (merge 20a7e06172 tg/stash-doc-cleanup later to maint).
- When "git p4" imports changelist that removes paths, it failed to convert pathnames when the p4 used encoding different from the one used on the Git side. This has been corrected. (merge a8b05162e8 ls/p4-path-encoding later to maint).
- A new coccinelle rule that catches a check of !pointer before the pointer is free(3)d, which most likely is a bug. (merge ec6cd14c7a rs/cocci-check-free-only-null later to maint).
- "ls-files" run with pathspec has been micro-optimized to avoid having to memmove(3) unnecessary bytes. (merge 96f6d3f61a rs/ls-files-partial-optim later to maint).
- A hotfix for a topic already in ’master’. (merge a4d92d579f js/mingw-isatty later to maint).
- Other minor doc, test and build updates and code cleanups. (merge f2627d9b19 sb/submodule-config-cleanup later to maint). (merge 384f1a167b sb/unpack-trees-cleanup later to maint). (merge 874444b704 rh/diff-orderfile-doc later to maint). (merge eafd5d9483 cw/doc-sign-off later to maint). (merge 0aaad415bc rs/absolute-pathdup later to maint). (merge 4432dd6b5b rs/receive-pack-cleanup later to maint). (merge 540a398e9c sg/mailmap-self later to maint). (merge 209df269a6 nd/rev-list-all-includes-HEAD-doc later to maint). (merge 941b9c5270 sb/doc-unify-bottom later to maint). (merge 2aaf37b62c jk/doc-remote-helpers-markup-fix later to maint). (merge e91461b332 jk/doc-submodule-markup-fix later to maint). (merge 8ab9740d9f dp/submodule-doc-markup-fix later to maint). (merge 0838cbc22f jk/tempfile-ferror-fclose-confusion later to maint). (merge 115a40add6 dr/doc-check-ref-format-normalize later to maint). (merge 133f0a299d gp/document-dotfiles-in-templates-are-not-copied later to maint). (merge 2b35a9f4c7 bc/blame-doc-fix later to maint). (merge 7e82388024 ps/doc-gc-aggressive-depth-update later to maint). (merge 9993a7c5f1 bc/worktree-doc-fix-detached later to maint). (merge e519eccdf4 rt/align-add-i-help-text later to maint).
2.12.1
Git v2.12.1 Release Notes =========================
Fixes since v2.12 -----------------
- Reduce authentication round-trip over HTTP when the server supports just a single authentication method. This also improves the behaviour when Git is misconfigured to enable http.emptyAuth against a server that does not authenticate without a username (i.e. not using Kerberos etc., which makes http.emptyAuth pointless).
- Windows port wants to use OpenSSL’s implementation of SHA-1 routines, so let them.
- Add 32-bit Linux variant to the set of platforms to be tested with Travis CI.
- When a redirected http transport gets an error during the redirected request, we ignored the error we got from the server, and ended up giving a not-so-useful error message.
- The patch subcommand of "git add -i" was meant to have paths selection prompt just like other subcommand, unlike "git add -p" directly jumps to hunk selection. Recently, this was broken and "add -i" lost the paths selection dialog, but it now has been fixed.
- Git v2.12 was shipped with an embarrassing breakage where various operations that verify paths given from the user stopped dying when seeing an issue, and instead later triggering segfault.
- The code to parse "git log -L…" command line was buggy when there are many ranges specified with -L; overrun of the allocated buffer has been fixed.
- The command-line parsing of "git log -L" copied internal data structures using incorrect size on ILP32 systems.
Also contains various documentation updates and code clean-ups.
2.12.2
Git v2.12.2 Release Notes =========================
Fixes since v2.12.1 -------------------
- "git status --porcelain" is supposed to give a stable output, but a few strings were left as translatable by mistake.
- "Dumb http" transport used to misparse a nonsense http-alternates response, which has been fixed.
- "git diff --quiet" relies on the size field in diff_filespec to be correctly populated, but diff_populate_filespec() helper function made an incorrect short-cut when asked only to populate the size field for paths that need to go through convert_to_git() (e.g. CRLF conversion).
- There is no need for Python only to give a few messages to the standard error stream, but we somehow did.
- A leak in a codepath to read from a packed object in (rare) cases has been plugged.
- "git upload-pack", which is a counter-part of "git fetch", did not report a request for a ref that was not advertised as invalid. This is generally not a problem (because "git fetch" will stop before making such a request), but is the right thing to do.
- A "gc.log" file left by a backgrounded "gc --auto" disables further automatic gc; it has been taught to run at least once a day (by default) by ignoring a stale "gc.log" file that is too old.
- "git remote rm X", when a branch has remote X configured as the value of its branch..remote, tried to remove branch..remote and branch.*.merge and failed if either is unset.
- A caller of tempfile API that uses stdio interface to write to files may ignore errors while writing, which is detected when tempfile is closed (with a call to ferror()). By that time, the original errno that may have told us what went wrong is likely to be long gone and was overwritten by an irrelevant value. close_tempfile() now resets errno to EIO to make errno at least predictable.
- "git show-branch" expected there were only very short branch names in the repository and used a fixed-length buffer to hold them without checking for overflow.
- The code that parses header fields in the commit object has been updated for (micro)performance and code hygiene.
- A test that creates a confusing branch whose name is HEAD has been corrected not to do so.
- "Cc:" on the trailer part does not have to conform to RFC strictly, unlike in the e-mail header. "git send-email" has been updated to ignore anything after ’>’ when picking addresses, to allow non-address cruft like " # stable 4.4" after the address.
- "git push" had a handful of codepaths that could lead to a deadlock when unexpected error happened, which has been fixed.
- Code to read submodule.<name>.ignore config did not state the variable name correctly when giving an error message diagnosing misconfiguration.
- "git ls-remote" and "git archive --remote" are designed to work without being in a directory under Git’s control. However, recent updates revealed that we randomly look into a directory called .git/ without actually doing necessary set-up when working in a repository. Stop doing so.
- The code to parse the command line "git grep <patterns>… <rev> [[--] <pathspec>…]" has been cleaned up, and a handful of bugs have been fixed (e.g. we used to check "--" if it is a rev).
- The code to parse "git -c VAR=VAL cmd" and set configuration variable for the duration of cmd had two small bugs, which have been fixed. This supersedes jc/config-case-cmdline topic that has been discarded.
Also contains various documentation updates and code clean-ups.
2.12.3
Git v2.12.3 Release Notes =========================
Fixes since v2.12.2 -------------------
- The "parse_config_key()" API function has been cleaned up.
- An helper function to make it easier to append the result from real_path() to a strbuf has been added.
- The t/perf performance test suite was not prepared to test not so old versions of Git, but now it covers versions of Git that are not so ancient.
- Picking two versions of Git and running tests to make sure the older one and the newer one interoperate happily has now become possible.
- Teach the "debug" helper used in the test framework that allows a command to run under "gdb" to make the session interactive.
- "git repack --depth=<n>" for a long time busted the specified depth when reusing delta from existing packs. This has been corrected.
- user.email that consists of only cruft chars should consistently error out, but didn’t.
- A few tests were run conditionally under (rare) conditions where they cannot be run (like running cvs tests under ’root’ account).
- "git branch @" created refs/heads/@ as a branch, and in general the code that handled @{-1} and @{upstream} was a bit too loose in disambiguating.
- "git fetch" that requests a commit by object name, when the other side does not allow such an request, failed without much explanation.
- "git filter-branch --prune-empty" drops a single-parent commit that becomes a no-op, but did not drop a root commit whose tree is empty.
- Recent versions of Git treats http alternates (used in dumb http transport) just like HTTP redirects and requires the client to enable following it, due to security concerns. But we forgot to give a warning when we decide not to honor the alternates.
- NO_PTHREADS build has been broken for some time; now fixed.
- Fix for potential segv introduced in v2.11.0 and later (also v2.10.2).
- A few unterminated here documents in tests were fixed, which in turn revealed incorrect expectations the tests make. These tests have been updated.
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
Also contains various documentation updates and code clean-ups.
2.12.4
Git v2.12.4 Release Notes =========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.12.5
Git v2.12.5 Release Notes =========================
Fixes since v2.12.4 -------------------
- "git cvsserver" no longer is invoked by "git daemon" by default, as it is old and largely unmaintained.
- Various Perl scripts did not use safe_pipe_capture() instead of backticks, leaving them susceptible to end-user input. They have been corrected.
Credits go to joernchen <joernchen@phenoelit.de> for finding the unsafe constructs in "git cvsserver", and to Jeff King at GitHub for finding and fixing instances of the same issue in other scripts.
2.13.0
Git 2.13 Release Notes ======================
Backward compatibility notes.
- Use of an empty string as a pathspec element that is used for ’everything matches’ is still warned and Git asks users to use a more explicit ’.’ for that instead. The hope is that existing users will not mind this change, and eventually the warning can be turned into a hard error, upgrading the deprecation into removal of this (mis)feature. That is not scheduled to happen in the upcoming release (yet).
- The historical argument order "git merge <msg> HEAD <commit>…" has been deprecated for quite some time, and is now removed.
- The default location "
/.git-credential-cache/socket" for the socket used to communicate with the credential-cache daemon has been moved to "/.cache/git/credential/socket".
- Git now avoids blindly falling back to ".git" when the setup sequence said we are not in Git repository. A corner case that happens to work right now may be broken by a call to die("BUG"). We’ve tried hard to locate such cases and fixed them, but there might still be cases that need to be addressed—bug reports are greatly appreciated.
Updates since v2.12 -------------------
UI, Workflows & Features
- "git describe" and "git name-rev" have been taught to take more than one refname patterns to restrict the set of refs to base their naming output on, and also learned to take negative patterns to name refs not to be used for naming via their "--exclude" option.
- Deletion of a branch "foo/bar" could remove .git/refs/heads/foo once there no longer is any other branch whose name begins with "foo/", but we didn’t do so so far. Now we do.
- When "git merge" detects a path that is renamed in one history while the other history deleted (or modified) it, it now reports both paths to help the user understand what is going on in the two histories being merged.
- The <url> part in "http.<url>.<variable>" configuration variable can now be spelled with ’’ that serves as wildcard. E.g. "http.https://.example.com.proxy" can be used to specify the proxy used for https://a.example.com, https://b.example.com, etc., i.e. any host in the example.com domain.
- "git tag" did not leave useful message when adding a new entry to reflog; this was left unnoticed for a long time because refs/tags/* doesn’t keep reflog by default.
- The "negative" pathspec feature was somewhat more cumbersome to use than necessary in that its short-hand used "!" which needed to be escaped from shells, and it required "exclude from what?" specified.
- The command line options for ssh invocation needs to be tweaked for some implementations of SSH (e.g. PuTTY plink wants "-P <port>" while OpenSSH wants "-p <port>" to specify port to connect to), and the variant was guessed when GIT_SSH environment variable is used to specify it. The logic to guess now applies to the command specified by the newer GIT_SSH_COMMAND and also core.sshcommand configuration variable, and comes with an escape hatch for users to deal with misdetected cases.
- The "--git-path", "--git-common-dir", and "--shared-index-path" options of "git rev-parse" did not produce usable output. They are now updated to show the path to the correct file, relative to where the caller is.
- "git diff -W" has been taught to handle the case where a new function is added at the end of the file better.
- "git update-ref -d" and other operations to delete references did not leave any entry in HEAD’s reflog when the reference being deleted was the current branch. This is not a problem in practice because you do not want to delete the branch you are currently on, but caused renaming of the current branch to something else not to be logged in a useful way.
- "Cc:" on the trailer part does not have to conform to RFC strictly, unlike in the e-mail header. "git send-email" has been updated to ignore anything after ’>’ when picking addresses, to allow non-address cruft like " # stable 4.4" after the address.
- When "git submodule init" decides that the submodule in the working tree is its upstream, it now gives a warning as it is not a very common setup.
- "git stash push" takes a pathspec so that the local changes can be stashed away only partially.
- Documentation for "git ls-files" did not refer to core.quotePath.
- The experimental "split index" feature has gained a few configuration variables to make it easier to use.
- From a working tree of a repository, a new option of "rev-parse" lets you ask if the repository is used as a submodule of another project, and where the root level of the working tree of that project (i.e. your superproject) is.
- The pathspec mechanism learned to further limit the paths that match the pattern to those that have specified attributes attached via the gitattributes mechanism.
- Our source code has used the SHA1_HEADER cpp macro after "#include" in the C code to switch among the SHA-1 implementations. Instead, list the exact header file names and switch among implementations using "#ifdef BLK_SHA1/#include "block-sha1/sha1.h"/…/#endif"; this helps some IDE tools.
- The start-up sequence of "git" needs to figure out some configured settings before it finds and set itself up in the location of the repository and was quite messy due to its "chicken-and-egg" nature. The code has been restructured.
- The command line prompt (in contrib/) learned a new ’tag’ style that can be specified with GIT_PS1_DESCRIBE_STYLE, to describe a detached HEAD with "git describe --tags".
- The configuration file learned a new "includeIf.<condition>.path" that includes the contents of the given path only when the condition holds. This allows you to say "include this work-related bit only in the repositories under my ~/work/ directory".
- Recent update to "rebase -i" started showing a message that is not a warning with "warning:" prefix by mistake. This has been fixed.
- Recently we started passing the "--push-options" through the external remote helper interface; now the "smart HTTP" remote helper understands what to do with the passed information.
- "git describe --dirty" dies when it cannot be determined if the state in the working tree matches that of HEAD (e.g. broken repository or broken submodule). The command learned a new option "git describe --broken" to give "$name-broken" (where $name is the description of HEAD) in such a case.
- "git checkout" is taught the "--recurse-submodules" option.
- Recent enhancement to "git stash push" command to support pathspec to allow only a subset of working tree changes to be stashed away was found to be too chatty and exposed the internal implementation detail (e.g. when it uses reset to match the index to HEAD before doing other things, output from reset seeped out). These, and other chattyness has been fixed.
- "git merge <message> HEAD <commit>" syntax that has been deprecated since October 2007 has been removed.
- The refs completion for large number of refs has been sped up, partly by giving up disambiguating ambiguous refs and partly by eliminating most of the shell processing between ’git for-each-ref’ and ’ls-remote’ and Bash’s completion facility.
- On many keyboards, typing "@{" involves holding down SHIFT key and one can easily end up with "@{Up…" when typing "@{upstream}". As the upstream/push keywords do not appear anywhere else in the syntax, we can safely accept them case insensitively without introducing ambiguity or confusion to solve this.
- "git tag/branch/for-each-ref" family of commands long allowed to filter the refs by "--contains X" (show only the refs that are descendants of X), "--merged X" (show only the refs that are ancestors of X), "--no-merged X" (show only the refs that are not ancestors of X). One curious omission, "--no-contains X" (show only the refs that are not descendants of X) has been added to them.
- The default behaviour of "git log" in an interactive session has been changed to enable "--decorate".
- The output from "git status --short" has been extended to show various kinds of dirtiness in submodules differently; instead of to "M" for modified, ’m’ and ’?’ can be shown to signal changes only to the working tree of the submodule but not the commit that is checked out.
- Allow the http.postbuffer configuration variable to be set to a size that can be expressed in size_t, which can be larger than ulong on some platforms.
- "git rebase" learns "--signoff" option.
- The completion script (in contrib/) learned to complete "git push --delete b<TAB>" to complete branch name to be deleted.
- "git worktree add --lock" allows to lock a worktree immediately after it’s created. This helps prevent a race between "git worktree add; git worktree lock" and "git worktree prune".
- Completion for "git checkout <branch>" that auto-creates the branch out of a remote tracking branch can now be disabled, as this completion often gets in the way when completing to checkout an existing local branch that happens to share the same prefix with bunch of remote tracking branches.
Performance, Internal Implementation, Development Support etc.
- The code to list branches in "git branch" has been consolidated with the more generic ref-filter API.
- Resource usage while enumerating refs from alternate object store has been optimized to help receiving end of "push" that hosts a repository with many "forks".
- The gitattributes machinery is being taught to work better in a multi-threaded environment.
- "git rebase -i" starts using the recently updated "sequencer" code.
- Code and design clean-up for the refs API.
- The preload-index code has been taught not to bother with the index entries that are paths that are not checked out by "sparse checkout".
- Some warning() messages from "git clean" were updated to show the errno from failed system calls.
- The "parse_config_key()" API function has been cleaned up.
- A test that creates a confusing branch whose name is HEAD has been corrected not to do so.
- The code that parses header fields in the commit object has been updated for (micro)performance and code hygiene.
- An helper function to make it easier to append the result from real_path() to a strbuf has been added.
- Reduce authentication round-trip over HTTP when the server supports just a single authentication method. This also improves the behaviour when Git is misconfigured to enable http.emptyAuth against a server that does not authenticate without a username (i.e. not using Kerberos etc., which makes http.emptyAuth pointless).
- Windows port wants to use OpenSSL’s implementation of SHA-1 routines, so let them.
- The t/perf performance test suite was not prepared to test not so old versions of Git, but now it covers versions of Git that are not so ancient.
- Add 32-bit Linux variant to the set of platforms to be tested with Travis CI.
- "git branch --list" takes the "--abbrev" and "--no-abbrev" options to control the output of the object name in its "-v"(erbose) output, but a recent update started ignoring them; fix it before the breakage reaches to any released version.
- Picking two versions of Git and running tests to make sure the older one and the newer one interoperate happily has now become possible.
- "git tag --contains" used to (ab)use the object bits to keep track of the state of object reachability without clearing them after use; this has been cleaned up and made to use the newer commit-slab facility.
- The "debug" helper used in the test framework learned to run a command under "gdb" interactively.
- The "detect attempt to create collisions" variant of SHA-1 implementation by Marc Stevens (CWI) and Dan Shumow (Microsoft) has been integrated and made the default.
- The test framework learned to detect unterminated here documents.
- The name-hash used for detecting paths that are different only in cases (which matter on case insensitive filesystems) has been optimized to take advantage of multi-threading when it makes sense.
- An earlier version of sha1dc/sha1.c that was merged to ’master’ compiled incorrectly on Windows, which has been fixed.
- "what URL do we want to update this submodule?" and "are we interested in this submodule?" are split into two distinct concepts, and then the way used to express the latter got extended, paving a way to make it easier to manage a project with many submodules and make it possible to later extend use of multiple worktrees for a project with submodules.
- Some debugging output from "git describe" were marked for l10n, but some weren’t. Mark missing ones for l10n.
- Define a new task in .travis.yml that triggers a test session on Windows run elsewhere.
- Conversion from uchar[20] to struct object_id continues.
- The "submodule" specific field in the ref_store structure is replaced with a more generic "gitdir" that can later be used also when dealing with ref_store that represents the set of refs visible from the other worktrees.
- The string-list API used a custom reallocation strategy that was very inefficient, instead of using the usual ALLOC_GROW() macro, which has been fixed. (merge 950a234cbd jh/string-list-micro-optim later to maint).
- In a 2- and 3-way merge of trees, more than one source trees often end up sharing an identical subtree; optimize by not reading the same tree multiple times in such a case. (merge d12a8cf0af jh/unpack-trees-micro-optim later to maint).
- The index file has a trailing SHA-1 checksum to detect file corruption, and historically we checked it every time the index file is used. Omit the validation during normal use, and instead verify only in "git fsck".
- Having a git command on the upstream side of a pipe in a test script will hide the exit status from the command, which may cause us to fail to notice a breakage; rewrite tests in a script to avoid this issue.
- Travis CI learns to run coccicheck.
- "git checkout" that handles a lot of paths has been optimized by reducing the number of unnecessary checks of paths in the has_dir_name() function.
- The internals of the refs API around the cached refs has been streamlined.
- Output from perf tests have been updated to align their titles.
Also contains various documentation updates and code clean-ups.
Fixes since v2.12 -----------------
Unless otherwise noted, all the fixes since v2.12 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git repack --depth=<n>" for a long time busted the specified depth when reusing delta from existing packs. This has been corrected.
- The code to parse the command line "git grep <patterns>… <rev> [[--] <pathspec>…]" has been cleaned up, and a handful of bugs have been fixed (e.g. we used to check "--" if it is a rev).
- "git ls-remote" and "git archive --remote" are designed to work without being in a directory under Git’s control. However, recent updates revealed that we randomly look into a directory called .git/ without actually doing necessary set-up when working in a repository. Stop doing so.
- "git show-branch" expected there were only very short branch names in the repository and used a fixed-length buffer to hold them without checking for overflow.
- A caller of tempfile API that uses stdio interface to write to files may ignore errors while writing, which is detected when tempfile is closed (with a call to ferror()). By that time, the original errno that may have told us what went wrong is likely to be long gone and was overwritten by an irrelevant value. close_tempfile() now resets errno to EIO to make errno at least predictable.
- "git remote rm X", when a branch has remote X configured as the value of its branch..remote, tried to remove branch..remote and branch.*.merge and failed if either is unset.
- A "gc.log" file left by a backgrounded "gc --auto" disables further automatic gc; it has been taught to run at least once a day (by default) by ignoring a stale "gc.log" file that is too old.
- The code to parse "git -c VAR=VAL cmd" and set configuration variable for the duration of cmd had two small bugs, which have been fixed.
- user.email that consists of only cruft chars should consistently error out, but didn’t.
- "git upload-pack", which is a counter-part of "git fetch", did not report a request for a ref that was not advertised as invalid. This is generally not a problem (because "git fetch" will stop before making such a request), but is the right thing to do.
- A leak in a codepath to read from a packed object in (rare) cases has been plugged.
- When a redirected http transport gets an error during the redirected request, we ignored the error we got from the server, and ended up giving a not-so-useful error message.
- The patch subcommand of "git add -i" was meant to have paths selection prompt just like other subcommand, unlike "git add -p" directly jumps to hunk selection. Recently, this was broken and "add -i" lost the paths selection dialog, but it now has been fixed.
- Git v2.12 was shipped with an embarrassing breakage where various operations that verify paths given from the user stopped dying when seeing an issue, and instead later triggering segfault.
- There is no need for Python only to give a few messages to the standard error stream, but we somehow did.
- The code to parse "git log -L…" command line was buggy when there are many ranges specified with -L; overrun of the allocated buffer has been fixed.
- The command-line parsing of "git log -L" copied internal data structures using incorrect size on ILP32 systems.
- "git diff --quiet" relies on the size field in diff_filespec to be correctly populated, but diff_populate_filespec() helper function made an incorrect short-cut when asked only to populate the size field for paths that need to go through convert_to_git() (e.g. CRLF conversion).
- A few tests were run conditionally under (rare) conditions where they cannot be run (like running cvs tests under ’root’ account).
- "git branch @" created refs/heads/@ as a branch, and in general the code that handled @{-1} and @{upstream} was a bit too loose in disambiguating.
- "git fetch" that requests a commit by object name, when the other side does not allow such an request, failed without much explanation.
- "git filter-branch --prune-empty" drops a single-parent commit that becomes a no-op, but did not drop a root commit whose tree is empty.
- Recent versions of Git treats http alternates (used in dumb http transport) just like HTTP redirects and requires the client to enable following it, due to security concerns. But we forgot to give a warning when we decide not to honor the alternates.
- "git push" had a handful of codepaths that could lead to a deadlock when unexpected error happened, which has been fixed.
- "Dumb http" transport used to misparse a nonsense http-alternates response, which has been fixed.
- "git add -p <pathspec>" unnecessarily expanded the pathspec to a list of individual files that matches the pathspec by running "git ls-files <pathspec>", before feeding it to "git diff-index" to see which paths have changes, because historically the pathspec language supported by "diff-index" was weaker. These days they are equivalent and there is no reason to internally expand it. This helps both performance and avoids command line argument limit on some platforms. (merge 7288e12cce jk/add-i-use-pathspecs later to maint).
- "git status --porcelain" is supposed to give a stable output, but a few strings were left as translatable by mistake.
- "git revert -m 0 $merge_commit" complained that reverting a merge needs to say relative to which parent the reversion needs to happen, as if "-m 0" weren’t given. The correct diagnosis is that "-m 0" does not refer to the first parent ("-m 1" does). This has been fixed.
- Code to read submodule.<name>.ignore config did not state the variable name correctly when giving an error message diagnosing misconfiguration.
- Fix for NO_PTHREADS build.
- Fix for potential segv introduced in v2.11.0 and later (also v2.10.2) to "git log --pickaxe-regex -S".
- A few unterminated here documents in tests were fixed, which in turn revealed incorrect expectations the tests make. These tests have been updated.
- Fix for NO_PTHREADS option. (merge 2225e1ea20 bw/grep-recurse-submodules later to maint).
- Git now avoids blindly falling back to ".git" when the setup sequence said we are not in Git repository. A corner case that happens to work right now may be broken by a call to die("BUG"). (merge b1ef400eec jk/no-looking-at-dotgit-outside-repo-final later to maint).
- A few commands that recently learned the "--recurse-submodule" option misbehaved when started from a subdirectory of the superproject. (merge b2dfeb7c00 bw/recurse-submodules-relative-fix later to maint).
- FreeBSD implementation of getcwd(3) behaved differently when an intermediate directory is unreadable/unsearchable depending on the length of the buffer provided, which our strbuf_getcwd() was not aware of. strbuf_getcwd() has been taught to cope with it better. (merge a54e938e5b rs/freebsd-getcwd-workaround later to maint).
- A recent update to "rebase -i" stopped running hooks for the "git commit" command during "reword" action, which has been fixed.
- Removing an entry from a notes tree and then looking another note entry from the resulting tree using the internal notes API functions did not work as expected. No in-tree users of the API has such access pattern, but it still is worth fixing.
- "git receive-pack" could have been forced to die by attempting allocate an unreasonably large amount of memory with a crafted push certificate; this has been fixed. (merge f2214dede9 bc/push-cert-receive-fix later to maint).
- Update error handling for codepath that deals with corrupt loose objects. (merge 51054177b3 jk/loose-object-info-report-error later to maint).
- "git diff --submodule=diff" learned to work better in a project with a submodule that in turn has its own submodules. (merge 17b254cda6 sb/show-diff-for-submodule-in-diff-fix later to maint).
- Update the build dependency so that an update to /usr/bin/perl etc. result in recomputation of perl.mak file. (merge c59c4939c2 ab/regen-perl-mak-with-different-perl later to maint).
- "git push --recurse-submodules --push-option=<string>" learned to propagate the push option recursively down to pushes in submodules.
- If a patch e-mail had its first paragraph after an in-body header indented (even after a blank line after the in-body header line), the indented line was mistook as a continuation of the in-body header. This has been fixed. (merge fd1062e52e lt/mailinfo-in-body-header-continuation later to maint).
- Clean up fallouts from recent tightening of the set-up sequence, where Git barfs when repository information is accessed without first ensuring that it was started in a repository. (merge bccb22cbb1 jk/no-looking-at-dotgit-outside-repo later to maint).
- "git p4" used "name-rev HEAD" when it wants to learn what branch is checked out; it should use "symbolic-ref HEAD". (merge eff451101d ld/p4-current-branch-fix later to maint).
- "http.proxy" set to an empty string is used to disable the usage of proxy. We broke this early last year. (merge ae51d91105 sr/http-proxy-configuration-fix later to maint).
- $GIT_DIR may in some cases be normalized with all symlinks resolved while "gitdir" path expansion in the pattern does not receive the same treatment, leading to incorrect mismatch. This has been fixed.
- "git submodule" script does not work well with strange pathnames. Protect it from a path with slashes in them, at least.
- "git fetch-pack" was not prepared to accept ERR packet that the upload-pack can send with a human-readable error message. It showed the packet contents with ERR prefix, so there was no data loss, but it was redundant to say "ERR" in an error message. (merge 8e2c7bef03 jt/fetch-pack-error-reporting later to maint).
- "ls-files --recurse-submodules" did not quite work well in a project with nested submodules.
- gethostname(2) may not NUL terminate the buffer if hostname does not fit; unfortunately there is no easy way to see if our buffer was too small, but at least this will make sure we will not end up using garbage past the end of the buffer. (merge 5781a9a270 dt/xgethostname-nul-termination later to maint).
- A recent update broke "git add -p ../foo" from a subdirectory.
- While handy, "git_path()" is a dangerous function to use as a callsite that uses it safely one day can be broken by changes to other code that calls it. Reduction of its use continues. (merge 16d2676c9e jk/war-on-git-path later to maint).
- The split-index code configuration code used an unsafe git_path() function without copying its result out.
- Many stale HTTP(s) links have been updated in our documentation. (merge 613416f0be jk/update-links-in-docs later to maint).
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
- Other minor doc, test and build updates and code cleanups. (merge df2a6e38b7 jk/pager-in-use later to maint). (merge 75ec4a6cb0 ab/branch-list-doc later to maint). (merge 3e5b36c637 sg/skip-prefix-in-prettify-refname later to maint). (merge 2c5e2865cc jk/fast-import-cleanup later to maint). (merge 4473060bc2 ab/test-readme-updates later to maint). (merge 48a96972fd ab/doc-submitting later to maint). (merge f5c2bc2b96 jk/make-coccicheck-detect-errors later to maint). (merge c105f563d1 cc/untracked later to maint). (merge 8668976b53 jc/unused-symbols later to maint). (merge fba275dc93 jc/bs-t-is-not-a-tab-for-sed later to maint). (merge be6ed145de mm/ls-files-s-doc later to maint). (merge 60b091c679 qp/bisect-docfix later to maint). (merge 47242cd103 ah/diff-files-ours-theirs-doc later to maint). (merge 35ad44cbd8 sb/submodule-rm-absorb later to maint). (merge 0301f1fd92 va/i18n-perl-scripts later to maint). (merge 733e064d98 vn/revision-shorthand-for-side-branch-log later to maint). (merge 85999743e7 tb/doc-eol-normalization later to maint). (merge 0747fb49fd jk/loose-object-fsck later to maint). (merge d8f4481c4f jk/quarantine-received-objects later to maint). (merge 7ba1ceef95 xy/format-patch-base later to maint). (merge fa1912c89a rs/misc-cppcheck-fixes later to maint). (merge f17d642d3b ab/push-cas-doc-n-test later to maint). (merge 61e282425a ss/gitmodules-ignore-doc later to maint). (merge 8d3047cd5b ss/submodule-shallow-doc later to maint). (merge 1f9e18b772 jk/prio-queue-avoid-swap-with-self later to maint). (merge 627fde1025 jk/submodule-init-segv-fix later to maint). (merge d395745d81 rg/doc-pull-typofix later to maint). (merge 01e60a9a22 rg/doc-submittingpatches-wordfix later to maint). (merge 501d3cd7b8 sr/hooks-cwd-doc later to maint).
2.13.1
Git v2.13.1 Release Notes =========================
Fixes since v2.13 -----------------
- The Web interface to gmane news archive is long gone, even though the articles are still accessible via NTTP. Replace the links with ones to public-inbox.org. Because their message identification is based on the actual message-id, it is likely that it will be easier to migrate away from it if/when necessary.
- Update tests to pass under GETTEXT_POISON (a mechanism to ensure that output strings that should not be translated are not translated by mistake), and tell TravisCI to run them.
- Setting "log.decorate=false" in the configuration file did not take effect in v2.13, which has been corrected.
- An earlier update to test 7400 needed to be skipped on CYGWIN.
- Git sometimes gives an advice in a rhetorical question that does not require an answer, which can confuse new users and non native speakers. Attempt to rephrase them.
- "git read-tree -m" (no tree-ish) gave a nonsense suggestion "use --empty if you want to clear the index". With "-m", such a request will still fail anyway, as you’d need to name at least one tree-ish to be merged.
- The codepath in "git am" that is used when running "git rebase" leaked memory held for the log message of the commits being rebased.
- "pack-objects" can stream a slice of an existing packfile out when the pack bitmap can tell that the reachable objects are all needed in the output, without inspecting individual objects. This strategy however would not work well when "--local" and other options are in use, and need to be disabled.
- Clarify documentation for include.path and includeIf.<condition>.path configuration variables.
- Tag objects, which are not reachable from any ref, that point at missing objects were mishandled by "git gc" and friends (they should silently be ignored instead)
- A few http:// links that are redirected to https:// in the documentation have been updated to https:// links.
- Make sure our tests would pass when the sources are checked out with "platform native" line ending convention by default on Windows. Some "text" files out tests use and the test scripts themselves that are meant to be run with /bin/sh, ought to be checked out with eol=LF even on Windows.
- Fix memory leaks pointed out by Coverity (and people).
- The receive-pack program now makes sure that the push certificate records the same set of push options used for pushing.
- "git cherry-pick" and other uses of the sequencer machinery mishandled a trailer block whose last line is an incomplete line. This has been fixed so that an additional sign-off etc. are added after completing the existing incomplete line.
- The shell completion script (in contrib/) learned "git stash" has a new "push" subcommand.
- Travis CI gained a task to format the documentation with both AsciiDoc and AsciiDoctor.
- Update the C style recommendation for notes for translators, as recent versions of gettext tools can work with our style of multi-line comments.
- "git clone --config var=val" is a way to populate the per-repository configuration file of the new repository, but it did not work well when val is an empty string. This has been fixed.
- A few codepaths in "checkout" and "am" working on an unborn branch tried to access an uninitialized piece of memory.
- "git for-each-ref --format=…" with %(HEAD) in the format used to resolve the HEAD symref as many times as it had processed refs, which was wasteful, and "git branch" shared the same problem.
- "git interpret-trailers", when used as GIT_EDITOR for "git commit -v", looked for and appended to a trailer block at the very end, i.e. at the end of the "diff" output. The command has been corrected to pay attention to the cut-mark line "commit -v" adds to the buffer---the real trailer block should appear just before it.
- A test allowed both "git push" and "git receive-pack" on the other end write their traces into the same file. This is OK on platforms that allows atomically appending to a file opened with O_APPEND, but on other platforms led to a mangled output, causing intermittent test failures. This has been fixed by disabling traces from "receive-pack" in the test.
- "foobarbaz" in "git fetch foobarbaz", even though there is no slashes in it, cannot be a nickname for a remote on Windows, as that is likely to be a pathname on a local filesystem.
- The "collision detecting" SHA-1 implementation shipped with 2.13 was quite broken on some big-endian platforms and/or platforms that do not like unaligned fetches. Update to the upstream code which has already fixed these issues.
- "git am -h" triggered a BUG().
- The interaction of "url.*.insteadOf" and custom URL scheme’s whitelisting is now documented better.
Also contains various documentation updates and code clean-ups.
2.13.2
Git v2.13.2 Release Notes =========================
Fixes since v2.13.1 -------------------
- The "collision detecting" SHA-1 implementation shipped with 2.13.1 was still broken on some platforms. Update to the upstream code again to take their fix.
- "git checkout --recurse-submodules" did not quite work with a submodule that itself has submodules.
- Introduce the BUG() macro to improve die("BUG: …").
- The "run-command" API implementation has been made more robust against dead-locking in a threaded environment.
- A recent update to t5545-push-options.sh started skipping all the tests in the script when a web server testing is disabled or unavailable, not just the ones that require a web server. Non HTTP tests have been salvaged to always run in this script.
- "git clean -d" used to clean directories that has ignored files, even though the command should not lose ignored ones without "-x". "git status --ignored" did not list ignored and untracked files without "-uall". These have been corrected.
- The timestamp of the index file is now taken after the file is closed, to help Windows, on which a stale timestamp is reported by fstat() on a file that is opened for writing and data was written but not yet closed.
- "git pull --rebase --autostash" didn’t auto-stash when the local history fast-forwards to the upstream.
- "git describe --contains" penalized light-weight tags so much that they were almost never considered. Instead, give them about the same chance to be considered as an annotated tag that is the same age as the underlying commit would.
- The result from "git diff" that compares two blobs, e.g. "git diff $commit1:$path $commit2:$path", used to be shown with the full object name as given on the command line, but it is more natural to use the $path in the output and use it to look up .gitattributes.
- A flaky test has been corrected.
- Help contributors that visit us at GitHub.
- "git stash push <pathspec>" did not work from a subdirectory at all. Bugfix for a topic in v2.13
Also contains various documentation updates and code clean-ups.
2.13.3
Git v2.13.3 Release Notes =========================
Fixes since v2.13.2 -------------------
- The "collision detecting" SHA-1 implementation shipped with 2.13.2 was still broken on some platforms. Update to the upstream code again to take their fix.
- The ’diff-highlight’ program (in contrib/) has been restructured for easier reuse by an external project ’diff-so-fancy’.
- "git mergetool" learned to work around a wrapper MacOS X adds around underlying meld.
- An example in documentation that does not work in multi worktree configuration has been corrected.
- The pretty-format specifiers like ’%h’, ’%t’, etc. had an optimization that no longer works correctly. In preparation/hope of getting it correctly implemented, first discard the optimization that is broken.
- The code to pick up and execute command alias definition from the configuration used to switch to the top of the working tree and then come back when the expanded alias was executed, which was unnecessarily complex. Attempt to simplify the logic by using the early-config mechanism that does not chdir around.
- "git add -p" were updated in 2.12 timeframe to cope with custom core.commentchar but the implementation was buggy and a metacharacter like $ and * did not work.
- Fix a recent regression to "git rebase -i" and add tests that would have caught it and others.
- An unaligned 32-bit access in pack-bitmap code has been corrected.
- Tighten error checks for invalid "git apply" input.
- The split index code did not honor core.sharedrepository setting correctly.
- The Makefile rule in contrib/subtree for building documentation learned to honour USE_ASCIIDOCTOR just like the main documentation set does.
- A few tests that tried to verify the contents of push certificates did not use ’git rev-parse’ to formulate the line to look for in the certificate correctly.
- After "git branch --move" of the currently checked out branch, the code to walk the reflog of HEAD via "log -g" and friends incorrectly stopped at the reflog entry that records the renaming of the branch.
- The rewrite of "git branch --list" using for-each-ref’s internals that happened in v2.13 regressed its handling of color.branch.local; this has been fixed.
Also contains various documentation updates and code clean-ups.
2.13.4
Git v2.13.4 Release Notes =========================
Fixes since v2.13.3 -------------------
- Update the character width tables.
- A recent update broke an alias that contained an uppercase letter, which has been fixed.
- On Cygwin, similar to Windows, "git push //server/share/repository" ought to mean a repository on a network share that can be accessed locally, but this did not work correctly due to stripping the double slashes at the beginning.
- The progress meter did not give a useful output when we haven’t had 0.5 seconds to measure the throughput during the interval. Instead show the overall throughput rate at the end, which is a much more useful number.
- We run an early part of "git gc" that deals with refs before daemonising (and not under lock) even when running a background auto-gc, which caused multiple gc processes attempting to run the early part at the same time. This is now prevented by running the early part also under the GC lock.
Also contains a handful of small code and documentation clean-ups.
2.13.5
Git v2.13.5 Release Notes =========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.13.6
Git v2.13.6 Release Notes =========================
Fixes since v2.13.5 -------------------
- "git cvsserver" no longer is invoked by "git daemon" by default, as it is old and largely unmaintained.
- Various Perl scripts did not use safe_pipe_capture() instead of backticks, leaving them susceptible to end-user input. They have been corrected.
Credits go to joernchen <joernchen@phenoelit.de> for finding the unsafe constructs in "git cvsserver", and to Jeff King at GitHub for finding and fixing instances of the same issue in other scripts.
2.13.7
Git v2.13.7 Release Notes =========================
Fixes since v2.13.6 -------------------
- Submodule "names" come from the untrusted .gitmodules file, but we blindly append them to $GIT_DIR/modules to create our on-disk repo paths. This means you can do bad things by putting "../" into the name. We now enforce some rules for submodule names which will cause Git to ignore these malicious names (CVE-2018-11235).
Credit for finding this vulnerability and the proof of concept from
which the test script was adapted goes to Etienne Stalmans.
- It was possible to trick the code that sanity-checks paths on NTFS into reading random piece of memory (CVE-2018-11233).
Credit for fixing for these bugs goes to Jeff King, Johannes Schindelin and others.
2.14.0
Git 2.14 Release Notes ======================
Backward compatibility notes and other notable changes.
- Use of an empty string as a pathspec element that is used for ’everything matches’ is still warned and Git asks users to use a more explicit ’.’ for that instead. The hope is that existing users will not mind this change, and eventually the warning can be turned into a hard error, upgrading the deprecation into removal of this (mis)feature. That is not scheduled to happen in the upcoming release (yet).
- Git now avoids blindly falling back to ".git" when the setup sequence said we are not in Git repository. A corner case that happens to work right now may be broken by a call to die("BUG"). We’ve tried hard to locate such cases and fixed them, but there might still be cases that need to be addressed—bug reports are greatly appreciated.
- The experiment to improve the hunk-boundary selection of textual diff output has finished, and the "indent heuristics" has now become the default.
- Git can now be built with PCRE v2 instead of v1 of the PCRE library. Replace USE_LIBPCRE=YesPlease with USE_LIBPCRE2=YesPlease in existing build scripts to build against the new version. As the upstream PCRE maintainer has abandoned v1 maintenance for all but the most critical bug fixes, use of v2 is recommended.
Updates since v2.13 -------------------
UI, Workflows & Features
- The colors in which "git status --short --branch" showed the names of the current branch and its remote-tracking branch are now configurable.
- "git clone" learned the "--no-tags" option not to fetch all tags initially, and also set up the tagopt not to follow any tags in subsequent fetches.
- "git archive --format=zip" learned to use zip64 extension when necessary to go beyond the 4GB limit.
- "git reset" learned "--recurse-submodules" option.
- "git diff --submodule=diff" now recurses into nested submodules.
- "git repack" learned to accept the --threads=<n> option and pass it to pack-objects.
- "git send-email" learned to run sendemail-validate hook to inspect and reject a message before sending it out.
- There is no good reason why "git fetch $there $sha1" should fail when the $sha1 names an object at the tip of an advertised ref, even when the other side hasn’t enabled allowTipSHA1InWant.
- The "[includeIf "gitdir:$dir"] path=…" mechanism introduced in 2.13.0 would canonicalize the path of the gitdir being matched, and did not match e.g. "gitdir:
/work/*" against a repo in "/work/main" if "~/work" was a symlink to "/mnt/storage/work". Now we match both the resolved canonical path and what "pwd" would show. The include will happen if either one matches.
- The "indent" heuristics is now the default in "diff". The diff.indentHeuristic configuration variable can be set to "false" for those who do not want it.
- Many commands learned to pay attention to submodule.recurse configuration.
- The convention for a command line is to follow "git cmdname --options" with revisions followed by an optional "--" disambiguator and then finally pathspecs. When "--" is not there, we make sure early ones are all interpretable as revs (and do not look like paths) and later ones are the other way around. A pathspec with "magic" (e.g. ":/p/a/t/h" that matches p/a/t/h from the top-level of the working tree, no matter what subdirectory you are working from) are conservatively judged as "not a path", which required disambiguation more often. The command line parser learned to say "it’s a pathspec" a bit more often when the syntax looks like so.
- Update "perl-compatible regular expression" support to enable JIT and also allow linking with the newer PCRE v2 library.
- "filter-branch" learned a pseudo filter "--setup" that can be used to define common functions/variables that can be used by other filters.
- Using "git add d/i/r" when d/i/r is the top of the working tree of a separate repository would create a gitlink in the index, which would appear as a not-quite-initialized submodule to others. We learned to give warnings when this happens.
- "git status" learned to optionally give how many stash entries there are in its output.
- "git status" has long shown essentially the same message as "git commit"; the message it gives while preparing for the root commit, i.e. "Initial commit", was hard to understand for some new users. Now it says "No commits yet" to stress more on the current status (rather than the commit the user is preparing for, which is more in line with the focus of "git commit").
- "git send-email" now has --batch-size and --relogin-delay options which can be used to overcome limitations on SMTP servers that restrict on how many of e-mails can be sent in a single session.
- An old message shown in the commit log template was removed, as it has outlived its usefulness.
- "git pull --rebase --recurse-submodules" learns to rebase the branch in the submodules to an updated base.
- "git log" learned -P as a synonym for --perl-regexp, "git grep" already had such a synonym.
- "git log" didn’t understand --regexp-ignore-case when combined with --perl-regexp. This has been fixed.
Performance, Internal Implementation, Development Support etc.
- The default packed-git limit value has been raised on larger platforms to save "git fetch" from a (recoverable) failure while "gc" is running in parallel.
- Code to update the cache-tree has been tightened so that we won’t accidentally write out any 0{40} entry in the tree object.
- Attempt to allow us notice "fishy" situation where we fail to remove the temporary directory used during the test.
- Travis CI gained a task to format the documentation with both AsciiDoc and AsciiDoctor.
- Some platforms have ulong that is smaller than time_t, and our historical use of ulong for timestamp would mean they cannot represent some timestamp that the platform allows. Invent a separate and dedicated timestamp_t (so that we can distinguish timestamps and a vanilla ulongs, which along is already a good move), and then declare uintmax_t is the type to be used as the timestamp_t.
- We can trigger Windows auto-build tester (credits: Dscho & Microsoft) from our existing Travis CI tester now.
- Conversion from uchar[20] to struct object_id continues.
- Simplify parse_pathspec() codepath and stop it from looking at the default in-core index.
- Add perf-test for wildmatch.
- Code from "conversion using external process" codepath has been extracted to a separate sub-process.[ch] module.
- When "git checkout", "git merge", etc. manipulates the in-core index, various pieces of information in the index extensions are discarded from the original state, as it is usually not the case that they are kept up-to-date and in-sync with the operation on the main index. The untracked cache extension is copied across these operations now, which would speed up "git status" (as long as the cache is properly invalidated).
- The internal implementation of "git grep" has seen some clean-up.
- Update the C style recommendation for notes for translators, as recent versions of gettext tools can work with our style of multi-line comments.
- The implementation of "ref" API around the "packed refs" have been cleaned up, in preparation for further changes.
- The internal logic used in "git blame" has been libified to make it easier to use by cgit.
- Our code often opens a path to an optional file, to work on its contents when we can successfully open it. We can ignore a failure to open if such an optional file does not exist, but we do want to report a failure in opening for other reasons (e.g. we got an I/O error, or the file is there, but we lack the permission to open).
The exact errors we need to ignore are ENOENT (obviously) and
ENOTDIR (less obvious). Instead of repeating comparison of errno
with these two constants, introduce a helper function to do so.
- We often try to open a file for reading whose existence is optional, and silently ignore errors from open/fopen; report such errors if they are not due to missing files.
- When an existing repository is used for t/perf testing, we first create bit-for-bit copy of it, which may grab a transient state of the repository and freeze it into the repository used for testing, which then may cause Git operations to fail. Single out "the index being locked" case and forcibly drop the lock from the copy.
- Three instances of the same helper function have been consolidated to one.
- "fast-import" uses a default pack chain depth that is consistent with other parts of the system.
- A new test to show the interaction between the pattern [^a-z] (which matches ’/’) and a slash in a path has been added. The pattern should not match the slash with "pathmatch", but should with "wildmatch".
- The ’diff-highlight’ program (in contrib/) has been restructured for easier reuse by an external project ’diff-so-fancy’.
- A common pattern to free a piece of memory and assign NULL to the pointer that used to point at it has been replaced with a new FREE_AND_NULL() macro.
- Traditionally, the default die() routine had a code to prevent it from getting called multiple times, which interacted badly when a threaded program used it (one downside is that the real error may be hidden and instead the only error message given to the user may end up being "die recursion detected", which is not very useful).
- Introduce a "repository" object to eventually make it easier to work in multiple repositories (the primary focus is to work with the superproject and its submodules) in a single process.
- Optimize "what are the object names already taken in an alternate object database?" query that is used to derive the length of prefix an object name is uniquely abbreviated to.
- The hashmap API has been updated so that data to customize the behaviour of the comparison function can be specified at the time a hashmap is initialized.
- The "collision detecting" SHA-1 implementation shipped with 2.13 is now integrated into git.git as a submodule (the first submodule to ship with git.git). Clone git.git with --recurse-submodules to get it. For now a non-submodule copy of the same code is also shipped as part of the tree.
- A recent update made it easier to use "-fsanitize=" option while compiling but supported only one sanitize option. Allow more than one to be combined, joined with a comma, like "make SANITIZE=foo,bar".
- Use "p4 -G" to make "p4 changes" output more Python-friendly to parse.
- We started using "%" PRItime, imitating "%" PRIuMAX and friends, as a way to format the internal timestamp value, but this does not play well with gettext(1) i18n framework, and causes "make pot" that is run by the l10n coordinator to create a broken po/git.pot file. This is a possible workaround for that problem.
- It turns out that Cygwin also needs the fopen() wrapper that returns failure when a directory is opened for reading.
Also contains various documentation updates and code clean-ups.
Fixes since v2.13 -----------------
Unless otherwise noted, all the fixes since v2.13 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git gc" did not interact well with "git worktree"-managed per-worktree refs.
- "git cherry-pick" and other uses of the sequencer machinery mishandled a trailer block whose last line is an incomplete line. This has been fixed so that an additional sign-off etc. are added after completing the existing incomplete line.
- The codepath in "git am" that is used when running "git rebase" leaked memory held for the log message of the commits being rebased.
- "git clone --config var=val" is a way to populate the per-repository configuration file of the new repository, but it did not work well when val is an empty string. This has been fixed.
- Setting "log.decorate=false" in the configuration file did not take effect in v2.13, which has been corrected.
- A few codepaths in "checkout" and "am" working on an unborn branch tried to access an uninitialized piece of memory.
- The Web interface to gmane news archive is long gone, even though the articles are still accessible via NTTP. Replace the links with ones to public-inbox.org. Because their message identification is based on the actual message-id, it is likely that it will be easier to migrate away from it if/when necessary.
- The receive-pack program now makes sure that the push certificate records the same set of push options used for pushing.
- Tests have been updated to pass under GETTEXT_POISON (a mechanism to ensure that output strings that should not be translated are not translated by mistake), and TravisCI is told to run them.
- "git checkout --recurse-submodules" did not quite work with a submodule that itself has submodules.
- "pack-objects" can stream a slice of an existing packfile out when the pack bitmap can tell that the reachable objects are all needed in the output, without inspecting individual objects. This strategy however would not work well when "--local" and other options are in use, and need to be disabled.
- Fix memory leaks pointed out by Coverity (and people).
- "git read-tree -m" (no tree-ish) gave a nonsense suggestion "use --empty if you want to clear the index". With "-m", such a request will still fail anyway, as you’d need to name at least one tree-ish to be merged.
- Make sure our tests would pass when the sources are checked out with "platform native" line ending convention by default on Windows. Some "text" files out tests use and the test scripts themselves that are meant to be run with /bin/sh, ought to be checked out with eol=LF even on Windows.
- Introduce the BUG() macro to improve die("BUG: …").
- Clarify documentation for include.path and includeIf.<condition>.path configuration variables.
- Git sometimes gives an advice in a rhetorical question that does not require an answer, which can confuse new users and non native speakers. Attempt to rephrase them.
- A few http:// links that are redirected to https:// in the documentation have been updated to https:// links.
- "git for-each-ref --format=…" with %(HEAD) in the format used to resolve the HEAD symref as many times as it had processed refs, which was wasteful, and "git branch" shared the same problem.
- Regression fix to topic recently merged to ’master’.
- The shell completion script (in contrib/) learned "git stash" has a new "push" subcommand.
- "git interpret-trailers", when used as GIT_EDITOR for "git commit -v", looked for and appended to a trailer block at the very end, i.e. at the end of the "diff" output. The command has been corrected to pay attention to the cut-mark line "commit -v" adds to the buffer---the real trailer block should appear just before it.
- A test allowed both "git push" and "git receive-pack" on the other end write their traces into the same file. This is OK on platforms that allows atomically appending to a file opened with O_APPEND, but on other platforms led to a mangled output, causing intermittent test failures. This has been fixed by disabling traces from "receive-pack" in the test.
- Tag objects, which are not reachable from any ref, that point at missing objects were mishandled by "git gc" and friends (they should silently be ignored instead)
- "git describe --contains" penalized light-weight tags so much that they were almost never considered. Instead, give them about the same chance to be considered as an annotated tag that is the same age as the underlying commit would.
- The "run-command" API implementation has been made more robust against dead-locking in a threaded environment.
- A recent update to t5545-push-options.sh started skipping all the tests in the script when a web server testing is disabled or unavailable, not just the ones that require a web server. Non HTTP tests have been salvaged to always run in this script.
- "git send-email" now uses Net::SMTP::SSL, which is obsolete, only when needed. Recent versions of Net::SMTP can do TLS natively.
- "foobarbaz" in "git fetch foobarbaz", even though there is no slashes in it, cannot be a nickname for a remote on Windows, as that is likely to be a pathname on a local filesystem.
- "git clean -d" used to clean directories that has ignored files, even though the command should not lose ignored ones without "-x". "git status --ignored" did not list ignored and untracked files without "-uall". These have been corrected.
- The result from "git diff" that compares two blobs, e.g. "git diff $commit1:$path $commit2:$path", used to be shown with the full object name as given on the command line, but it is more natural to use the $path in the output and use it to look up .gitattributes.
- The "collision detecting" SHA-1 implementation shipped with 2.13 was quite broken on some big-endian platforms and/or platforms that do not like unaligned fetches. Update to the upstream code which has already fixed these issues.
- "git am -h" triggered a BUG().
- The interaction of "url.*.insteadOf" and custom URL scheme’s whitelisting is now documented better.
- The timestamp of the index file is now taken after the file is closed, to help Windows, on which a stale timestamp is reported by fstat() on a file that is opened for writing and data was written but not yet closed.
- "git pull --rebase --autostash" didn’t auto-stash when the local history fast-forwards to the upstream.
- A flaky test has been corrected.
- "git $cmd -h" for builtin commands calls the implementation of the command (i.e. cmd_$cmd() function) without doing any repository set-up, and the commands that expect RUN_SETUP is done by the Git potty needs to be prepared to show the help text without barfing. (merge d691551192 jk/consistent-h later to maint).
- Help contributors that visit us at GitHub.
- "git stash push <pathspec>" did not work from a subdirectory at all. Bugfix for a topic in v2.13
- As there is no portable way to pass timezone information to strftime, some output format from "git log" and friends are impossible to produce. Teach our own strbuf_addftime to replace %z and %Z with caller-supplied values to help working around this. (merge 6eced3ec5e rs/strbuf-addftime-zZ later to maint).
- "git mergetool" learned to work around a wrapper MacOS X adds around underlying meld.
- An example in documentation that does not work in multi worktree configuration has been corrected.
- The pretty-format specifiers like ’%h’, ’%t’, etc. had an optimization that no longer works correctly. In preparation/hope of getting it correctly implemented, first discard the optimization that is broken.
- The code to pick up and execute command alias definition from the configuration used to switch to the top of the working tree and then come back when the expanded alias was executed, which was unnecessarily complex. Attempt to simplify the logic by using the early-config mechanism that does not chdir around.
- Fix configuration codepath to pay proper attention to commondir that is used in multi-worktree situation, and isolate config API into its own header file. (merge dc8441fdb4 bw/config-h later to maint).
- "git add -p" were updated in 2.12 timeframe to cope with custom core.commentchar but the implementation was buggy and a metacharacter like $ and * did not work.
- A recent regression in "git rebase -i" has been fixed and tests that would have caught it and others have been added.
- An unaligned 32-bit access in pack-bitmap code has been corrected.
- Tighten error checks for invalid "git apply" input.
- The split index code did not honor core.sharedRepository setting correctly.
- The Makefile rule in contrib/subtree for building documentation learned to honour USE_ASCIIDOCTOR just like the main documentation set does.
- Code clean-up to fix possible buffer over-reading.
- A few tests that tried to verify the contents of push certificates did not use ’git rev-parse’ to formulate the line to look for in the certificate correctly.
- Update the character width tables.
- After "git branch --move" of the currently checked out branch, the code to walk the reflog of HEAD via "log -g" and friends incorrectly stopped at the reflog entry that records the renaming of the branch.
- The rewrite of "git branch --list" using for-each-ref’s internals that happened in v2.13 regressed its handling of color.branch.local; this has been fixed.
- The build procedure has been improved to allow building and testing Git with address sanitizer more easily. (merge 425ca6710b jk/build-with-asan later to maint).
- On Cygwin, similar to Windows, "git push //server/share/repository" ought to mean a repository on a network share that can be accessed locally, but this did not work correctly due to stripping the double slashes at the beginning.
- The progress meter did not give a useful output when we haven’t had 0.5 seconds to measure the throughput during the interval. Instead show the overall throughput rate at the end, which is a much more useful number.
- Code clean-up, that makes us in sync with Debian by one patch.
- We run an early part of "git gc" that deals with refs before daemonising (and not under lock) even when running a background auto-gc, which caused multiple gc processes attempting to run the early part at the same time. This is now prevented by running the early part also under the GC lock.
- A recent update broke an alias that contained an uppercase letter.
- Other minor doc, test and build updates and code cleanups. (merge 5053313562 rs/urlmatch-cleanup later to maint). (merge 42c78a216e rs/use-div-round-up later to maint). (merge 5e8d2729ae rs/wt-status-cleanup later to maint). (merge bc9b7e207f as/diff-options-grammofix later to maint). (merge ac05222b31 ah/patch-id-doc later to maint).
2.14.1
Git v2.14.1 Release Notes =========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.14.2
Git v2.14.2 Release Notes =========================
Fixes since v2.14.1 -------------------
- Because recent Git for Windows do come with a real msgfmt, the build procedure for git-gui has been updated to use it instead of a hand-rolled substitute.
- "%C(color name)" in the pretty print format always produced ANSI color escape codes, which was an early design mistake. They now honor the configuration (e.g. "color.ui = never") and also tty-ness of the output medium.
- The http.{sslkey,sslCert} configuration variables are to be interpreted as a pathname that honors "~[username]/" prefix, but weren’t, which has been fixed.
- Numerous bugs in walking of reflogs via "log -g" and friends have been fixed.
- "git commit" when seeing an totally empty message said "you did not edit the message", which is clearly wrong. The message has been corrected.
- When a directory is not readable, "gitweb" fails to build the project list. Work this around by skipping such a directory.
- A recently added test for the "credential-cache" helper revealed that EOF detection done around the time the connection to the cache daemon is torn down were flaky. This was fixed by reacting to ECONNRESET and behaving as if we got an EOF.
- Some versions of GnuPG fail to kill gpg-agent it auto-spawned and such a left-over agent can interfere with a test. Work it around by attempting to kill one before starting a new test.
- "git log --tag=no-such-tag" showed log starting from HEAD, which has been fixed---it now shows nothing.
- The "tag.pager" configuration variable was useless for those who actually create tag objects, as it interfered with the use of an editor. A new mechanism has been introduced for commands to enable pager depending on what operation is being carried out to fix this, and then "git tag -l" is made to run pager by default.
- "git push --recurse-submodules $there HEAD:$target" was not propagated down to the submodules, but now it is.
- Commands like "git rebase" accepted the --rerere-autoupdate option from the command line, but did not always use it. This has been fixed.
- "git clone --recurse-submodules --quiet" did not pass the quiet option down to submodules.
- "git am -s" has been taught that some input may end with a trailer block that is not Signed-off-by: and it should refrain from adding an extra blank line before adding a new sign-off in such a case.
- "git svn" used with "--localtime" option did not compute the tz offset for the timestamp in question and instead always used the current time, which has been corrected.
- Memory leaks in a few error codepaths have been plugged.
- bash 4.4 or newer gave a warning on NUL byte in command substitution done in "git stash"; this has been squelched.
- "git grep -L" and "git grep --quiet -L" reported different exit codes; this has been corrected.
- When handshake with a subprocess filter notices that the process asked for an unknown capability, Git did not report what program the offending subprocess was running. This has been corrected.
- "git apply" that is used as a better "patch -p1" failed to apply a taken from a file with CRLF line endings to a file with CRLF line endings. The root cause was because it misused convert_to_git() that tried to do "safe-crlf" processing by looking at the index entry at the same path, which is a nonsense---in that mode, "apply" is not working on the data in (or derived from) the index at all. This has been fixed.
- Killing "git merge --edit" before the editor returns control left the repository in a state with MERGE_MSG but without MERGE_HEAD, which incorrectly tells the subsequent "git commit" that there was a squash merge in progress. This has been fixed.
- "git archive" did not work well with pathspecs and the export-ignore attribute.
- "git cvsserver" no longer is invoked by "git daemon" by default, as it is old and largely unmaintained.
- Various Perl scripts did not use safe_pipe_capture() instead of backticks, leaving them susceptible to end-user input. They have been corrected.
Also contains various documentation updates and code clean-ups.
Credits go to joernchen <joernchen@phenoelit.de> for finding the unsafe constructs in "git cvsserver", and to Jeff King at GitHub for finding and fixing instances of the same issue in other scripts.
2.14.3
Git v2.14.3 Release Notes =========================
Fixes since v2.14.2 -------------------
- A helper function to read a single whole line into strbuf mistakenly triggered OOM error at EOF under certain conditions, which has been fixed.
- In addition to "cc: <a@dd.re.ss> # cruft", "cc: a@dd.re.ss # cruft" was taught to "git send-email" as a valid way to tell it that it needs to also send a carbon copy to <a@dd.re.ss> in the trailer section.
- Fix regression to "gitk --bisect" by a recent update.
- Unlike "git commit-tree < file", "git commit-tree -F file" did not pass the contents of the file verbatim and instead completed an incomplete line at the end, if exists. The latter has been updated to match the behaviour of the former.
- "git archive", especially when used with pathspec, stored an empty directory in its output, even though Git itself never does so. This has been fixed.
- API error-proofing which happens to also squelch warnings from GCC.
- "git gc" tries to avoid running two instances at the same time by reading and writing pid/host from and to a lock file; it used to use an incorrect fscanf() format when reading, which has been corrected.
- The test linter has been taught that we do not like "echo -e".
- Code cmp.std.c nitpick.
- "git describe --match" learned to take multiple patterns in v2.13 series, but the feature ignored the patterns after the first one and did not work at all. This has been fixed.
- "git cat-file --textconv" started segfaulting recently, which has been corrected.
- The built-in pattern to detect the "function header" for HTML did not match <H1>..<H6> elements without any attributes, which has been fixed.
- "git mailinfo" was loose in decoding quoted printable and produced garbage when the two letters after the equal sign are not hexadecimal. This has been fixed.
- The documentation for ’-X<option>’ for merges was misleadingly written to suggest that "-s theirs" exists, which is not the case.
- Spell the name of our system as "Git" in the output from request-pull script.
- Fixes for a handful memory access issues identified by valgrind.
- Backports a moral equivalent of 2015 fix to the poll emulation from the upstream gnulib to fix occasional breakages on HPE NonStop.
- In the "--format=…" option of the "git for-each-ref" command (and its friends, i.e. the listing mode of "git branch/tag"), "%(atom:)" (e.g. "%(refname:)", "%(body:)" used to error out. Instead, treat them as if the colon and an empty string that follows it were not there.
- Users with "color.ui = always" in their configuration were broken by a recent change that made plumbing commands to pay attention to them as the patch created internally by "git add -p" were colored (heh) and made unusable. This has been fixed.
- "git branch -M a b" while on a branch that is completely unrelated to either branch a or branch b misbehaved when multiple worktree was in use. This has been fixed.
- "git fast-export" with -M/-C option issued "copy" instruction on a path that is simultaneously modified, which was incorrect.
- The checkpoint command "git fast-import" did not flush updates to refs and marks unless at least one object was created since the last checkpoint, which has been corrected, as these things can happen without any new object getting created.
- The scripts to drive TravisCI has been reorganized and then an optimization to avoid spending cycles on a branch whose tip is tagged has been implemented.
- "git fetch <there> <src>:<dst>" allows an object name on the <src> side when the other side accepts such a request since Git v2.5, but the documentation was left stale.
- A regression in 2.11 that made the code to read the list of alternate object stores overrun the end of the string has been fixed.
Also contains various documentation updates and code clean-ups.
2.14.4
Git v2.14.4 Release Notes =========================
This release is to forward-port the fixes made in the v2.13.7 version of Git. See its release notes for details.
2.14.5
Git v2.14.5 Release Notes =========================
This release is to address the recently reported CVE-2018-17456.
Fixes since v2.14.4 -------------------
- Submodules’ "URL"s come from the untrusted .gitmodules file, but we blindly gave it to "git clone" to clone submodules when "git clone --recurse-submodules" was used to clone a project that has such a submodule. The code has been hardened to reject such malformed URLs (e.g. one that begins with a dash).
Credit for finding and fixing this vulnerability goes to joernchen and Jeff King, respectively.
2.14.6
Git v2.14.6 Release Notes =========================
This release addresses the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387.
Fixes since v2.14.5 -------------------
- CVE-2019-1348: The --export-marks option of git fast-import is exposed also via the in-stream command feature export-marks=… and it allows overwriting arbitrary paths.
- CVE-2019-1349: When submodules are cloned recursively, under certain circumstances Git could be fooled into using the same Git directory twice. We now require the directory to be empty.
- CVE-2019-1350: Incorrect quoting of command-line arguments allowed remote code execution during a recursive clone in conjunction with SSH URLs.
- CVE-2019-1351: While the only permitted drive letters for physical drives on Windows are letters of the US-English alphabet, this restriction does not apply to virtual drives assigned via subst <letter>: <path>. Git mistook such paths for relative paths, allowing writing outside of the worktree while cloning.
- CVE-2019-1352: Git was unaware of NTFS Alternate Data Streams, allowing files inside the .git/ directory to be overwritten during a clone.
- CVE-2019-1353: When running Git in the Windows Subsystem for Linux (also known as "WSL") while accessing a working directory on a regular Windows drive, none of the NTFS protections were active.
- CVE-2019-1354: Filenames on Linux/Unix can contain backslashes. On Windows, backslashes are directory separators. Git did not use to refuse to write out tracked files with such filenames.
- CVE-2019-1387: Recursive clones are currently affected by a vulnerability that is caused by too-lax validation of submodule names, allowing very targeted attacks via remote code execution in recursive clones.
Credit for finding these vulnerabilities goes to Microsoft Security Response Center, in particular to Nicolas Joly. The fast-import fixes were provided by Jeff King, the other fixes by Johannes Schindelin with help from Garima Singh.
2.15.0
Git 2.15 Release Notes ======================
Backward compatibility notes and other notable changes.
- Use of an empty string as a pathspec element that is used for ’everything matches’ is still warned and Git asks users to use a more explicit ’.’ for that instead. The hope is that existing users will not mind this change, and eventually the warning can be turned into a hard error, upgrading the deprecation into removal of this (mis)feature. That is now scheduled to happen in Git v2.16, the next major release after this one.
- Git now avoids blindly falling back to ".git" when the setup sequence said we are not in Git repository. A corner case that happens to work right now may be broken by a call to BUG(). We’ve tried hard to locate such cases and fixed them, but there might still be cases that need to be addressed—bug reports are greatly appreciated.
- "branch --set-upstream" that has been deprecated in Git 1.8 has finally been retired.
Updates since v2.14 -------------------
UI, Workflows & Features
- An example that is now obsolete has been removed from a sample hook, and an old example in it that added a sign-off manually has been improved to use the interpret-trailers command.
- The advice message given when "git rebase" stops for conflicting changes has been improved.
- The "rerere-train" script (in contrib/) learned the "--overwrite" option to allow overwriting existing recorded resolutions.
- "git contacts" (in contrib/) now lists the address on the "Reported-by:" trailer to its output, in addition to those on S-o-b: and other trailers, to make it easier to notify (and thank) the original bug reporter.
- "git rebase", especially when it is run by mistake and ends up trying to replay many changes, spent long time in silence. The command has been taught to show progress report when it spends long time preparing these many changes to replay (which would give the user a chance to abort with ^C).
- "git merge" learned a "--signoff" option to add the Signed-off-by: trailer with the committer’s name.
- "git diff" learned to optionally paint new lines that are the same as deleted lines elsewhere differently from genuinely new lines.
- "git interpret-trailers" learned to take the trailer specifications from the command line that overrides the configured values.
- "git interpret-trailers" has been taught a "--parse" and a few other options to make it easier for scripts to grab existing trailer lines from a commit log message.
- The "--format=%(trailers)" option "git log" and its friends take learned to take the ’unfold’ and ’only’ modifiers to normalize its output, e.g. "git log --format=%(trailers:only,unfold)".
- "gitweb" shows a link to visit the ’raw’ contents of blobs in the history overview page.
- "[gc] rerereResolved = 5.days" used to be invalid, as the variable is defined to take an integer counting the number of days. It now is allowed.
- The code to acquire a lock on a reference (e.g. while accepting a push from a client) used to immediately fail when the reference is already locked---now it waits for a very short while and retries, which can make it succeed if the lock holder was holding it during a read-only operation.
- "branch --set-upstream" that has been deprecated in Git 1.8 has finally been retired.
- The codepath to call external process filter for smudge/clean operation learned to show the progress meter.
- "git rev-parse" learned "--is-shallow-repository", that is to be used in a way similar to existing "--is-bare-repository" and friends.
- "git describe --match <pattern>" has been taught to play well with the "--all" option.
- "git branch" learned "-c/-C" to create a new branch by copying an existing one.
- Some commands (most notably "git status") makes an opportunistic update when performing a read-only operation to help optimize later operations in the same repository. The new "--no-optional-locks" option can be passed to Git to disable them.
- "git for-each-ref --format=…" learned a new format element, %(trailers), to show only the commit log trailer part of the log message.
Performance, Internal Implementation, Development Support etc.
- Conversion from uchar[20] to struct object_id continues.
- Start using selected c99 constructs in small, stable and essential part of the system to catch people who care about older compilers that do not grok them.
- The filter-process interface learned to allow a process with long latency give a "delayed" response.
- Many uses of comparison callback function the hashmap API uses cast the callback function type when registering it to hashmap_init(), which defeats the compile time type checking when the callback interface changes (e.g. gaining more parameters). The callback implementations have been updated to take "void *" pointers and cast them to the type they expect instead.
- Because recent Git for Windows do come with a real msgfmt, the build procedure for git-gui has been updated to use it instead of a hand-rolled substitute.
- "git grep --recurse-submodules" has been reworked to give a more consistent output across submodule boundary (and do its thing without having to fork a separate process).
- A helper function to read a single whole line into strbuf mistakenly triggered OOM error at EOF under certain conditions, which has been fixed.
- The "ref-store" code reorganization continues.
- "git commit" used to discard the index and re-read from the filesystem just in case the pre-commit hook has updated it in the middle; this has been optimized out when we know we do not run the pre-commit hook. (merge 680ee550d7 kw/commit-keep-index-when-pre-commit-is-not-run later to maint).
- Updates to the HTTP layer we made recently unconditionally used features of libCurl without checking the existence of them, causing compilation errors, which has been fixed. Also migrate the code to check feature macros, not version numbers, to cope better with libCurl that vendor ships with backported features.
- The API to start showing progress meter after a short delay has been simplified. (merge 8aade107dd jc/simplify-progress later to maint).
- Code clean-up to avoid mixing values read from the .gitmodules file and values read from the .git/config file.
- We used to spend more than necessary cycles allocating and freeing piece of memory while writing each index entry out. This has been optimized.
- Platforms that ship with a separate sha1 with collision detection library can link to it instead of using the copy we ship as part of our source tree.
- Code around "notes" have been cleaned up. (merge 3964281524 mh/notes-cleanup later to maint).
- The long-standing rule that an in-core lockfile instance, once it is used, must not be freed, has been lifted and the lockfile and tempfile APIs have been updated to reduce the chance of programming errors.
- Our hashmap implementation in hashmap.[ch] is not thread-safe when adding a new item needs to expand the hashtable by rehashing; add an API to disable the automatic rehashing to work it around.
- Many of our programs consider that it is OK to release dynamic storage that is used throughout the life of the program by simply exiting, but this makes it harder to leak detection tools to avoid reporting false positives. Plug many existing leaks and introduce a mechanism for developers to mark that the region of memory pointed by a pointer is not lost/leaking to help these tools.
- As "git commit" to conclude a conflicted "git merge" honors the commit-msg hook, "git merge" that records a merge commit that cleanly auto-merges should, but it didn’t.
- The codepath for "git merge-recursive" has been cleaned up.
- Many leaks of strbuf have been fixed.
- "git imap-send" has our own implementation of the protocol and also can use more recent libCurl with the imap protocol support. Update the latter so that it can use the credential subsystem, and then make it the default option to use, so that we can eventually deprecate and remove the former.
- "make style" runs git-clang-format to help developers by pointing out coding style issues.
- A test to demonstrate "git mv" failing to adjust nested submodules has been added. (merge c514167df2 hv/mv-nested-submodules-test later to maint).
- On Cygwin, "ulimit -s" does not report failure but it does not work at all, which causes an unexpected success of some tests that expect failures under a limited stack situation. This has been fixed.
- Many codepaths have been updated to squelch -Wimplicit-fallthrough warnings from Gcc 7 (which is a good code hygiene).
- Add a helper for DLL loading in anticipation for its need in a future topic RSN.
- "git status --ignored", when noticing that a directory without any tracked path is ignored, still enumerated all the ignored paths in the directory, which is unnecessary. The codepath has been optimized to avoid this overhead.
- The final batch to "git rebase -i" updates to move more code from the shell script to C has been merged.
- Operations that do not touch (majority of) packed refs have been optimized by making accesses to packed-refs file lazy; we no longer pre-parse everything, and an access to a single ref in the packed-refs does not touch majority of irrelevant refs, either.
- Add comment to clarify that the style file is meant to be used with clang-5 and the rules are still work in progress.
- Many variables that points at a region of memory that will live throughout the life of the program have been marked with UNLEAK marker to help the leak checkers concentrate on real leaks..
- Plans for weaning us off of SHA-1 has been documented.
- A new "oidmap" API has been introduced and oidset API has been rewritten to use it.
Also contains various documentation updates and code clean-ups.
Fixes since v2.14 -----------------
- "%C(color name)" in the pretty print format always produced ANSI color escape codes, which was an early design mistake. They now honor the configuration (e.g. "color.ui = never") and also tty-ness of the output medium.
- The http.{sslkey,sslCert} configuration variables are to be interpreted as a pathname that honors "~[username]/" prefix, but weren’t, which has been fixed.
- Numerous bugs in walking of reflogs via "log -g" and friends have been fixed.
- "git commit" when seeing an totally empty message said "you did not edit the message", which is clearly wrong. The message has been corrected.
- When a directory is not readable, "gitweb" fails to build the project list. Work this around by skipping such a directory.
- Some versions of GnuPG fails to kill gpg-agent it auto-spawned and such a left-over agent can interfere with a test. Work it around by attempting to kill one before starting a new test.
- A recently added test for the "credential-cache" helper revealed that EOF detection done around the time the connection to the cache daemon is torn down were flaky. This was fixed by reacting to ECONNRESET and behaving as if we got an EOF.
- "git log --tag=no-such-tag" showed log starting from HEAD, which has been fixed---it now shows nothing.
- The "tag.pager" configuration variable was useless for those who actually create tag objects, as it interfered with the use of an editor. A new mechanism has been introduced for commands to enable pager depending on what operation is being carried out to fix this, and then "git tag -l" is made to run pager by default.
- "git push --recurse-submodules $there HEAD:$target" was not propagated down to the submodules, but now it is.
- Commands like "git rebase" accepted the --rerere-autoupdate option from the command line, but did not always use it. This has been fixed.
- "git clone --recurse-submodules --quiet" did not pass the quiet option down to submodules.
- Test portability fix for OBSD.
- Portability fix for OBSD.
- "git am -s" has been taught that some input may end with a trailer block that is not Signed-off-by: and it should refrain from adding an extra blank line before adding a new sign-off in such a case.
- "git svn" used with "--localtime" option did not compute the tz offset for the timestamp in question and instead always used the current time, which has been corrected.
- Memory leak in an error codepath has been plugged.
- "git stash -u" used the contents of the committed version of the ".gitignore" file to decide which paths are ignored, even when the file has local changes. The command has been taught to instead use the locally modified contents.
- bash 4.4 or newer gave a warning on NUL byte in command substitution done in "git stash"; this has been squelched.
- "git grep -L" and "git grep --quiet -L" reported different exit codes; this has been corrected.
- When handshake with a subprocess filter notices that the process asked for an unknown capability, Git did not report what program the offending subprocess was running. This has been corrected.
- "git apply" that is used as a better "patch -p1" failed to apply a taken from a file with CRLF line endings to a file with CRLF line endings. The root cause was because it misused convert_to_git() that tried to do "safe-crlf" processing by looking at the index entry at the same path, which is a nonsense---in that mode, "apply" is not working on the data in (or derived from) the index at all. This has been fixed.
- Killing "git merge --edit" before the editor returns control left the repository in a state with MERGE_MSG but without MERGE_HEAD, which incorrectly tells the subsequent "git commit" that there was a squash merge in progress. This has been fixed.
- "git archive" did not work well with pathspecs and the export-ignore attribute.
- In addition to "cc: <a@dd.re.ss> # cruft", "cc: a@dd.re.ss # cruft" was taught to "git send-email" as a valid way to tell it that it needs to also send a carbon copy to <a@dd.re.ss> in the trailer section.
- "git branch -M a b" while on a branch that is completely unrelated to either branch a or branch b misbehaved when multiple worktree was in use. This has been fixed. (merge 31824d180d nd/worktree-kill-parse-ref later to maint).
- "git gc" and friends when multiple worktrees are used off of a single repository did not consider the index and per-worktree refs of other worktrees as the root for reachability traversal, making objects that are in use only in other worktrees to be subject to garbage collection.
- A regression to "gitk --bisect" by a recent update has been fixed.
- "git -c submodule.recurse=yes pull" did not work as if the "--recurse-submodules" option was given from the command line. This has been corrected.
- Unlike "git commit-tree < file", "git commit-tree -F file" did not pass the contents of the file verbatim and instead completed an incomplete line at the end, if exists. The latter has been updated to match the behaviour of the former.
- Many codepaths did not diagnose write failures correctly when disks go full, due to their misuse of write_in_full() helper function, which have been corrected. (merge f48ecd38cb jk/write-in-full-fix later to maint).
- "git help co" now says "co is aliased to …", not "git co is". (merge b3a8076e0d ks/help-alias-label later to maint).
- "git archive", especially when used with pathspec, stored an empty directory in its output, even though Git itself never does so. This has been fixed.
- API error-proofing which happens to also squelch warnings from GCC.
- The explanation of the cut-line in the commit log editor has been slightly tweaked. (merge 8c4b1a3593 ks/commit-do-not-touch-cut-line later to maint).
- "git gc" tries to avoid running two instances at the same time by reading and writing pid/host from and to a lock file; it used to use an incorrect fscanf() format when reading, which has been corrected.
- The scripts to drive TravisCI has been reorganized and then an optimization to avoid spending cycles on a branch whose tip is tagged has been implemented. (merge 8376eb4a8f ls/travis-scriptify later to maint).
- The test linter has been taught that we do not like "echo -e".
- Code cmp.std.c nitpick.
- A regression fix for 2.11 that made the code to read the list of alternate object stores overrun the end of the string. (merge f0f7bebef7 jk/info-alternates-fix later to maint).
- "git describe --match" learned to take multiple patterns in v2.13 series, but the feature ignored the patterns after the first one and did not work at all. This has been fixed.
- "git filter-branch" cannot reproduce a history with a tag without the tagger field, which only ancient versions of Git allowed to be created. This has been corrected. (merge b2c1ca6b4b ic/fix-filter-branch-to-handle-tag-without-tagger later to maint).
- "git cat-file --textconv" started segfaulting recently, which has been corrected.
- The built-in pattern to detect the "function header" for HTML did not match <H1>..<H6> elements without any attributes, which has been fixed.
- "git mailinfo" was loose in decoding quoted printable and produced garbage when the two letters after the equal sign are not hexadecimal. This has been fixed.
- The machinery to create xdelta used in pack files received the sizes of the data in size_t, but lost the higher bits of them by storing them in "unsigned int" during the computation, which is fixed.
- The delta format used in the packfile cannot reference data at offset larger than what can be expressed in 4-byte, but the generator for the data failed to make sure the offset does not overflow. This has been corrected.
- The documentation for ’-X<option>’ for merges was misleadingly written to suggest that "-s theirs" exists, which is not the case.
- "git fast-export" with -M/-C option issued "copy" instruction on a path that is simultaneously modified, which was incorrect. (merge b3e8ca89cf jt/fast-export-copy-modify-fix later to maint).
- Many codepaths have been updated to squelch -Wsign-compare warnings. (merge 071bcaab64 rj/no-sign-compare later to maint).
- Memory leaks in various codepaths have been plugged. (merge 4d01a7fa65 ma/leakplugs later to maint).
- Recent versions of "git rev-parse --parseopt" did not parse the option specification that does not have the optional flags (*=?!) correctly, which has been corrected. (merge a6304fa4c2 bc/rev-parse-parseopt-fix later to maint).
- The checkpoint command "git fast-import" did not flush updates to refs and marks unless at least one object was created since the last checkpoint, which has been corrected, as these things can happen without any new object getting created. (merge 30e215a65c er/fast-import-dump-refs-on-checkpoint later to maint).
- Spell the name of our system as "Git" in the output from request-pull script.
- Fixes for a handful memory access issues identified by valgrind.
- Backports a moral equivalent of 2015 fix to the poll() emulation from the upstream gnulib to fix occasional breakages on HPE NonStop.
- Users with "color.ui = always" in their configuration were broken by a recent change that made plumbing commands to pay attention to them as the patch created internally by "git add -p" were colored (heh) and made unusable. This has been fixed by reverting the offending change.
- In the "--format=…" option of the "git for-each-ref" command (and its friends, i.e. the listing mode of "git branch/tag"), "%(atom:)" (e.g. "%(refname:)", "%(body:)" used to error out. Instead, treat them as if the colon and an empty string that follows it were not there.
- An ancient bug that made Git misbehave with creation/renaming of refs has been fixed.
- "git fetch <there> <src>:<dst>" allows an object name on the <src> side when the other side accepts such a request since Git v2.5, but the documentation was left stale. (merge 83558a412a jc/fetch-refspec-doc-update later to maint).
- Update the documentation for "git filter-branch" so that the filter options are listed in the same order as they are applied, as described in an earlier part of the doc. (merge 07c4984508 dg/filter-branch-filter-order-doc later to maint).
- A possible oom error is now caught as a fatal error, instead of continuing and dereferencing NULL. (merge 55d7d15847 ao/path-use-xmalloc later to maint).
- Other minor doc, test and build updates and code cleanups. (merge f094b89a4d ma/parse-maybe-bool later to maint). (merge 6cdf8a7929 ma/ts-cleanups later to maint). (merge 7560f547e6 ma/up-to-date later to maint). (merge 0db3dc75f3 rs/apply-epoch later to maint). (merge 276d0e35c0 ma/split-symref-update-fix later to maint). (merge f777623514 ks/branch-tweak-error-message-for-extra-args later to maint). (merge 33f3c683ec ks/verify-filename-non-option-error-message-tweak later to maint). (merge 7cbbf9d6a2 ls/filter-process-delayed later to maint). (merge 488aa65c8f wk/merge-options-gpg-sign-doc later to maint). (merge e61cb19a27 jc/branch-force-doc-readability-fix later to maint). (merge 32fceba3fd np/config-path-doc later to maint). (merge e38c681fb7 sb/rev-parse-show-superproject-root later to maint). (merge 4f851dc883 sg/rev-list-doc-reorder-fix later to maint).
2.15.1
Git v2.15.1 Release Notes =========================
Fixes since v2.15 -----------------
- TravisCI build updates.
- "auto" as a value for the columnar output configuration ought to judge "is the output consumed by humans?" with the same criteria as "auto" for coloured output configuration, i.e. either the standard output stream is going to tty, or a pager is in use. We forgot the latter, which has been fixed.
- The experimental "color moved lines differently in diff output" feature was buggy around "ignore whitespace changes" edges, which has been corrected.
- Instead of using custom line comparison and hashing functions to implement "moved lines" coloring in the diff output, use the pair of these functions from lower-layer xdiff/ code.
- Some codepaths did not check for errors when asking what branch the HEAD points at, which have been fixed.
- "git commit", after making a commit, did not check for errors when asking on what branch it made the commit, which has been corrected.
- "git status --ignored -u" did not stop at a working tree of a separate project that is embedded in an ignored directory and listed files in that other project, instead of just showing the directory itself as ignored.
- A broken access to object databases in recent update to "git grep --recurse-submodules" has been fixed.
- A recent regression in "git rebase -i" that broke execution of git commands from subdirectories via "exec" instruction has been fixed.
- "git check-ref-format --branch @{-1}" bit a "BUG()" when run outside a repository for obvious reasons; clarify the documentation and make sure we do not even try to expand the at-mark magic in such a case, but still call the validation logic for branch names.
- Command line completion (in contrib/) update.
- Description of blame.{showroot,blankboundary,showemail,date} configuration variables have been added to "git config --help".
- After an error from lstat(), diff_populate_filespec() function sometimes still went ahead and used invalid data in struct stat, which has been fixed.
- UNC paths are also relevant in Cygwin builds and they are now tested just like Mingw builds.
- Correct start-up sequence so that a repository could be placed immediately under the root directory again (which was broken at around Git 2.13).
- The credential helper for libsecret (in contrib/) has been improved to allow possibly prompting the end user to unlock secrets that are currently locked (otherwise the secrets may not be loaded).
- Updates from GfW project.
- "git rebase -i" recently started misbehaving when a submodule that is configured with ’submodule.<name>.ignore’ is dirty; this has been corrected.
- Some error messages did not quote filenames shown in it, which have been fixed.
- Building with NO_LIBPCRE1_JIT did not disable it, which has been fixed.
- We used to add an empty alternate object database to the system that does not help anything; it has been corrected.
- Error checking in "git imap-send" for empty response has been improved.
- An ancient bug in "git apply --ignore-space-change" codepath has been fixed.
- There was a recent semantic mismerge in the codepath to write out a section of a configuration section, which has been corrected.
Also contains various documentation updates and code clean-ups.
2.15.2
Git v2.15.2 Release Notes =========================
Fixes since v2.15.1 -------------------
- Recent update to the refs infrastructure implementation started rewriting packed-refs file more often than before; this has been optimized again for most trivial cases.
- The SubmittingPatches document has been converted to produce an HTML version via AsciiDoc/Asciidoctor.
- Contrary to the documentation, "git pull -4/-6 other-args" did not ask the underlying "git fetch" to go over IPv4/IPv6, which has been corrected.
- When "git rebase" prepared an mailbox of changes and fed it to "git am" to replay them, it was confused when a stray "From " happened to be in the log message of one of the replayed changes. This has been corrected.
- Command line completion (in contrib/) has been taught about the "--copy" option of "git branch".
- "git apply --inaccurate-eof" when used with "--ignore-space-change" triggered an internal sanity check, which has been fixed.
- The sequencer machinery (used by "git cherry-pick A..B", and "git rebase -i", among other things) would have lost a commit if stopped due to an unlockable index file, which has been fixed.
- The three-way merge performed by "git cherry-pick" was confused when a new submodule was added in the meantime, which has been fixed (or "papered over").
- "git notes" sent its error message to its standard output stream, which was corrected.
- A few scripts (both in production and tests) incorrectly redirected their error output. These have been corrected.
- Clarify and enhance documentation for "merge-base --fork-point", as it was clear what it computed but not why/what for.
- This release also contains the fixes made in the v2.13.7 version of Git. See its release notes for details.
Also contains various documentation updates and code clean-ups.
2.15.3
Git v2.15.3 Release Notes =========================
This release merges up the fixes that appear in v2.14.5 to address the recently reported CVE-2018-17456; see the release notes for that version for details.
2.15.4
Git v2.15.4 Release Notes =========================
This release merges up the fixes that appear in v2.14.6 to address the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes for that version for details.
In conjunction with a vulnerability that was fixed in v2.20.2, .gitmodules is no longer allowed to contain entries of the form submodule.<name>.update=!command.
2.16.0
Git 2.16 Release Notes ======================
Backward compatibility notes and other notable changes.
- Use of an empty string as a pathspec element that is used for ’everything matches’ is now an error.
Updates since v2.15 -------------------
UI, Workflows & Features
- An empty string as a pathspec element that means "everything" i.e. ’git add ""’, is now illegal. We started this by first deprecating and warning a pathspec that has such an element in 2.11 (Nov 2016).
- A hook script that is set unexecutable is simply ignored. Git notifies when such a file is ignored, unless the message is squelched via advice.ignoredHook configuration.
- "git pull" has been taught to accept "--[no-]signoff" option and pass it down to "git merge".
- The "--push-option=<string>" option to "git push" now defaults to a list of strings configured via push.pushOption variable.
- "gitweb" checks if a directory is searchable with Perl’s "-x" operator, which can be enhanced by using "filetest ’access’" pragma, which now we do.
- "git stash save" has been deprecated in favour of "git stash push".
- The set of paths output from "git status --ignored" was tied closely with its "--untracked=<mode>" option, but now it can be controlled more flexibly. Most notably, a directory that is ignored because it is listed to be ignored in the ignore/exclude mechanism can be handled differently from a directory that ends up to be ignored only because all files in it are ignored.
- The remote-helper for talking to MediaWiki has been updated to truncate an overlong pagename so that ".mw" suffix can still be added.
- The remote-helper for talking to MediaWiki has been updated to work with mediawiki namespaces.
- The "--format=…" option "git for-each-ref" takes learned to show the name of the ’remote’ repository and the ref at the remote side that is affected for ’upstream’ and ’push’ via "%(push:remotename)" and friends.
- Doc and message updates to teach users "bisect view" is a synonym for "bisect visualize".
- "git bisect run" that did not specify any command to run used to go ahead and treated all commits to be tested as ’good’. This has been corrected by making the command error out.
- The SubmittingPatches document has been converted to produce an HTML version via AsciiDoc/Asciidoctor.
- We learned to optionally talk to a file system monitor via new fsmonitor extension to speed up "git status" and other operations that need to see which paths have been modified. Currently we only support "watchman". See File System Monitor section of git-update-index(1) for more detail.
- The "diff" family of commands learned to ignore differences in carriage return at the end of line.
- Places that know about "sendemail.to", like documentation and shell completion (in contrib/) have been taught about "sendemail.tocmd", too.
- "git add --renormalize ." is a new and safer way to record the fact that you are correcting the end-of-line convention and other "convert_to_git()" glitches in the in-repository data.
- "git branch" and "git checkout -b" are now forbidden from creating a branch whose name is "HEAD".
- "git branch --list" learned to show its output through the pager by default when the output is going to a terminal, which is controlled by the pager.branch configuration variable. This is similar to a recent change to "git tag --list".
- "git grep -W", "git diff -W" and their friends learned a heuristic to extend a pre-context beyond the line that matches the "function pattern" (aka "diff.*.xfuncname") to include a comment block, if exists, that immediately precedes it.
- "git config --expiry-date gc.reflogexpire" can read "2.weeks" from the configuration and report it as a timestamp, just like "--int" would read "1k" and report 1024, to help consumption by scripts.
- The shell completion (in contrib/) learned that "git pull" can take the "--autostash" option.
- The tagnames "git log --decorate" uses to annotate the commits can now be limited to subset of available refs with the two additional options, --decorate-refs[-exclude]=<pattern>.
- "git grep" compiled with libpcre2 sometimes triggered a segfault, which is being fixed.
- "git send-email" tries to see if the sendmail program is available in /usr/lib and /usr/sbin; extend the list of locations to be checked to also include directories on $PATH.
- "git diff" learned, "--anchored", a variant of the "--patience" algorithm, to which the user can specify which ’unique’ line to be used as anchoring points.
- The way "git worktree add" determines what branch to create from where and checkout in the new worktree has been updated a bit.
- Ancient part of codebase still shows dots after an abbreviated object name just to show that it is not a full object name, but these ellipses are confusing to people who newly discovered Git who are used to seeing abbreviated object names and find them confusing with the range syntax.
- With a configuration variable rebase.abbreviateCommands set, "git rebase -i" produces the todo list with a single-letter command names.
- "git worktree add" learned to run the post-checkout hook, just like "git checkout" does, after the initial checkout.
- "git svn" has been updated to strip CRs in the commit messages, as recent versions of Subversion rejects them.
- "git imap-send" did not correctly quote the folder name when making a request to the server, which has been corrected.
- Error messages from "git rebase" have been somewhat cleaned up.
- Git has been taught to support an https:// URL used for http.proxy when using recent versions of libcurl.
- "git merge" learned to pay attention to merge.verifySignatures configuration variable and pretend as if '--verify-signatures’ option was given from the command line.
- "git describe" was taught to dig trees deeper to find a <commit-ish>:<path> that refers to a given blob object.
Performance, Internal Implementation, Development Support etc.
- An earlier update made it possible to use an on-stack in-core lockfile structure (as opposed to having to deliberately leak an on-heap one). Many codepaths have been updated to take advantage of this new facility.
- Calling cmd_foo() as if it is a general purpose helper function is a no-no. Correct two instances of such to set an example.
- We try to see if somebody runs our test suite with a shell that does not support "local" like bash/dash does.
- An early part of piece-by-piece rewrite of "git bisect" in C.
- GSoC to piece-by-piece rewrite "git submodule" in C.
- Optimize the code to find shortest unique prefix of object names.
- Pathspec-limited revision traversal was taught not to keep finding unneeded differences once it knows two trees are different inside given pathspec.
- Conversion from uchar[20] to struct object_id continues.
- Code cleanup.
- A single-word "unsigned flags" in the diff options is being split into a structure with many bitfields.
- TravisCI build updates.
- Parts of a test to drive the long-running content filter interface has been split into its own module, hopefully to eventually become reusable.
- Drop (perhaps overly cautious) sanity check before using the index read from the filesystem at runtime.
- The build procedure has been taught to avoid some unnecessary instability in the build products.
- A new mechanism to upgrade the wire protocol in place is proposed and demonstrated that it works with the older versions of Git without harming them.
- An infrastructure to define what hash function is used in Git is introduced, and an effort to plumb that throughout various codepaths has been started.
- The code to iterate over loose object files got optimized.
- An internal function that was left for backward compatibility has been removed, as there is no remaining callers.
- Historically, the diff machinery for rename detection had a hardcoded limit of 32k paths; this is being lifted to allow users trade cycles with a (possibly) easier to read result.
- The tracing infrastructure has been optimized for cases where no tracing is requested.
- In preparation for implementing narrow/partial clone, the object walking machinery has been taught a way to tell it to "filter" some objects from enumeration.
- A few structures and variables that are implementation details of the decorate API have been renamed and then the API got documented better.
- Assorted updates for TravisCI integration. (merge 4f26366679 sg/travis-fixes later to maint).
- Introduce a helper to simplify code to parse a common pattern that expects either "--key" or "--key=<something>".
- "git version --build-options" learned to report the host CPU and the exact commit object name the binary was built from.
Also contains various documentation updates and code clean-ups.
Fixes since v2.15 -----------------
- "auto" as a value for the columnar output configuration ought to judge "is the output consumed by humans?" with the same criteria as "auto" for coloured output configuration, i.e. either the standard output stream is going to tty, or a pager is in use. We forgot the latter, which has been fixed.
- The experimental "color moved lines differently in diff output" feature was buggy around "ignore whitespace changes" edges, which has been corrected.
- Instead of using custom line comparison and hashing functions to implement "moved lines" coloring in the diff output, use the pair of these functions from lower-layer xdiff/ code.
- Some codepaths did not check for errors when asking what branch the HEAD points at, which have been fixed.
- "git commit", after making a commit, did not check for errors when asking on what branch it made the commit, which has been corrected.
- "git status --ignored -u" did not stop at a working tree of a separate project that is embedded in an ignored directory and listed files in that other project, instead of just showing the directory itself as ignored.
- A broken access to object databases in recent update to "git grep --recurse-submodules" has been fixed.
- A recent regression in "git rebase -i" that broke execution of git commands from subdirectories via "exec" instruction has been fixed.
- A (possibly flakey) test fix.
- "git check-ref-format --branch @{-1}" bit a "BUG()" when run outside a repository for obvious reasons; clarify the documentation and make sure we do not even try to expand the at-mark magic in such a case, but still call the validation logic for branch names.
- "git fetch --recurse-submodules" now knows that submodules can be moved around in the superproject in addition to getting updated, and finds the ones that need to be fetched accordingly.
- Command line completion (in contrib/) update.
- Description of blame.{showroot,blankboundary,showemail,date} configuration variables have been added to "git config --help".
- After an error from lstat(), diff_populate_filespec() function sometimes still went ahead and used invalid data in struct stat, which has been fixed.
- UNC paths are also relevant in Cygwin builds and they are now tested just like Mingw builds.
- Correct start-up sequence so that a repository could be placed immediately under the root directory again (which was broken at around Git 2.13).
- The credential helper for libsecret (in contrib/) has been improved to allow possibly prompting the end user to unlock secrets that are currently locked (otherwise the secrets may not be loaded).
- MinGW updates.
- Error checking in "git imap-send" for empty response has been improved.
- Recent update to the refs infrastructure implementation started rewriting packed-refs file more often than before; this has been optimized again for most trivial cases.
- Some error messages did not quote filenames shown in it, which have been fixed.
- "git rebase -i" recently started misbehaving when a submodule that is configured with ’submodule.<name>.ignore’ is dirty; this has been corrected.
- Building with NO_LIBPCRE1_JIT did not disable it, which has been fixed.
- We used to add an empty alternate object database to the system that does not help anything; it has been corrected.
- Doc update around use of "format-patch --subject-prefix" etc.
- A fix for an ancient bug in "git apply --ignore-space-change" codepath.
- Clarify and enhance documentation for "merge-base --fork-point", as it was clear what it computed but not why/what for.
- A few scripts (both in production and tests) incorrectly redirected their error output. These have been corrected.
- "git notes" sent its error message to its standard output stream, which was corrected.
- The three-way merge performed by "git cherry-pick" was confused when a new submodule was added in the meantime, which has been fixed (or "papered over").
- The sequencer machinery (used by "git cherry-pick A..B", and "git rebase -i", among other things) would have lost a commit if stopped due to an unlockable index file, which has been fixed.
- "git apply --inaccurate-eof" when used with "--ignore-space-change" triggered an internal sanity check, which has been fixed.
- Command line completion (in contrib/) has been taught about the "--copy" option of "git branch".
- When "git rebase" prepared a mailbox of changes and fed it to "git am" to replay them, it was confused when a stray "From " happened to be in the log message of one of the replayed changes. This has been corrected.
- There was a recent semantic mismerge in the codepath to write out a section of a configuration section, which has been corrected.
- Mentions of "git-rebase" and "git-am" (dashed form) still remained in end-user visible strings emitted by the "git rebase" command; they have been corrected.
- Contrary to the documentation, "git pull -4/-6 other-args" did not ask the underlying "git fetch" to go over IPv4/IPv6, which has been corrected.
- "git checkout --recursive" may overwrite and rewind the history of the branch that happens to be checked out in submodule repositories, which might not be desirable. Detach the HEAD but still allow the recursive checkout to succeed in such a case. (merge 57f22bf997 sb/submodule-recursive-checkout-detach-head later to maint).
- "git branch --set-upstream" has been deprecated and (sort of) removed, as "--set-upstream-to" is the preferred one these days. The documentation still had "--set-upstream" listed on its synopsis section, which has been corrected. (merge a060f3d3d8 tz/branch-doc-remove-set-upstream later to maint).
- Internally we use 0{40} as a placeholder object name to signal the codepath that there is no such object (e.g. the fast-forward check while "git fetch" stores a new remote-tracking ref says "we know there is no ’old’ thing pointed at by the ref, as we are creating it anew" by passing 0{40} for the ’old’ side), and expect that a codepath to locate an in-core object to return NULL as a sign that the object does not exist. A look-up for an object that does not exist however is quite costly with a repository with large number of packfiles. This access pattern has been optimized. (merge 87b5e236a1 jk/fewer-pack-rescan later to maint).
- In addition to "git stash -m message", the command learned to accept "git stash -mmessage" form. (merge 5675473fcb ph/stash-save-m-option-fix later to maint).
- @{-N} in "git checkout @{-N}" may refer to a detached HEAD state, but the documentation was not clear about it, which has been fixed. (merge 75ce149575 ks/doc-checkout-previous later to maint).
- A regression in the progress eye-candy was fixed. (merge 9c5951cacf jk/progress-delay-fix later to maint).
- The code internal to the recursive merge strategy was not fully prepared to see a path that is renamed to try overwriting another path that is only different in case on case insensitive systems. This does not matter in the current code, but will start to matter once the rename detection logic starts taking hints from nearby paths moving to some directory and moves a new path along with them. (merge 4cba2b0108 en/merge-recursive-icase-removal later to maint).
- An v2.12-era regression in pathspec match logic, which made it look into submodule tree even when it is not desired, has been fixed. (merge eef3df5a93 bw/pathspec-match-submodule-boundary later to maint).
- Amending commits in git-gui broke the author name that is non-ascii due to incorrect encoding conversion.
- Recent update to the submodule configuration code broke "diff-tree" by accidentally stopping to read from the index upfront. (merge fd66bcc31f bw/submodule-config-cleanup later to maint).
- Git shows a message to tell the user that it is waiting for the user to finish editing when spawning an editor, in case the editor opens to a hidden window or somewhere obscure and the user gets lost. (merge abfb04d0c7 ls/editor-waiting-message later to maint).
- The "safe crlf" check incorrectly triggered for contents that does not use CRLF as line endings, which has been corrected. (merge 649f1f0948 tb/check-crlf-for-safe-crlf later to maint).
- The build procedure now allows not just the repositories but also the refs to be used to take pre-formatted manpages and html documents to install. (merge 65289e9dcd rb/quick-install-doc later to maint).
- Update the shell prompt script (in contrib/) to strip trailing CR from strings read from various "state" files. (merge 041fe8fc83 ra/prompt-eread-fix later to maint).
- "git merge -s recursive" did not correctly abort when the index is dirty, if the merged tree happened to be the same as the current HEAD, which has been fixed.
- Bytes with high-bit set were encoded incorrectly and made credential helper fail. (merge 4c267f2ae3 jd/fix-strbuf-add-urlencode-bytes later to maint).
- "git rebase -p -X<option>" did not propagate the option properly down to underlying merge strategy backend. (merge dd6fb0053c js/fix-merge-arg-quoting-in-rebase-p later to maint).
- "git merge -s recursive" did not correctly abort when the index is dirty, if the merged tree happened to be the same as the current HEAD, which has been fixed. (merge f309e8e768 ew/empty-merge-with-dirty-index-maint later to maint).
- Other minor doc, test and build updates and code cleanups. (merge 1a1fc2d5b5 rd/man-prune-progress later to maint). (merge 0ba014035a rd/man-reflog-add-n later to maint). (merge e54b63359f rd/doc-notes-prune-fix later to maint). (merge ff4c9b413a sp/doc-info-attributes later to maint). (merge 7db2cbf4f1 jc/receive-pack-hook-doc later to maint). (merge 5a0526264b tg/t-readme-updates later to maint). (merge 5e83cca0b8 jk/no-optional-locks later to maint). (merge 826c778f7c js/hashmap-update-sample later to maint). (merge 176b2d328c sg/setup-doc-update later to maint). (merge 1b09073514 rs/am-builtin-leakfix later to maint). (merge addcf6cfde rs/fmt-merge-msg-string-leak-fix later to maint). (merge c3ff8f6c14 rs/strbuf-read-once-reset-length later to maint). (merge 6b0eb884f9 db/doc-workflows-neuter-the-maintainer later to maint). (merge 8c87bdfb21 jk/cvsimport-quoting later to maint). (merge 176cb979fe rs/fmt-merge-msg-leakfix later to maint). (merge 5a03360e73 tb/delimit-pretty-trailers-args-with-comma later to maint). (merge d0e6326026 ot/pretty later to maint). (merge 44103f4197 sb/test-helper-excludes later to maint). (merge 170078693f jt/transport-no-more-rsync later to maint). (merge c07b3adff1 bw/path-doc later to maint). (merge bf9d7df950 tz/lib-git-svn-svnserve-tests later to maint). (merge dec366c9a8 sr/http-sslverify-config-doc later to maint). (merge 3f824e91c8 jk/test-suite-tracing later to maint). (merge 1feb061701 db/doc-config-section-names-with-bs later to maint). (merge 74dea0e13c jh/memihash-opt later to maint). (merge 2e9fdc795c ma/bisect-leakfix later to maint).
2.16.1
Git v2.16.1 Release Notes =========================
Fixes since v2.16 -----------------
- "git clone" segfaulted when cloning a project that happens to track two paths that differ only in case on a case insensitive filesystem.
Does not contain any other documentation updates or code clean-ups.
2.16.2
Git v2.16.2 Release Notes =========================
Fixes since v2.16.1 -------------------
- An old regression in "git describe --all $annotated_tag^0" has been fixed.
- "git svn dcommit" did not take into account the fact that a svn+ssh: to the same SVN repository without the username@ and failed when svn.pushmergeinfo option is set.
- "git merge -Xours/-Xtheirs" learned to use our/their version when resolving a conflicting updates to a symbolic link.
- "git clone $there $here" is allowed even when here directory exists as long as it is an empty directory, but the command incorrectly removed it upon a failure of the operation.
- "git stash — <pathspec>" incorrectly blew away untracked files in the directory that matched the pathspec, which has been corrected.
- "git add -p" was taught to ignore local changes to submodules as they do not interfere with the partial addition of regular changes anyway.
Also contains various documentation updates and code clean-ups.
2.16.3
Git v2.16.3 Release Notes =========================
Fixes since v2.16.2 -------------------
- "git status" after moving a path in the working tree (hence making it appear "removed") and then adding with the -N option (hence making that appear "added") detected it as a rename, but did not report the old and new pathnames correctly.
- "git commit --fixup" did not allow "-m<message>" option to be used at the same time; allow it to annotate resulting commit with more text.
- When resetting the working tree files recursively, the working tree of submodules are now also reset to match.
- Fix for a commented-out code to adjust it to a rather old API change around object ID.
- When there are too many changed paths, "git diff" showed a warning message but in the middle of a line.
- The http tracing code, often used to debug connection issues, learned to redact potentially sensitive information from its output so that it can be more safely shareable.
- Crash fix for a corner case where an error codepath tried to unlock what it did not acquire lock on.
- The split-index mode had a few corner case bugs fixed.
- Assorted fixes to "git daemon".
- Completion of "git merge -s<strategy>" (in contrib/) did not work well in non-C locale.
- Workaround for segfault with more recent versions of SVN.
- Recently introduced leaks in fsck have been plugged.
- Travis CI integration now builds the executable in ’script’ phase to follow the established practice, rather than during ’before_script’ phase. This allows the CI categorize the failures better (’failed’ is project’s fault, ’errored’ is build environment’s).
Also contains various documentation updates and code clean-ups.
2.16.4
Git v2.16.4 Release Notes =========================
This release is to forward-port the fixes made in the v2.13.7 version of Git. See its release notes for details.
2.16.5
Git v2.16.5 Release Notes =========================
This release merges up the fixes that appear in v2.14.5 to address the recently reported CVE-2018-17456; see the release notes for that version for details.
2.16.6
Git v2.16.6 Release Notes =========================
This release merges up the fixes that appear in v2.14.6 and in v2.15.4 addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes for those versions for details.
2.17.0
Git 2.17 Release Notes ======================
Updates since v2.16 -------------------
UI, Workflows & Features
- "diff" family of commands learned "--find-object=<object-id>" option to limit the findings to changes that involve the named object.
- "git format-patch" learned to give 72-cols to diffstat, which is consistent with other line length limits the subcommand uses for its output meant for e-mails.
- The log from "git daemon" can be redirected with a new option; one relevant use case is to send the log to standard error (instead of syslog) when running it from inetd.
- "git rebase" learned to take "--allow-empty-message" option.
- "git am" has learned the "--quit" option, in addition to the existing "--abort" option; having the pair mirrors a few other commands like "rebase" and "cherry-pick".
- "git worktree add" learned to run the post-checkout hook, just like "git clone" runs it upon the initial checkout.
- "git tag" learned an explicit "--edit" option that allows the message given via "-m" and "-F" to be further edited.
- "git fetch --prune-tags" may be used as a handy short-hand for getting rid of stale tags that are locally held.
- The new "--show-current-patch" option gives an end-user facing way to get the diff being applied when "git rebase" (and "git am") stops with a conflict.
- "git add -p" used to offer "/" (look for a matching hunk) as a choice, even there was only one hunk, which has been corrected. Also the single-key help is now given only for keys that are enabled (e.g. help for ’/’ won’t be shown when there is only one hunk).
- Since Git 1.7.9, "git merge" defaulted to --no-ff (i.e. even when the side branch being merged is a descendant of the current commit, create a merge commit instead of fast-forwarding) when merging a tag object. This was appropriate default for integrators who pull signed tags from their downstream contributors, but caused an unnecessary merges when used by downstream contributors who habitually "catch up" their topic branches with tagged releases from the upstream. Update "git merge" to default to --no-ff only when merging a tag object that does not sit at its usual place in refs/tags/ hierarchy, and allow fast-forwarding otherwise, to mitigate the problem.
- "git status" can spend a lot of cycles to compute the relation between the current branch and its upstream, which can now be disabled with "--no-ahead-behind" option.
- "git diff" and friends learned funcname patterns for Go language source files.
- "git send-email" learned "--reply-to=<address>" option.
- Funcname pattern used for C# now recognizes "async" keyword.
- In a way similar to how "git tag" learned to honor the pager setting only in the list mode, "git config" learned to ignore the pager setting when it is used for setting values (i.e. when the purpose of the operation is not to "show").
Performance, Internal Implementation, Development Support etc.
- More perf tests for threaded grep
- "perf" test output can be sent to codespeed server.
- The build procedure for perl/ part has been greatly simplified by weaning ourselves off of MakeMaker.
- Perl 5.8 or greater has been required since Git 1.7.4 released in 2010, but we continued to assume some core modules may not exist and used a conditional "eval { require module }"; we no longer do this. Some platforms (Fedora/RedHat/CentOS, for example) ship Perl without all core modules by default (e.g. Digest::MD5, File::Temp, File::Spec, Net::Domain, Net::SMTP). Users on such platforms may need to install these additional modules.
- As a convenience, we install copies of Perl modules we require which are not part of the core Perl distribution (e.g. Error and Mail::Address). Users and packagers whose operating system provides these modules can set NO_PERL_CPAN_FALLBACKS to avoid installing the bundled modules.
- In preparation for implementing narrow/partial clone, the machinery for checking object connectivity used by gc and fsck has been taught that a missing object is OK when it is referenced by a packfile specially marked as coming from trusted repository that promises to make them available on-demand and lazily.
- The machinery to clone & fetch, which in turn involves packing and unpacking objects, has been told how to omit certain objects using the filtering mechanism introduced by another topic. It now knows to mark the resulting pack as a promisor pack to tolerate missing objects, laying foundation for "narrow" clones.
- The first step to getting rid of mru API and using the doubly-linked list API directly instead.
- Retire mru API as it does not give enough abstraction over underlying list API to be worth it.
- Rewrite two more "git submodule" subcommands in C.
- The tracing machinery learned to report tweaking of environment variables as well.
- Update Coccinelle rules to catch and optimize strbuf_addf(&buf, "%s", str)
- Prevent "clang-format" from breaking line after function return type.
- The sequencer infrastructure is shared across "git cherry-pick", "git rebase -i", etc., and has always spawned "git commit" when it needs to create a commit. It has been taught to do so internally, when able, by reusing the codepath "git commit" itself uses, which gives performance boost for a few tens of percents in some sample scenarios.
- Push the submodule version of collision-detecting SHA-1 hash implementation a bit harder on builders.
- Avoid mmapping small files while using packed refs (especially ones with zero size, which would cause later munmap() to fail).
- Conversion from uchar[20] to struct object_id continues.
- More tests for wildmatch functions.
- The code to binary search starting from a fan-out table (which is how the packfile is indexed with object names) has been refactored into a reusable helper.
- We now avoid using identifiers that clash with C keywords. Even though it is not a goal to compile Git with C compilers, changes like this help use of code analysis tools that targets C++ on our codebase.
- The executable is now built in ’script’ phase in Travis CI integration, to follow the established practice, rather than during ’before_script’ phase. This allows the CI categorize the failures better (’failed’ is project’s fault, ’errored’ is build environment’s). (merge 3c93b82920 sg/travis-build-during-script-phase later to maint).
- Writing out the index file when the only thing that changed in it is the untracked cache information is often wasteful, and this has been optimized out.
- Various pieces of Perl code we have have been cleaned up.
- Internal API clean-up to allow write_locked_index() optionally skip writing the in-core index when it is not modified.
Also contains various documentation updates and code clean-ups.
Fixes since v2.16 -----------------
- An old regression in "git describe --all $annotated_tag^0" has been fixed.
- "git status" after moving a path in the working tree (hence making it appear "removed") and then adding with the -N option (hence making that appear "added") detected it as a rename, but did not report the old and new pathnames correctly.
- "git svn dcommit" did not take into account the fact that a svn+ssh: to the same SVN repository without the username@ and failed when svn.pushmergeinfo option is set.
- API clean-up around revision traversal.
- "git merge -Xours/-Xtheirs" learned to use our/their version when resolving a conflicting updates to a symbolic link.
- "git clone $there $here" is allowed even when here directory exists as long as it is an empty directory, but the command incorrectly removed it upon a failure of the operation.
- "git commit --fixup" did not allow "-m<message>" option to be used at the same time; allow it to annotate resulting commit with more text.
- When resetting the working tree files recursively, the working tree of submodules are now also reset to match.
- "git stash — <pathspec>" incorrectly blew away untracked files in the directory that matched the pathspec, which has been corrected.
- Instead of maintaining home-grown email address parsing code, ship a copy of reasonably recent Mail::Address to be used as a fallback in ’git send-email’ when the platform lacks it. (merge d60be8acab mm/send-email-fallback-to-local-mail-address later to maint).
- "git add -p" was taught to ignore local changes to submodules as they do not interfere with the partial addition of regular changes anyway.
- Avoid showing a warning message in the middle of a line of "git diff" output. (merge 4e056c989f nd/diff-flush-before-warning later to maint).
- The http tracing code, often used to debug connection issues, learned to redact potentially sensitive information from its output so that it can be more safely shareable. (merge 8ba18e6fa4 jt/http-redact-cookies later to maint).
- Crash fix for a corner case where an error codepath tried to unlock what it did not acquire lock on. (merge 81fcb698e0 mr/packed-ref-store-fix later to maint).
- The split-index mode had a few corner case bugs fixed. (merge ae59a4e44f tg/split-index-fixes later to maint).
- Assorted fixes to "git daemon". (merge ed15e58efe jk/daemon-fixes later to maint).
- Completion of "git merge -s<strategy>" (in contrib/) did not work well in non-C locale. (merge 7cc763aaa3 nd/list-merge-strategy later to maint).
- Workaround for segfault with more recent versions of SVN. (merge 7f6f75e97a ew/svn-branch-segfault-fix later to maint).
- Plug recently introduced leaks in fsck. (merge ba3a08ca0e jt/fsck-code-cleanup later to maint).
- "git pull --rebase" did not pass verbosity setting down when recursing into a submodule. (merge a56771a668 sb/pull-rebase-submodule later to maint).
- The way "git reset --hard" reports the commit the updated HEAD points at is made consistent with the way how the commit title is generated by the other parts of the system. This matters when the title is spread across physically multiple lines. (merge 1cf823fb68 tg/reset-hard-show-head-with-pretty later to maint).
- Test fixes. (merge 63b1a175ee sg/test-i18ngrep later to maint).
- Some bugs around "untracked cache" feature have been fixed. This will notice corrupt data in the untracked cache left by old and buggy code and issue a warning---the index can be fixed by clearing the untracked cache from it. (merge 0cacebf099 nd/fix-untracked-cache-invalidation later to maint). (merge 7bf0be7501 ab/untracked-cache-invalidation-docs later to maint).
- "git blame HEAD COPYING" in a bare repository failed to run, while "git blame HEAD — COPYING" run just fine. This has been corrected.
- "git add" files in the same directory, but spelling the directory path in different cases on case insensitive filesystem, corrupted the name hash data structure and led to unexpected results. This has been corrected. (merge c95525e90d bp/name-hash-dirname-fix later to maint).
- "git rebase -p" mangled log messages of a merge commit, which is now fixed. (merge ed5144d7eb js/fix-merge-arg-quoting-in-rebase-p later to maint).
- Some low level protocol codepath could crash when they get an unexpected flush packet, which is now fixed. (merge bb1356dc64 js/packet-read-line-check-null later to maint).
- "git check-ignore" with multiple paths got confused when one is a file and the other is a directory, which has been fixed. (merge d60771e930 rs/check-ignore-multi later to maint).
- "git describe $garbage" stopped giving any errors when the garbage happens to be a string with 40 hexadecimal letters. (merge a8e7a2bf0f sb/describe-blob later to maint).
- Code to unquote single-quoted string (used in the parser for configuration files, etc.) did not diagnose bogus input correctly and produced bogus results instead. (merge ddbbf8eb25 jk/sq-dequote-on-bogus-input later to maint).
- Many places in "git apply" knew that "/dev/null" that signals "there is no such file on this side of the diff" can be followed by whitespace and garbage when parsing a patch, except for one, which made an otherwise valid patch (e.g. ones from subversion) rejected. (merge e454ad4bec tk/apply-dev-null-verify-name-fix later to maint).
- We no longer create any *.spec file, so "make clean" should not remove it. (merge 4321bdcabb tz/do-not-clean-spec-file later to maint).
- "git push" over http transport did not unquote the push-options correctly. (merge 90dce21eb0 jk/push-options-via-transport-fix later to maint).
- "git send-email" learned to complain when the batch-size option is not defined when the relogin-delay option is, since these two are mutually required. (merge 9caa70697b xz/send-email-batch-size later to maint).
- Y2k20 fix ;-) for our perl scripts. (merge a40e06ee33 bw/perl-timegm-timelocal-fix later to maint).
- Threaded "git grep" has been optimized to avoid allocation in code section that is covered under a mutex. (merge 38ef24dccf rv/grep-cleanup later to maint).
- "git subtree" script (in contrib/) scripted around "git log", whose output got affected by end-user configuration like log.showsignature (merge 8841b5222c sg/subtree-signed-commits later to maint).
- While finding unique object name abbreviation, the code may accidentally have read beyond the end of the array of object names in a pack. (merge 21abed500c ds/find-unique-abbrev-optim later to maint).
- Micro optimization in revision traversal code. (merge ebbed3ba04 ds/mark-parents-uninteresting-optim later to maint).
- "git commit" used to run "gc --auto" near the end, which was lost when the command was reimplemented in C by mistake. (merge 095c741edd ab/gc-auto-in-commit later to maint).
- Allow running a couple of tests with "sh -x". (merge c20bf94abc sg/cvs-tests-with-x later to maint).
- The codepath to replace an existing entry in the index had a bug in updating the name hash structure, which has been fixed. (merge 0e267b7a24 bp/refresh-cache-ent-rehash-fix later to maint).
- The transfer.fsckobjects configuration tells "git fetch" to validate the data and connected-ness of objects in the received pack; the code to perform this check has been taught about the narrow clone’s convention that missing objects that are reachable from objects in a pack that came from a promisor remote is OK.
- There was an unused file-scope static variable left in http.c when building for versions of libCURL that is older than 7.19.4, which has been fixed. (merge b8fd6008ec rj/http-code-cleanup later to maint).
- Shell script portability fix. (merge 206a6ae013 ml/filter-branch-portability-fix later to maint).
- Other minor doc, test and build updates and code cleanups. (merge e2a5a028c7 bw/oidmap-autoinit later to maint). (merge ec3b4b06f8 cl/t9001-cleanup later to maint). (merge e1b3f3dd38 ks/submodule-doc-updates later to maint). (merge fbac558a9b rs/describe-unique-abbrev later to maint). (merge 8462ff43e4 tb/crlf-conv-flags later to maint). (merge 7d68bb0766 rb/hashmap-h-compilation-fix later to maint). (merge 3449847168 cc/sha1-file-name later to maint). (merge ad622a256f ds/use-get-be64 later to maint). (merge f919ffebed sg/cocci-move-array later to maint). (merge 4e801463c7 jc/mailinfo-cleanup-fix later to maint). (merge ef5b3a6c5e nd/shared-index-fix later to maint). (merge 9f5258cbb8 tz/doc-show-defaults-to-head later to maint). (merge b780e4407d jc/worktree-add-short-help later to maint). (merge ae239fc8e5 rs/cocci-strbuf-addf-to-addstr later to maint). (merge 2e22a85e5c nd/ignore-glob-doc-update later to maint). (merge 3738031581 jk/gettext-poison later to maint). (merge 54360a1956 rj/sparse-updates later to maint). (merge 12e31a6b12 sg/doc-test-must-fail-args later to maint). (merge 760f1ad101 bc/doc-interpret-trailers-grammofix later to maint). (merge 4ccf461f56 bp/fsmonitor later to maint). (merge a6119f82b1 jk/test-hashmap-updates later to maint). (merge 5aea9fe6cc rd/typofix later to maint). (merge e4e5da2796 sb/status-doc-fix later to maint). (merge 7976e901c8 gs/test-unset-xdg-cache-home later to maint). (merge d023df1ee6 tg/worktree-create-tracking later to maint). (merge 4cbe92fd41 sm/mv-dry-run-update later to maint). (merge 75e5e9c3f7 sb/color-h-cleanup later to maint). (merge 2708ef4af6 sg/t6300-modernize later to maint). (merge d88e92d4e0 bw/doc-submodule-recurse-config-with-clone later to maint). (merge f74bbc8dd2 jk/cached-commit-buffer later to maint). (merge 1316416903 ms/non-ascii-ticks later to maint). (merge 878056005e rs/strbuf-read-file-or-whine later to maint). (merge 79f0ba1547 jk/strbuf-read-file-close-error later to maint). (merge edfb8ba068 ot/ref-filter-cleanup later to maint). (merge 11395a3b4b jc/test-must-be-empty later to maint). (merge 768b9d6db7 mk/doc-pretty-fill later to maint). (merge 2caa7b8d27 ab/man-sec-list later to maint). (merge 40c17eb184 ks/t3200-typofix later to maint). (merge bd9958c358 dp/merge-strategy-doc-fix later to maint). (merge 9ee0540a40 js/ming-strftime later to maint). (merge 1775e990f7 tz/complete-tag-delete-tagname later to maint). (merge 00a4b03501 rj/warning-uninitialized-fix later to maint). (merge b635ed97a0 jk/attributes-path-doc later to maint).
2.17.1
Git v2.17.1 Release Notes =========================
Fixes since v2.17 -----------------
- This release contains the same fixes made in the v2.13.7 version of Git, covering CVE-2018-11233 and 11235, and forward-ported to v2.14.4, v2.15.2 and v2.16.4 releases. See release notes to v2.13.7 for details.
- In addition to the above fixes, this release has support on the server side to reject pushes to repositories that attempt to create such problematic .gitmodules file etc. as tracked contents, to help hosting sites protect their customers by preventing malicious contents from spreading.
2.17.2
Git v2.17.2 Release Notes =========================
This release merges up the fixes that appear in v2.14.5 to address the recently reported CVE-2018-17456; see the release notes for that version for details.
In addition, this release also teaches "fsck" and the server side logic to reject pushes to repositories that attempt to create such a problematic ".gitmodules" file as tracked contents, to help hosting sites protect their customers by preventing malicious contents from spreading.
2.17.3
Git v2.17.3 Release Notes =========================
This release merges up the fixes that appear in v2.14.6 and in v2.15.4 addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes for those versions for details.
In addition, git fsck was taught to identify .gitmodules entries of the form submodule.<name>.update=!command, which have been disallowed in v2.15.4.
2.17.4
Git v2.17.4 Release Notes =========================
This release is to address the security issue: CVE-2020-5260
Fixes since v2.17.3 -------------------
- With a crafted URL that contains a newline in it, the credential helper machinery can be fooled to give credential information for a wrong host. The attack has been made impossible by forbidding a newline character in any value passed via the credential protocol.
Credit for finding the vulnerability goes to Felix Wilhelm of Google Project Zero.
2.17.5
Git v2.17.5 Release Notes =========================
This release is to address a security issue: CVE-2020-11008
Fixes since v2.17.4 -------------------
- With a crafted URL that contains a newline or empty host, or lacks a scheme, the credential helper machinery can be fooled into providing credential information that is not appropriate for the protocol in use and host being contacted.
Unlike the vulnerability CVE-2020-5260 fixed in v2.17.4, the
credentials are not for a host of the attacker's choosing; instead,
they are for some unspecified host (based on how the configured
credential helper handles an absent "host" parameter).
The attack has been made impossible by refusing to work with
under-specified credential patterns.
Credit for finding the vulnerability goes to Carlo Arenas.
2.17.6
Git v2.17.6 Release Notes =========================
This release addresses the security issues CVE-2021-21300.
Fixes since v2.17.5 -------------------
- CVE-2021-21300: On case-insensitive file systems with support for symbolic links, if Git is configured globally to apply delay-capable clean/smudge filters (such as Git LFS), Git could be fooled into running remote code during a clone.
Credit for finding and fixing this vulnerability goes to Matheus Tavares, helped by Johannes Schindelin.
2.18.0
Git 2.18 Release Notes ======================
Updates since v2.17 -------------------
UI, Workflows & Features
- Rename detection logic that is used in "merge" and "cherry-pick" has learned to guess when all of x/a, x/b and x/c have moved to z/a, z/b and z/c, it is likely that x/d added in the meantime would also want to move to z/d by taking the hint that the entire directory ’x’ moved to ’z’. A bug causing dirty files involved in a rename to be overwritten during merge has also been fixed as part of this work. Incidentally, this also avoids updating a file in the working tree after a (non-trivial) merge whose result matches what our side originally had.
- "git filter-branch" learned to use a different exit code to allow the callers to tell the case where there was no new commits to rewrite from other error cases.
- When built with more recent cURL, GIT_SSL_VERSION can now specify "tlsv1.3" as its value.
- "git gui" learned that "
/.ssh/id_ecdsa.pub" and "/.ssh/id_ed25519.pub" are also possible SSH key files. (merge 2e2f0288ef bb/git-gui-ssh-key-files later to maint).
- "git gui" performs commit upon CTRL/CMD+ENTER but the CTRL/CMD+KP_ENTER (i.e. enter key on the numpad) did not have the same key binding. It now does. (merge 28a1d94a06 bp/git-gui-bind-kp-enter later to maint).
- "git gui" has been taught to work with old versions of tk (like 8.5.7) that do not support "ttk::style theme use" as a way to query the current theme. (merge 4891961105 cb/git-gui-ttk-style later to maint).
- "git rebase" has learned to honor "--signoff" option when using backends other than "am" (but not "--preserve-merges").
- "git branch --list" during an interrupted "rebase -i" now lets users distinguish the case where a detached HEAD is being rebased and a normal branch is being rebased.
- "git mergetools" learned talking to guiffy.
- The scripts in contrib/emacs/ have outlived their usefulness and have been replaced with a stub that errors out and tells the user there are replacements.
- The new "working-tree-encoding" attribute can ask Git to convert the contents to the specified encoding when checking out to the working tree (and the other way around when checking in).
- The "git config" command uses separate options e.g. "--int", "--bool", etc. to specify what type the caller wants the value to be interpreted as. A new "--type=<typename>" option has been introduced, which would make it cleaner to define new types.
- "git config --get" learned the "--default" option, to help the calling script. Building on top of the above changes, the "git config" learns "--type=color" type. Taken together, you can do things like "git config --get foo.color --default blue" and get the ANSI color sequence for the color given to foo.color variable, or "blue" if the variable does not exist.
- "git ls-remote" learned an option to allow sorting its output based on the refnames being shown.
- The command line completion (in contrib/) has been taught that "git stash save" has been deprecated ("git stash push" is the preferred spelling in the new world) and does not offer it as a possible completion candidate when "git stash push" can be.
- "git gc --prune=nonsense" spent long time repacking and then silently failed when underlying "git prune --expire=nonsense" failed to parse its command line. This has been corrected.
- Error messages from "git push" can be painted for more visibility.
- "git http-fetch" (deprecated) had an optional and experimental "feature" to fetch only commits and/or trees, which nobody used. This has been removed.
- The functionality of "$GIT_DIR/info/grafts" has been superseded by the "refs/replace/" mechanism for some time now, but the internal code had support for it in many places, which has been cleaned up in order to drop support of the "grafts" mechanism.
- "git worktree add" learned to check out an existing branch.
- "git --no-pager cmd" did not have short-and-sweet single letter option. Now it does as "-P". (merge 7213c28818 js/no-pager-shorthand later to maint).
- "git rebase" learned "--rebase-merges" to transplant the whole topology of commit graph elsewhere.
- "git status" learned to pay attention to UI related diff configuration variables such as diff.renames.
- The command line completion mechanism (in contrib/) learned to load custom completion file for "git $command" where $command is a custom "git-$command" that the end user has on the $PATH when using newer version of bash-completion.
- "git send-email" can sometimes offer confirmation dialog "Send this email?" with choices ’Yes’, ’No’, ’Quit’, and ’All’. A new action ’Edit’ has been added to this dialog’s choice.
- With merge.renames configuration set to false, the recursive merge strategy can be told not to spend cycles trying to find renamed paths and merge them accordingly.
- "git status" learned to honor a new status.renames configuration to skip rename detection, which could be useful for those who want to do so without disabling the default rename detection done by the "git diff" command.
- Command line completion (in contrib/) learned to complete pathnames for various commands better.
- "git blame" learns to unhighlight uninteresting metadata from the originating commit on lines that are the same as the previous one, and also paint lines in different colors depending on the age of the commit.
- Transfer protocol v2 learned to support the partial clone.
- When a short hexadecimal string is used to name an object but there are multiple objects that share the string as the prefix of their names, the code lists these ambiguous candidates in a help message. These object names are now sorted according to their types for easier eyeballing.
- "git fetch $there $refspec" that talks over protocol v2 can take advantage of server-side ref filtering; the code has been extended so that this mechanism triggers also when fetching with configured refspec.
- Our HTTP client code used to advertise that we accept gzip encoding from the other side; instead, just let cURL library to advertise and negotiate the best one.
- "git p4" learned to "unshelve" shelved commit from P4. (merge 123f631761 ld/p4-unshelve later to maint).
Performance, Internal Implementation, Development Support etc.
- A "git fetch" from a repository with insane number of refs into a repository that is already up-to-date still wasted too many cycles making many lstat(2) calls to see if these objects at the tips exist as loose objects locally. These lstat(2) calls are optimized away by enumerating all loose objects beforehand. It is unknown if the new strategy negatively affects existing use cases, fetching into a repository with many loose objects from a repository with small number of refs.
- Git can be built to use either v1 or v2 of the PCRE library, and so far, the build-time configuration USE_LIBPCRE=YesPlease instructed the build procedure to use v1, but now it means v2. USE_LIBPCRE1 and USE_LIBPCRE2 can be used to explicitly choose which version to use, as before.
- The build procedure learned to optionally use symbolic links (instead of hardlinks and copies) to install "git-foo" for built-in commands, whose binaries are all identical.
- Conversion from uchar[20] to struct object_id continues.
- The way "git worktree prune" worked internally has been simplified, by assuming how "git worktree move" moves an existing worktree to a different place.
- Code clean-up for the "repository" abstraction. (merge 00a3da2a13 nd/remove-ignore-env-field later to maint).
- Code to find the length to uniquely abbreviate object names based on packfile content, which is a relatively recent addition, has been optimized to use the same fan-out table.
- The mechanism to use parse-options API to automate the command line completion continues to get extended and polished.
- Copies of old scripted Porcelain commands in contrib/examples/ have been removed.
- Some tests that rely on the exact hardcoded values of object names have been updated in preparation for hash function migration.
- Perf-test update.
- Test helper update.
- The effort continues to refactor the internal global data structure to make it possible to open multiple repositories, work with and then close them,
- Small test-helper programs have been consolidated into a single binary.
- API clean-up around ref-filter code.
- Shell completion (in contrib) that gives list of paths have been optimized somewhat.
- The index file is updated to record the fsmonitor section after a full scan was made, to avoid wasting the effort that has already spent.
- Performance measuring framework in t/perf learned to help bisecting performance regressions.
- Some multi-word source filenames are being renamed to separate words with dashes instead of underscores.
- An reusable "memory pool" implementation has been extracted from fast-import.c, which in turn has become the first user of the mem-pool API.
- A build-time option has been added to allow Git to be told to refer to its associated files relative to the main binary, in the same way that has been possible on Windows for quite some time, for Linux, BSDs and Darwin.
- Precompute and store information necessary for ancestry traversal in a separate file to optimize graph walking.
- The effort to pass the repository in-core structure throughout the API continues. This round deals with the code that implements the refs/replace/ mechanism.
- The build procedure "make DEVELOPER=YesPlease" learned to enable a bit more warning options depending on the compiler used to help developers more. There also is "make DEVOPTS=tokens" knob available now, for those who want to help fixing warnings we usually ignore, for example.
- A new version of the transport protocol is being worked on.
- The code to interface to GPG has been restructured somewhat to make it cleaner to integrate with other types of signature systems later.
- The code has been taught to use the duplicated information stored in the commit-graph file to learn the tree object name for a commit to avoid opening and parsing the commit object when it makes sense to do so.
- "git gc" in a large repository takes a lot of time as it considers to repack all objects into one pack by default. The command has been taught to pretend as if the largest existing packfile is marked with ".keep" so that it is left untouched while objects in other packs and loose ones are repacked.
- The transport protocol v2 is getting updated further.
- The codepath around object-info API has been taught to take the repository object (which in turn tells the API which object store the objects are to be located).
- "git pack-objects" needs to allocate tons of "struct object_entry" while doing its work, and shrinking its size helps the performance quite a bit.
- The implementation of "git rebase -i --root" has been updated to use the sequencer machinery more.
- Developer support update, by using BUG() macro instead of die() to mark codepaths that should not happen more clearly.
- Developer support. Use newer GCC on one of the builds done at TravisCI.org to get more warnings and errors diagnosed.
- Conversion from uchar[20] to struct object_id continues.
- By code restructuring of submodule merge in merge-recursive, informational messages from the codepath are now given using the same mechanism as other output, and honor the merge.verbosity configuration. The code also learned to give a few new messages when a submodule three-way merge resolves cleanly when one side records a descendant of the commit chosen by the other side.
- Avoid unchecked snprintf() to make future code auditing easier. (merge ac4896f007 jk/snprintf-truncation later to maint).
- Many tests hardcode the raw object names, which would change once we migrate away from SHA-1. While some of them must test against exact object names, most of them do not have to use hardcoded constants in the test. The latter kind of tests have been updated to test the moral equivalent of the original without hardcoding the actual object names.
- The list of commands with their various attributes were spread across a few places in the build procedure, but it now is getting a bit more consolidated to allow more automation.
- Quite a many tests assumed that newly created refs are made as loose refs using the files backend, which have been updated to use proper plumbing like rev-parse and update-ref, to avoid breakage once we start using different ref backends.
Also contains various documentation updates and code clean-ups.
Fixes since v2.17 -----------------
- "git shortlog cruft" aborted with a BUG message when run outside a Git repository. The command has been taught to complain about extra and unwanted arguments on its command line instead in such a case. (merge 4aa0161e83 ma/shortlog-revparse later to maint).
- "git stash push -u — <pathspec>" gave an unnecessary and confusing error message when there was no tracked files that match the <pathspec>, which has been fixed. (merge 353278687e tg/stash-untracked-with-pathspec-fix later to maint).
- "git tag --contains no-such-commit" gave a full list of options after giving an error message. (merge 3bb0923f06 ps/contains-id-error-message later to maint).
- "diff-highlight" filter (in contrib/) learned to understand "git log --graph" output better. (merge 4551fbba14 jk/diff-highlight-graph-fix later to maint).
- when refs that do not point at committish are given, "git filter-branch" gave a misleading error messages. This has been corrected. (merge f78ab355e7 yk/filter-branch-non-committish-refs later to maint).
- "git submodule status" misbehaved on a submodule that has been removed from the working tree. (merge 74b6bda32f rs/status-with-removed-submodule later to maint).
- When credential helper exits very quickly without reading its input, it used to cause Git to die with SIGPIPE, which has been fixed. (merge a0d51e8d0e eb/cred-helper-ignore-sigpipe later to maint).
- "git rebase --keep-empty" still removed an empty commit if the other side contained an empty commit (due to the "does an equivalent patch exist already?" check), which has been corrected. (merge 3d946165e1 pw/rebase-keep-empty-fixes later to maint).
- Some codepaths, including the refs API, get and keep relative paths, that go out of sync when the process does chdir(2). The chdir-notify API is introduced to let these codepaths adjust these cached paths to the new current directory. (merge fb9c2d2703 jk/relative-directory-fix later to maint).
- "cd sub/dir && git commit ../path" ought to record the changes to the file "sub/path", but this regressed long time ago. (merge 86238e07ef bw/commit-partial-from-subdirectory-fix later to maint).
- Recent introduction of "--log-destination" option to "git daemon" did not work well when the daemon was run under "--inetd" mode. (merge e67d906d73 lw/daemon-log-destination later to maint).
- Small fix to the autoconf build procedure. (merge 249482daf0 es/fread-reads-dir-autoconf-fix later to maint).
- Fix an unexploitable (because the oversized contents are not under attacker’s control) buffer overflow. (merge d8579accfa bp/fsmonitor-bufsize-fix later to maint).
- Recent simplification of build procedure forgot a bit of tweak to the build procedure of contrib/mw-to-git/ (merge d8698987f3 ab/simplify-perl-makefile later to maint).
- Moving a submodule that itself has submodule in it with "git mv" forgot to make necessary adjustment to the nested sub-submodules; now the codepath learned to recurse into the submodules.
- "git config --unset a.b", when "a.b" is the last variable in an otherwise empty section "a", left an empty section "a" behind, and worse yet, a subsequent "git config a.c value" did not reuse that empty shell and instead created a new one. These have been (partially) corrected. (merge c71d8bb38a js/empty-config-section-fix later to maint).
- "git worktree remove" learned that "-f" is a shorthand for "--force" option, just like for "git worktree add". (merge d228eea514 sb/worktree-remove-opt-force later to maint).
- The completion script (in contrib/) learned to clear cached list of command line options upon dot-sourcing it again in a more efficient way. (merge 94408dc71c sg/completion-clear-cached later to maint).
- "git svn" had a minor thinko/typo which has been fixed. (merge 51db271587 ab/git-svn-get-record-typofix later to maint).
- During a "rebase -i" session, the code could give older timestamp to commits created by later "pick" than an earlier "reword", which has been corrected. (merge 12f7babd6b js/ident-date-fix later to maint).
- "git submodule status" did not check the symbolic revision name it computed for the submodule HEAD is not the NULL, and threw it at printf routines, which has been corrected. (merge 0b5e2ea7cf nd/submodule-status-fix later to maint).
- When fed input that already has In-Reply-To: and/or References: headers and told to add the same information, "git send-email" added these headers separately, instead of appending to an existing one, which is a violation of the RFC. This has been corrected. (merge 256be1d3f0 sa/send-email-dedup-some-headers later to maint).
- "git fast-export" had a regression in v2.15.0 era where it skipped some merge commits in certain cases, which has been corrected. (merge be011bbe00 ma/fast-export-skip-merge-fix later to maint).
- The code did not propagate the terminal width to subprocesses via COLUMNS environment variable, which it now does. This caused trouble to "git column" helper subprocess when "git tag --column=row" tried to list the existing tags on a display with non-default width. (merge b5d5a567fb nd/term-columns later to maint).
- We learned that our source files with ".pl" and ".py" extensions are Perl and Python files respectively and changes to them are better viewed as such with appropriate diff drivers. (merge 7818b619e2 ab/perl-python-attrs later to maint).
- "git rebase -i" sometimes left intermediate "# This is a combination of N commits" message meant for the human consumption inside an editor in the final result in certain corner cases, which has been fixed. (merge 15ef69314d js/rebase-i-clean-msg-after-fixup-continue later to maint).
- A test to see if the filesystem normalizes UTF-8 filename has been updated to check what we need to know in a more direct way, i.e. a path created in NFC form can be accessed with NFD form (or vice versa) to cope with APFS as well as HFS. (merge 742ae10e35 tb/test-apfs-utf8-normalization later to maint).
- "git format-patch --cover --attach" created a broken MIME multipart message for the cover letter, which has been fixed by keeping the cover letter as plain text file. (merge 50cd54ef4e bc/format-patch-cover-no-attach later to maint).
- The split-index feature had a long-standing and dormant bug in certain use of the in-core merge machinery, which has been fixed. (merge 7db118303a en/unpack-trees-split-index-fix later to maint).
- Asciidoctor gives a reasonable imitation for AsciiDoc, but does not render illustration in a literal block correctly when indented with HT by default. The problem is fixed by forcing 8-space tabs. (merge 379805051d bc/asciidoctor-tab-width later to maint).
- Code clean-up to adjust to a more recent lockfile API convention that allows lockfile instances kept on the stack. (merge 0fa5a2ed8d ma/lockfile-cleanup later to maint).
- the_repository→index is not a allocated piece of memory but repo_clear() indiscriminately attempted to free(3) it, which has been corrected. (merge 74373b5f10 nd/repo-clear-keep-the-index later to maint).
- Code clean-up to avoid non-standard-conformant pointer arithmetic. (merge c112084af9 rs/no-null-ptr-arith-in-fast-export later to maint).
- Code clean-up to turn history traversal more robust in a semi-corrupt repository. (merge 8702b30fd7 jk/unavailable-can-be-missing later to maint).
- "git update-ref A B" is supposed to ensure that ref A does not yet exist when B is a NULL OID, but this check was not done correctly for pseudo-refs outside refs/ hierarchy, e.g. MERGE_HEAD.
- "git submodule update" and "git submodule add" supported the "--reference" option to borrow objects from a neighbouring local repository like "git clone" does, but lacked the more recent invention "--dissociate". Also "git submodule add" has been taught to take the "--progress" option. (merge a0ef29341a cf/submodule-progress-dissociate later to maint).
- Update credential-netrc helper (in contrib/) to allow customizing the GPG used to decrypt the encrypted .netrc file. (merge 786ef50a23 lm/credential-netrc later to maint).
- "git submodule update" attempts two different kinds of "git fetch" against the upstream repository to grab a commit bound at the submodule’s path, but it incorrectly gave up if the first kind (i.e. a normal fetch) failed, making the second "last resort" one (i.e. fetching an exact commit object by object name) ineffective. This has been corrected. (merge e30d833671 sb/submodule-update-try-harder later to maint).
- Error behaviour of "git grep" when it cannot read the index was inconsistent with other commands that uses the index, which has been corrected to error out early. (merge b2aa84c789 sb/grep-die-on-unreadable-index later to maint).
- We used to call regfree() after regcomp() failed in some codepaths, which have been corrected. (merge 17154b1576 ma/regex-no-regfree-after-comp-fail later to maint).
- The import-tars script (in contrib/) has been taught to handle tarballs with overly long paths that use PAX extended headers. (merge 12ecea46e3 pa/import-tars-long-names later to maint).
- "git rev-parse Y…" etc. misbehaved when given endpoints were not committishes. (merge 0ed556d38f en/rev-parse-invalid-range later to maint).
- "git pull --recurse-submodules --rebase", when the submodule repository’s history did not have anything common between ours and the upstream’s, failed to execute. We need to fetch from them to continue even in such a case. (merge 4d36f88be7 jt/submodule-pull-recurse-rebase later to maint).
- "git remote update" can take both a single remote nickname and a nickname for remote groups, but only one of them was documented. (merge a97447a42a nd/remote-update-doc later to maint).
- "index-pack --strict" has been taught to make sure that it runs the final object integrity checks after making the freshly indexed packfile available to itself. (merge 3737746120 jk/index-pack-maint later to maint).
- Make zlib inflate codepath more robust against versions of zlib that clobber unused portion of outbuf. (merge b611396e97 jl/zlib-restore-nul-termination later to maint).
- Fix old merge glitch in Documentation during v2.13-rc0 era. (merge 28cb06020b mw/doc-merge-enumfix later to maint).
- The code to read compressed bitmap was not careful to avoid reading past the end of the file, which has been corrected. (merge 1140bf01ec jk/ewah-bounds-check later to maint).
- "make NO_ICONV=NoThanks" did not override NEEDS_LIBICONV (i.e. linkage of -lintl, -liconv, etc. that are platform-specific tweaks), which has been corrected. (merge fdb1fbbc7d es/make-no-iconv later to maint).
- Other minor doc, test and build updates and code cleanups. (merge 248f66ed8e nd/trace-with-env later to maint). (merge 14ced5562c ys/bisect-object-id-missing-conversion-fix later to maint). (merge 5988eb631a ab/doc-hash-brokenness later to maint). (merge a4d4e32a70 pk/test-avoid-pipe-hiding-exit-status later to maint). (merge 05e293c1ac jk/flockfile-stdio later to maint). (merge e9184b0789 jk/t5561-missing-curl later to maint). (merge b1801b85a3 nd/worktree-move later to maint). (merge bbd374dd20 ak/bisect-doc-typofix later to maint). (merge 4855f06fb3 mn/send-email-credential-doc later to maint). (merge 8523b1e355 en/doc-typoes later to maint). (merge 43b44ccfe7 js/t5404-path-fix later to maint). (merge decf711fc1 ps/test-chmtime-get later to maint). (merge 22d11a6e8e es/worktree-docs later to maint). (merge 92a5dbbc22 tg/use-git-contacts later to maint). (merge adc887221f tq/t1510 later to maint). (merge bed21a8ad6 sg/doc-gc-quote-mismatch-fix later to maint). (merge 73364e4f10 tz/doc-git-urls-reference later to maint). (merge cd1e606bad bc/mailmap-self later to maint). (merge f7997e3682 ao/config-api-doc later to maint). (merge ee930754d8 jk/apply-p-doc later to maint). (merge 011b648646 nd/pack-format-doc later to maint). (merge 87a6bb701a sg/t5310-jgit-bitmap-test later to maint). (merge f6b82970aa sg/t5516-fixes later to maint). (merge 4362da078e sg/t7005-spaces-in-filenames-cleanup later to maint). (merge 7d0ee47c11 js/test-unset-prereq later to maint). (merge 5356a3c354 ah/misc-doc-updates later to maint). (merge 92c4a7a129 nd/completion-aliasfiletype-typofix later to maint). (merge 58bd77b66a nd/pack-unreachable-objects-doc later to maint). (merge 4ed79d5203 sg/t6500-no-redirect-of-stdin later to maint). (merge 17b8a2d6cd jk/config-blob-sans-repo later to maint). (merge 590551ca2c rd/tag-doc-lightweight later to maint). (merge 44f560fc16 rd/init-typo later to maint). (merge f156a0934a rd/p4-doc-markup-env later to maint). (merge 2a00502b14 tg/doc-sec-list later to maint). (merge 47cc91310a jk/submodule-fsck-loose-fixup later to maint). (merge efde7b725c rd/comment-typofix-in-sha1-file later to maint). (merge 7eedad15df rd/diff-options-typofix later to maint). (merge 58ebd936cc km/doc-workflows-typofix later to maint). (merge 30aa96cdf8 rd/doc-remote-tracking-with-hyphen later to maint). (merge cf317877e3 ks/branch-set-upstream later to maint). (merge 8de19d6be8 sg/t7406-chain-fix later to maint).
2.18.1
Git v2.18.1 Release Notes =========================
This release merges up the fixes that appear in v2.14.5 and in v2.17.2 to address the recently reported CVE-2018-17456; see the release notes for those versions for details.
2.18.2
Git v2.18.2 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4 and in v2.17.3, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes for those versions for details.
2.18.3
Git v2.18.3 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.18.4
Git v2.18.4 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.18.5
Git v2.18.5 Release Notes =========================
This release merges up the fixes that appear in v2.17.6 to address the security issue CVE-2021-21300; see the release notes for that version for details.
2.19.0
Git 2.19 Release Notes ======================
Updates since v2.18 -------------------
UI, Workflows & Features
- "git diff" compares the index and the working tree. For paths added with intent-to-add bit, the command shows the full contents of them as added, but the paths themselves were not marked as new files. They are now shown as new by default.
"git apply" learned the "--intent-to-add" option so that an
otherwise working-tree-only application of a patch will add new
paths to the index marked with the "intent-to-add" bit.
- "git grep" learned the "--column" option that gives not just the line number but the column number of the hit.
- The "-l" option in "git branch -l" is an unfortunate short-hand for "--create-reflog", but many users, both old and new, somehow expect it to be something else, perhaps "--list". This step warns when "-l" is used as a short-hand for "--create-reflog" and warns about the future repurposing of the it when it is used.
- The userdiff pattern for .php has been updated.
- The content-transfer-encoding of the message "git send-email" sends out by default was 8bit, which can cause trouble when there is an overlong line to bust RFC 5322/2822 limit. A new option ’auto’ to automatically switch to quoted-printable when there is such a line in the payload has been introduced and is made the default.
- "git checkout" and "git worktree add" learned to honor checkout.defaultRemote when auto-vivifying a local branch out of a remote tracking branch in a repository with multiple remotes that have tracking branches that share the same names. (merge 8d7b558bae ab/checkout-default-remote later to maint).
- "git grep" learned the "--only-matching" option.
- "git rebase --rebase-merges" mode now handles octopus merges as well.
- Add a server-side knob to skip commits in exponential/fibbonacci stride in an attempt to cover wider swath of history with a smaller number of iterations, potentially accepting a larger packfile transfer, instead of going back one commit a time during common ancestor discovery during the "git fetch" transaction. (merge 42cc7485a2 jt/fetch-negotiator-skipping later to maint).
- A new configuration variable core.usereplacerefs has been added, primarily to help server installations that want to ignore the replace mechanism altogether.
- Teach "git tag -s" etc. a few configuration variables (gpg.format that can be set to "openpgp" or "x509", and gpg.<format>.program that is used to specify what program to use to deal with the format) to allow x.509 certs with CMS via "gpgsm" to be used instead of openpgp via "gnupg".
- Many more strings are prepared for l10n.
- "git p4 submit" learns to ask its own pre-submit hook if it should continue with submitting.
- The test performed at the receiving end of "git push" to prevent bad objects from entering repository can be customized via receive.fsck.* configuration variables; we now have gained a counterpart to do the same on the "git fetch" side, with fetch.fsck.* configuration variables.
- "git pull --rebase=interactive" learned "i" as a short-hand for "interactive".
- "git instaweb" has been adjusted to run better with newer Apache on RedHat based distros.
- "git range-diff" is a reimplementation of "git tbdiff" that lets us compare individual patches in two iterations of a topic.
- The sideband code learned to optionally paint selected keywords at the beginning of incoming lines on the receiving end.
- "git branch --list" learned to take the default sort order from the ’branch.sort’ configuration variable, just like "git tag --list" pays attention to ’tag.sort’.
- "git worktree" command learned "--quiet" option to make it less verbose.
Performance, Internal Implementation, Development Support etc.
- The bulk of "git submodule foreach" has been rewritten in C.
- The in-core "commit" object had an all-purpose "void *util" field, which was tricky to use especially in library-ish part of the code. All of the existing uses of the field has been migrated to a more dedicated "commit-slab" mechanism and the field is eliminated.
- A less often used command "git show-index" has been modernized. (merge fb3010c31f jk/show-index later to maint).
- The conversion to pass "the_repository" and then "a_repository" throughout the object access API continues.
- Continuing with the idea to programmatically enumerate various pieces of data required for command line completion, teach the codebase to report the list of configuration variables subcommands care about to help complete them.
- Separate "rebase -p" codepath out of "rebase -i" implementation to slim down the latter and make it easier to manage.
- Make refspec parsing codepath more robust.
- Some flaky tests have been fixed.
- Continuing with the idea to programmatically enumerate various pieces of data required for command line completion, the codebase has been taught to enumerate options prefixed with "--no-" to negate them.
- Build and test procedure for netrc credential helper (in contrib/) has been updated.
- Remove unused function definitions and declarations from ewah bitmap subsystem.
- Code preparation to make "git p4" closer to be usable with Python 3.
- Tighten the API to make it harder to misuse in-tree .gitmodules file, even though it shares the same syntax with configuration files, to read random configuration items from it.
- "git fast-import" has been updated to avoid attempting to create delta against a zero-byte-long string, which is pointless.
- The codebase has been updated to compile cleanly with -pedantic option. (merge 2b647a05d7 bb/pedantic later to maint).
- The character display width table has been updated to match the latest Unicode standard. (merge 570951eea2 bb/unicode-11-width later to maint).
- test-lint now looks for broken use of "VAR=VAL shell_func" in test scripts.
- Conversion from uchar[40] to struct object_id continues.
- Recent "security fix" to pay attention to contents of ".gitmodules" while accepting "git push" was a bit overly strict than necessary, which has been adjusted.
- "git fsck" learns to make sure the optional commit-graph file is in a sane state.
- "git diff --color-moved" feature has further been tweaked.
- Code restructuring and a small fix to transport protocol v2 during fetching.
- Parsing of -L[<N>][,[<M>]] parameters "git blame" and "git log" take has been tweaked.
- lookup_commit_reference() and friends have been updated to find in-core object for a specific in-core repository instance.
- Various glitches in the heuristics of merge-recursive strategy have been documented in new tests.
- "git fetch" learned a new option "--negotiation-tip" to limit the set of commits it tells the other end as "have", to reduce wasted bandwidth and cycles, which would be helpful when the receiving repository has a lot of refs that have little to do with the history at the remote it is fetching from.
- For a large tree, the index needs to hold many cache entries allocated on heap. These cache entries are now allocated out of a dedicated memory pool to amortize malloc(3) overhead.
- Tests to cover various conflicting cases have been added for merge-recursive.
- Tests to cover conflict cases that involve submodules have been added for merge-recursive.
- Look for broken "&&" chains that are hidden in subshell, many of which have been found and corrected.
- The singleton commit-graph in-core instance is made per in-core repository instance.
- "make DEVELOPER=1 DEVOPTS=pedantic" allows developers to compile with -pedantic option, which may catch more problematic program constructs and potential bugs.
- Preparatory code to later add json output for telemetry data has been added.
- Update the way we use Coccinelle to find out-of-style code that need to be modernised.
- It is too easy to misuse system API functions such as strcat(); these selected functions are now forbidden in this codebase and will cause a compilation failure.
- Add a script (in contrib/) to help users of VSCode work better with our codebase.
- The Travis CI scripts were taught to ship back the test data from failed tests. (merge aea8879a6a sg/travis-retrieve-trash-upon-failure later to maint).
- The parse-options machinery learned to refrain from enclosing placeholder string inside a "<bra" and "ket>" pair automatically without PARSE_OPT_LITERAL_ARGHELP. Existing help text for option arguments that are not formatted correctly have been identified and fixed. (merge 5f0df44cd7 rs/parse-opt-lithelp later to maint).
- Noiseword "extern" has been removed from function decls in the header files.
- A few atoms like %(objecttype) and %(objectsize) in the format specifier of "for-each-ref --format=<format>" can be filled without getting the full contents of the object, but just with the object header. These cases have been optimized by calling oid_object_info() API (instead of reading and inspecting the data).
- The end result of documentation update has been made to be inspected more easily to help developers.
- The API to iterate over all objects learned to optionally list objects in the order they appear in packfiles, which helps locality of access if the caller accesses these objects while as objects are enumerated.
- Improve built-in facility to catch broken &&-chain in the tests.
- The more library-ish parts of the codebase learned to work on the in-core index-state instance that is passed in by their callers, instead of always working on the singleton "the_index" instance.
- A test prerequisite defined by various test scripts with slightly different semantics has been consolidated into a single copy and made into a lazily defined one. (merge 6ec633059a wc/make-funnynames-shared-lazy-prereq later to maint).
- After a partial clone, repeated fetches from promisor remote would have accumulated many packfiles marked with .promisor bit without getting them coalesced into fewer packfiles, hurting performance. "git repack" now learned to repack them.
- Partially revert the support for multiple hash functions to regain hash comparison performance; we’d think of a way to do this better in the next cycle.
- "git help --config" (which is used in command line completion) missed the configuration variables not described in the main config.txt file but are described in another file that is included by it, which has been corrected.
- The test linter code has learned that the end of here-doc mark "EOF" can be quoted in a double-quote pair, not just in a single-quote pair.
Fixes since v2.18 -----------------
- "git remote update" can take both a single remote nickname and a nickname for remote groups, and the completion script (in contrib/) has been taught about it. (merge 9cd4382ad5 ls/complete-remote-update-names later to maint).
- "git fetch --shallow-since=<cutoff>" that specifies the cut-off point that is newer than the existing history used to end up grabbing the entire history. Such a request now errors out. (merge e34de73c56 nd/reject-empty-shallow-request later to maint).
- Fix for 2.17-era regression around
core.safecrlf. (merge 6cb09125be as/safecrlf-quiet-fix later to maint).
- The recent addition of "partial clone" experimental feature kicked in when it shouldn’t, namely, when there is no partial-clone filter defined even if extensions.partialclone is set. (merge cac1137dc4 jh/partial-clone later to maint).
- "git send-pack --signed" (hence "git push --signed" over the http transport) did not read user ident from the config mechanism to determine whom to sign the push certificate as, which has been corrected. (merge d067d98887 ms/send-pack-honor-config later to maint).
- "git fetch-pack --all" used to unnecessarily fail upon seeing an annotated tag that points at an object other than a commit. (merge c12c9df527 jk/fetch-all-peeled-fix later to maint).
- When user edits the patch in "git add -p" and the user’s editor is set to strip trailing whitespaces indiscriminately, an empty line that is unchanged in the patch would become completely empty (instead of a line with a sole SP on it). The code introduced in Git 2.17 timeframe failed to parse such a patch, but now it learned to notice the situation and cope with it. (merge f4d35a6b49 pw/add-p-recount later to maint).
- The code to try seeing if a fetch is necessary in a submodule during a fetch with --recurse-submodules got confused when the path to the submodule was changed in the range of commits in the superproject, sometimes showing "(null)". This has been corrected.
- Bugfix for "rebase -i" corner case regression. (merge a9279c6785 pw/rebase-i-keep-reword-after-conflict later to maint).
- Recently added "--base" option to "git format-patch" command did not correctly generate prereq patch ids. (merge 15b76c1fb3 xy/format-patch-prereq-patch-id-fix later to maint).
- POSIX portability fix in Makefile to fix a glitch introduced a few releases ago. (merge 6600054e9b dj/runtime-prefix later to maint).
- "git filter-branch" when used with the "--state-branch" option still attempted to rewrite the commits whose filtered result is known from the previous attempt (which is recorded on the state branch); the command has been corrected not to waste cycles doing so. (merge 709cfe848a mb/filter-branch-optim later to maint).
- Clarify that setting core.ignoreCase to deviate from reality would not turn a case-incapable filesystem into a case-capable one. (merge 48294b512a ms/core-icase-doc later to maint).
- "fsck.skipList" did not prevent a blob object listed there from being inspected for is contents (e.g. we recently started to inspect the contents of ".gitmodules" for certain malicious patterns), which has been corrected. (merge fb16287719 rj/submodule-fsck-skip later to maint).
- "git checkout --recurse-submodules another-branch" did not report in which submodule it failed to update the working tree, which resulted in an unhelpful error message. (merge ba95d4e4bd sb/submodule-move-head-error-msg later to maint).
- "git rebase" behaved slightly differently depending on which one of the three backends gets used; this has been documented and an effort to make them more uniform has begun. (merge b00bf1c9a8 en/rebase-consistency later to maint).
- The "--ignore-case" option of "git for-each-ref" (and its friends) did not work correctly, which has been fixed. (merge e674eb2528 jk/for-each-ref-icase later to maint).
- "git fetch" failed to correctly validate the set of objects it received when making a shallow history deeper, which has been corrected. (merge cf1e7c0770 jt/connectivity-check-after-unshallow later to maint).
- Partial clone support of "git clone" has been updated to correctly validate the objects it receives from the other side. The server side has been corrected to send objects that are directly requested, even if they may match the filtering criteria (e.g. when doing a "lazy blob" partial clone). (merge a7e67c11b8 jt/partial-clone-fsck-connectivity later to maint).
- Handling of an empty range by "git cherry-pick" was inconsistent depending on how the range ended up to be empty, which has been corrected. (merge c5e358d073 jk/empty-pick-fix later to maint).
- "git reset --merge" (hence "git merge ---abort") and "git reset --hard" had trouble working correctly in a sparsely checked out working tree after a conflict, which has been corrected. (merge b33fdfc34c mk/merge-in-sparse-checkout later to maint).
- Correct a broken use of "VAR=VAL shell_func" in a test. (merge 650161a277 jc/t3404-one-shot-export-fix later to maint).
- "git rev-parse ’:/substring’" did not consider the history leading only to HEAD when looking for a commit with the given substring, when the HEAD is detached. This has been fixed. (merge 6b3351e799 wc/find-commit-with-pattern-on-detached-head later to maint).
- Build doc update for Windows. (merge ede8d89bb1 nd/command-list later to maint).
- core.commentchar is now honored when preparing the list of commits to replay in "rebase -i".
- "git pull --rebase" on a corrupt HEAD caused a segfault. In general we substitute an empty tree object when running the in-core equivalent of the diff-index command, and the codepath has been corrected to do so as well to fix this issue. (merge 3506dc9445 jk/has-uncommitted-changes-fix later to maint).
- httpd tests saw occasional breakage due to the way its access log gets inspected by the tests, which has been updated to make them less flaky. (merge e8b3b2e275 sg/httpd-test-unflake later to maint).
- Tests to cover more D/F conflict cases have been added for merge-recursive.
- "git gc --auto" opens file descriptors for the packfiles before spawning "git repack/prune", which would upset Windows that does not want a process to work on a file that is open by another process. The issue has been worked around. (merge 12e73a3ce4 kg/gc-auto-windows-workaround later to maint).
- The recursive merge strategy did not properly ensure there was no change between HEAD and the index before performing its operation, which has been corrected. (merge 55f39cf755 en/dirty-merge-fixes later to maint).
- "git rebase" started exporting GIT_DIR environment variable and exposing it to hook scripts when part of it got rewritten in C. Instead of matching the old scripted Porcelains’ behaviour, compensate by also exporting GIT_WORK_TREE environment as well to lessen the damage. This can harm existing hooks that want to operate on different repository, but the current behaviour is already broken for them anyway. (merge ab5e67d751 bc/sequencer-export-work-tree-as-well later to maint).
- "git send-email" when using in a batched mode that limits the number of messages sent in a single SMTP session lost the contents of the variable used to choose between tls/ssl, unable to send the second and later batches, which has been fixed. (merge 636f3d7ac5 jm/send-email-tls-auth-on-batch later to maint).
- The lazy clone support had a few places where missing but promised objects were not correctly tolerated, which have been fixed.
- One of the "diff --color-moved" mode "dimmed_zebra" that was named in an unusual way has been deprecated and replaced by "dimmed-zebra". (merge e3f2f5f9cd es/diff-color-moved-fix later to maint).
- The wire-protocol v2 relies on the client to send "ref prefixes" to limit the bandwidth spent on the initial ref advertisement. "git clone" when learned to speak v2 forgot to do so, which has been corrected. (merge 402c47d939 bw/clone-ref-prefixes later to maint).
- "git diff --histogram" had a bad memory usage pattern, which has been rearranged to reduce the peak usage. (merge 79cb2ebb92 sb/histogram-less-memory later to maint).
- Code clean-up to use size_t/ssize_t when they are the right type. (merge 7726d360b5 jk/size-t later to maint).
- The wire-protocol v2 relies on the client to send "ref prefixes" to limit the bandwidth spent on the initial ref advertisement. "git fetch $remote branch:branch" that asks tags that point into the history leading to the "branch" automatically followed sent to narrow prefix and broke the tag following, which has been fixed. (merge 2b554353a5 jt/tag-following-with-proto-v2-fix later to maint).
- When the sparse checkout feature is in use, "git cherry-pick" and other mergy operations lost the skip_worktree bit when a path that is excluded from checkout requires content level merge, which is resolved as the same as the HEAD version, without materializing the merge result in the working tree, which made the path appear as deleted. This has been corrected by preserving the skip_worktree bit (and not materializing the file in the working tree). (merge 2b75fb601c en/merge-recursive-skip-fix later to maint).
- The automatic tree-matching in "git merge -s subtree" was broken 5 years ago and nobody has noticed since then, which is now fixed. (merge 2ec4150713 jk/merge-subtree-heuristics later to maint).
- "git fetch $there refs/heads/s" ought to fetch the tip of the branch ’s’, but when "refs/heads/refs/heads/s", i.e. a branch whose name is "refs/heads/s" exists at the same time, fetched that one instead by mistake. This has been corrected to honor the usual disambiguation rules for abbreviated refnames. (merge 60650a48c0 jt/refspec-dwim-precedence-fix later to maint).
- Futureproofing a helper function that can easily be misused. (merge 65bb21e77e es/want-color-fd-defensive later to maint).
- The http-backend (used for smart-http transport) used to slurp the whole input until EOF, without paying attention to CONTENT_LENGTH that is supplied in the environment and instead expecting the Web server to close the input stream. This has been fixed. (merge eebfe40962 mk/http-backend-content-length later to maint).
- "git merge --abort" etc. did not clean things up properly when there were conflicted entries in the index in certain order that are involved in D/F conflicts. This has been corrected. (merge ad3762042a en/abort-df-conflict-fixes later to maint).
- "git diff --indent-heuristic" had a bad corner case performance. (merge 301ef85401 sb/indent-heuristic-optim later to maint).
- The "--exec" option to "git rebase --rebase-merges" placed the exec commands at wrong places, which has been corrected.
- "git verify-tag" and "git verify-commit" have been taught to use the exit status of underlying "gpg --verify" to signal bad or untrusted signature they found. (merge 4e5dc9ca17 jc/gpg-status later to maint).
- "git mergetool" stopped and gave an extra prompt to continue after the last path has been handled, which did not make much sense. (merge d651a54b8a ng/mergetool-lose-final-prompt later to maint).
- Among the three codepaths we use O_APPEND to open a file for appending, one used for writing GIT_TRACE output requires O_APPEND implementation that behaves sensibly when multiple processes are writing to the same file. POSIX emulation used in the Windows port has been updated to improve in this area. (merge d641097589 js/mingw-o-append later to maint).
- "git pull --rebase -v" in a repository with a submodule barfed as an intermediate process did not understand what "-v(erbose)" flag meant, which has been fixed. (merge e84c3cf3dc sb/pull-rebase-submodule later to maint).
- Recent update to "git config" broke updating variable in a subsection, which has been corrected. (merge bff7df7a87 sb/config-write-fix later to maint).
- When "git rebase -i" is told to squash two or more commits into one, it labeled the log message for each commit with its number. It correctly called the first one "1st commit", but the next one was "commit #1", which was off-by-one. This has been corrected. (merge dd2e36ebac pw/rebase-i-squash-number-fix later to maint).
- "git rebase -i", when a ’merge <branch>’ insn in its todo list fails, segfaulted, which has been (minimally) corrected. (merge bc9238bb09 pw/rebase-i-merge-segv-fix later to maint).
- "git cherry-pick --quit" failed to remove CHERRY_PICK_HEAD even though we won’t be in a cherry-pick session after it returns, which has been corrected. (merge 3e7dd99208 nd/cherry-pick-quit-fix later to maint).
- In a recent update in 2.18 era, "git pack-objects" started producing a larger than necessary packfiles by missing opportunities to use large deltas. This has been corrected.
- The meaning of the possible values the "core.checkStat" configuration variable can take were not adequately documented, which has been fixed. (merge 9bf5d4c4e2 nd/config-core-checkstat-doc later to maint).
- Recent "git rebase -i" update started to write bogusly formatted author-script, with a matching broken reading code. These are fixed.
- Recent addition of "directory rename" heuristics to the merge-recursive backend makes the command susceptible to false positives and false negatives. In the context of "git am -3", which does not know about surrounding unmodified paths and thus cannot inform the merge machinery about the full trees involved, this risk is particularly severe. As such, the heuristic is disabled for "git am -3" to keep the machinery "more stupid but predictable".
- "git merge-base" in 2.19-rc1 has performance regression when the (experimental) commit-graph feature is in use, which has been mitigated.
- Code cleanup, docfix, build fix, etc. (merge aee9be2ebe sg/update-ref-stdin-cleanup later to maint). (merge 037714252f jc/clean-after-sanity-tests later to maint). (merge 5b26c3c941 en/merge-recursive-cleanup later to maint). (merge 0dcbc0392e bw/config-refer-to-gitsubmodules-doc later to maint). (merge bb4d000e87 bw/protocol-v2 later to maint). (merge 928f0ab4ba vs/typofixes later to maint). (merge d7f590be84 en/rebase-i-microfixes later to maint). (merge 81d395cc85 js/rebase-recreate-merge later to maint). (merge 51d1863168 tz/exclude-doc-smallfixes later to maint). (merge a9aa3c0927 ds/commit-graph later to maint). (merge 5cf8e06474 js/enhanced-version-info later to maint). (merge 6aaded5509 tb/config-default later to maint). (merge 022d2ac1f3 sb/blame-color later to maint). (merge 5a06a20e0c bp/test-drop-caches-for-windows later to maint). (merge dd61cc1c2e jk/ui-color-always-to-auto later to maint). (merge 1e83b9bfdd sb/trailers-docfix later to maint). (merge ab29f1b329 sg/fast-import-dump-refs-on-checkpoint-fix later to maint). (merge 6a8ad880f0 jn/subtree-test-fixes later to maint). (merge ffbd51cc60 nd/pack-objects-threading-doc later to maint). (merge e9dac7be60 es/mw-to-git-chain-fix later to maint). (merge fe583c6c7a rs/remote-mv-leakfix later to maint). (merge 69885ab015 en/t3031-title-fix later to maint). (merge 8578037bed nd/config-blame-sort later to maint). (merge 8ad169c4ba hn/config-in-code-comment later to maint). (merge b7446fcfdf ar/t4150-am-scissors-test-fix later to maint). (merge a8132410ee js/typofixes later to maint). (merge 388d0ff6e5 en/update-index-doc later to maint). (merge e05aa688dd jc/update-index-doc later to maint). (merge 10c600172c sg/t5310-empty-input-fix later to maint). (merge 5641eb9465 jh/partial-clone-doc later to maint). (merge 2711b1ad5e ab/submodule-relative-url-tests later to maint). (merge ce528de023 ab/unconditional-free-and-null later to maint). (merge bbc072f5d8 rs/opt-updates later to maint). (merge 69d846f053 jk/use-compat-util-in-test-tool later to maint). (merge 1820703045 js/larger-timestamps later to maint). (merge c8b35b95e1 sg/t4051-fix later to maint). (merge 30612cb670 sg/t0020-conversion-fix later to maint). (merge 15da753709 sg/t7501-thinkofix later to maint). (merge 79b04f9b60 sg/t3903-missing-fix later to maint). (merge 2745817028 sg/t3420-autostash-fix later to maint). (merge 7afb0d6777 sg/test-rebase-editor-fix later to maint). (merge 6c6ce21baa es/freebsd-iconv-portability later to maint).
2.19.1
Git v2.19.1 Release Notes =========================
This release merges up the fixes that appear in v2.14.5 and in v2.17.2 to address the recently reported CVE-2018-17456; see the release notes for those versions for details.
2.19.2
Git v2.19.2 Release Notes =========================
Fixes since v2.19.1 -------------------
- "git interpret-trailers" and its underlying machinery had a buggy code that attempted to ignore patch text after commit log message, which triggered in various codepaths that will always get the log message alone and never get such an input.
- "git rebase -i" did not clear the state files correctly when a run of "squash/fixup" is aborted and then the user manually amended the commit instead, which has been corrected.
- When fsmonitor is in use, after operation on submodules updates .gitmodules, we lost track of the fact that we did so and relied on stale fsmonitor data.
- Fix for a long-standing bug that leaves the index file corrupt when it shrinks during a partial commit.
- Further fix for O_APPEND emulation on Windows
- A corner case bugfix in "git rerere" code.
- "git add ’:(attr:foo)’" is not supported and is supposed to be rejected while the command line arguments are parsed, but we fail to reject such a command line upfront.
- "git rebase" etc. in Git 2.19 fails to abort when given an empty commit log message as result of editing, which has been corrected.
- The code to backfill objects in lazily cloned repository did not work correctly, which has been corrected.
- Update error messages given by "git remote" and make them consistent.
- "git update-ref" learned to make both "--no-deref" and "--stdin" work at the same time.
- Recently added "range-diff" had a corner-case bug to cause it segfault, which has been corrected.
- The recently introduced commit-graph auxiliary data is incompatible with mechanisms such as replace & grafts that "breaks" immutable nature of the object reference relationship. Disable optimizations based on its use (and updating existing commit-graph) when these incompatible features are in use in the repository.
- The mailmap file update.
- The code in "git status" sometimes hit an assertion failure. This was caused by a structure that was reused without cleaning the data used for the first run, which has been corrected.
- A corner-case bugfix.
- A partial clone that is configured to lazily fetch missing objects will on-demand issue a "git fetch" request to the originating repository to fill not-yet-obtained objects. The request has been optimized for requesting a tree object (and not the leaf blob objects contained in it) by telling the originating repository that no blobs are needed.
- The codepath to support the experimental split-index mode had remaining "racily clean" issues fixed.
- "git log --graph" showing an octopus merge sometimes miscounted the number of display columns it is consuming to show the merge and its parent commits, which has been corrected.
- The implementation of run_command() API on the UNIX platforms had a bug that caused a command not on $PATH to be found in the current directory.
- A mutex used in "git pack-objects" were not correctly initialized and this caused "git repack" to dump core on Windows.
- Under certain circumstances, "git diff D:/a/b/c D:/a/b/d" on Windows would strip initial parts from the paths because they were not recognized as absolute, which has been corrected.
- The receive.denyCurrentBranch=updateInstead codepath kicked in even when the push should have been rejected due to other reasons, such as it does not fast-forward or the update-hook rejects it, which has been corrected.
- "git repack" in a shallow clone did not correctly update the shallow points in the repository, leading to a repository that does not pass fsck.
- Operations on promisor objects make sense in the context of only a small subset of the commands that internally use the revisions machinery, but the "--exclude-promisor-objects" option were taken and led to nonsense results by commands like "log", to which it didn’t make much sense. This has been corrected.
- The "container" mode of TravisCI is going away. Our .travis.yml file is getting prepared for the transition.
- Our test scripts can now take the ’-V’ option as a synonym for the '--verbose-log’ option.
- A regression in Git 2.12 era made "git fsck" fall into an infinite loop while processing truncated loose objects.
Also contains various documentation updates and code clean-ups.
2.19.3
Git v2.19.3 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4 and in v2.17.3, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes for those versions for details.
2.19.4
Git v2.19.4 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.19.5
Git v2.19.5 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.19.6
Git v2.19.6 Release Notes =========================
This release merges up the fixes that appear in v2.17.6 and v2.18.5 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.2.0
Git v2.2 Release Notes ======================
Updates since v2.1 ------------------
Ports
- Building on older MacOS X systems automatically sets the necessary NO_APPLE_COMMON_CRYPTO build-time option.
- Building with NO_PTHREADS has been resurrected.
- Compilation options have been updated a bit to better support the z/OS port.
UI, Workflows & Features
- "git archive" learned to filter what gets archived with a pathspec.
- "git config --edit --global" starts from a skeletal per-user configuration file contents, instead of a total blank, when the user does not already have any global config. This immediately reduces the need to later ask "Have you forgotten to set core.user?", and we can add more to the template as we gain more experience.
- "git stash list -p" used to be almost always a no-op because each stash entry is represented as a merge commit. It learned to show the difference between the base commit version and the working tree version, which is in line with what "git stash show" gives.
- Sometimes users want to report a bug they experience on their repository, but they are not at liberty to share the contents of the repository. "fast-export" was taught an "--anonymize" option to replace blob contents, names of people, paths and log messages with bland and simple strings to help them.
- "git difftool" learned an option to stop feeding paths to the diff backend when it exits with a non-zero status.
- "git grep" learned to paint (or not paint) partial matches on context lines when showing "grep -C<num>" output in color.
- "log --date=iso" uses a slight variant of the ISO 8601 format that is more human readable. A new "--date=iso-strict" option gives datetime output that conforms more strictly.
- The logic "git prune" uses is more resilient against various corner cases.
- A broken reimplementation of Git could write an invalid index that records both stage #0 and higher-stage entries for the same path. We now notice and reject such an index, as there is no sensible fallback (we do not know if the broken tool wanted to resolve and forgot to remove the higher-stage entries, or if it wanted to unresolve and forgot to remove the stage #0 entry).
- The temporary files "git mergetool" uses are renamed to avoid too many dots in them (e.g. a temporary file for "hello.c" used to be named e.g. "hello.BASE.4321.c" but now uses underscore instead, e.g. "hello_BASE_4321.c", to allow us to have multiple variants).
- The temporary files "git mergetool" uses can be placed in a newly created temporary directory, instead of the current directory, by setting the mergetool.writeToTemp configuration variable.
- "git mergetool" understands "--tool bc" now, as version 4 of BeyondCompare can be driven the same way as its version 3 and it feels awkward to say "--tool bc3" to run version 4.
- The "pre-receive" and "post-receive" hooks are no longer required to consume their input fully (not following this requirement used to result in intermittent errors in "git push").
- The pretty-format specifier "%d", which expands to " (tagname)" for a tagged commit, gained a cousin "%D" that just gives the "tagname" without frills.
- "git push" learned "--signed" push, that allows a push (i.e. request to update the refs on the other side to point at a new history, together with the transmission of necessary objects) to be signed, so that it can be verified and audited, using the GPG signature of the person who pushed, that the tips of branches at a public repository really point the commits the pusher wanted to, without having to "trust" the server.
- "git interpret-trailers" is a new filter to programmatically edit the tail end of the commit log messages, e.g. "Signed-off-by:".
- "git help everyday" shows the "Everyday Git in 20 commands or so" document, whose contents have been updated to match more modern Git practice.
- On the "git svn" front, work progresses to reduce memory consumption and to improve handling of mergeinfo.
Performance, Internal Implementation, Development Support etc.
- The API to manipulate the "refs" has been restructured to make it more transactional, with the eventual goal to allow all-or-none atomic updates and migrating the storage to something other than the traditional filesystem based one (e.g. databases).
- The lockfile API and its users have been cleaned up.
- We no longer attempt to keep track of individual dependencies to the header files in the build procedure, relying instead on automated dependency generation support from modern compilers.
- In tests, we have been using NOT_{MINGW,CYGWIN} test prerequisites long before negated prerequisites e.g. !MINGW were invented. The former has been converted to the latter to avoid confusion.
- Optimized looking up a remote’s configuration in a repository with very many remotes defined.
- There are cases where you lock and open to write a file, close it to show the updated contents to an external processes, and then have to update the file again while still holding the lock; now the lockfile API has support for such an access pattern.
- The API to allocate the structure to keep track of commit decoration has been updated to make it less cumbersome to use.
- An in-core caching layer to let us avoid reading the same configuration files several times has been added. A few commands have been converted to use this subsystem.
- Various code paths have been cleaned up and simplified by using the "strbuf", "starts_with()", and "skip_prefix()" APIs more.
- A few codepaths that died when large blobs that would not fit in core are involved in their operation have been taught to punt instead, by e.g. marking a too-large blob as not to be diffed.
- A few more code paths in "commit" and "checkout" have been taught to repopulate the cache-tree in the index, to help speed up later "write-tree" (used in "commit") and "diff-index --cached" (used in "status").
- A common programming mistake to assign the same short option name to two separate options is detected by the parse_options() API to help developers.
- The code path to write out the packed-refs file has been optimized, which especially matters in a repository with a large number of refs.
- The check to see if a ref $F can be created by making sure no existing ref has $F/ as its prefix has been optimized, which especially matters in a repository with a large number of existing refs.
- "git fsck" was taught to check the contents of tag objects a bit more.
- "git hash-object" was taught a "--literally" option to help debugging.
- When running a required clean filter, we do not have to mmap the original before feeding the filter. Instead, stream the file contents directly to the filter and process its output.
- The scripts in the test suite can be run with the "-x" option to show a shell-trace of each command they run.
- The "run-command" API learned to manage the argv and environment arrays for child process, alleviating the need for the callers to allocate and deallocate them.
- Some people use AsciiDoctor, instead of AsciiDoc, to format our documentation set; the documentation has been adjusted to be usable by both, as AsciiDoctor is pickier than AsciiDoc about its input mark-up.
Also contains various documentation updates and code clean-ups.
Fixes since v2.1 ----------------
Unless otherwise noted, all the fixes since v2.1 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git log --pretty/format=" with an empty format string did not mean the more obvious "No output whatsoever" but "Use default format", which was counterintuitive.
- "git -c section.var command" and "git -c section.var= command" should pass the configuration value differently (the former should be a boolean true, the latter should be an empty string).
- Applying a patch not generated by Git in a subdirectory used to check for whitespace breakage using the attributes of incorrect paths. Also whitespace checks were performed even for paths excluded via the "git apply --exclude=<path>" mechanism.
- "git bundle create" with a date-range specification was meant to exclude tags outside the range, but it didn’t.
- "git add x" where x used to be a directory and is now a symbolic link to a directory misbehaved.
- The prompt script checked the $GIT_DIR/ref/stash file to see if there is a stash, which was a no-no.
- Pack-protocol documentation had a minor typo.
- "git checkout -m" did not switch to another branch while carrying the local changes forward when a path was deleted from the index.
- "git daemon" (with NO_IPV6 build configuration) used to incorrectly use the hostname even when gethostbyname() reported that the given hostname is not found. (merge 107efbe rs/daemon-fixes later to maint).
- With sufficiently long refnames, "git fast-import" could have overflowed an on-stack buffer.
- After "pack-refs --prune" packed refs at the top-level, it failed to prune them.
- Progress output from "git gc --auto" was visible in "git fetch -q".
- We used to pass -1000 to poll(2), expecting it to also mean "no timeout", which should be spelled as -1.
- "git rebase" documentation was unclear that it is required to specify on what <upstream> the rebase is to be done when telling it to first check out <branch>. (merge 95c6826 so/rebase-doc later to maint).
- "git push" over HTTP transport had an artificial limit on the number of refs that can be pushed, imposed by the command line length. (merge 26be19b jk/send-pack-many-refspecs later to maint).
- When receiving an invalid pack stream that records the same object twice, multiple threads got confused due to a race. (merge ab791dd jk/index-pack-threading-races later to maint).
- An attempt to remove the entire tree in the "git fast-import" input stream caused it to misbehave. (merge 2668d69 mb/fast-import-delete-root later to maint).
- Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use. (merge c40fdd0 mk/reachable-protect-detached-head later to maint).
- "git config --add section.var val" when section.var already has an empty-string value used to lose the empty-string value. (merge c1063be ta/config-add-to-empty-or-true-fix later to maint).
- "git fsck" failed to report that it found corrupt objects via its exit status in some cases. (merge 30d1038 jk/fsck-exit-code-fix later to maint).
- Use of the "--verbose" option used to break "git branch --merged". (merge 12994dd jk/maint-branch-verbose-merged later to maint).
- Some MUAs mangle a line in a message that begins with "From " to ">From " when writing to a mailbox file, and feeding such an input to "git am" used to lose such a line. (merge 85de86a jk/mbox-from-line later to maint).
- "rev-parse --verify --quiet $name" is meant to quietly exit with a non-zero status when $name is not a valid object name, but still gave error messages in some cases.
- A handful of C source files have been updated to include "git-compat-util.h" as the first thing, to conform better to our coding guidelines. (merge 1c4b660 da/include-compat-util-first-in-c later to maint).
- The t7004 test, which tried to run Git with small stack space, has been updated to use a bit larger stack to avoid false breakage on some platforms. (merge b9a1907 sk/tag-contains-wo-recursion later to maint).
- A few documentation pages had example sections marked up not quite correctly, which passed AsciiDoc but failed with AsciiDoctor. (merge c30c43c bc/asciidoc-pretty-formats-fix later to maint). (merge f8a48af bc/asciidoc later to maint).
- "gitweb" used deprecated CGI::startfrom, which was removed from CGI.pm as of 4.04; use CGI::start_from instead. (merge 4750f4b rm/gitweb-start-form later to maint).
- Newer versions of ’meld’ break the auto-detection we use to see if they are new enough to support the
--outputoption. (merge b12d045 da/mergetool-meld later to maint).
- "git pack-objects" forgot to disable the codepath to generate the object reachability bitmap when it needs to split the resulting pack. (merge 2113471 jk/pack-objects-no-bitmap-when-splitting later to maint).
- The code to use cache-tree trusted the on-disk data too much and fell into an infinite loop upon seeing an incorrectly recorded index file. (merge 729dbbd jk/cache-tree-protect-from-broken-libgit2 later to maint).
- "git fetch" into a repository where branch B was deleted earlier, back when it had reflog enabled, and then branch B/C is fetched into it without reflog enabled, which is arguably an unlikely corner case, unnecessarily failed. (merge aae828b jk/fetch-reflog-df-conflict later to maint).
- "git log --first-parent -L…" used to crash. (merge a8787c5 tm/line-log-first-parent later to maint).
2.2.1
Git v2.2.1 Release Notes ========================
Fixes since v2.2 ----------------
- We used to allow committing a path ".Git/config" with Git that is running on a case sensitive filesystem, but an attempt to check out such a path with Git that runs on a case insensitive filesystem would have clobbered ".git/config", which is definitely not what the user would have expected. Git now prevents you from tracking a path with ".Git" (in any case combination) as a path component.
- On Windows, certain path components that are different from ".git" are mapped to ".git", e.g. "git~1/config" is treated as if it were ".git/config". HFS+ has a similar issue, where certain unicode codepoints are ignored, e.g. ".gu200cit/config" is treated as if it were ".git/config". Pathnames with these potential issues are rejected on the affected systems. Git on systems that are not affected by this issue (e.g. Linux) can also be configured to reject them to ensure cross platform interoperability of the hosted projects.
- "git fsck" notices a tree object that records such a path that can be confused with ".git", and with receive.fsckObjects configuration set to true, an attempt to "git push" such a tree object will be rejected. Such a path may not be a problem on a well behaving filesystem but in order to protect those on HFS+ and on case insensitive filesystems, this check is enabled on all platforms.
A big "thanks!" for bringing this issue to us goes to our friends in the Mercurial land, namely, Matt Mackall and Augie Fackler.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.2.2
Git v2.2.2 Release Notes ========================
Fixes since v2.2.1 ------------------
- "git checkout $treeish $path", when $path in the index and the working tree already matched what is in $treeish at the $path, still overwrote the $path unnecessarily.
- "git config --get-color" did not parse its command line arguments carefully.
- open() emulated on Windows platforms did not give EISDIR upon an attempt to open a directory for writing.
- A few code paths used abs() when they should have used labs() on long integers.
- "gitweb" used to depend on a behaviour recent CGI.pm deprecated.
- "git init" (hence "git clone") initialized the per-repository configuration file .git/config with x-bit by mistake.
- Git 2.0 was supposed to make the "simple" mode for the default of "git push", but it didn’t.
- "Everyday" document had a broken link.
- The build procedure did not bother fixing perl and python scripts when NO_PERL and NO_PYTHON build-time configuration changed.
- The code that reads the reflog from the newer to the older entries did not handle an entry that crosses a boundary of block it uses to read them correctly.
- "git apply" was described in the documentation to take --ignore-date option, which it does not.
- Traditionally we tried to avoid interpreting date strings given by the user as future dates, e.g. GIT_COMMITTER_DATE=2014-12-10 when used early November 2014 was taken as "October 12, 2014" because it is likely that a date in the future, December 10, is a mistake. This heuristics has been loosened to allow people to express future dates (most notably, --until=<date> may want to be far in the future) and we no longer tiebreak by future-ness of the date when
(1) ISO-like format is used, and
(2) the string can make sense interpreted as both y-m-d and y-d-m.
Git may still have to use the heuristics to tiebreak between dd/mm/yy
and mm/dd/yy, though.
- The code to abbreviate an object name to its short unique prefix has been optimized when no abbreviation was requested.
- "git add --ignore-errors …" did not ignore an error to give a file that did not exist.
- Git did not correctly read an overlong refname from a packed refs file.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.2.3
Git v2.2.3 Release Notes ========================
Fixes since v2.2.2 ------------------
- A handful of codepaths that used to use fixed-sized arrays to hold pathnames have been corrected to use strbuf and other mechanisms to allow longer pathnames without fearing overflows.
2.20.0
Git 2.20 Release Notes ======================
Backward Compatibility Notes ----------------------------
- "git branch -l <foo>" used to be a way to ask a reflog to be created while creating a new branch, but that is no longer the case. It is a short-hand for "git branch --list <foo>" now.
- "git push" into refs/tags/* hierarchy is rejected without getting forced, but "git fetch" (misguidedly) used the "fast forwarding" rule used for the refs/heads/* hierarchy; this has been corrected, which means some fetches of tags that did not fail with older version of Git will fail without "--force" with this version.
- "git help -a" now gives verbose output (same as "git help -av"). Those who want the old output may say "git help --no-verbose -a"..
- "git cpn --help", when "cpn" is an alias to, say, "cherry-pick -n", reported only the alias expansion of "cpn" in earlier versions of Git. It now runs "git cherry-pick --help" to show the manual page of the command, while sending the alias expansion to the standard error stream.
- "git send-email" learned to grab address-looking string on any trailer whose name ends with "-by". This is a backward-incompatible change. Adding "--suppress-cc=misc-by" on the command line, or setting sendemail.suppresscc configuration variable to "misc-by", can be used to disable this behaviour.
Updates since v2.19 -------------------
UI, Workflows & Features
- Running "git clone" against a project that contain two files with pathnames that differ only in cases on a case insensitive filesystem would result in one of the files lost because the underlying filesystem is incapable of holding both at the same time. An attempt is made to detect such a case and warn.
- "git checkout -b newbranch [HEAD]" should not have to do as much as checking out a commit different from HEAD. An attempt is made to optimize this special case.
- "git rev-list --stdin </dev/null" used to be an error; it now shows no output without an error. "git rev-list --stdin --default HEAD" still falls back to the given default when nothing is given on the standard input.
- Lift code from GitHub to restrict delta computation so that an object that exists in one fork is not made into a delta against another object that does not appear in the same forked repository.
- "git format-patch" learned new "--interdiff" and "--range-diff" options to explain the difference between this version and the previous attempt in the cover letter (or after the three-dashes as a comment).
- "git mailinfo" used in "git am" learned to make a best-effort recovery of a patch corrupted by MUA that sends text/plain with format=flawed option. (merge 3aa4d81f88 rs/mailinfo-format-flowed later to maint).
- The rules used by "git push" and "git fetch" to determine if a ref can or cannot be updated were inconsistent; specifically, fetching to update existing tags were allowed even though tags are supposed to be unmoving anchoring points. "git fetch" was taught to forbid updates to existing tags without the "--force" option.
- "git multi-pack-index" learned to detect corruption in the .midx file it uses, and this feature has been integrated into "git fsck".
- Generation of (experimental) commit-graph files have so far been fairly silent, even though it takes noticeable amount of time in a meaningfully large repository. The users will now see progress output.
- The minimum version of Windows supported by Windows port of Git is now set to Vista.
- The completion script (in contrib/) learned to complete a handful of options "git stash list" command takes.
- The completion script (in contrib/) learned that "git fetch --multiple" only takes remote names as arguments and no refspecs.
- "git status" learns to show progress bar when refreshing the index takes a long time. (merge ae9af12287 nd/status-refresh-progress later to maint).
- "git help -a" and "git help -av" give different pieces of information, and generally the "verbose" version is more friendly to the new users. "git help -a" by default now uses the more verbose output (with "--no-verbose", you can go back to the original). Also "git help -av" now lists aliases and external commands, which it did not used to.
- Unlike "grep", "git grep" by default recurses to the whole tree. The command learned "git grep --recursive" option, so that "git grep --no-recursive" can serve as a synonym to setting the max-depth to 0.
- When pushing into a repository that borrows its objects from an alternate object store, "git receive-pack" that responds to the push request on the other side lists the tips of refs in the alternate to reduce the amount of objects transferred. This sometimes is detrimental when the number of refs in the alternate is absurdly large, in which case the bandwidth saved in potentially fewer objects transferred is wasted in excessively large ref advertisement. The alternate refs that are advertised are now configurable with a pair of configuration variables.
- "git cmd --help" when "cmd" is aliased used to only say "cmd is aliased to …". Now it shows that to the standard error stream and runs "git $cmd --help" where $cmd is the first word of the alias expansion.
- The documentation of "git gc" has been updated to mention that it is no longer limited to "pruning away cruft" but also updates ancillary files like commit-graph as a part of repository optimization.
- "git p4 unshelve" improvements.
- The logic to select the default user name and e-mail on Windows has been improved. (merge 501afcb8b0 js/mingw-default-ident later to maint).
- The "rev-list --filter" feature learned to exclude all trees via "tree:0" filter.
- "git send-email" learned to grab address-looking string on any trailer whose name ends with "-by"; --suppress-cc=misc-by on the command line, or setting sendemail.suppresscc configuration variable to "misc-by", can be used to disable this behaviour.
- "git mergetool" learned to take the "--[no-]gui" option, just like "git difftool" does.
- "git rebase -i" learned a new insn, ’break’, that the user can insert in the to-do list. Upon hitting it, the command returns control back to the user.
- New "--pretty=format:" placeholders %GF and %GP that show the GPG key fingerprints have been invented.
- On platforms with recent cURL library, http.sslBackend configuration variable can be used to choose a different SSL backend at runtime. The Windows port uses this mechanism to switch between OpenSSL and Secure Channel while talking over the HTTPS protocol.
- "git send-email" learned to disable SMTP authentication via the "--smtp-auth=none" option, even when the smtp username is given (which turns the authentication on by default).
- A fourth class of configuration files (in addition to the traditional "system wide", "per user in the $HOME directory" and "per repository in the $GIT_DIR/config") has been introduced so that different worktrees that share the same repository (hence the same $GIT_DIR/config file) can use different customization.
- A pattern with ’**’ that does not have a slash on either side used to be an invalid one, but the code now treats such double-asterisks the same way as two normal asterisks that happen to be adjacent to each other. (merge e5bbe09e88 nd/wildmatch-double-asterisk later to maint).
- The "--no-patch" option, which can be used to get a high-level overview without the actual line-by-line patch difference shown, of the "range-diff" command was earlier broken, which has been corrected.
- The recently merged "rebase in C" has an escape hatch to use the scripted version when necessary, but it hasn’t been documented, which has been corrected.
Performance, Internal Implementation, Development Support etc.
- Developer builds now use -Wunused-function compilation option.
- One of our CI tests to run with "unusual/experimental/random" settings now also uses commit-graph and midx.
- When there are too many packfiles in a repository (which is not recommended), looking up an object in these would require consulting many pack .idx files; a new mechanism to have a single file that consolidates all of these .idx files is introduced.
- "git submodule update" is getting rewritten piece-by-piece into C.
- The code for computing history reachability has been shuffled, obtained a bunch of new tests to cover them, and then being improved.
- The unpack_trees() API used in checking out a branch and merging walks one or more trees along with the index. When the cache-tree in the index tells us that we are walking a tree whose flattened contents is known (i.e. matches a span in the index), as linearly scanning a span in the index is much more efficient than having to open tree objects recursively and listing their entries, the walk can be optimized, which has been done.
- When creating a thin pack, which allows objects to be made into a delta against another object that is not in the resulting pack but is known to be present on the receiving end, the code learned to take advantage of the reachability bitmap; this allows the server to send a delta against a base beyond the "boundary" commit.
- spatch transformation to replace boolean uses of !hashcmp() to newly introduced oideq() is added, and applied, to regain performance lost due to support of multiple hash algorithms.
- Fix a bug in which the same path could be registered under multiple worktree entries if the path was missing (for instance, was removed manually). Also, as a convenience, expand the number of cases in which --force is applicable.
- Split Documentation/config.txt for easier maintenance. (merge 6014363f0b nd/config-split later to maint).
- Test helper binaries clean-up. (merge c9a1f4161f nd/test-tool later to maint).
- Various tests have been updated to make it easier to swap the hash function used for object identification. (merge ae0c89d41b bc/hash-independent-tests later to maint).
- Update fsck.skipList implementation and documentation. (merge 371a655074 ab/fsck-skiplist later to maint).
- An alias that expands to another alias has so far been forbidden, but now it is allowed to create such an alias.
- Various test scripts have been updated for style and also correct handling of exit status of various commands.
- "gc --auto" ended up calling exit(-1) upon error, which has been corrected to use exit(1). Also the error reporting behaviour when daemonized has been updated to exit with zero status when stopping due to a previously discovered error (which implies there is no point running gc to improve the situation); we used to exit with failure in such a case.
- Various codepaths in the core-ish part learned to work on an arbitrary in-core index structure, not necessarily the default instance "the_index". (merge b3c7eef9b0 nd/the-index later to maint).
- Code clean-up in the internal machinery used by "git status" and "git commit --dry-run". (merge 73ba5d78b4 ss/wt-status-committable later to maint).
- Some environment variables that control the runtime options of Git used during tests are getting renamed for consistency. (merge 4231d1ba99 bp/rename-test-env-var later to maint).
- A pair of new extensions to the index file have been introduced. They allow the index file to be read in parallel for performance.
- The oidset API was built on top of the oidmap API which in turn is on the hashmap API. Replace the implementation to build on top of the khash API and gain performance.
- Over some transports, fetching objects with an exact commit object name can be done without first seeing the ref advertisements. The code has been optimized to exploit this.
- In a partial clone that will lazily be hydrated from the originating repository, we generally want to avoid "does this object exist (locally)?" on objects that we deliberately omitted when we created the clone. The cache-tree codepath (which is used to write a tree object out of the index) however insisted that the object exists, even for paths that are outside of the partial checkout area. The code has been updated to avoid such a check.
- To help developers, an EditorConfig file that attempts to follow the project convention has been added. (merge b548d698a0 bc/editorconfig later to maint).
- The result of coverage test can be combined with "git blame" to check the test coverage of code introduced recently with a new ’coverage-diff’ tool (in contrib/). (merge 783faedd65 ds/coverage-diff later to maint).
- An experiment to fuzz test a few areas, hopefully we can gain more coverage to various areas.
- More codepaths are moving away from hardcoded hash sizes.
- The way the Windows port figures out the current directory has been improved.
- The way DLLs are loaded on the Windows port has been improved.
- Some tests have been reorganized and renamed; "ls t/" now gives a better overview of what is tested for these scripts than before.
- "git rebase" and "git rebase -i" have been reimplemented in C.
- Windows port learned to use nano-second resolution file timestamps.
- The overly large Documentation/config.txt file have been split into million little pieces. This potentially allows each individual piece to be included into the manual page of the command it affects more easily.
- Replace three string-list instances used as look-up tables in "git fetch" with hashmaps.
- Unify code to read the author-script used in "git am" and the commands that use the sequencer machinery, e.g. "git rebase -i".
- In preparation to the day when we can deprecate and remove the "rebase -p", make sure we can skip and later remove tests for it.
- The history traversal used to implement the tag-following has been optimized by introducing a new helper.
- The helper function to refresh the cached stat information in the in-core index has learned to perform the lstat() part of the operation in parallel on multi-core platforms.
- The code to traverse objects for reachability, used to decide what objects are unreferenced and expendable, have been taught to also consider per-worktree refs of other worktrees as starting points to prevent data loss.
- "git add" needs to internally run "diff-files" equivalent, and the codepath learned the same optimization as "diff-files" has to run lstat(2) in parallel to find which paths have been updated in the working tree.
- The procedure to install dependencies before testing at Travis CI is getting revamped for both simplicity and flexibility, taking advantage of the recent move to the vm-based environment.
- The support for format-patch (and send-email) by the command-line completion script (in contrib/) has been simplified a bit.
- The revision walker machinery learned to take advantage of the commit generation numbers stored in the commit-graph file.
- The codebase has been cleaned up to reduce "#ifndef NO_PTHREADS".
- The way -lcurl library gets linked has been simplified by taking advantage of the fact that we can just ask curl-config command how.
- Various functions have been audited for "-Wunused-parameter" warnings and bugs in them got fixed.
- A sanity check for start-up sequence has been added in the config API codepath.
- The build procedure to link for fuzzing test has been made customizable with a new Makefile variable.
- The way "git rebase" parses and forwards the command line options meant for underlying "git am" has been revamped, which fixed for options with parameters that were not passed correctly.
- Our testing framework uses a special i18n "poisoned localization" feature to find messages that ought to stay constant but are incorrectly marked to be translated. This feature has been made into a runtime option (it used to be a compile-time option).
- "git push" used to check ambiguities between object-names and refnames while processing the list of refs’ old and new values, which was unnecessary (as it knew that it is feeding raw object names). This has been optimized out.
- The xcurl_off_t() helper function is used to cast size_t to curl_off_t, but some compilers gave warnings against the code to ensure the casting is done without wraparound, when size_t is narrower than curl_off_t. This warning has been squelched.
- Code preparation to replace ulong vars with size_t vars where appropriate continues.
- The "test installed Git" mode of our test suite has been updated to work better.
- A coding convention around the Coccinelle semantic patches to have two classes to ease code migration process has been proposed and its support has been added to the Makefile.
- The "container" mode of TravisCI is going away. Our .travis.yml file is getting prepared for the transition. (merge 32ee384be8 ss/travis-ci-force-vm-mode later to maint).
- Our test scripts can now take the ’-V’ option as a synonym for the '--verbose-log’ option. (merge a5f52c6dab sg/test-verbose-log later to maint).
Fixes since v2.19 -----------------
- "git interpret-trailers" and its underlying machinery had a buggy code that attempted to ignore patch text after commit log message, which triggered in various codepaths that will always get the log message alone and never get such an input. (merge 66e83d9b41 jk/trailer-fixes later to maint).
- Malformed or crafted data in packstream can make our code attempt to read or write past the allocated buffer and abort, instead of reporting an error, which has been fixed.
- "git rebase -i" did not clear the state files correctly when a run of "squash/fixup" is aborted and then the user manually amended the commit instead, which has been corrected. (merge 10d2f35436 js/rebase-i-autosquash-fix later to maint).
- When fsmonitor is in use, after operation on submodules updates .gitmodules, we lost track of the fact that we did so and relied on stale fsmonitor data. (merge 43f1180814 bp/mv-submodules-with-fsmonitor later to maint).
- Fix for a long-standing bug that leaves the index file corrupt when it shrinks during a partial commit. (merge 6c003d6ffb jk/reopen-tempfile-truncate later to maint).
- Further fix for O_APPEND emulation on Windows (merge eeaf7ddac7 js/mingw-o-append later to maint).
- A corner case bugfix in "git rerere" code. (merge ad2bf0d9b4 en/rerere-multi-stage-1-fix later to maint).
- "git add ’:(attr:foo)’" is not supported and is supposed to be rejected while the command line arguments are parsed, but we fail to reject such a command line upfront. (merge 84d938b732 nd/attr-pathspec-fix later to maint).
- Recent update broke the reachability algorithm when refs (e.g. tags) that point at objects that are not commit were involved, which has been fixed.
- "git rebase" etc. in Git 2.19 fails to abort when given an empty commit log message as result of editing, which has been corrected. (merge a3ec9eaf38 en/sequencer-empty-edit-result-aborts later to maint).
- The code to backfill objects in lazily cloned repository did not work correctly, which has been corrected. (merge e68302011c jt/lazy-object-fetch-fix later to maint).
- Update error messages given by "git remote" and make them consistent. (merge 5025425dff ms/remote-error-message-update later to maint).
- "git update-ref" learned to make both "--no-deref" and "--stdin" work at the same time. (merge d345e9fbe7 en/update-ref-no-deref-stdin later to maint).
- Recently added "range-diff" had a corner-case bug to cause it segfault, which has been corrected. (merge e467a90c7a tg/range-diff-corner-case-fix later to maint).
- The recently introduced commit-graph auxiliary data is incompatible with mechanisms such as replace & grafts that "breaks" immutable nature of the object reference relationship. Disable optimizations based on its use (and updating existing commit-graph) when these incompatible features are in use in the repository. (merge 829a321569 ds/commit-graph-with-grafts later to maint).
- The mailmap file update. (merge 255eb03edf jn/mailmap-update later to maint).
- The code in "git status" sometimes hit an assertion failure. This was caused by a structure that was reused without cleaning the data used for the first run, which has been corrected. (merge 3e73cc62c0 en/status-multiple-renames-to-the-same-target-fix later to maint).
- "git fetch $repo $object" in a partial clone did not correctly fetch the asked-for object that is referenced by an object in promisor packfile, which has been fixed.
- A corner-case bugfix. (merge c5cbb27cb5 sm/show-superproject-while-conflicted later to maint).
- Various fixes to "diff --color-moved-ws".
- A partial clone that is configured to lazily fetch missing objects will on-demand issue a "git fetch" request to the originating repository to fill not-yet-obtained objects. The request has been optimized for requesting a tree object (and not the leaf blob objects contained in it) by telling the originating repository that no blobs are needed. (merge 4c7f9567ea jt/non-blob-lazy-fetch later to maint).
- The codepath to support the experimental split-index mode had remaining "racily clean" issues fixed. (merge 4c490f3d32 sg/split-index-racefix later to maint).
- "git log --graph" showing an octopus merge sometimes miscounted the number of display columns it is consuming to show the merge and its parent commits, which has been corrected. (merge 04005834ed np/log-graph-octopus-fix later to maint).
- "git range-diff" did not work well when the compared ranges had changes in submodules and the "--submodule=log" was used.
- The implementation of run_command() API on the UNIX platforms had a bug that caused a command not on $PATH to be found in the current directory. (merge f67b980771 jk/run-command-notdot later to maint).
- A mutex used in "git pack-objects" were not correctly initialized and this caused "git repack" to dump core on Windows. (merge 34204c8166 js/pack-objects-mutex-init-fix later to maint).
- Under certain circumstances, "git diff D:/a/b/c D:/a/b/d" on Windows would strip initial parts from the paths because they were not recognized as absolute, which has been corrected. (merge ffd04e92e2 js/diff-notice-has-drive-prefix later to maint).
- The receive.denyCurrentBranch=updateInstead codepath kicked in even when the push should have been rejected due to other reasons, such as it does not fast-forward or the update-hook rejects it, which has been corrected. (merge b072a25fad jc/receive-deny-current-branch-fix later to maint).
- The logic to determine the archive type "git archive" uses did not correctly kick in for "git archive --remote", which has been corrected.
- "git repack" in a shallow clone did not correctly update the shallow points in the repository, leading to a repository that does not pass fsck. (merge 5dcfbf564c js/shallow-and-fetch-prune later to maint).
- Some codepaths failed to form a proper URL when .gitmodules record the URL to a submodule repository as relative to the repository of superproject, which has been corrected. (merge e0a862fdaf sb/submodule-url-to-absolute later to maint).
- "git fetch" over protocol v2 into a shallow repository failed to fetch full history behind a new tip of history that was diverged before the cut-off point of the history that was previously fetched shallowly.
- The command line completion machinery (in contrib/) has been updated to allow the completion script to tweak the list of options that are reported by the parse-options machinery correctly. (merge 276b49ff34 nd/completion-negation later to maint).
- Operations on promisor objects make sense in the context of only a small subset of the commands that internally use the revisions machinery, but the "--exclude-promisor-objects" option were taken and led to nonsense results by commands like "log", to which it didn’t make much sense. This has been corrected. (merge 669b1d2aae md/exclude-promisor-objects-fix later to maint).
- A regression in Git 2.12 era made "git fsck" fall into an infinite loop while processing truncated loose objects. (merge 18ad13e5b2 jk/detect-truncated-zlib-input later to maint).
- "git ls-remote $there foo" was broken by recent update for the protocol v2 and stopped showing refs that match ’foo’ that are not refs/{heads,tags}/foo, which has been fixed. (merge 6a139cdd74 jk/proto-v2-ref-prefix-fix later to maint).
- Additional comment on a tricky piece of code to help developers. (merge 0afbe3e806 jk/stream-pack-non-delta-clarification later to maint).
- A couple of tests used to leave the repository in a state that is deliberately corrupt, which have been corrected. (merge aa984dbe5e ab/pack-tests-cleanup later to maint).
- The submodule support has been updated to read from the blob at HEAD:.gitmodules when the .gitmodules file is missing from the working tree. (merge 2b1257e463 ao/submodule-wo-gitmodules-checked-out later to maint).
- "git fetch" was a bit loose in parsing responses from the other side when talking over the protocol v2.
- "git rev-parse --exclude=* --branches --branches" (i.e. first saying "add only things that do not match ’’ out of all branches" and then adding all branches, without any exclusion this time) worked as expected, but "--exclude= --all --all" did not work the same way, which has been fixed. (merge 5221048092 ag/rev-parse-all-exclude-fix later to maint).
- "git send-email --transfer-encoding=…" in recent versions of Git sometimes produced an empty "Content-Transfer-Encoding:" header, which has been corrected. (merge 3c88e46f1a al/send-email-auto-cte-fixup later to maint).
- The interface into "xdiff" library used to discover the offset and size of a generated patch hunk by first formatting it into the textual hunk header "@@ -n,m +k,l @@" and then parsing the numbers out. A new interface has been introduced to allow callers a more direct access to them. (merge 5eade0746e jk/xdiff-interface later to maint).
- Pathspec matching against a tree object were buggy when negative pathspec elements were involved, which has been fixed. (merge b7845cebc0 nd/tree-walk-path-exclusion later to maint).
- "git merge" and "git pull" that merges into an unborn branch used to completely ignore "--verify-signatures", which has been corrected. (merge 01a31f3bca jk/verify-sig-merge-into-void later to maint).
- "git rebase --autostash" did not correctly re-attach the HEAD at times.
- "rev-parse --exclude=<pattern> --branches=<pattern>" etc. did not quite work, which has been corrected. (merge 9ab9b5df0e ra/rev-parse-exclude-glob later to maint).
- When editing a patch in a "git add -i" session, a hunk could be made to no-op. The "git apply" program used to reject a patch with such a no-op hunk to catch user mistakes, but it is now updated to explicitly allow a no-op hunk in an edited patch. (merge 22cb3835b9 js/apply-recount-allow-noop later to maint).
- The URL to an MSDN page in a comment has been updated. (merge 2ef2ae2917 js/mingw-msdn-url later to maint).
- "git ls-remote --sort=<thing>" can feed an object that is not yet available into the comparison machinery and segfault, which has been corrected to check such a request upfront and reject it.
- When "git bundle" aborts due to an empty commit ranges (i.e. resulting in an empty pack), it left a file descriptor to an lockfile open, which resulted in leftover lockfile on Windows where you cannot remove a file with an open file descriptor. This has been corrected. (merge 2c8ee1f53c jk/close-duped-fd-before-unlock-for-bundle later to maint).
- "git format-patch --stat=<width>" can be used to specify the width used by the diffstat (shown in the cover letter). (merge 284aeb7e60 nd/format-patch-cover-letter-stat-width later to maint).
- The way .git/index and .git/sharedindex* files were initially created gave these files different perm bits until they were adjusted for shared repository settings. This was made consistent. (merge c9d6c78870 cc/shared-index-permbits later to maint).
- "git rebase --stat" to transplant a piece of history onto a totally unrelated history were not working before and silently showed wrong result. With the recent reimplementation in C, it started to instead die with an error message, as the original logic was not prepared to cope with this case. This has now been fixed.
- The advice message to tell the user to migrate an existing graft file to the replace system when a graft file was read was shown even when "git replace --convert-graft-file" command, which is the way the message suggests to use, was running, which made little sense. (merge 8821e90a09 ab/replace-graft-with-replace-advice later to maint).
- "git diff --raw" lost ellipses to adjust the output columns for some time now, but the documentation still showed them.
- Code cleanup, docfix, build fix, etc. (merge 96a7501aad ts/doc-build-manpage-xsl-quietly later to maint). (merge b9b07efdb2 tg/conflict-marker-size later to maint). (merge fa0aeea770 sg/doc-trace-appends later to maint). (merge d64324cb60 tb/void-check-attr later to maint). (merge c3b9bc94b9 en/double-semicolon-fix later to maint). (merge 79336116f5 sg/t3701-tighten-trace later to maint). (merge 801fa63a90 jk/dev-build-format-security later to maint). (merge 0597dd62ba sb/string-list-remove-unused later to maint). (merge db2d36fad8 bw/protocol-v2 later to maint). (merge 456d7cd3a9 sg/split-index-test later to maint). (merge 7b6057c852 tq/refs-internal-comment-fix later to maint). (merge 29e8dc50ad tg/t5551-with-curl-7.61.1 later to maint). (merge 55f6bce2c9 fe/doc-updates later to maint). (merge 7987d2232d jk/check-everything-connected-is-long-gone later to maint). (merge 4ba3c9be47 dz/credential-doc-url-matching-rules later to maint). (merge 4c399442f7 ma/commit-graph-docs later to maint). (merge fc0503b04e ma/t1400-undebug-test later to maint). (merge e56b53553a nd/packobjectshook-doc-fix later to maint). (merge c56170a0c4 ma/mailing-list-address-in-git-help later to maint). (merge 6e8fc70fce rs/sequencer-oidset-insert-avoids-dups later to maint). (merge ad0b8f9575 mw/doc-typofixes later to maint). (merge d9f079ad1a jc/how-to-document-api later to maint). (merge b1492bf315 ma/t7005-bash-workaround later to maint). (merge ac1f98a0df du/rev-parse-is-plumbing later to maint). (merge ca8ed443a5 mm/doc-no-dashed-git later to maint). (merge ce366a8144 du/get-tar-commit-id-is-plumbing later to maint). (merge 61018fe9e0 du/cherry-is-plumbing later to maint). (merge c7e5fe79b9 sb/strbuf-h-update later to maint). (merge 8d2008196b tq/branch-create-wo-branch-get later to maint). (merge 2e3c894f4b tq/branch-style-fix later to maint). (merge c5d844af9c sg/doc-show-branch-typofix later to maint). (merge 081d91618b ah/doc-updates later to maint). (merge b84c783882 jc/cocci-preincr later to maint). (merge 5e495f8122 uk/merge-subtree-doc-update later to maint). (merge aaaa881822 jk/uploadpack-packobjectshook-fix later to maint). (merge 3063477445 tb/char-may-be-unsigned later to maint). (merge 8c64bc9420 sg/test-rebase-editor-fix later to maint). (merge 71571cd7d6 ma/sequencer-do-reset-saner-loop-termination later to maint). (merge 9a4cb8781e cb/notes-freeing-always-null-fix later to maint). (merge 3006f5ee16 ma/reset-doc-rendering-fix later to maint). (merge 4c2eb06419 sg/daemon-test-signal-fix later to maint). (merge d27525e519 ss/msvc-strcasecmp later to maint).
2.20.1
Git v2.20.1 Release Notes =========================
This release is primarily to fix brown-paper-bag breakages in the 2.20.0 release.
Fixes since v2.20 -----------------
- A few newly added tests were not portable and caused minority platforms to report false breakages, which have been fixed.
- Portability fix for a recent update to parse-options API.
- "git help -a" did not work well when an overly long alias is defined, which has been corrected.
- A recent update accidentally squelched an error message when the run_command API failed to run a missing command, which has been corrected.
2.20.2
Git v2.20.2 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4 and in v2.17.3, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes for those versions for details.
The change to disallow submodule.<name>.update=!command entries in .gitmodules which was introduced v2.15.4 (and for which v2.17.3 added explicit fsck checks) fixes the vulnerability in v2.20.x where a recursive clone followed by a submodule update could execute code contained within the repository without the user explicitly having asked for that (CVE-2019-19604).
Credit for finding this vulnerability goes to Joern Schneeweisz, credit for the fixes goes to Jonathan Nieder.
2.20.3
Git v2.20.3 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.20.4
Git v2.20.4 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.20.5
Git v2.20.5 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5 and v2.19.6 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.21.0
Git 2.21 Release Notes ======================
Backward Compatibility Notes ----------------------------
- Historically, the "-m" (mainline) option can only be used for "git cherry-pick" and "git revert" when working with a merge commit. This version of Git no longer warns or errors out when working with a single-parent commit, as long as the argument to the "-m" option is 1 (i.e. it has only one parent, and the request is to pick or revert relative to that first parent). Scripts that relied on the behaviour may get broken with this change.
Updates since v2.20 -------------------
UI, Workflows & Features
- The "http.version" configuration variable can be used with recent enough versions of cURL library to force the version of HTTP used to talk when fetching and pushing.
- Small fixes and features for fast-export and fast-import, mostly on the fast-export side has been made.
- "git push $there $src:$dst" rejects when $dst is not a fully qualified refname and it is not clear what the end user meant. The codepath has been taught to give a clearer error message, and also guess where the push should go by taking the type of the pushed object into account (e.g. a tag object would want to go under refs/tags/).
- "git checkout [<tree-ish>] path…" learned to report the number of paths that have been checked out of the index or the tree-ish, which gives it the same degree of noisy-ness as the case in which the command checks out a branch. "git checkout -m <pathspec>" to undo conflict resolution gives a similar message.
- "git quiltimport" learned "--keep-non-patch" option.
- "git worktree remove" and "git worktree move" refused to work when there is a submodule involved. This has been loosened to ignore uninitialized submodules.
- "git cherry-pick -m1" was forbidden when picking a non-merge commit, even though there is parent number 1 for such a commit. This was done to avoid mistakes back when "cherry-pick" was about picking a single commit, but is no longer useful with "cherry-pick" that can pick a range of commits. Now the "-m$num" option is allowed when picking any commit, as long as $num names an existing parent of the commit.
- Update "git multimail" from the upstream.
- "git p4" update.
- The "--format=<placeholder>" option of for-each-ref, branch and tag learned to show a few more traits of objects that can be learned by the object_info API.
- "git rebase -i" learned to re-execute a command given with ’exec’ to run after it failed the last time.
- "git diff --color-moved-ws" updates.
- Custom userformat "log --format" learned %S atom that stands for the tip the traversal reached the commit from, i.e. --source.
- "git instaweb" learned to drive http.server that comes with "batteries included" Python installation (both Python2 & 3).
- A new encoding UTF-16LE-BOM has been invented to force encoding to UTF-16 with BOM in little endian byte order, which cannot be directly generated by using iconv.
- A new date format "--date=human" that morphs its output depending on how far the time is from the current time has been introduced. "--date=auto:human" can be used to use this new format (or any existing format) when the output is going to the pager or to the terminal, and otherwise the default format.
Performance, Internal Implementation, Development Support etc.
- Code clean-up with optimization for the codepath that checks (non-)existence of loose objects.
- More codepaths have become aware of working with in-core repository instances other than the default "the_repository".
- The "strncat()" function is now among the banned functions.
- Portability updates for the HPE NonStop platform.
- Earlier we added "-Wformat-security" to developer builds, assuming that "-Wall" (which includes "-Wformat" which in turn is required to use "-Wformat-security") is always in effect. This is not true when config.mak.autogen is in use, unfortunately. This has been fixed by unconditionally adding "-Wall" to developer builds.
- The loose object cache used to optimize existence look-up has been updated.
- Flaky tests can now be repeatedly run under load with the "--stress" option.
- Documentation/Makefile is getting prepared for manpage localization.
- "git fetch-pack" now can talk the version 2 protocol.
- sha-256 hash has been added and plumbed through the code to allow building Git with the "NewHash".
- Debugging help for http transport.
- "git fetch --deepen=<more>" has been corrected to work over v2 protocol.
- The code to walk tree objects has been taught that we may be working with object names that are not computed with SHA-1.
- The in-core repository instances are passed through more codepaths.
- Update the protocol message specification to allow only the limited use of scaled quantities. This is to ensure potential compatibility issues will not get out of hand.
- Micro-optimize the code that prepares commit objects to be walked by "git rev-list" when the commit-graph is available.
- "git fetch" and "git upload-pack" learned to send all exchanges over the sideband channel while talking the v2 protocol.
- The codepath to write out commit-graph has been optimized by following the usual pattern of visiting objects in in-pack order.
- The codepath to show progress meter while writing out commit-graph file has been improved.
- Cocci rules have been updated to encourage use of strbuf_addbuf().
- "git rebase --merge" has been reimplemented by reusing the internal machinery used for "git rebase -i".
- More code in "git bisect" has been rewritten in C.
- Instead of going through "git-rebase—am" scriptlet to use the "am" backend, the built-in version of "git rebase" learned to drive the "am" backend directly.
- The assumption to work on the single "in-core index" instance has been reduced from the library-ish part of the codebase.
- The test lint learned to catch non-portable "sed" options.
- "git pack-objects" learned another algorithm to compute the set of objects to send, that trades the resulting packfile off to save traversal cost to favor small pushes.
- The travis CI scripts have been corrected to build Git with the compiler(s) of our choice.
- "git submodule update" learned to abort early when core.worktree for the submodule is not set correctly to prevent spreading damage.
- Test suite has been adjusted to run on Azure Pipeline.
- Running "Documentation/doc-diff x" from anywhere other than the top-level of the working tree did not show the usage string correctly, which has been fixed.
- Use of the sparse tool got easier to customize from the command line to help developers.
- A new target "coverage-prove" to run the coverage test under "prove" has been added.
- A flakey "p4" test has been removed.
- The code and tests assume that the system supplied iconv() would always use BOM in its output when asked to encode to UTF-16 (or UTF-32), but apparently some implementations output big-endian without BOM. A compile-time knob has been added to help such systems (e.g. NonStop) to add BOM to the output to increase portability.
Fixes since v2.20 -----------------
- Updates for corner cases in merge-recursive. (merge cc4cb0902c en/merge-path-collision later to maint).
- "git checkout frotz" (without any double-dash) avoids ambiguity by making sure ’frotz’ cannot be interpreted as a revision and as a path at the same time. This safety has been updated to check also a unique remote-tracking branch ’frotz’ in a remote, when dwimming to create a local branch ’frotz’ out of a remote-tracking branch ’frotz’ from a remote. (merge be4908f103 nd/checkout-dwim-fix later to maint).
- Refspecs configured with "git -c var=val clone" did not propagate to the resulting repository, which has been corrected. (merge 7eae4a3ac4 sg/clone-initial-fetch-configuration later to maint).
- A properly configured username/email is required under user.useConfigOnly in order to create commits; now "git stash" (even though it creates commit objects to represent stash entries) command is exempt from the requirement. (merge 3bc2111fc2 sd/stash-wo-user-name later to maint).
- The http-backend CGI process did not correctly clean up the child processes it spawns to run upload-pack etc. when it dies itself, which has been corrected. (merge 02818a98d7 mk/http-backend-kill-children-before-exit later to maint).
- "git rev-list --exclude-promisor-objects" had to take an object that does not exist locally (and is lazily available) from the command line without barfing, but the code dereferenced NULL. (merge 4cf67869b2 md/list-lazy-objects-fix later to maint).
- The traversal over tree objects has learned to honor ":(attr:label)" pathspec match, which has been implemented only for enumerating paths on the filesystem. (merge 5a0b97b34c nd/attr-pathspec-in-tree-walk later to maint).
- BSD port updates. (merge 4e3ecbd439 cb/openbsd-allows-reading-directory later to maint). (merge b6bdc2a0f5 cb/t5004-empty-tar-archive-fix later to maint). (merge 82cbc8cde2 cb/test-lint-cp-a later to maint).
- Lines that begin with a certain keyword that come over the wire, as well as lines that consist only of one of these keywords, ought to be painted in color for easier eyeballing, but the latter was broken ever since the feature was introduced in 2.19, which has been corrected. (merge 1f67290450 hn/highlight-sideband-keywords later to maint).
- "git log -G<regex>" looked for a hunk in the "git log -p" patch output that contained a string that matches the given pattern. Optimize this code to ignore binary files, which by default will not show any hunk that would match any pattern (unless textconv or the --text option is in effect, that is). (merge e0e7cb8080 tb/log-G-binary later to maint).
- "git submodule update" ought to use a single job unless asked, but by mistake used multiple jobs, which has been fixed. (merge e3a9d1aca9 sb/submodule-fetchjobs-default-to-one later to maint).
- "git stripspace" should be usable outside a git repository, but under the "-s" or "-c" mode, it didn’t. (merge 957da75802 jn/stripspace-wo-repository later to maint).
- Some of the documentation pages formatted incorrectly with Asciidoctor, which have been fixed. (merge b62eb1d2f4 ma/asciidoctor later to maint).
- The core.worktree setting in a submodule repository should not be pointing at a directory when the submodule loses its working tree (e.g. getting deinit’ed), but the code did not properly maintain this invariant.
- With zsh, "git cmd path<TAB>" was completed to "git cmd path name" when the completed path has a special character like SP in it, without any attempt to keep "path name" a single filename. This has been fixed to complete it to "git cmd path\ name" just like Bash completion does.
- The test suite tried to see if it is run under bash, but the check itself failed under some other implementations of shell (notably under NetBSD). This has been corrected. (merge 54ea72f09c sg/test-bash-version-fix later to maint).
- "git gc" and "git repack" did not close the open packfiles that they found unneeded before removing them, which didn’t work on a platform incapable of removing an open file. This has been corrected. (merge 5bdece0d70 js/gc-repack-close-before-remove later to maint).
- The code to drive GIT_EXTERNAL_DIFF command relied on the string returned from getenv() to be non-volatile, which is not true, that has been corrected. (merge 6776a84dae kg/external-diff-save-env later to maint).
- There were many places the code relied on the string returned from getenv() to be non-volatile, which is not true, that have been corrected. (merge 0da0e9268b jk/save-getenv-result later to maint).
- The v2 upload-pack protocol implementation failed to honor hidden-ref configuration, which has been corrected. (merge e20b4192a3 jk/proto-v2-hidden-refs-fix later to maint).
- "git fetch --recurse-submodules" may not fetch the necessary commit that is bound to the superproject, which is getting corrected. (merge be76c21282 sb/submodule-recursive-fetch-gets-the-tip later to maint).
- "git rebase" internally runs "checkout" to switch between branches, and the command used to call the post-checkout hook, but the reimplementation stopped doing so, which is getting fixed.
- "git add -e" got confused when the change it wants to let the user edit is smaller than the previous change that was left over in a temporary file. (merge fa6f225e01 js/add-e-clear-patch-before-stating later to maint).
- "git p4" failed to update a shelved change when there were moved files, which has been corrected. (merge 7a10946ab9 ld/git-p4-shelve-update-fix later to maint).
- The codepath to read from the commit-graph file attempted to read past the end of it when the file’s table-of-contents was corrupt.
- The compat/obstack code had casts that -Wcast-function-type compilation option found questionable. (merge 764473d257 sg/obstack-cast-function-type-fix later to maint).
- An obvious typo in an assertion error message has been fixed. (merge 3c27e2e059 cc/test-ref-store-typofix later to maint).
- In Git for Windows, "git clone \serversharepath" etc. that uses UNC paths from command line had bad interaction with its shell emulation.
- "git add --ignore-errors" did not work as advertised and instead worked as an unintended synonym for "git add --renormalize", which has been fixed. (merge e2c2a37545 jk/add-ignore-errors-bit-assignment-fix later to maint).
- On a case-insensitive filesystem, we failed to compare the part of the path that is above the worktree directory in an absolute pathname, which has been corrected.
- Asking "git check-attr" about a macro (e.g. "binary") on a specific path did not work correctly, even though "git check-attr -a" listed such a macro correctly. This has been corrected. (merge 7b95849be4 jk/attr-macro-fix later to maint).
- "git pack-objects" incorrectly used uninitialized mutex, which has been corrected. (merge edb673cf10 ph/pack-objects-mutex-fix later to maint).
- "git checkout -b <new> [HEAD]" to create a new branch from the current commit and check it out ought to be a no-op in the index and the working tree in normal cases, but there are corner cases that do require updates to the index and the working tree. Running it immediately after "git clone --no-checkout" is one of these cases that an earlier optimization kicked in incorrectly, which has been fixed. (merge 8424bfd45b bp/checkout-new-branch-optim later to maint).
- "git diff --color-moved --cc --stat -p" did not work well due to funny interaction between a bug in color-moved and the rest, which has been fixed. (merge dac03b5518 jk/diff-cc-stat-fixes later to maint).
- When GIT_SEQUENCE_EDITOR is set, the command was incorrectly started when modes of "git rebase" that implicitly uses the machinery for the interactive rebase are run, which has been corrected. (merge 891d4a0313 pw/no-editor-in-rebase-i-implicit later to maint).
- The commit-graph facility did not work when in-core objects that are promoted from unknown type to commit (e.g. a commit that is accessed via a tag that refers to it) were involved, which has been corrected. (merge 4468d4435c sg/object-as-type-commit-graph-fix later to maint).
- "git fetch" output cleanup. (merge dc40b24df4 nd/fetch-compact-update later to maint).
- "git cat-file --batch" reported a dangling symbolic link by mistake, when it wanted to report that a given name is ambiguous.
- Documentation around core.crlf has been updated. (merge c9446f0504 jk/autocrlf-overrides-eol-doc later to maint).
- The documentation of "git commit-tree" said that the command understands "--gpg-sign" in addition to "-S", but the command line parser did not know about the longhand, which has been corrected.
- "git rebase -x $cmd" did not reject multi-line command, even though the command is incapable of handling such a command. It now is rejected upfront. (merge c762aada1a pw/rebase-x-sanity-check later to maint).
- Output from "git help" was not correctly aligned, which has been fixed. (merge 6195a76da4 nd/help-align-command-desc later to maint).
- The "git submodule summary" subcommand showed shortened commit object names by mechanically truncating them at 7-hexdigit, which has been improved to let "rev-parse --short" scale the length of the abbreviation with the size of the repository. (merge 0586a438f6 sh/submodule-summary-abbrev-fix later to maint).
- The way the OSX build jobs updates its build environment used the "--quiet" option to "brew update" command, but it wasn’t all that quiet to be useful. The use of the option has been replaced with an explicit redirection to the /dev/null (which incidentally would have worked around a breakage by recent updates to homebrew, which has fixed itself already). (merge a1ccaedd62 sg/travis-osx-brew-breakage-workaround later to maint).
- "git --work-tree=$there --git-dir=$here describe --dirty" did not work correctly as it did not pay attention to the location of the worktree specified by the user by mistake, which has been corrected. (merge c801170b0c ss/describe-dirty-in-the-right-directory later to maint).
- "git fetch" over protocol v2 that needs to make a second connection to backfill tags did not clear a variable that holds shallow repository information correctly, leading to an access of freed piece of memory.
- Some errors from the other side coming over smart HTTP transport were not noticed, which has been corrected.
- Code cleanup, docfix, build fix, etc. (merge 89ba9a79ae hb/t0061-dot-in-path-fix later to maint). (merge d173e799ea sb/diff-color-moved-config-option-fixup later to maint). (merge a8f5a59067 en/directory-renames-nothanks-doc-update later to maint). (merge ec36c42a63 nd/indentation-fix later to maint). (merge f116ee21cd do/gitweb-strict-export-conf-doc later to maint). (merge 112ea42663 fd/gitweb-snapshot-conf-doc-fix later to maint). (merge 1cadad6f65 tb/use-common-win32-pathfuncs-on-cygwin later to maint). (merge 57e9dcaa65 km/rebase-doc-typofix later to maint). (merge b8b4cb27e6 ds/gc-doc-typofix later to maint). (merge 3b3357626e nd/style-opening-brace later to maint). (merge b4583d5595 es/doc-worktree-guessremote-config later to maint). (merge cce99cd8c6 ds/commit-graph-assert-missing-parents later to maint). (merge 0650614982 cy/completion-typofix later to maint). (merge 6881925ef5 rs/sha1-file-close-mapped-file-on-error later to maint). (merge bd8d6f0def en/show-ref-doc-fix later to maint). (merge 1747125e2c cc/partial-clone-doc-typofix later to maint). (merge e01378753d cc/fetch-error-message-fix later to maint). (merge 54e8c11215 jk/remote-insteadof-cleanup later to maint). (merge d609615f48 js/test-git-installed later to maint). (merge ba170517be ja/doc-style-fix later to maint). (merge 86fb1c4e77 km/init-doc-typofix later to maint). (merge 5cfd4a9d10 nd/commit-doc later to maint). (merge 9fce19a431 ab/diff-tree-doc-fix later to maint). (merge 2e285e7803 tz/gpg-test-fix later to maint). (merge 5427de960b kl/pretty-doc-markup-fix later to maint). (merge 3815f64b0d js/mingw-host-cpu later to maint). (merge 5fe81438b5 rj/sequencer-sign-off-header-static later to maint). (merge 18a4f6be6b nd/fileno-may-be-macro later to maint). (merge 99e9ab54ab kd/t0028-octal-del-is-377-not-777 later to maint).
2.21.1
Git v2.21.1 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4, v2.17.3 and in v2.20.2, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and CVE-2019-19604; see the release notes for those versions for details.
Additionally, this version also includes a couple of fixes for the Windows-specific quoting of command-line arguments when Git executes a Unix shell on Windows.
2.21.2
Git v2.21.2 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.21.3
Git v2.21.3 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.21.4
Git v2.21.4 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6 and v2.20.5 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.22.0
Git 2.22 Release Notes ======================
Updates since v2.21 -------------------
Backward compatibility note
- The filter specification "--filter=sparse:path=<path>" used to create a lazy/partial clone has been removed. Using a blob that is part of the project as sparse specification is still supported with the "--filter=sparse:oid=<blob>" option.
UI, Workflows & Features
- "git checkout --no-overlay" can be used to trigger a new mode of checking out paths out of the tree-ish, that allows paths that match the pathspec that are in the current index and working tree and are not in the tree-ish.
- The %(trailers) formatter in "git log --format=…" now allows to optionally pick trailers selectively by keyword, show only values, etc.
- Four new configuration variables {author,committer}.{name,email} have been introduced to override user.{name,email} in more specific cases.
- Command-line completion (in contrib/) learned to tab-complete the "git submodule absorbgitdirs" subcommand.
- "git branch" learned a new subcommand "--show-current".
- Output from "diff --cc" did not show the original paths when the merge involved renames. A new option adds the paths in the original trees to the output.
- The command line completion (in contrib/) has been taught to complete more subcommand parameters.
- The final report from "git bisect" used to show the suspected culprit using a raw "diff-tree", with which there is no output for a merge commit. This has been updated to use a more modern and human readable output that still is concise enough.
- "git rebase --rebase-merges" replaces its old "--preserve-merges" option; the latter is now marked as deprecated.
- Error message given while cloning with --recurse-submodules has been updated.
- The completion helper code now pays attention to repository-local configuration (when available), which allows --list-cmds to honour a repository specific setting of completion.commands, for example.
- "git mergetool" learned to offer Sublime Merge (smerge) as one of its backends.
- A new hook "post-index-change" is called when the on-disk index file changes, which can help e.g. a virtualized working tree implementation.
- "git difftool" can now run outside a repository.
- "git checkout -m <other>" was about carrying the differences between HEAD and the working-tree files forward while checking out another branch, and ignored the differences between HEAD and the index. The command has been taught to abort when the index and the HEAD are different.
- A progress indicator has been added to the "index-pack" step, which often makes users wait for completion during "git clone".
- "git submodule" learns "set-branch" subcommand that allows the submodule.*.branch settings to be modified.
- "git merge-recursive" backend recently learned a new heuristics to infer file movement based on how other files in the same directory moved. As this is inherently less robust heuristics than the one based on the content similarity of the file itself (rather than based on what its neighbours are doing), it sometimes gives an outcome unexpected by the end users. This has been toned down to leave the renamed paths in higher/conflicted stages in the index so that the user can examine and confirm the result.
- "git tag" learned to give an advice suggesting it might be a mistake when creating an annotated or signed tag that points at another tag.
- The "git pack-objects" command learned to report the number of objects it packed via the trace2 mechanism.
- The list of conflicted paths shown in the editor while concluding a conflicted merge was shown above the scissors line when the clean-up mode is set to "scissors", even though it was commented out just like the list of updated paths and other information to help the user explain the merge better.
- The trace2 tracing facility learned to auto-generate a filename when told to log to a directory.
- "git clone" learned a new --server-option option when talking over the protocol version 2.
- The connectivity bitmaps are created by default in bare repositories now; also the pathname hash-cache is created by default to avoid making crappy deltas when repacking.
- "git branch new A…B" and "git checkout -b new A…B" have been taught that in their contexts, the notation A…B means "the merge base between these two commits", just like "git checkout A…B" detaches HEAD at that commit.
- Update "git difftool" and "git mergetool" so that the combinations of {diff,merge}.{tool,guitool} configuration variables serve as fallback settings of each other in a sensible order.
- The "--dir-diff" mode of "git difftool" is not useful in "--no-index" mode; they are now explicitly marked as mutually incompatible.
Performance, Internal Implementation, Development Support etc.
- The diff machinery, one of the oldest parts of the system, which long predates the parse-options API, uses fairly long and complex handcrafted option parser. This is being rewritten to use the parse-options API.
- The implementation of pack-redundant has been updated for performance in a repository with many packfiles.
- A more structured way to obtain execution trace has been added.
- "git prune" has been taught to take advantage of reachability bitmap when able.
- The command line parser of "git commit-tree" has been rewritten to use the parse-options API.
- Suggest GitGitGadget instead of submitGit as a way to submit patches based on GitHub PR to us.
- The test framework has been updated to help developers by making it easier to run most of the tests under different versions of over-the-wire protocols.
- Dev support update to make it easier to compare two formatted results from our documentation.
- The scripted "git rebase" implementation has been retired.
- "git multi-pack-index verify" did not scale well with the number of packfiles, which is being improved.
- "git stash" has been rewritten in C.
- The "check-docs" Makefile target to support developers has been updated.
- The tests have been updated not to rely on the abbreviated option names the parse-options API offers, to protect us from an abbreviated form of an option that used to be unique within the command getting non-unique when a new option that share the same prefix is added.
- The scripted version of "git rebase -i" wrote and rewrote the todo list many times during a single step of its operation, and the recent C-rewrite made a faithful conversion of the logic to C. The implementation has been updated to carry necessary information around in-core to avoid rewriting the same file over and over unnecessarily.
- Test framework update to more robustly clean up leftover files and processes after tests are done.
- Conversion from unsigned char[20] to struct object_id continues.
- While running "git diff" in a lazy clone, we can upfront know which missing blobs we will need, instead of waiting for the on-demand machinery to discover them one by one. The code learned to aim to achieve better performance by batching the request for these promised blobs.
- During an initial "git clone --depth=…" partial clone, it is pointless to spend cycles for a large portion of the connectivity check that enumerates and skips promisor objects (which by definition is all objects fetched from the other side). This has been optimized out.
- Mechanically and systematically drop "extern" from function declaration.
- The script to aggregate perf result unconditionally depended on libjson-perl even though it did not have to, which has been corrected.
- The internal implementation of "git rebase -i" has been updated to avoid forking a separate "rebase—interactive" process.
- Allow DEP and ASLR for Windows build to for security hardening.
- Performance test framework has been broken and measured the version of Git that happens to be on $PATH, not the specified one to measure, for a while, which has been corrected.
- Optionally "make coccicheck" can feed multiple source files to spatch, gaining performance while spending more memory.
- Attempt to use an abbreviated option in "git clone --recurs" is responded by a request to disambiguate between --recursive and --recurse-submodules, which is bad because these two are synonyms. The parse-options API has been extended to define such synonyms more easily and not produce an unnecessary failure.
- A pair of private functions in http.c that had names similar to fread/fwrite did not return the number of elements, which was found to be confusing.
- Update collision-detecting SHA-1 code to build properly on HP-UX.
Fixes since v2.21 -----------------
- "git prune-packed" did not notice and complain against excess arguments given from the command line, which now it does. (merge 9b0bd87ed2 rj/prune-packed-excess-args later to maint).
- Split-index fix. (merge 6e37c8ed3c nd/split-index-null-base-fix later to maint).
- "git diff --no-index" may still want to access Git goodies like --ext-diff and --textconv, but so far these have been ignored, which has been corrected. (merge 287ab28bfa jk/diff-no-index-initialize later to maint).
- Unify RPC code for smart http in protocol v0/v1 and v2, which fixes a bug in the latter (lack of authentication retry) and generally improves the code base. (merge a97d00799a jt/http-auth-proto-v2-fix later to maint).
- The include file compat/bswap.h has been updated so that it is safe to (accidentally) include it more than once. (merge 33aa579a55 jk/guard-bswap-header later to maint).
- The set of header files used by "make hdr-check" unconditionally included sha256/gcrypt.h, even when it is not used, causing the make target to fail. We now skip it when GCRYPT_SHA256 is not in use. (merge f23aa18e7f rj/hdr-check-gcrypt-fix later to maint).
- The Makefile uses ’find’ utility to enumerate all the *.h header files, which is expensive on platforms with slow filesystems; it now optionally uses "ls-files" if working within a repository, which is a trick similar to how all sources are enumerated to run ETAGS on. (merge 92b88eba9f js/find-lib-h-with-ls-files-when-possible later to maint).
- "git rebase" that was reimplemented in C did not set ORIG_HEAD correctly, which has been corrected. (merge cbd29ead92 js/rebase-orig-head-fix later to maint).
- Dev support. (merge f545737144 js/stress-test-ui-tweak later to maint).
- CFLAGS now can be tweaked when invoking Make while using DEVELOPER=YesPlease; this did not work well before. (merge 6d5d4b4e93 ab/makefile-help-devs-more later to maint).
- "git fsck --connectivity-only" omits computation necessary to sift the objects that are not reachable from any of the refs into unreachable and dangling. This is now enabled when dangling objects are requested (which is done by default, but can be overridden with the "--no-dangling" option). (merge 8d8c2a5aef jk/fsck-doc later to maint).
- On platforms where "git fetch" is killed with SIGPIPE (e.g. OSX), the upload-pack that runs on the other end that hangs up after detecting an error could cause "git fetch" to die with a signal, which led to a flaky test. "git fetch" now ignores SIGPIPE during the network portion of its operation (this is not a problem as we check the return status from our write(2)s). (merge 143588949c jk/no-sigpipe-during-network-transport later to maint).
- A recent update broke "is this object available to us?" check for well-known objects like an empty tree (which should yield "yes", even when there is no on-disk object for an empty tree), which has been corrected. (merge f06ab027ef jk/virtual-objects-do-exist later to maint).
- The setup code has been cleaned up to avoid leaks around the repository_format structure. (merge e8805af1c3 ma/clear-repository-format later to maint).
- "git config --type=color …" is meant to replace "git config --get-color" but there is a slight difference that wasn’t documented, which is now fixed. (merge cd8e7593b9 jk/config-type-color-ends-with-lf later to maint).
- When the "clean" filter can reduce the size of a huge file in the working tree down to a small "token" (a la Git LFS), there is no point in allocating a huge scratch area upfront, but the buffer is sized based on the original file size. The convert mechanism now allocates very minimum and reallocates as it receives the output from the clean filter process. (merge 02156ab031 jh/resize-convert-scratch-buffer later to maint).
- "git rebase" uses the refs/rewritten/ hierarchy to store its intermediate states, which inherently makes the hierarchy per worktree, but it didn’t quite work well. (merge b9317d55a3 nd/rewritten-ref-is-per-worktree later to maint).
- "git log -L<from>,<to>:<path>" with "-s" did not suppress the patch output as it should. This has been corrected. (merge 05314efaea jk/line-log-with-patch later to maint).
- "git worktree add" used to do a "find an available name with stat and then mkdir", which is race-prone. This has been fixed by using mkdir and reacting to EEXIST in a loop. (merge 7af01f2367 ms/worktree-add-atomic-mkdir later to maint).
- Build update for SHA-1 with collision detection. (merge 07a20f569b jk/sha1dc later to maint).
- Build procedure has been fixed around use of asciidoctor instead of asciidoc. (merge 185f9a0ea0 ma/asciidoctor-fixes later to maint).
- remote-http transport did not anonymize URLs reported in its error messages at places. (merge c1284b21f2 js/anonymize-remote-curl-diag later to maint).
- Error messages given from the http transport have been updated so that they can be localized. (merge ed8b4132c8 js/remote-curl-i18n later to maint).
- "git init" forgot to read platform-specific repository configuration, which made Windows port to ignore settings of core.hidedotfiles, for example.
- A corner-case object name ambiguity while the sequencer machinery is working (e.g. "rebase -i -x") has been fixed.
- "git format-patch" did not diagnose an error while opening the output file for the cover-letter, which has been corrected. (merge 2fe95f494c jc/format-patch-error-check later to maint).
- "git checkout -f <branch>" while the index has an unmerged path incorrectly left some paths in an unmerged state, which has been corrected.
- A corner case bug in the refs API has been corrected. (merge d3322eb28b jk/refs-double-abort later to maint).
- Unicode update. (merge 584b62c37b bb/unicode-12 later to maint).
- dumb-http walker has been updated to share more error recovery strategy with the normal codepath.
- A buglet in configuration parser has been fixed. (merge 19e7fdaa58 nd/include-if-wildmatch later to maint).
- The documentation for "git read-tree --reset -u" has been updated. (merge b5a0bd694c nd/read-tree-reset-doc later to maint).
- Code clean-up around a much-less-important-than-it-used-to-be update_server_info() function. (merge b3223761c8 jk/server-info-rabbit-hole later to maint).
- The message given when "git commit -a <paths>" errors out has been updated. (merge 5a1dbd48bc nd/commit-a-with-paths-msg-update later to maint).
- "git cherry-pick --options A..B", after giving control back to the user to ask help resolving a conflicted step, did not honor the options it originally received, which has been corrected.
- Various glitches in "git gc" around reflog handling have been fixed.
- The code to read from commit-graph file has been cleanup with more careful error checking before using data read from it.
- Performance fix around "git fetch" that grabs many refs. (merge b764300912 jt/fetch-pack-wanted-refs-optim later to maint).
- Protocol v2 support in "git fetch-pack" of shallow clones has been corrected.
- Performance fix around "git blame", especially in a linear history (which is the norm we should optimize for). (merge f892014943 dk/blame-keep-origin-blob later to maint).
- Performance fix for "rev-list --parents — pathspec". (merge 8320b1dbe7 jk/revision-rewritten-parents-in-prio-queue later to maint).
- Updating the display with progress message has been cleaned up to deal better with overlong messages. (merge 545dc345eb sg/overlong-progress-fix later to maint).
- "git blame — path" in a non-bare repository starts blaming from the working tree, and the same command in a bare repository errors out because there is no working tree by definition. The command has been taught to instead start blaming from the commit at HEAD, which is more useful. (merge a544fb08f8 sg/blame-in-bare-start-at-head later to maint).
- An underallocation in the code to read the untracked cache extension has been corrected. (merge 3a7b45a623 js/untracked-cache-allocfix later to maint).
- The code is updated to check the result of memory allocation before it is used in more places, by using xmalloc and/or xcalloc calls. (merge 999b951b28 jk/xmalloc later to maint).
- The GETTEXT_POISON test option has been quite broken ever since it was made runtime-tunable, which has been fixed. (merge f88b9cb603 jc/gettext-test-fix later to maint).
- Test fix on APFS that is incapable of store paths in Latin-1. (merge 3889149619 js/iso8895-test-on-apfs later to maint).
- "git submodule foreach <command> --quiet" did not pass the option down correctly, which has been corrected. (merge a282f5a906 nd/submodule-foreach-quiet later to maint).
- "git send-email" has been taught to use quoted-printable when the payload contains carriage-return. The use of the mechanism is in line with the design originally added the codepath that chooses QP when the payload has overly long lines. (merge 74d76a1701 bc/send-email-qp-cr later to maint).
- The recently added feature to add addresses that are on anything-by: trailers in ’git send-email’ was found to be way too eager and considered nonsense strings as if they can be legitimate beginning of *-by: trailer. This has been tightened.
- Builds with gettext broke on recent macOS w/ Homebrew, which seems to have stopped including from /usr/local/include; this has been corrected. (merge 92a1377a2a js/macos-gettext-build later to maint).
- Running "git add" on a repository created inside the current repository is an explicit indication that the user wants to add it as a submodule, but when the HEAD of the inner repository is on an unborn branch, it cannot be added as a submodule. Worse, the files in its working tree can be added as if they are a part of the outer repository, which is not what the user wants. These problems are being addressed. (merge f937bc2f86 km/empty-repo-is-still-a-repo later to maint).
- "git cherry-pick" run with the "-x" or the "--signoff" option used to (and more importantly, ought to) clean up the commit log message with the --cleanup=space option by default, but this has been broken since late 2017. This has been fixed.
- When given a tag that points at a commit-ish, "git replace --graft" failed to peel the tag before writing a replace ref, which did not make sense because the old graft mechanism the feature wants to mimic only allowed to replace one commit object with another. This has been fixed. (merge ee521ec4cb cc/replace-graft-peel-tags later to maint).
- Code tightening against a "wrong" object appearing where an object of a different type is expected, instead of blindly assuming that the connection between objects are correctly made. (merge 97dd512af7 tb/unexpected later to maint).
- An earlier update for MinGW and Cygwin accidentally broke MSVC build, which has been fixed. (merge 22c3634c0f ss/msvc-path-utils-fix later to maint).
- %(push:track) token used in the --format option to "git for-each-ref" and friends was not showing the right branch, which has been fixed. (merge c646d0934e dr/ref-filter-push-track-fix later to maint).
- "make check-docs", "git help -a", etc. did not account for cases where a particular build may deliberately omit some subcommands, which has been corrected.
- The logic to tell if a Git repository has a working tree protects "git branch -D" from removing the branch that is currently checked out by mistake. The implementation of this logic was broken for repositories with unusual name, which unfortunately is the norm for submodules these days. This has been fixed. (merge f3534c98e4 jt/submodule-repo-is-with-worktree later to maint).
- The autoconf generated configure script failed to use the right gettext() implementations from -libintl by ignoring useless stub implementations shipped in some C library, which has been corrected. (merge b71e56a683 vk/autoconf-gettext later to maint).
- Fix index-pack perf test so that the repeated invocations always run in an empty repository, which emulates the initial clone situation better. (merge 775c71e16d jk/p5302-avoid-collision-check-cost later to maint).
- A "ls-files" that emulates "find" to enumerate files in the working tree resulted in duplicated Makefile rules that caused the build to issue an unnecessary warning during a trial build after merge conflicts are resolved in working tree *.h files but before the resolved results are added to the index. This has been corrected.
- "git cherry-pick" (and "revert" that shares the same runtime engine) that deals with multiple commits got confused when the final step gets stopped with a conflict and the user concluded the sequence with "git commit". Attempt to fix it by cleaning up the state files used by these commands in such a situation. (merge 4a72486de9 pw/clean-sequencer-state-upon-final-commit later to maint).
- On a filesystem like HFS+, the names of the refs stored as filesystem entities may become different from what the end-user expects, just like files in the working tree get "renamed". Work around the mismatch by paying attention to the core.precomposeUnicode configuration. (merge 8e712ef6fc en/unicode-in-refnames later to maint).
- The code to generate the multi-pack idx file was not prepared to see too many packfiles and ran out of open file descriptor, which has been corrected.
- To run tests for Git SVN, our scripts for CI used to install the git-svn package (in the hope that it would bring in the right dependencies). This has been updated to install the more direct dependency, namely, libsvn-perl. (merge db864306cf sg/ci-libsvn-perl later to maint).
- "git cvsexportcommit" running on msys did not expect cvsnt showed "cvs status" output with CRLF line endings.
- The fsmonitor interface got out of sync after the in-core index file gets discarded, which has been corrected. (merge 398a3b0899 js/fsmonitor-refresh-after-discarding-index later to maint).
- "git status" did not know that the "label" instruction in the todo-list "rebase -i -r" uses should not be shown as a hex object name.
- A prerequisite check in the test suite to see if a working jgit is available was made more robust. (merge abd0f28983 tz/test-lib-check-working-jgit later to maint).
- The codepath to parse :<path> that obtains the object name for an indexed object has been made more robust.
- Code cleanup, docfix, build fix, etc. (merge 11f470aee7 jc/test-yes-doc later to maint). (merge 90503a240b js/doc-symref-in-proto-v1 later to maint). (merge 5c326d1252 jk/unused-params later to maint). (merge 68cabbfda3 dl/doc-submodule-wo-subcommand later to maint). (merge 9903623761 ab/receive-pack-use-after-free-fix later to maint). (merge 1ede45e44b en/merge-options-doc later to maint). (merge 3e14dd2c8e rd/doc-hook-used-in-sample later to maint). (merge c271dc28fd nd/no-more-check-racy later to maint). (merge e6e15194a8 yb/utf-16le-bom-spellfix later to maint). (merge bb101aaf0c rd/attr.c-comment-typofix later to maint). (merge 716a5af812 rd/gc-prune-doc-fix later to maint). (merge 50b206371d js/untravis-windows later to maint). (merge dbf47215e3 js/rebase-recreate-merge later to maint). (merge 56cb2d30f8 dl/reset-doc-no-wrt-abbrev later to maint). (merge 64eca306a2 ja/dir-rename-doc-markup-fix later to maint). (merge af91b0230c dl/ignore-docs later to maint). (merge 59a06e947b ra/t3600-test-path-funcs later to maint). (merge e041d0781b ar/t4150-remove-cruft later to maint). (merge 8d75a1d183 ma/asciidoctor-fixes-more later to maint). (merge 74cc547b0f mh/pack-protocol-doc-fix later to maint). (merge ed31851fa6 ab/doc-misc-typofixes later to maint). (merge a7256debd4 nd/checkout-m-doc-update later to maint). (merge 3a9e1ad78d jt/t5551-protocol-v2-does-not-have-half-auth later to maint). (merge 0b918b75af sg/t5318-cleanup later to maint). (merge 68ed71b53c cb/doco-mono later to maint). (merge a34dca2451 nd/interpret-trailers-docfix later to maint). (merge cf7b857a77 en/fast-import-parsing-fix later to maint). (merge fe61ccbc35 po/rerere-doc-fmt later to maint). (merge ffea0248bf po/describe-not-necessarily-7 later to maint). (merge 7cb7283adb tg/ls-files-debug-format-fix later to maint). (merge f64a21bd82 tz/doc-apostrophe-no-longer-needed later to maint). (merge dbe7b41019 js/t3301-unbreak-notes-test later to maint). (merge d8083e4180 km/t3000-retitle later to maint). (merge 9e4cbccbd7 tz/git-svn-doc-markup-fix later to maint). (merge da9ca955a7 jk/ls-files-doc-markup-fix later to maint). (merge 6804ba3a58 cw/diff-highlight later to maint). (merge 1a8787144d nd/submodule-helper-incomplete-line-fix later to maint). (merge d9ef573837 jk/apache-lsan later to maint). (merge c871fbee2b js/t6500-use-windows-pid-on-mingw later to maint). (merge ce4c7bfc90 bl/t4253-exit-code-from-format-patch later to maint). (merge 397a46db78 js/t5580-unc-alternate-test later to maint). (merge d4907720a2 cm/notes-comment-fix later to maint). (merge 9dde06de13 cb/http-push-null-in-message-fix later to maint). (merge 4c785c0edc js/rebase-config-bitfix later to maint). (merge 8e9fe16c87 es/doc-gitsubmodules-markup later to maint).
2.22.1
Git 2.22.1 Release Notes ========================
Fixes since v2.22 -----------------
- A relative pathname given to "git init --template=<path> <repo>" ought to be relative to the directory "git init" gets invoked in, but it instead was made relative to the repository, which has been corrected.
- "git worktree add" used to fail when another worktree connected to the same repository was corrupt, which has been corrected.
- The ownership rule for the file descriptor to fast-import remote backend was mixed up, leading to unrelated file descriptor getting closed, which has been fixed.
- "git update-server-info" used to leave stale packfiles in its output, which has been corrected.
- The server side support for "git fetch" used to show incorrect value for the HEAD symbolic ref when the namespace feature is in use, which has been corrected.
- "git am -i --resolved" segfaulted after trying to see a commit as if it were a tree, which has been corrected.
- "git bundle verify" needs to see if prerequisite objects exist in the receiving repository, but the command did not check if we are in a repository upfront, which has been corrected.
- "git merge --squash" is designed to update the working tree and the index without creating the commit, and this cannot be countermanded by adding the "--commit" option; the command now refuses to work when both options are given.
- The data collected by fsmonitor was not properly written back to the on-disk index file, breaking t7519 tests occasionally, which has been corrected.
- Update to Unicode 12.1 width table.
- The command line to invoke a "git cat-file" command from inside "git p4" was not properly quoted to protect a caret and running a broken command on Windows, which has been corrected.
- "git request-pull" learned to warn when the ref we ask them to pull from in the local repository and in the published repository are different.
- When creating a partial clone, the object filtering criteria is recorded for the origin of the clone, but this incorrectly used a hardcoded name "origin" to name that remote; it has been corrected to honor the "--origin <name>" option.
- "git fetch" into a lazy clone forgot to fetch base objects that are necessary to complete delta in a thin packfile, which has been corrected.
- The filter_data used in the list-objects-filter (which manages a lazily sparse clone repository) did not use the dynamic array API correctly---’nr’ is supposed to point at one past the last element of the array in use. This has been corrected.
- The description about slashes in gitignore patterns (used to indicate things like "anchored to this level only" and "only matches directories") has been revamped.
- The URL decoding code has been updated to avoid going past the end of the string while parsing %-<hex>-<hex> sequence.
- The list of for-each like macros used by clang-format has been updated.
- "git push --atomic" that goes over the transport-helper (namely, the smart http transport) failed to prevent refs to be pushed when it can locally tell that one of the ref update will fail without having to consult the other end, which has been corrected.
- "git clean" silently skipped a path when it cannot lstat() it; now it gives a warning.
- A codepath that reads from GPG for signed object verification read past the end of allocated buffer, which has been fixed.
- "git rm" to resolve a conflicted path leaked an internal message "needs merge" before actually removing the path, which was confusing. This has been corrected.
- The "git clone" documentation refers to command line options in its description in the short form; they have been replaced with long forms to make them more recognisable.
- The configuration variable rebase.rescheduleFailedExec should be effective only while running an interactive rebase and should not affect anything when running a non-interactive one, which was not the case. This has been corrected.
- "git submodule foreach" did not protect command line options passed to the command to be run in each submodule correctly, when the "--recursive" option was in use.
- Use "Erase in Line" CSI sequence that is already used in the editor support to clear cruft in the progress output.
- The codepath to compute delta islands used to spew progress output without giving the callers any way to squelch it, which has been fixed.
- The code to parse scaled numbers out of configuration files has been made more robust and also easier to follow.
- An incorrect list of options was cached after command line completion failed (e.g. trying to complete a command that requires a repository outside one), which has been corrected.
- "git rebase --abort" used to leave refs/rewritten/ when concluding "git rebase -r", which has been corrected.
- "git stash show 23" used to work, but no more after getting rewritten in C; this regression has been corrected.
- "git interpret-trailers" always treated ’#’ as the comment character, regardless of core.commentChar setting, which has been corrected.
- Code clean-up to avoid signed integer overlaps during binary search.
- "git checkout -p" needs to selectively apply a patch in reverse, which did not work well.
- The commit-graph file is now part of the "files that the runtime may keep open file descriptors on, all of which would need to be closed when done with the object store", and the file descriptor to an existing commit-graph file now is closed before "gc" finalizes a new instance to replace it.
- Code restructuring during 2.20 period broke fetching tags via "import" based transports.
- We have been trying out a few language features outside c89; the coding guidelines document did not talk about them and instead had a blanket ban against them.
- The internal diff machinery can be made to read out of bounds while looking for --funcion-context line in a corner case, which has been corrected.
Also contains various documentation updates, code clean-ups and minor fixups.
2.22.2
Git v2.22.2 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4, v2.17.3, v2.20.2 and in v2.21.1, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and CVE-2019-19604; see the release notes for those versions for details.
2.22.3
Git v2.22.3 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.22.4
Git v2.22.4 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.22.5
Git v2.22.5 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5 and v2.21.4 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.23.0
Git 2.23 Release Notes ======================
Updates since v2.22 -------------------
Backward compatibility note
- The "--base" option of "format-patch" computed the patch-ids for prerequisite patches in an unstable way, which has been updated to compute in a way that is compatible with "git patch-id --stable".
- The "git log" command by default behaves as if the --mailmap option was given.
UI, Workflows & Features
- The "git fast-export/import" pair has been taught to handle commits with log messages in encoding other than UTF-8 better.
- In recent versions of Git, per-worktree refs are exposed in refs/worktrees/<wtname>/ hierarchy, which means that worktree names must be a valid refname component. The code now sanitizes the names given to worktrees, to make sure these refs are well-formed.
- "git merge" learned "--quit" option that cleans up the in-progress merge while leaving the working tree and the index still in a mess.
- "git format-patch" learns a configuration to set the default for its --notes=<ref> option.
- The code to show args with potential typo that cannot be interpreted as a commit-ish has been improved.
- "git clone --recurse-submodules" learned to set up the submodules to ignore commit object names recorded in the superproject gitlink and instead use the commits that happen to be at the tip of the remote-tracking branches from the get-go, by passing the new "--remote-submodules" option.
- The pattern "git diff/grep" use to extract funcname and words boundary for Matlab has been extend to cover Octave, which is more or less equivalent.
- "git help git" was hard to discover (well, at least for some people).
- The pattern "git diff/grep" use to extract funcname and words boundary for Rust has been added.
- "git status" can be told a non-standard default value for the "--[no-]ahead-behind" option with a new configuration variable status.aheadBehind.
- "git fetch" and "git pull" reports when a fetch results in non-fast-forward updates to let the user notice unusual situation. The commands learned "--no-show-forced-updates" option to disable this safety feature.
- Two new commands "git switch" and "git restore" are introduced to split "checking out a branch to work on advancing its history" and "checking out paths out of the index and/or a tree-ish to work on advancing the current history" out of the single "git checkout" command.
- "git branch --list" learned to always output the detached HEAD as the first item (when the HEAD is detached, of course), regardless of the locale.
- The conditional inclusion mechanism learned to base the choice on the branch the HEAD currently is on.
- "git rev-list --objects" learned the "--no-object-names" option to squelch the path to the object that is used as a grouping hint for pack-objects.
- A new tag.gpgSign configuration variable turns "git tag -a" into "git tag -s".
- "git multi-pack-index" learned expire and repack subcommands.
- "git blame" learned to "ignore" commits in the history, whose effects (as well as their presence) get ignored.
- "git cherry-pick/revert" learned a new "--skip" action.
- The tips of refs from the alternate object store can be used as starting point for reachability computation now.
- Extra blank lines in "git status" output have been reduced.
- The commits in a repository can be described by multiple commit-graph files now, which allows the commit-graph files to be updated incrementally.
- "git range-diff" output has been tweaked for easier identification of which part of what file the patch shown is about.
Performance, Internal Implementation, Development Support etc.
- Update supporting parts of "git rebase" to remove code that should no longer be used.
- Developer support to emulate unsatisfied prerequisites in tests to ensure that the remainder of the tests still succeeds when tests with prerequisites are skipped.
- "git update-server-info" learned not to rewrite the file with the same contents.
- The way of specifying the path to find dynamic libraries at runtime has been simplified. The old default to pass -R/path/to/dir has been replaced with the new default to pass -Wl,-rpath,/path/to/dir, which is the more recent GCC uses. Those who need to build with an old GCC can still use "CC_LD_DYNPATH=-R"
- Prepare use of reachability index in topological walker that works on a range (A..B).
- A new tutorial targeting specifically aspiring git-core developers has been added.
- Auto-detect how to tell HP-UX aCC where to use dynamically linked libraries from at runtime.
- "git mergetool" and its tests now spawn fewer subprocesses.
- Dev support update to help tracing out tests.
- Support to build with MSVC has been updated.
- "git fetch" that grabs from a group of remotes learned to run the auto-gc only once at the very end.
- A handful of Windows build patches have been upstreamed.
- The code to read state files used by the sequencer machinery for "git status" has been made more robust against a corrupt or stale state files.
- "git for-each-ref" with multiple patterns have been optimized.
- The tree-walk API learned to pass an in-core repository instance throughout more codepaths.
- When one step in multi step cherry-pick or revert is reset or committed, the command line prompt script failed to notice the current status, which has been improved.
- Many GIT_TEST_* environment variables control various aspects of how our tests are run, but a few followed "non-empty is true, empty or unset is false" while others followed the usual "there are a few ways to spell true, like yes, on, etc., and also ways to spell false, like no, off, etc." convention.
- Adjust the dir-iterator API and apply it to the local clone optimization codepath.
- We have been trying out a few language features outside c89; the coding guidelines document did not talk about them and instead had a blanket ban against them.
- A test helper has been introduced to optimize preparation of test repositories with many simple commits, and a handful of test scripts have been updated to use it.
Fixes since v2.22 -----------------
- A relative pathname given to "git init --template=<path> <repo>" ought to be relative to the directory "git init" gets invoked in, but it instead was made relative to the repository, which has been corrected.
- "git worktree add" used to fail when another worktree connected to the same repository was corrupt, which has been corrected.
- The ownership rule for the file descriptor to fast-import remote backend was mixed up, leading to an unrelated file descriptor getting closed, which has been fixed.
- A "merge -c" instruction during "git rebase --rebase-merges" should give the user a chance to edit the log message, even when there is otherwise no need to create a new merge and replace the existing one (i.e. fast-forward instead), but did not. Which has been corrected.
- Code cleanup and futureproof.
- More parameter validation.
- "git update-server-info" used to leave stale packfiles in its output, which has been corrected.
- The server side support for "git fetch" used to show incorrect value for the HEAD symbolic ref when the namespace feature is in use, which has been corrected.
- "git am -i --resolved" segfaulted after trying to see a commit as if it were a tree, which has been corrected.
- "git bundle verify" needs to see if prerequisite objects exist in the receiving repository, but the command did not check if we are in a repository upfront, which has been corrected.
- "git merge --squash" is designed to update the working tree and the index without creating the commit, and this cannot be countermanded by adding the "--commit" option; the command now refuses to work when both options are given.
- The data collected by fsmonitor was not properly written back to the on-disk index file, breaking t7519 tests occasionally, which has been corrected.
- Update to Unicode 12.1 width table.
- The command line to invoke a "git cat-file" command from inside "git p4" was not properly quoted to protect a caret and running a broken command on Windows, which has been corrected.
- "git request-pull" learned to warn when the ref we ask them to pull from in the local repository and in the published repository are different.
- When creating a partial clone, the object filtering criteria is recorded for the origin of the clone, but this incorrectly used a hardcoded name "origin" to name that remote; it has been corrected to honor the "--origin <name>" option.
- "git fetch" into a lazy clone forgot to fetch base objects that are necessary to complete delta in a thin packfile, which has been corrected.
- The filter_data used in the list-objects-filter (which manages a lazily sparse clone repository) did not use the dynamic array API correctly---’nr’ is supposed to point at one past the last element of the array in use. This has been corrected.
- The description about slashes in gitignore patterns (used to indicate things like "anchored to this level only" and "only matches directories") has been revamped.
- The URL decoding code has been updated to avoid going past the end of the string while parsing %-<hex>-<hex> sequence.
- The list of for-each like macros used by clang-format has been updated.
- "git branch --list" learned to show branches that are checked out in other worktrees connected to the same repository prefixed with ’+’, similar to the way the currently checked out branch is shown with ’*’ in front. (merge 6e9381469e nb/branch-show-other-worktrees-head later to maint).
- Code restructuring during 2.20 period broke fetching tags via "import" based transports.
- The commit-graph file is now part of the "files that the runtime may keep open file descriptors on, all of which would need to be closed when done with the object store", and the file descriptor to an existing commit-graph file now is closed before "gc" finalizes a new instance to replace it.
- "git checkout -p" needs to selectively apply a patch in reverse, which did not work well.
- Code clean-up to avoid signed integer wraparounds during binary search.
- "git interpret-trailers" always treated ’#’ as the comment character, regardless of core.commentChar setting, which has been corrected.
- "git stash show 23" used to work, but no more after getting rewritten in C; this regression has been corrected.
- "git rebase --abort" used to leave refs/rewritten/ when concluding "git rebase -r", which has been corrected.
- An incorrect list of options was cached after command line completion failed (e.g. trying to complete a command that requires a repository outside one), which has been corrected.
- The code to parse scaled numbers out of configuration files has been made more robust and also easier to follow.
- The codepath to compute delta islands used to spew progress output without giving the callers any way to squelch it, which has been fixed.
- Protocol capabilities that go over wire should never be translated, but it was incorrectly marked for translation, which has been corrected. The output of protocol capabilities for debugging has been tweaked a bit.
- Use "Erase in Line" CSI sequence that is already used in the editor support to clear cruft in the progress output.
- "git submodule foreach" did not protect command line options passed to the command to be run in each submodule correctly, when the "--recursive" option was in use.
- The configuration variable rebase.rescheduleFailedExec should be effective only while running an interactive rebase and should not affect anything when running a non-interactive one, which was not the case. This has been corrected.
- The "git clone" documentation refers to command line options in its description in the short form; they have been replaced with long forms to make them more recognisable.
- Generation of pack bitmaps are now disabled when .keep files exist, as these are mutually exclusive features. (merge 7328482253 ew/repack-with-bitmaps-by-default later to maint).
- "git rm" to resolve a conflicted path leaked an internal message "needs merge" before actually removing the path, which was confusing. This has been corrected.
- "git stash --keep-index" did not work correctly on paths that have been removed, which has been fixed. (merge b932f6a5e8 tg/stash-keep-index-with-removed-paths later to maint).
- Window 7 update ;-)
- A codepath that reads from GPG for signed object verification read past the end of allocated buffer, which has been fixed.
- "git clean" silently skipped a path when it cannot lstat() it; now it gives a warning.
- "git push --atomic" that goes over the transport-helper (namely, the smart http transport) failed to prevent refs to be pushed when it can locally tell that one of the ref update will fail without having to consult the other end, which has been corrected.
- The internal diff machinery can be made to read out of bounds while looking for --function-context line in a corner case, which has been corrected. (merge b777f3fd61 jk/xdiff-clamp-funcname-context-index later to maint).
- Other code cleanup, docfix, build fix, etc. (merge fbec05c210 cc/test-oidmap later to maint). (merge 7a06fb038c jk/no-system-includes-in-dot-c later to maint). (merge 81ed2b405c cb/xdiff-no-system-includes-in-dot-c later to maint). (merge d61e6ce1dd sg/fsck-config-in-doc later to maint).
2.23.1
Git v2.23.1 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4, v2.17.3, v2.20.2 and in v2.21.1, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and CVE-2019-19604; see the release notes for those versions for details.
2.23.2
Git v2.23.2 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.23.3
Git v2.23.3 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.23.4
Git v2.23.4 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4 and v2.22.5 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.24.0
Git 2.24 Release Notes ======================
Updates since v2.23 -------------------
Backward compatibility note
- "filter-branch" is showing its age and alternatives are available. From this release, we started to discourage its use and hint people about filter-repo.
UI, Workflows & Features
- We now have an active interim maintainer for the Git-Gui part of the system. Praise and thank Pratyush Yadav for volunteering.
- The command line parser learned "--end-of-options" notation; the standard convention for scripters to have hardcoded set of options first on the command line, and force the command to treat end-user input as non-options, has been to use "--" as the delimiter, but that would not work for commands that use "--" as a delimiter between revs and pathspec.
- A mechanism to affect the default setting for a (related) group of configuration variables is introduced.
- "git fetch" learned "--set-upstream" option to help those who first clone from their private fork they intend to push to, add the true upstream via "git remote add" and then "git fetch" from it.
- Device-tree files learned their own userdiff patterns. (merge 3c81760bc6 sb/userdiff-dts later to maint).
- "git rebase --rebase-merges" learned to drive different merge strategies and pass strategy specific options to them.
- A new "pre-merge-commit" hook has been introduced.
- Command line completion updates for "git -c var.name=val" have been added.
- The lazy clone machinery has been taught that there can be more than one promisor remote and consult them in order when downloading missing objects on demand.
- The list-objects-filter API (used to create a sparse/lazy clone) learned to take a combined filter specification.
- The documentation and tests for "git format-patch" have been cleaned up.
- On Windows, the root level of UNC share is now allowed to be used just like any other directory.
- The command line completion support (in contrib/) learned about the "--skip" option of "git revert" and "git cherry-pick".
- "git rebase --keep-base <upstream>" tries to find the original base of the topic being rebased and rebase on top of that same base, which is useful when running the "git rebase -i" (and its limited variant "git rebase -x").
The command also has learned to fast-forward in more cases where it
can instead of replaying to recreate identical commits.
- A configuration variable tells "git fetch" to write the commit graph after finishing.
- "git add -i" has been taught to show the total number of hunks and the hunks that has been processed so far when showing prompts.
- "git fetch --jobs=<n>" allowed <n> parallel jobs when fetching submodules, but this did not apply to "git fetch --multiple" that fetches from multiple remote repositories. It now does.
- The installation instruction for zsh completion script (in contrib/) has been a bit improved.
Performance, Internal Implementation, Development Support etc.
- The code to write commit-graph over given commit object names has been made a bit more robust.
- The first line of verbose output from each test piece now carries the test name and number to help scanning with eyeballs.
- Further clean-up of the initialization code.
- xmalloc() used to have a mechanism to ditch memory and address space resources as the last resort upon seeing an allocation failure from the underlying malloc(), which made the code complex and thread-unsafe with dubious benefit, as major memory resource users already do limit their uses with various other mechanisms. It has been simplified away.
- Unnecessary full-tree diff in "git log -L" machinery has been optimized away.
- The http transport lacked some optimization the native transports learned to avoid unnecessary ref advertisement, which has been corrected.
- Preparation for SHA-256 upgrade continues in the test department. (merge 0c37c41d13 bc/hash-independent-tests-part-5 later to maint).
- The memory ownership model of the "git fast-import" got straightened out.
- Output from trace2 subsystem is formatted more prettily now.
- The internal code originally invented for ".gitignore" processing got reshuffled and renamed to make it less tied to "excluding" and stress more that it is about "matching", as it has been reused for things like sparse checkout specification that want to check if a path is "included".
- "git stash" learned to write refreshed index back to disk.
- Coccinelle checks are done on more source files than before now.
- The cache-tree code has been taught to be less aggressive in attempting to see if a tree object it computed already exists in the repository.
- The code to parse and use the commit-graph file has been made more robust against corrupted input.
- The hg-to-git script (in contrib/) has been updated to work with Python 3.
- Update the way build artifacts in t/helper/ directory are ignored.
- Preparation for SHA-256 upgrade continues.
- "git log --graph" for an octopus merge is sometimes colored incorrectly, which is demonstrated and documented but not yet fixed.
- The trace2 output, when sending them to files in a designated directory, can populate the directory with too many files; a mechanism is introduced to set the maximum number of files and discard further logs when the maximum is reached.
- We have adopted a Code-of-conduct document. (merge 3f9ef874a7 jk/coc later to maint).
Fixes since v2.23 -----------------
- "git grep --recurse-submodules" that looks at the working tree files looked at the contents in the index in submodules, instead of files in the working tree. (merge 6a289d45c0 mt/grep-submodules-working-tree later to maint).
- Codepaths to walk tree objects have been audited for integer overflows and hardened. (merge 5aa02f9868 jk/tree-walk-overflow later to maint).
- "git pack-refs" can lose refs that are created while running, which is getting corrected. (merge a613d4f817 sc/pack-refs-deletion-racefix later to maint).
- "git checkout" and "git restore" to re-populate the index from a tree-ish (typically HEAD) did not work correctly for a path that was removed and then added again with the intent-to-add bit, when the corresponding working tree file was empty. This has been corrected.
- Compilation fix. (merge 70597e8386 rs/nedalloc-fixlets later to maint).
- "git gui" learned to call the clean-up procedure before exiting. (merge 0d88f3d2c5 py/git-gui-do-quit later to maint).
- We promoted the "indent heuristics" that decides where to split diff hunks from experimental to the default a few years ago, but some stale documentation still marked it as experimental, which has been corrected. (merge 64e5e1fba1 sg/diff-indent-heuristic-non-experimental later to maint).
- Fix a mismerge that happened in 2.22 timeframe. (merge acb7da05ac en/checkout-mismerge-fix later to maint).
- "git archive" recorded incorrect length in extended pax header in some corner cases, which has been corrected. (merge 71d41ff651 rs/pax-extended-header-length-fix later to maint).
- On-demand object fetching in lazy clone incorrectly tried to fetch commits from submodule projects, while still working in the superproject, which has been corrected. (merge a63694f523 jt/diff-lazy-fetch-submodule-fix later to maint).
- Prepare get_short_oid() codepath to be thread-safe. (merge 7cfcb16b0e rs/sort-oid-array-thread-safe later to maint).
- "for-each-ref" and friends that show refs did not protect themselves against ancient tags that did not record tagger names when asked to show "%(taggername)", which have been corrected. (merge 8b3f33ef11 mp/for-each-ref-missing-name-or-email later to maint).
- The "git am" based backend of "git rebase" ignored the result of updating ".gitattributes" done in one step when replaying subsequent steps. (merge 2c65d90f75 bc/reread-attributes-during-rebase later to maint).
- Tell cURL library to use the same malloc() implementation, with the xmalloc() wrapper, as the rest of the system, for consistency. (merge 93b980e58f cb/curl-use-xmalloc later to maint).
- Build fix to adjust .gitignore to unignore a path that we started to track. (merge aac6ff7b5b js/visual-studio later to maint).
- A few implementation fixes in the notes API. (merge 60fe477a0b mh/notes-duplicate-entries later to maint).
- Fix an earlier regression to "git push --all" which should have been forbidden when the target remote repository is set to be a mirror. (merge 8e4c8af058 tg/push-all-in-mirror-forbidden later to maint).
- Fix an earlier regression in the test suite, which mistakenly stopped running HTTPD tests. (merge 3960290675 sg/git-test-boolean later to maint).
- "git rebase --autostash <upstream> <branch>", when <branch> is different from the current branch, incorrectly moved the tip of the current branch, which has been corrected. (merge bf1e28e0ad bw/rebase-autostash-keep-current-branch later to maint).
- Update support for Asciidoctor documentation toolchain. (merge 83b0b8953e ma/asciidoctor-refmiscinfo later to maint).
- Start using DocBook 5 (instead of DocBook 4.5) as Asciidoctor 2.0 no longer works with the older one. (merge f6461b82b9 bc/doc-use-docbook-5 later to maint).
- The markup used in user-manual has been updated to work better with asciidoctor. (merge c4d2f6143a ma/user-manual-markup-update later to maint).
- Make sure the grep machinery does not abort when seeing a payload that is not UTF-8 even when JIT is not in use with PCRE1. (merge ad7c543e3b cb/skip-utf8-check-with-pcre1 later to maint).
- The name of the blob object that stores the filter specification for sparse cloning/fetching was interpreted in a wrong place in the code, causing Git to abort.
- "git log --decorate-refs-exclude=<pattern>" was incorrectly overruled when the "--simplify-by-decoration" option is used, which has been corrected. (merge 0cc7380d88 rs/simplify-by-deco-with-deco-refs-exclude later to maint).
- The "upload-pack" (the counterpart of "git fetch") needs to disable commit-graph when responding to a shallow clone/fetch request, but the way this was done made Git panic, which has been corrected.
- The object traversal machinery has been optimized not to load tree objects when we are only interested in commit history. (merge 72ed80c784 jk/list-objects-optim-wo-trees later to maint).
- The object name parser for "Nth parent" syntax has been made more robust against integer overflows. (merge 59fa5f5a25 rs/nth-parent-parse later to maint).
- The code used in following tags in "git fetch" has been optimized. (merge b7e2d8bca5 ms/fetch-follow-tag-optim later to maint).
- Regression fix for progress output. (merge 2bb74b53a4 sg/progress-fix later to maint).
- A bug in merge-recursive code that triggers when a branch with a symbolic link is merged with a branch that replaces it with a directory has been fixed. (merge 83e3ad3b12 jt/merge-recursive-symlink-is-not-a-dir-in-way later to maint).
- The rename detection logic sorts a list of rename source candidates by similarity to pick the best candidate, which means that a tie between sources with the same similarity is broken by the original location in the original candidate list (which is sorted by path). Force the sorting by similarity done with a stable sort, which is not promised by system supplied qsort(3), to ensure consistent results across platforms. (merge 2049b8dc65 js/diff-rename-force-stable-sort later to maint).
- The code to skip "UTF" and "UTF-" prefix, when computing an advice message, did not work correctly when the prefix was "UTF", which has been fixed. (merge b181676ce9 rs/convert-fix-utf-without-dash later to maint).
- "git rebase -i" showed a wrong HEAD while "reword" open the editor. (merge b0a3186140 pw/rebase-i-show-HEAD-to-reword later to maint).
- A few simplification and bugfixes to PCRE interface. (merge c581e4a749 ab/pcre-jit-fixes later to maint).
- PCRE fixes. (merge ff61681b46 cb/pcre1-cleanup later to maint).
- "git range-diff" segfaulted when diff.noprefix configuration was used, as it blindly expected the patch it internally generates to have the standard a/ and b/ prefixes. The command now forces the internal patch to be built without any prefix, not to be affected by any end-user configuration. (merge 937b76ed49 js/range-diff-noprefix later to maint).
- "git stash apply" in a subdirectory of a secondary worktree failed to access the worktree correctly, which has been corrected. (merge dfd557c978 js/stash-apply-in-secondary-worktree later to maint).
- The merge-recursive machinery is one of the most complex parts of the system that accumulated cruft over time. This large series cleans up the implementation quite a bit. (merge b657047719 en/merge-recursive-cleanup later to maint).
- Pretty-printed command line formatter (used in e.g. reporting the command being run by the tracing API) had a bug that lost an argument that is an empty string, which has been corrected. (merge ce2d7ed2fd gs/sq-quote-buf-pretty later to maint).
- "git range-diff" failed to handle mode-only change, which has been corrected. (merge 2b6a9b13ca tg/range-diff-output-update later to maint).
- Dev support update. (merge 4f3c1dc5d6 dl/allow-running-cocci-verbosely later to maint).
- "git format-patch -o <outdir>" did an equivalent of "mkdir <outdir>" not "mkdir -p <outdir>", which was corrected.
- "git stash save" lost local changes to submodules, which has been corrected. (merge 556895d0c8 jj/stash-reset-only-toplevel later to maint).
- The atomic push over smart HTTP transport did not work, which has been corrected. (merge 6f1194246a bc/smart-http-atomic-push later to maint).
- Other code cleanup, docfix, build fix, etc. (merge d1387d3895 en/fast-import-merge-doc later to maint). (merge 1c24a54ea4 bm/repository-layout-typofix later to maint). (merge 415b770b88 ds/midx-expire-repack later to maint). (merge 19800bdc3f nd/diff-parseopt later to maint). (merge 58166c2e9d tg/t0021-racefix later to maint). (merge 7027f508c7 dl/compat-cleanup later to maint). (merge e770fbfeff jc/test-cleanup later to maint). (merge 1fd881d404 rs/trace2-dst-warning later to maint). (merge 7e92756751 mh/http-urlmatch-cleanup later to maint). (merge 9784f97321 mh/release-commit-memory-fix later to maint). (merge 60d198d022 tb/banned-vsprintf-namefix later to maint). (merge 80e3658647 rs/help-unknown-ref-does-not-return later to maint). (merge 0a8bc7068f dt/remote-helper-doc-re-lock-option later to maint). (merge 27fd1e4ea7 en/merge-options-ff-and-friends later to maint). (merge 502c386ff9 sg/clean-nested-repo-with-ignored later to maint). (merge 26e3d1cbea am/mailmap-andrey-mazo later to maint). (merge 47b27c96fa ss/get-time-cleanup later to maint). (merge dd2e50a84e jk/commit-graph-cleanup later to maint). (merge 4fd39c76e6 cs/pretty-formats-doc-typofix later to maint). (merge 40e747e89d dl/submodule-set-branch later to maint). (merge 689a146c91 rs/commit-graph-use-list-count later to maint). (merge 0eb7c37a8a js/doc-patch-text later to maint). (merge 4b3aa170d1 rs/nth-switch-code-simplification later to maint). (merge 0d4304c124 ah/doc-submodule-ignore-submodules later to maint). (merge af78249463 cc/svn-fe-py-shebang later to maint). (merge 7bd97d6dff rs/alias-use-copy-array later to maint). (merge c46ebc2496 sg/travis-help-debug later to maint). (merge 24c681794f ps/my-first-contribution-alphasort later to maint). (merge 75b2c15435 cb/do-not-use-test-cmp-with-a later to maint). (merge cda0d497e3 bw/submodule-helper-usage-fix later to maint). (merge fe0ed5d5e9 am/visual-studio-config-fix later to maint). (merge 2e09c01232 sg/name-rev-cutoff-underflow-fix later to maint). (merge ddb3c856f3 as/shallow-slab-use-fix later to maint). (merge 71f4960b91 js/mingw-spawn-with-spaces-in-path later to maint). (merge 53d687bf5f ah/cleanups later to maint). (merge f537485fa5 rs/test-remove-useless-debugging-cat later to maint). (merge 11a3d3aadd dl/rev-list-doc-cleanup later to maint). (merge d928a8388a am/t0028-utf16-tests later to maint). (merge b05b40930e dl/t0000-skip-test-test later to maint). (merge 03d3b1297c js/xdiffi-comment-updates later to maint). (merge 57d8f4b4c7 js/doc-stash-save later to maint). (merge 8c1cfd58e3 ta/t1308-typofix later to maint). (merge fa364ad790 bb/utf8-wcwidth-cleanup later to maint). (merge 68b69211b2 bb/compat-util-comment-fix later to maint). (merge 5cc6a4be11 rs/http-push-simplify later to maint). (merge a81e42d235 rs/column-use-utf8-strnwidth later to maint). (merge 062a309d36 rs/remote-curl-use-argv-array later to maint). (merge 3b3c79f6c9 nr/diff-highlight-indent-fix later to maint). (merge 3444ec2eb2 wb/fsmonitor-bitmap-fix later to maint). (merge 10da030ab7 cb/pcre2-chartables-leakfix later to maint). (merge 60e6569a12 js/mingw-needs-hiding-fix later to maint). (merge 52bd3e4657 rl/gitweb-blame-prev-fix later to maint).
2.24.1
Git v2.24.1 Release Notes =========================
This release merges up the fixes that appear in v2.14.6, v2.15.4, v2.17.3, v2.20.2 and in v2.21.1, addressing the security issues CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and CVE-2019-19604; see the release notes for those versions for details.
2.24.2
Git v2.24.2 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.24.3
Git v2.24.3 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.24.4
Git v2.24.4 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5 and v2.23.4 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.25.0
Git 2.25 Release Notes ======================
Updates since v2.24 -------------------
Backward compatibility notes
UI, Workflows & Features
- A tutorial on object enumeration has been added.
- The branch description ("git branch --edit-description") has been used to fill the body of the cover letters by the format-patch command; this has been enhanced so that the subject can also be filled.
- "git rebase --preserve-merges" has been marked as deprecated; this release stops advertising it in the "git rebase -h" output.
- The code to generate multi-pack index learned to show (or not to show) progress indicators.
- "git apply --3way" learned to honor merge.conflictStyle configuration variable, like merges would.
- The custom format for "git log --format=<format>" learned the l/L placeholder that is similar to e/E that fills in the e-mail address, but only the local part on the left side of ’@’.
- Documentation pages for "git shortlog" now list commit limiting options explicitly.
- The patterns to detect function boundary for Elixir language has been added.
- The completion script (in contrib/) learned that the "--onto" option of "git rebase" can take its argument as the value of the option.
- The userdiff machinery has been taught that "async def" is another way to begin a "function" in Python.
- "git range-diff" learned to take the "--notes=<ref>" and the "--no-notes" options to control the commit notes included in the log message that gets compared.
- "git rev-parse --show-toplevel" run outside of any working tree did not error out, which has been corrected.
- A few commands learned to take the pathspec from the standard input or a named file, instead of taking it as the command line arguments, with the "--pathspec-from-file" option.
- "git submodule" learned a subcommand "set-url".
- "git log" family learned "--pretty=reference" that gives the name of a commit in the format that is often used to refer to it in log messages.
- The interaction between "git clone --recurse-submodules" and alternate object store was ill-designed. The documentation and code have been taught to make more clear recommendations when the users see failures.
- Management of sparsely checked-out working tree has gained a dedicated "sparse-checkout" command.
- Miscellaneous small UX improvements on "git-p4".
- "git sparse-checkout list" subcommand learned to give its output in a more concise form when the "cone" mode is in effect.
Performance, Internal Implementation, Development Support etc.
- Debugging support for lazy cloning has been a bit improved.
- Move the definition of a set of bitmask constants from 0ctal literal to (1U<<count) notation.
- Test updates to prepare for SHA-2 transition continues.
- Crufty code and logic accumulated over time around the object parsing and low-level object access used in "git fsck" have been cleaned up.
- The implementation of "git log --graph" got refactored and then its output got simplified.
- Follow recent push to move API docs from Documentation/ to header files and update config.h
- "git bundle" has been taught to use the parse options API. "git bundle verify" learned "--quiet" and "git bundle create" learned options to control the progress output.
- Handling of commit objects that use non UTF-8 encoding during "rebase -i" has been improved.
- The beginning of rewriting "git add -i" in C.
- A label used in the todo list that are generated by "git rebase --rebase-merges" is used as a part of a refname; the logic to come up with the label has been tightened to avoid names that cannot be used as such.
- The logic to avoid duplicate label names generated by "git rebase --rebase-merges" forgot that the machinery itself uses "onto" as a label name, which must be avoided by auto-generated labels, which has been corrected.
- We have had compatibility fallback macro definitions for "PRIuMAX", "PRIu32", etc. but did not for "PRIdMAX", while the code used the last one apparently without any hiccup reported recently. The fallback macro definitions for these <inttypes.h> macros that must appear in C99 systems have been removed.
- Recently we have declared that GIT_TEST_* variables take the usual boolean values (it used to be that some used "non-empty means true" and taking GIT_TEST_VAR=YesPlease as true); make sure we notice and fail when non-bool strings are given to these variables.
- Users of oneway_merge() (like "reset --hard") learned to take advantage of fsmonitor to avoid unnecessary lstat(2) calls.
- Performance tweak on "git push" into a repository with many refs that point at objects we have never heard of.
- PerfTest fix to avoid stale result mixed up with the latest round of test results.
- Hide lower-level verify_signed-buffer() API as a pure helper to implement the public check_signature() function, in order to encourage new callers to use the correct and more strict validation.
- Unnecessary reading of state variables back from the disk during sequencer operation has been reduced.
- The code has been made to avoid gmtime() and localtime() and prefer their reentrant counterparts.
- In a repository with many packfiles, the cost of the procedure that avoids registering the same packfile twice was unnecessarily high by using an inefficient search algorithm, which has been corrected.
- Redo "git name-rev" to avoid recursive calls.
- FreeBSD CI support via Cirrus-CI has been added.
Fixes since v2.24 -----------------
- "rebase -i" ceased to run post-commit hook by mistake in an earlier update, which has been corrected.
- "git notes copy $original" ought to copy the notes attached to the original object to HEAD, but a mistaken tightening to command line parameter validation made earlier disabled that feature by mistake.
- When all files from some subdirectory were renamed to the root directory, the directory rename heuristics would fail to detect that as a rename/merge of the subdirectory to the root directory, which has been corrected.
- Code clean-up and a bugfix in the logic used to tell worktree local and repository global refs apart. (merge f45f88b2e4 sg/dir-trie-fixes later to maint).
- "git stash save" in a working tree that is sparsely checked out mistakenly removed paths that are outside the area of interest. (merge 4a58c3d7f7 js/update-index-ignore-removal-for-skip-worktree later to maint).
- "git rev-parse --git-path HEAD.lock" did not give the right path when run in a secondary worktree. (merge 76a53d640f js/git-path-head-dot-lock-fix later to maint).
- "git merge --no-commit" needs "--no-ff" if you do not want to move HEAD, which has been corrected in the manual page for "git bisect". (merge 8dd327b246 ma/bisect-doc-sample-update later to maint).
- "git worktree add" internally calls "reset --hard" that should not descend into submodules, even when submodule.recurse configuration is set, but it was affected. This has been corrected. (merge 4782cf2ab6 pb/no-recursive-reset-hard-in-worktree-add later to maint).
- Messages from die() etc. can be mixed up from multiple processes without even line buffering on Windows, which has been worked around. (merge 116d1fa6c6 js/vreportf-wo-buffering later to maint).
- HTTP transport had possible allocator/deallocator mismatch, which has been corrected.
- The watchman integration for fsmonitor was racy, which has been corrected to be more conservative. (merge dd0b61f577 kw/fsmonitor-watchman-fix later to maint).
- Fetching from multiple remotes into the same repository in parallel had a bad interaction with the recent change to (optionally) update the commit-graph after a fetch job finishes, as these parallel fetches compete with each other. Which has been corrected.
- Recent update to "git stash pop" made the command empty the index when run with the "--quiet" option, which has been corrected.
- "git fetch" codepath had a big "do not lazily fetch missing objects when I ask if something exists" switch. This has been corrected by marking the "does this thing exist?" calls with "if not please do not lazily fetch it" flag.
- Test update to avoid wasted cycles. (merge e0316695ec sg/skip-skipped-prereq later to maint).
- Error handling after "git push" finishes sending the packdata and waits for the response to the remote side has been improved. (merge ad7a403268 jk/send-pack-remote-failure later to maint).
- Some codepaths in "gitweb" that forgot to escape URLs generated based on end-user input have been corrected. (merge a376e37b2c jk/gitweb-anti-xss later to maint).
- CI jobs for macOS has been made less chatty when updating perforce package used during testing. (merge 0dbc4a0edf jc/azure-ci-osx-fix-fix later to maint).
- "git unpack-objects" used to show progress based only on the number of received and unpacked objects, which stalled when it has to handle an unusually large object. It now shows the throughput as well. (merge bae60ba7e9 sg/unpack-progress-throughput later to maint).
- The sequencer machinery compared the HEAD and the state it is attempting to commit to decide if the result would be a no-op commit, even when amending a commit, which was incorrect, and has been corrected.
- The code to parse GPG output used to assume incorrectly that the finterprint for the primary key would always be present for a valid signature, which has been corrected. (merge 67a6ea6300 hi/gpg-optional-pkfp-fix later to maint).
- "git submodule status" and "git submodule status --cached" show different things, but the documentation did not cover them correctly, which has been corrected. (merge 8d483c8408 mg/doc-submodule-status-cached later to maint).
- "git reset --patch $object" without any pathspec should allow a tree object to be given, but incorrectly required a committish, which has been corrected.
- "git submodule status" that is run from a subdirectory of the superproject did not work well, which has been corrected. (merge 1f3aea22c7 mg/submodule-status-from-a-subdirectory later to maint).
- The revision walking machinery uses resources like per-object flag bits that need to be reset before a new iteration of walking begins, but the resources related to topological walk were not cleared correctly, which has been corrected. (merge 0aa0c2b2ec mh/clear-topo-walk-upon-reset later to maint).
- TravisCI update. (merge 176441bfb5 sg/osx-force-gcc-9 later to maint).
- While running "revert" or "cherry-pick --edit" for multiple commits, a recent regression incorrectly detected "nothing to commit, working tree clean", instead of replaying the commits, which has been corrected. (merge befd4f6a81 sg/assume-no-todo-update-in-cherry-pick later to maint).
- Work around a issue where a FD that is left open when spawning a child process and is kept open in the child can interfere with the operation in the parent process on Windows.
- One kind of progress messages were always given during commit-graph generation, instead of following the "if it takes more than two seconds, show progress" pattern, which has been corrected.
- "git rebase" did not work well when format.useAutoBase configuration variable is set, which has been corrected.
- The "diff" machinery learned not to lose added/removed blank lines in the context when --ignore-blank-lines and --function-context are used at the same time. (merge 0bb313a552 rs/xdiff-ignore-ws-w-func-context later to maint).
- The test on "fast-import" used to get stuck when "fast-import" died in the middle. (merge 0d9b0d7885 sg/t9300-robustify later to maint).
- "git format-patch" can take a set of configured format.notes values to specify which notes refs to use in the log message part of the output. The behaviour of this was not consistent with multiple --notes command line options, which has been corrected. (merge e0f9095aaa dl/format-patch-notes-config-fixup later to maint).
- "git p4" used to ignore lfs.storage configuration variable, which has been corrected. (merge ea94b16fb8 rb/p4-lfs later to maint).
- Assorted fixes to the directory traversal API. (merge 6836d2fe06 en/fill-directory-fixes later to maint).
- Forbid pathnames that the platform’s filesystem cannot represent on MinGW. (merge 4dc42c6c18 js/mingw-reserved-filenames later to maint).
- "git rebase --signoff" stopped working when the command was written in C, which has been corrected. (merge 4fe7e43c53 en/rebase-signoff-fix later to maint).
- An earlier update to Git for Windows declared that a tree object is invalid if it has a path component with backslash in it, which was overly strict, which has been corrected. The only protection the Windows users need is to prevent such path (or any path that their filesystem cannot check out) from entering the index. (merge 224c7d70fa js/mingw-loosen-overstrict-tree-entry-checks later to maint).
- The code to write split commit-graph file(s) upon fetching computed bogus value for the parameter used in splitting the resulting files, which has been corrected. (merge 63020f175f ds/commit-graph-set-size-mult later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 80736d7c5e jc/am-show-current-patch-docfix later to maint). (merge 8b656572ca sg/commit-graph-usage-fix later to maint). (merge 6c02042139 mr/clone-dir-exists-to-path-exists later to maint). (merge 44ae131e38 sg/blame-indent-heuristics-is-now-the-default later to maint). (merge 0115e5d929 dl/doc-diff-no-index-implies-exit-code later to maint). (merge 270de6acbe en/t6024-style later to maint). (merge 14c4776d75 ns/test-desc-typofix later to maint). (merge 68d40f30c4 dj/typofix-merge-strat later to maint). (merge f66e0401ab jk/optim-in-pack-idx-conversion later to maint). (merge 169bed7421 rs/parse-options-dup-null-fix later to maint). (merge 51bd6be32d rs/use-copy-array-in-mingw-shell-command-preparation later to maint). (merge b018719927 ma/t7004 later to maint). (merge 932757b0cc ar/install-doc-update-cmds-needing-the-shell later to maint). (merge 46efd28be1 ep/guard-kset-tar-headers later to maint). (merge 9e5afdf997 ec/fetch-mark-common-refs-trace2 later to maint). (merge f0e58b3fe8 pb/submodule-update-fetches later to maint). (merge 2a02262078 dl/t5520-cleanup later to maint). (merge a4fb016ba1 js/pkt-line-h-typofix later to maint). (merge 54a7a64613 rs/simplify-prepare-cmd later to maint). (merge 3eae30e464 jk/lore-is-the-archive later to maint). (merge 14b7664df8 dl/lore-is-the-archive later to maint). (merge 0e40a73a4c po/bundle-doc-clonable later to maint). (merge e714b898c6 as/t7812-missing-redirects-fix later to maint). (merge 528d9e6d01 jk/perf-wo-git-dot-pm later to maint). (merge fc42f20e24 sg/test-squelch-noise-in-commit-bulk later to maint). (merge c64368e3a2 bc/t9001-zsh-in-posix-emulation-mode later to maint). (merge 11de8dd7ef dr/branch-usage-casefix later to maint). (merge e05e8cf074 rs/archive-zip-code-cleanup later to maint). (merge 147ee35558 rs/commit-export-env-simplify later to maint). (merge 4507ecc771 rs/patch-id-use-oid-to-hex later to maint). (merge 51a0a4ed95 mr/bisect-use-after-free later to maint). (merge cc2bd5c45d pb/submodule-doc-xref later to maint). (merge df5be01669 ja/doc-markup-cleanup later to maint). (merge 7c5cea7242 mr/bisect-save-pointer-to-const-string later to maint). (merge 20a67e8ce9 js/use-test-tool-on-path later to maint). (merge 4e61b2214d ew/packfile-syscall-optim later to maint). (merge ace0f86c7f pb/clarify-line-log-doc later to maint). (merge 763a59e71c en/merge-recursive-oid-eq-simplify later to maint). (merge 4e2c4c0d4f do/gitweb-typofix-in-comments later to maint). (merge 421c0ffb02 jb/doc-multi-pack-idx-fix later to maint). (merge f8740c586b pm/am-in-body-header-doc-update later to maint). (merge 5814d44d9b tm/doc-submodule-absorb-fix later to maint).
2.25.1
Git 2.25.1 Release Notes ========================
Fixes since v2.25 -----------------
- "git commit" gives output similar to "git status" when there is nothing to commit, but without honoring the advise.statusHints configuration variable, which has been corrected.
- has_object_file() said "no" given an object registered to the system via pretend_object_file(), making it inconsistent with read_object_file(), causing lazy fetch to attempt fetching an empty tree from promisor remotes.
- The code that tries to skip over the entries for the paths in a single directory using the cache-tree was not careful enough against corrupt index file.
- Complete an update to tutorial that encourages "git switch" over "git checkout" that was done only half-way.
- Reduce unnecessary round-trip when running "ls-remote" over the stateless RPC mechanism.
- "git restore --staged" did not correctly update the cache-tree structure, resulting in bogus trees to be written afterwards, which has been corrected.
- The code recently added to move to the entry beyond the ones in the same directory in the index in the sparse-cone mode did not count the number of entries to skip over incorrectly, which has been corrected.
- Work around test breakages caused by custom regex engine used in libasan, when address sanitizer is used with more recent versions of gcc and clang.
- "git fetch --refmap=" option has got a better documentation.
- Corner case bugs in "git clean" that stems from a (necessarily for performance reasons) awkward calling convention in the directory enumeration API has been corrected.
- "git grep --no-index" should not get affected by the contents of the .gitmodules file but when "--recurse-submodules" is given or the "submodule.recurse" variable is set, it did. Now these settings are ignored in the "--no-index" mode.
- Technical details of the bundle format has been documented.
- Unhelpful warning messages during documentation build have been squelched.
Also contains various documentation updates, code clean-ups and minor fixups.
2.25.2
Git 2.25.2 Release Notes ========================
Fixes since v2.25.1 -------------------
- Minor bugfixes to "git add -i" that has recently been rewritten in C.
- An earlier update to show the location of working tree in the error message did not consider the possibility that a git command may be run in a bare repository, which has been corrected.
- The "--recurse-submodules" option of various subcommands did not work well when run in an alternate worktree, which has been corrected.
- Running "git rm" on a submodule failed unnecessarily when .gitmodules is only cache-dirty, which has been corrected.
- "git rebase -i" identifies existing commits in its todo file with their abbreviated object name, which could become ambigous as it goes to create new commits, and has a mechanism to avoid ambiguity in the main part of its execution. A few other cases however were not covered by the protection against ambiguity, which has been corrected.
- The index-pack code now diagnoses a bad input packstream that records the same object twice when it is used as delta base; the code used to declare a software bug when encountering such an input, but it is an input error.
- The code to automatically shrink the fan-out in the notes tree had an off-by-one bug, which has been killed.
- "git check-ignore" did not work when the given path is explicitly marked as not ignored with a negative entry in the .gitignore file.
- The merge-recursive machinery failed to refresh the cache entry for a merge result in a couple of places, resulting in an unnecessary merge failure, which has been fixed.
- Fix for a bug revealed by a recent change to make the protocol v2 the default.
- "git merge signed-tag" while lacking the public key started to say "No signature", which was utterly wrong. This regression has been reverted.
- MinGW’s poll() emulation has been improved.
- "git show" and others gave an object name in raw format in its error output, which has been corrected to give it in hex.
- Both "git ls-remote -h" and "git grep -h" give short usage help, like any other Git subcommand, but it is not unreasonable to expect that the former would behave the same as "git ls-remote --head" (there is no other sensible behaviour for the latter). The documentation has been updated in an attempt to clarify this.
Also contains various documentation updates, code clean-ups and minor fixups.
2.25.3
Git v2.25.3 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.25.4
Git v2.25.4 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.25.5
Git v2.25.5 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5, v2.23.4 and v2.24.4 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.26.0
Git 2.26 Release Notes ======================
Updates since v2.25 -------------------
Backward compatibility notes
- "git rebase" uses a different backend that is based on the ’merge’ machinery by default. There are a few known differences in the behaviour from the traditional machinery based on patch+apply.
If your workflow is negatively affected by this change, please
report it to git@vger.kernel.org so that we can take a look into
it. After doing so, you can set the 'rebase.backend' configuration
variable to 'apply', in order to use the old default behaviour in
the meantime.
UI, Workflows & Features
- Sample credential helper for using .netrc has been updated to work out of the box.
- gpg.minTrustLevel configuration variable has been introduced to tell various signature verification codepaths the required minimum trust level.
- The command line completion (in contrib/) learned to complete subcommands and arguments to "git worktree".
- Disambiguation logic to tell revisions and pathspec apart has been tweaked so that backslash-escaped glob special characters do not count in the "wildcards are pathspec" rule.
- One effect of specifying where the GIT_DIR is (either with the environment variable, or with the "git --git-dir=<where> cmd" option) is to disable the repository discovery. This has been placed a bit more stress in the documentation, as new users often get confused.
- Two help messages given when "git add" notices the user gave it nothing to add have been updated to use advise() API.
- A new version of fsmonitor-watchman hook has been introduced, to avoid races.
- "git config" learned to show in which "scope", in addition to in which file, each config setting comes from.
- The basic 7 colors learned the brighter counterparts (e.g. "brightred").
- "git sparse-checkout" learned a new "add" subcommand.
- A configuration element used for credential subsystem can now use wildcard pattern to specify for which set of URLs the entry applies.
- "git clone --recurse-submodules --single-branch" now uses the same single-branch option when cloning the submodules.
- "git rm" and "git stash" learns the new "--pathspec-from-file" option.
- "git am --show-current-patch" is a way to show the piece of e-mail for the stopped step, which is not suitable to directly feed "git apply" (it is designed to be a good "git am" input). It learned a new option to show only the patch part.
- Handling of conflicting renames in merge-recursive have further been made consistent with how existing codepaths try to mimic what is done to add/add conflicts.
Performance, Internal Implementation, Development Support etc.
- Tell .editorconfig that in this project, *.txt files are indented with tabs.
- The test-lint machinery knew to check "VAR=VAL shell_function" construct, but did not check "VAR= shell_function", which has been corrected.
- Replace "git config --bool" calls with "git config --type=bool" in sample templates.
- The effort to move "git-add—interactive" to C continues.
- Improve error message generation for "git submodule add".
- Preparation of test scripts for the day when the object names will use SHA-256 continues.
- Warn programmers about pretend_object_file() that allows the code to tentatively use in-core objects.
- The way "git pack-objects" reuses objects stored in existing pack to generate its result has been improved.
- The transport protocol version 2 becomes the default one.
- Traditionally, we avoided threaded grep while searching in objects (as opposed to files in the working tree) as accesses to the object layer is not thread-safe. This limitation is getting lifted.
- "git rebase -i" (and friends) used to unnecessarily check out the tip of the branch to be rebased, which has been corrected.
- A low-level API function get_oid(), that accepts various ways to name an object, used to issue end-user facing error messages without l10n, which has been updated to be translatable.
- Unneeded connectivity check is now disabled in a partial clone when fetching into it.
- Some rough edges in the sparse-checkout feature, especially around the cone mode, have been cleaned up.
- The diff-* plumbing family of subcommands now pay attention to the diff.wsErrorHighlight configuration, which has been ignored before; this allows "git add -p" to also show the whitespace problems to the end user.
- Some codepaths were given a repository instance as a parameter to work in the repository, but passed the_repository instance to its callees, which has been cleaned up (somewhat).
- Memory footprint and performance of "git name-rev" has been improved.
- The object reachability bitmap machinery and the partial cloning machinery were not prepared to work well together, because some object-filtering criteria that partial clones use inherently rely on object traversal, but the bitmap machinery is an optimization to bypass that object traversal. There however are some cases where they can work together, and they were taught about them.
- "git rebase" has learned to use the merge backend (i.e. the machinery that drives "rebase -i") by default, while allowing "--apply" option to use the "apply" backend (e.g. the moral equivalent of "format-patch piped to am"). The rebase.backend configuration variable can be set to customize.
- Underlying machinery of "git bisect—helper" is being refactored into pieces that are more easily reused.
Fixes since v2.25 -----------------
- "git commit" gives output similar to "git status" when there is nothing to commit, but without honoring the advise.statusHints configuration variable, which has been corrected.
- has_object_file() said "no" given an object registered to the system via pretend_object_file(), making it inconsistent with read_object_file(), causing lazy fetch to attempt fetching an empty tree from promisor remotes.
- Complete an update to tutorial that encourages "git switch" over "git checkout" that was done only half-way.
- C pedantry ;-) fix.
- The code that tries to skip over the entries for the paths in a single directory using the cache-tree was not careful enough against corrupt index file.
- Reduce unnecessary round-trip when running "ls-remote" over the stateless RPC mechanism.
- "git restore --staged" did not correctly update the cache-tree structure, resulting in bogus trees to be written afterwards, which has been corrected.
- The code recently added to move to the entry beyond the ones in the same directory in the index in the sparse-cone mode did not count the number of entries to skip over incorrectly, which has been corrected.
- Rendering by "git log --graph" of ancestry lines leading to a merge commit were made suboptimal to waste vertical space a bit with a recent update, which has been corrected.
- Work around test breakages caused by custom regex engine used in libasan, when address sanitizer is used with more recent versions of gcc and clang.
- Minor bugfixes to "git add -i" that has recently been rewritten in C.
- "git fetch --refmap=" option has got a better documentation.
- "git checkout X" did not correctly fail when X is not a local branch but could name more than one remote-tracking branches (i.e. to be dwimmed as the starting point to create a corresponding local branch), which has been corrected. (merge fa74180d08 am/checkout-file-and-ref-ref-ambiguity later to maint).
- Corner case bugs in "git clean" that stems from a (necessarily for performance reasons) awkward calling convention in the directory enumeration API has been corrected.
- A fetch that is told to recursively fetch updates in submodules inevitably produces reams of output, and it becomes hard to spot error messages. The command has been taught to enumerate submodules that had errors at the end of the operation. (merge 0222540827 es/fetch-show-failed-submodules-atend later to maint).
- The "--recurse-submodules" option of various subcommands did not work well when run in an alternate worktree, which has been corrected.
- Futureproofing a test not to depend on the current implementation detail.
- Running "git rm" on a submodule failed unnecessarily when .gitmodules is only cache-dirty, which has been corrected.
- C pedantry ;-) fix.
- "git grep --no-index" should not get affected by the contents of the .gitmodules file but when "--recurse-submodules" is given or the "submodule.recurse" variable is set, it did. Now these settings are ignored in the "--no-index" mode.
- Technical details of the bundle format has been documented.
- Unhelpful warning messages during documentation build have been squelched.
- "git rebase -i" identifies existing commits in its todo file with their abbreviated object name, which could become ambiguous as it goes to create new commits, and has a mechanism to avoid ambiguity in the main part of its execution. A few other cases however were not covered by the protection against ambiguity, which has been corrected.
- Allow the rebase.missingCommitsCheck configuration to kick in when "rebase --edit-todo" and "rebase --continue" restarts the procedure. (merge 5a5445d878 ag/edit-todo-drop-check later to maint).
- The way "git submodule status" reports an initialized but not yet populated submodule has not been reimplemented correctly when a part of the "git submodule" command was rewritten in C, which has been corrected. (merge f38c92452d pk/status-of-uncloned-submodule later to maint).
- The code to automatically shrink the fan-out in the notes tree had an off-by-one bug, which has been killed.
- The index-pack code now diagnoses a bad input packstream that records the same object twice when it is used as delta base; the code used to declare a software bug when encountering such an input, but it is an input error.
- The code to compute the commit-graph has been taught to use a more robust way to tell if two object directories refer to the same thing. (merge a7df60cac8 tb/commit-graph-object-dir later to maint).
- "git remote rename X Y" needs to adjust configuration variables (e.g. branch.<name>.remote) whose value used to be X to Y. branch.<name>.pushRemote is now also updated.
- Update to doc-diff.
- Doc markup fix.
- "git check-ignore" did not work when the given path is explicitly marked as not ignored with a negative entry in the .gitignore file.
- The merge-recursive machinery failed to refresh the cache entry for a merge result in a couple of places, resulting in an unnecessary merge failure, which has been fixed.
- Fix for a bug revealed by a recent change to make the protocol v2 the default.
- In rare cases "git worktree add <path>" could think that <path> was already a registered worktree even when it wasn’t and refuse to add the new worktree. This has been corrected. (merge bb69b3b009 es/worktree-avoid-duplication-fix later to maint).
- "git push" should stop from updating a branch that is checked out when receive.denyCurrentBranch configuration is set, but it failed to pay attention to checkouts in secondary worktrees. This has been corrected. (merge 4d864895a2 hv/receive-denycurrent-everywhere later to maint).
- "git rebase BASE BRANCH" rebased/updated the tip of BRANCH and checked it out, even when the BRANCH is checked out in a different worktree. This has been corrected. (merge b5cabb4a96 es/do-not-let-rebase-switch-to-protected-branch later to maint).
- "git describe" in a repository with multiple root commits sometimes gave up looking for the best tag to describe a given commit with too early, which has been adjusted.
- "git merge signed-tag" while lacking the public key started to say "No signature", which was utterly wrong. This regression has been reverted.
- MinGW’s poll() emulation has been improved.
- "git show" and others gave an object name in raw format in its error output, which has been corrected to give it in hex.
- "git fetch" over HTTP walker protocol did not show any progress output. We inherently do not know how much work remains, but still we can show something not to bore users. (merge 7655b4119d rs/show-progress-in-dumb-http-fetch later to maint).
- Both "git ls-remote -h" and "git grep -h" give short usage help, like any other Git subcommand, but it is not unreasonable to expect that the former would behave the same as "git ls-remote --head" (there is no other sensible behaviour for the latter). The documentation has been updated in an attempt to clarify this.
- Other code cleanup, docfix, build fix, etc. (merge d0d0a357a1 am/update-pathspec-f-f-tests later to maint). (merge f94f7bd00d am/test-pathspec-f-f-error-cases later to maint). (merge c513a958b6 ss/t6025-modernize later to maint). (merge b441717256 dl/test-must-fail-fixes later to maint). (merge d031049da3 mt/sparse-checkout-doc-update later to maint). (merge 145136a95a jc/skip-prefix later to maint). (merge 5290d45134 jk/alloc-cleanups later to maint). (merge 7a9f8ca805 rs/parse-options-concat-dup later to maint). (merge 517b60564e rs/strbuf-insertstr later to maint). (merge f696a2b1c8 jk/mailinfo-cleanup later to maint). (merge de26f02db1 js/test-avoid-pipe later to maint). (merge a2dc43414c es/doc-mentoring later to maint). (merge 02bbbe9df9 es/worktree-cleanup later to maint). (merge 2ce6d075fa rs/micro-cleanups later to maint). (merge 27f182b3fc rs/blame-typefix-for-fingerprint later to maint). (merge 3c29e21eb0 ma/test-cleanup later to maint). (merge 240fc04f81 ag/rebase-remove-redundant-code later to maint). (merge d68ce906c7 rs/commit-graph-code-simplification later to maint). (merge a51d9e8f07 rj/t1050-use-test-path-is-file later to maint). (merge fd0bc17557 kk/complete-diff-color-moved later to maint). (merge 65bf820d0e en/test-cleanup later to maint).
2.26.1
Git v2.26.1 Release Notes =========================
This release merges the security fix that appears in v2.17.4; see the release notes for that version for details.
2.26.2
Git v2.26.2 Release Notes =========================
This release merges the security fix that appears in v2.17.5; see the release notes for that version for details.
2.26.3
Git v2.26.3 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5, v2.23.4, v2.24.4 and v2.25.5 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.27.0
Git 2.27 Release Notes ======================
Updates since v2.26 -------------------
Backward compatibility notes
- When "git describe C" finds that commit C is pointed by a signed or annotated tag, which records T as its tagname in the object, the command gives T as its answer. Even if the user renames or moves such a tag from its natural location in the "refs/tags/" hierarchy, "git describe C" would still give T as the answer, but in such a case "git show T^0" would no longer work as expected. There may be nothing at "refs/tags/T" or even worse there may be a different tag instead.
Starting from this version, "git describe" will always use the
"long" version, as if the "--long" option were given, when giving
its output based on such a misplaced tag to work around the problem.
- "git pull" issues a warning message until the pull.rebase configuration variable is explicitly given, which some existing users may find annoying---those who prefer not to rebase need to set the variable to false to squelch the warning.
- The transport protocol version 2, which was promoted to the default in Git 2.26 release, turned out to have some remaining rough edges, so it has been demoted from the default.
UI, Workflows & Features
- A handful of options to configure SSL when talking to proxies have been added.
- Smudge/clean conversion filters are now given more information (e.g. the object of the tree-ish in which the blob being converted appears, in addition to its path, which has already been given).
- When "git describe C" finds an annotated tag with tagname A to be the best name to explain commit C, and the tag is stored in a "wrong" place in the refs/tags hierarchy, e.g. refs/tags/B, the command gave a warning message but used A (not B) to describe C. If C is exactly at the tag, the describe output would be "A", but "git rev-parse A^0" would not be equal as "git rev-parse C^0". The behavior of the command has been changed to use the "long" form i.e. A-0-gOBJECTNAME, which is correctly interpreted by rev-parse.
- "git pull" learned to warn when no pull.rebase configuration exists, and neither --[no-]rebase nor --ff-only is given (which would result a merge).
- "git p4" learned four new hooks and also "--no-verify" option to bypass them (and the existing "p4-pre-submit" hook).
- "git rebase" learned the "--no-gpg-sign" option to countermand commit.gpgSign the user may have.
- The output from "git format-patch" uses RFC 2047 encoding for non-ASCII letters on From: and Subject: headers, so that it can directly be fed to e-mail programs. A new option has been added to produce these headers in raw.
- "git log" learned "--show-pulls" that helps pathspec limited history views; a merge commit that takes the whole change from a side branch, which is normally omitted from the output, is shown in addition to the commits that introduce real changes.
- The interactive input from various codepaths are consolidated and any prompt possibly issued earlier are fflush()ed before we read.
- Allow "git rebase" to reapply all local commits, even if the may be already in the upstream, without checking first.
- The ’pack.useSparse’ configuration variable now defaults to ’true’, enabling an optimization that has been experimental since Git 2.21.
- "git rebase" happens to call some hooks meant for "checkout" and "commit" by this was not a designed behaviour than historical accident. This has been documented.
- "git merge" learns the "--autostash" option.
- "sparse-checkout" UI improvements.
- "git update-ref --stdin" learned a handful of new verbs to let the user control ref update transactions more explicitly, which helps as an ingredient to implement two-phase commit-style atomic ref-updates across multiple repositories.
- "git commit-graph write" learned different ways to write out split files.
- Introduce an extension to the commit-graph to make it efficient to check for the paths that were modified at each commit using Bloom filters.
- The approxidate parser learns to parse seconds with fraction and ignore fractional part.
- The userdiff patterns for Markdown documents have been added.
- The sparse-checkout patterns have been forbidden from excluding all paths, leaving an empty working tree, for a long time. This limitation has been lifted.
- "git restore --staged --worktree" now defaults to take the contents out of "HEAD", instead of erring out.
- "git p4" learned to recover from a (broken) state where a directory and a file are recorded at the same path in the Perforce repository the same way as their clients do.
- "git multi-pack-index repack" has been taught to honor some repack.* configuration variables.
Performance, Internal Implementation, Development Support etc.
- The advise API has been revamped to allow more systematic enumeration of advice knobs in the future.
- SHA-256 transition continues.
- The code to interface with GnuPG has been refactored.
- "git stash" has kept an escape hatch to use the scripted version for a few releases, which got stale. It has been removed.
- Enable tests that require GnuPG on Windows.
- Minor test usability improvement.
- Trace2 enhancement to allow logging of the environment variables.
- Test clean-up continues.
- Perf-test update.
- A Windows-specific test element has been made more robust against misuse from both user’s environment and programmer’s errors.
- Various tests have been updated to work around issues found with shell utilities that come with busybox etc.
- The config API made mixed uses of int and size_t types to represent length of various pieces of text it parsed, which has been updated to use the correct type (i.e. size_t) throughout.
- The "--decorate-refs" and "--decorate-refs-exclude" options "git log" takes have learned a companion configuration variable log.excludeDecoration that sits at the lowest priority in the family.
- A new CI job to build and run test suite on linux with musl libc has been added.
- Update the CI configuration to use GitHub Actions, retiring the one based on Azure Pipelines.
- The directory traversal code had redundant recursive calls which made its performance characteristics exponential with respect to the depth of the tree, which was corrected.
- "git blame" learns to take advantage of the "changed-paths" Bloom filter stored in the commit-graph file.
- The "bugreport" tool has been added.
- The object walk with object filter "--filter=tree:0" can now take advantage of the pack bitmap when available.
- Instead of always building all branches at GitHub via Actions, users can specify which branches to build.
- Codepaths that show progress meter have been taught to also use the start_progress() and the stop_progress() calls as a "region" to be traced.
- Instead of downloading Windows SDK for CI jobs for windows builds from an external site (wingit.blob.core.windows.net), use the one created in the windows-build job, to work around quota issues at the external site.
Fixes since v2.26 -----------------
- The real_path() convenience function can easily be misused; with a bit of code refactoring in the callers’ side, its use has been eliminated. (merge 49d3c4b481 am/real-path-fix later to maint).
- Update "git p4" to work with Python 3. (merge 6bb40ed20a yz/p4-py3 later to maint).
- The mechanism to prevent "git commit" from making an empty commit or amending during an interrupted cherry-pick was broken during the rewrite of "git rebase" in C, which has been corrected. (merge 430b75f720 pw/advise-rebase-skip later to maint).
- Fix "git checkout --recurse-submodules" of a nested submodule hierarchy. (merge 846f34d351 pb/recurse-submodules-fix later to maint).
- The "--fork-point" mode of "git rebase" regressed when the command was rewritten in C back in 2.20 era, which has been corrected. (merge f08132f889 at/rebase-fork-point-regression-fix later to maint).
- The import-tars importer (in contrib/fast-import/) used to create phony files at the top-level of the repository when the archive contains global PAX headers, which made its own logic to detect and omit the common leading directory ineffective, which has been corrected. (merge c839fcff65 js/import-tars-do-not-make-phony-files-from-pax-headers later to maint).
- Simplify the commit ancestry connectedness check in a partial clone repository in which "promised" objects are assumed to be obtainable lazily on-demand from promisor remote repositories. (merge 2b98478c6f jt/connectivity-check-optim-in-partial-clone later to maint).
- The server-end of the v2 protocol to serve "git clone" and "git fetch" was not prepared to see a delim packets at unexpected places, which led to a crash. (merge cacae4329f jk/harden-protocol-v2-delim-handling later to maint).
- When fed a midx that records no objects, some codepaths tried to loop from 0 through (num_objects-1), which, due to integer arithmetic wrapping around, made it nonsense operation with out of bounds array accesses. The code has been corrected to reject such an midx file. (merge 796d61cdc0 dr/midx-avoid-int-underflow later to maint).
- Utitiles run via the run_command() API were not spawned correctly on Cygwin, when the paths to them are given as a full path with backslashes. (merge 05ac8582bc ak/run-command-on-cygwin-fix later to maint).
- "git pull --rebase" tried to run a rebase even after noticing that the pull results in a fast-forward and no rebase is needed nor sensible, for the past few years due to a mistake nobody noticed. (merge fbae70ddc6 en/pull-do-not-rebase-after-fast-forwarding later to maint).
- "git rebase" with the merge backend did not work well when the rebase.abbreviateCommands configuration was set. (merge de9f1d3ef4 ag/rebase-merge-allow-ff-under-abbrev-command later to maint).
- The logic to auto-follow tags by "git clone --single-branch" was not careful to avoid lazy-fetching unnecessary tags, which has been corrected. (merge 167a575e2d jk/use-quick-lookup-in-clone-for-tag-following later to maint).
- "git rebase -i" did not leave the reflog entries correctly. (merge 1f6965f994 en/sequencer-reflog-action later to maint).
- The more aggressive updates to remote-tracking branches we had for the past 7 years or so were not reflected in the documentation, which has been corrected. (merge a44088435c pb/pull-fetch-doc later to maint).
- We’ve left the command line parsing of "git log :/a/b/" broken for about a full year without anybody noticing, which has been corrected. (merge 0220461071 jc/missing-ref-store-fix later to maint).
- Misc fixes for Windows. (merge 3efc128cd5 js/mingw-fixes later to maint).
- "git rebase" (again) learns to honor "--no-keep-empty", which lets the user to discard commits that are empty from the beginning (as opposed to the ones that become empty because of rebasing). The interactive rebase also marks commits that are empty in the todo. (merge 50ed76148a en/rebase-no-keep-empty later to maint).
- Parsing the host part out of URL for the credential helper has been corrected. (merge 4c5971e18a jk/credential-parsing-end-of-host-in-URL later to maint).
- Document the recommended way to abort a failing test early (e.g. by exiting a loop), which is to say "return 1". (merge 7cc112dc95 jc/doc-test-leaving-early later to maint).
- The code that refreshes the last access and modified time of on-disk packfiles and loose object files have been updated. (merge 312cd76130 lr/freshen-file-fix later to maint).
- Validation of push certificate has been made more robust against timing attacks. (merge 719483e547 bc/constant-memequal later to maint).
- The custom hash function used by "git fast-import" has been replaced with the one from hashmap.c, which gave us a nice performance boost. (merge d8410a816b jk/fast-import-use-hashmap later to maint).
- The "git submodule" command did not initialize a few variables it internally uses and was affected by variable settings leaked from the environment. (merge 65d100c4dd lx/submodule-clear-variables later to maint).
- Raise the minimum required version of docbook-xsl package to 1.74, as 1.74.0 was from late 2008, which is more than 10 years old, and drop compatibility cruft from our documentation suite. (merge 3c255ad660 ma/doc-discard-docbook-xsl-1.73 later to maint).
- "git log" learns "--[no-]mailmap" as a synonym to "--[no-]use-mailmap" (merge 88acccda38 jc/log-no-mailmap later to maint).
- "git commit-graph write --expire-time=<timestamp>" did not use the given timestamp correctly, which has been corrected. (merge b09b785c78 ds/commit-graph-expiry-fix later to maint).
- Tests update to use "test-chmtime" instead of "touch -t". (merge e892a56845 ds/t5319-touch-fix later to maint).
- "git diff" in a partial clone learned to avoid lazy loading blob objects in more casese when they are not needed. (merge 95acf11a3d jt/avoid-prefetch-when-able-in-diff later to maint).
- "git push --atomic" used to show failures for refs that weren’t even pushed, which has been corrected. (merge dfe1b7f19c jx/atomic-push later to maint).
- Code in builtin/*, i.e. those can only be called from within built-in subcommands, that implements bulk of a couple of subcommands have been moved to libgit.a so that they could be used by others. (merge 9460fd48b5 dl/libify-a-few later to maint).
- Allowing the user to split a patch hunk while "git stash -p" does not work well; a band-aid has been added to make this (partially) work better.
- "git diff-tree --pretty --notes" used to hit an assertion failure, as it forgot to initialize the notes subsystem. (merge 5778b22b3d tb/diff-tree-with-notes later to maint).
- "git range-diff" fixes. (merge 8d1675eb7f vd/range-diff-with-custom-pretty-format-fix later to maint).
- "git grep" did not quote a path with unusual character like other commands (like "git diff", "git status") do, but did quote when run from a subdirectory, both of which has been corrected. (merge 45115d8490 mt/grep-cquote-path later to maint).
- GNU/Hurd is also among the ones that need the fopen() wrapper. (merge 274a1328fb jc/gnu-hurd-lets-fread-read-dirs later to maint).
- Those fetching over protocol v2 from linux-next and other kernel repositories are reporting that v2 often fetches way too much than needed. (merge 11c7f2a30b jn/demote-proto2-from-default later to maint).
- The upload-pack protocol v2 gave up too early before finding a common ancestor, resulting in a wasteful fetch from a fork of a project. This has been corrected to match the behaviour of v0 protocol. (merge 2f0a093dd6 jt/v2-fetch-nego-fix later to maint).
- The build procedure did not use the libcurl library and its include files correctly for a custom-built installation. (merge 0573831950 jk/build-with-right-curl later to maint).
- Tighten "git mailinfo" to notice and error out when decoded result contains NUL in it. (merge 3919997447 dd/mailinfo-with-nul later to maint).
- Fix in-core inconsistency after fetching into a shallow repository that broke the code to write out commit-graph. (merge 37b9dcabfc tb/reset-shallow later to maint).
- The commit-graph code exhausted file descriptors easily when it does not have to. (merge c8828530b7 tb/commit-graph-fd-exhaustion-fix later to maint).
- The multi-pack-index left mmapped file descriptors open when it does not have to. (merge 6c7ff7cf7f ds/multi-pack-index later to maint).
- Recent update to Homebrew used by macOS folks breaks build by moving gettext library and necessary headers. (merge a0b3108618 ds/build-homebrew-gettext-fix later to maint).
- Incompatible options "--root" and "--fork-point" of "git rebase" have been marked and documented as being incompatible. (merge a35413c378 en/rebase-root-and-fork-point-are-incompatible later to maint).
- Error and verbose trace messages from "git push" did not redact credential material embedded in URLs. (merge d192fa5006 js/anonymise-push-url-in-errors later to maint).
- Update the parser used for credential.<URL>.<variable> configuration, to handle <URL>s with ’/’ in them correctly. (merge b44d0118ac bc/wildcard-credential later to maint).
- Recent updates broke parsing of "credential.<url>.<key>" where <url> is not a full URL (e.g. [credential "https://"] helper = …) stopped working, which has been corrected. (merge 9a121b0d22 js/partial-urlmatch-2.17 later to maint). (merge cd93e6c029 js/partial-urlmatch later to maint).
- Some of the files commit-graph subsystem keeps on disk did not correctly honor the core.sharedRepository settings and some were left read-write.
- In error messages that "git switch" mentions its option to create a new branch, "-b/-B" options were shown, where "-c/-C" options should be, which has been corrected. (merge 7c16ef7577 dl/switch-c-option-in-error-message later to maint).
- With the recent tightening of the code that is used to parse various parts of a URL for use in the credential subsystem, a hand-edited credential-store file causes the credential helper to die, which is a bit too harsh to the users. Demote the error behaviour to just ignore and keep using well-formed lines instead. (merge c03859a665 cb/credential-store-ignore-bogus-lines later to maint).
- The samples in the credential documentation has been updated to make it clear that we depict what would appear in the .git/config file, by adding appropriate quotes as needed.. (merge 177681a07e jk/credential-sample-update later to maint).
- "git branch" and other "for-each-ref" variants accepted multiple --sort=<key> options in the increasing order of precedence, but it had a few breakages around "--ignore-case" handling, and tie-breaking with the refname, which have been fixed. (merge 7c5045fc18 jk/for-each-ref-multi-key-sort-fix later to maint).
- The coding guideline for shell scripts instructed to refer to a variable with dollar-sign inside arithmetic expansion to work around a bug in old versions of dash, which is a thing of the past. Now we are not forbidden from writing $var+1. (merge 32b5fe7f0e jk/arith-expansion-coding-guidelines later to maint).
- The <stdlib.h> header on NetBSD brings in its own definition of hmac() function (eek), which conflicts with our own and unrelated function with the same name. Our function has been renamed to work around the issue. (merge 3013118eb8 cb/avoid-colliding-with-netbsd-hmac later to maint).
- The basic test did not honor $TEST_SHELL_PATH setting, which has been corrected. (merge 0555e4af58 cb/t0000-use-the-configured-shell later to maint).
- Minor in-code comments and documentation updates around credential API. (merge 1aed817f99 cb/credential-doc-fixes later to maint).
- Teach "am", "commit", "merge" and "rebase", when they are run with the "--quiet" option, to pass "--quiet" down to "gc --auto". (merge 7c3e9e8cfb jc/auto-gc-quiet later to maint).
- The code to skip unmerged paths in the index when sparse checkout is in use would have made out-of-bound access of the in-core index when the last path was unmerged, which has been corrected.
- Serving a "git fetch" client over "git://" and "ssh://" protocols using the on-wire protocol version 2 was buggy on the server end when the client needs to make a follow-up request to e.g. auto-follow tags. (merge 08450ef791 cc/upload-pack-v2-fetch-fix later to maint).
- "git bisect replay" had trouble with input files when they used CRLF line ending, which has been corrected. (merge 6c722cbe5a cw/bisect-replay-with-dos later to maint).
- "rebase -i" segfaulted when rearranging a sequence that has a fix-up that applies another fix-up (which may or may not be a fix-up of yet another step). (merge 02471e7e20 js/rebase-autosquash-double-fixup-fix later to maint).
- "git fsck" ensures that the paths recorded in tree objects are sorted and without duplicates, but it failed to notice a case where a blob is followed by entries that sort before a tree with the same name. This has been corrected. (merge 9068cfb20f rs/fsck-duplicate-names-in-trees later to maint).
- Code clean-up by removing a compatibility implementation of a function we no longer use. (merge 84b0115f0d cb/no-more-gmtime later to maint).
- When a binary file gets modified and renamed on both sides of history to different locations, both files would be written to the working tree but both would have the contents from "ours". This has been corrected so that the path from each side gets their original content.
- Fix for a copy-and-paste error introduced during 2.20 era. (merge e68a5272b1 ds/multi-pack-verify later to maint).
- Update an unconditional use of "grep -a" with a perl script in a test. (merge 1eb7371236 dd/t5703-grep-a-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 564956f358 jc/maintain-doc later to maint). (merge 7422b2a0a1 sg/commit-slab-clarify-peek later to maint). (merge 9c688735f6 rs/doc-passthru-fetch-options later to maint). (merge 757c2ba3e2 en/oidset-uninclude-hashmap later to maint). (merge 8312aa7d74 jc/config-tar later to maint). (merge d00a5bdd50 ss/submodule-foreach-cb later to maint). (merge 64d1022e14 ar/test-style-fixes later to maint). (merge 4a465443a6 ds/doc-clone-filter later to maint). (merge bb2dbe301b jk/t3419-drop-expensive-tests later to maint). (merge d3507cc712 js/test-junit-finalization-fix later to maint). (merge 2149b6748f bc/faq later to maint). (merge 12dc0879f1 jk/test-cleanup later to maint). (merge 344420bf0f pb/rebase-doc-typofix later to maint). (merge 7cd54d37dc dl/wrapper-fix-indentation later to maint). (merge 78725ebda9 jc/allow-strlen-substitution-in-shell-scripts later to maint). (merge 2ecfcdecc6 jm/gitweb-fastcgi-utf8 later to maint). (merge 0740d0a5d3 jk/oid-array-cleanups later to maint). (merge a1aba0c95c js/t0007-typofix later to maint). (merge 76ba7fa225 ma/config-doc-fix later to maint). (merge 826f0c0df2 js/subtree-doc-update-to-asciidoctor-2 later to maint). (merge 88eaf361e0 eb/mboxrd-doc later to maint). (merge 051cc54941 tm/zsh-complete-switch-restore later to maint). (merge 39102cf4fe ms/doc-revision-illustration-fix later to maint). (merge 4d9378bfad eb/gitweb-more-trailers later to maint). (merge bdccbf7047 mt/doc-worktree-ref later to maint). (merge ce9baf234f dl/push-recurse-submodules-fix later to maint). (merge 4153274052 bc/doc-credential-helper-value later to maint). (merge 5c7bb0146e jc/codingstyle-compare-with-null later to maint).
2.27.1
Git v2.27.1 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5, v2.23.4, v2.24.4, v2.25.5 and v2.26.3 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.28.0
Git 2.28 Release Notes ======================
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 certain 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).
2.28.1
Git v2.28.1 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5, v2.23.4, v2.24.4, v2.25.5, v2.26.3 and v2.27.1 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.29.0
Git 2.29 Release Notes ======================
Updates since v2.28 -------------------
UI, Workflows & Features
- "git help log" has been enhanced by sharing more material from the documentation for the underlying "git rev-list" command.
- "git for-each-ref --format=<>" learned %(contents:size).
- "git merge" learned to selectively omit " into <branch>" at the end of the title of default merge message with merge.suppressDest configuration.
- The component to respond to "git fetch" request is made more configurable to selectively allow or reject object filtering specification used for partial cloning.
- Stop when "sendmail." configuration variables are defined, which could be a mistaken attempt to define "sendemail." variables.
- The existing backends for "git mergetool" based on variants of vim have been refactored and then support for "nvim" has been added.
- "git bisect" learns the "--first-parent" option to find the first breakage along the first-parent chain.
- "git log --first-parent -p" showed patches only for single-parent commits on the first-parent chain; the "--first-parent" option has been made to imply "-m". Use "--no-diff-merges" to restore the previous behaviour to omit patches for merge commits.
- The commit labels used to explain each side of conflicted hunks placed by the sequencer machinery have been made more readable by humans.
- The "--batch-size" option of "git multi-pack-index repack" command is now used to specify that very small packfiles are collected into one until the total size roughly exceeds it.
- The recent addition of SHA-256 support is marked as experimental in the documentation.
- "git fetch" learned --no-write-fetch-head option to avoid writing the FETCH_HEAD file.
- Command line completion (in contrib/) usually omits redundant, deprecated and/or dangerous options from its output; it learned to optionally include all of them.
- The output from the "diff" family of the commands had abbreviated object names of blobs involved in the patch, but its length was not affected by the --abbrev option. Now it is.
- "git worktree" gained a "repair" subcommand to help users recover after moving the worktrees or repository manually without telling Git. Also, "git init --separate-git-dir" no longer corrupts administrative data related to linked worktrees.
- The "--format=" option to the "for-each-ref" command and friends learned a few more tricks, e.g. the ":short" suffix that applies to "objectname" now also can be used for "parent", "tree", etc.
- "git worktree add" learns that the "-d" is a synonym to "--detach" option to create a new worktree without being on a branch.
- "format-patch --range-diff=<prev> <origin>..HEAD" has been taught not to ignore <origin> when <prev> is a single version.
- "add -p" now allows editing paths that were only added in intent.
- The ’meld’ backend of the "git mergetool" learned to give the underlying ’meld’ the '--auto-merge’ option, which would help reduce the amount of text that requires manual merging.
- "git for-each-ref" and friends that list refs used to allow only one --merged or --no-merged to filter them; they learned to take combination of both kind of filtering.
- "git maintenance", a "git gc"’s big brother, has been introduced to take care of more repository maintenance tasks, not limited to the object database cleaning.
- "git receive-pack" that accepts requests by "git push" learned to outsource most of the ref updates to the new "proc-receive" hook.
- "git push" that wants to be atomic and wants to send push certificate learned not to prepare and sign the push certificate when it fails the local check (hence due to atomicity it is known that no certificate is needed).
- "git commit-graph write" learned to limit the number of bloom filters that are computed from scratch with the --max-new-filters option.
- The transport protocol v2 has become the default again.
- The installation procedure learned to optionally omit "git-foo" executable files for each ’foo’ built-in subcommand, which are only required by old timers that still rely on the age old promise that prepending "git --exec-path" output to PATH early in their script will keep the "git-foo" calls they wrote working.
- The command line completion (in contrib/) learned that "git restore -s <TAB>" is often followed by a refname.
- "git shortlog" has been taught to group commits by the contents of the trailer lines, like "Reviewed-by:", "Coauthored-by:", etc.
- "git archive" learns the "--add-file" option to include untracked files into a snapshot from a tree-ish.
- "git fetch" and "git push" support negative refspecs.
- "git format-patch" learns to take "whenAble" as a possible value for the format.useAutoBase configuration variable to become no-op when the automatically computed base does not make sense.
- Credential helpers are now allowed to terminate lines with CRLF line ending, as well as LF line ending.
Performance, Internal Implementation, Development Support etc.
- The changed-path Bloom filter is improved using ideas from an independent implementation.
- Updates to the changed-paths bloom filter.
- The test framework has been updated so that most tests will run with predictable (artificial) timestamps.
- Preliminary clean-up of the refs API in preparation for adding a new refs backend "reftable".
- Dev support to limit the use of test_must_fail to only git commands.
- While packing many objects in a repository with a promissor remote, lazily fetching missing objects from the promissor remote one by one may be inefficient---the code now attempts to fetch all the missing objects in batch (obviously this won’t work for a lazy clone that lazily fetches tree objects as you cannot even enumerate what blobs are missing until you learn which trees are missing).
- The pretend-object mechanism checks if the given object already exists in the object store before deciding to keep the data in-core, but the check would have triggered lazy fetching of such an object from a promissor remote.
- The argv_array API is useful for not just managing argv but any "vector" (NULL-terminated array) of strings, and has seen adoption to a certain degree. It has been renamed to "strvec" to reduce the barrier to adoption.
- The final leg of SHA-256 transition plus doc updates. Note that there is no interoperability between SHA-1 and SHA-256 repositories yet.
- CMake support to build with MSVC for Windows bypassing the Makefile.
- A new helper function has_object() has been introduced to make it easier to mark object existence checks that do and don’t want to trigger lazy fetches, and a few such checks are converted using it.
- A no-op replacement function implemented as a C preprocessor macro does not perform as good a job as one implemented as a "static inline" function in catching errors in parameters; replace the former with the latter in <git-compat-util.h> header.
- Test framework update. (merge d572f52a64 es/test-cmp-typocatcher later to maint).
- Updates to "git merge" tests, in preparation for a new merge strategy backend.
- midx and commit-graph files now use the byte defined in their file format specification for identifying the hash function used for object names.
- The FETCH_HEAD is now always read from the filesystem regardless of the ref backend in use, as its format is much richer than the normal refs, and written directly by "git fetch" as a plain file..
- An unused binary has been discarded, and a bunch of commands have been turned into built-in.
- A handful of places in in-tree code still relied on being able to execute the git subcommands, especially built-ins, in "git-foo" form, which have been corrected.
- When a packfile is removed by "git repack", multi-pack-index gets cleared; the code was taught to do so less aggressively by first checking if the midx actually refers to a pack that no longer exists.
- Internal API clean-up to handle two options "diff-index" and "log" have, which happen to share the same short form, more sensibly.
- The "add -i/-p" machinery has been written in C but it is not used by default yet. It is made default to those who are participating in feature.experimental experiment.
- Allow maintainers to tweak $(TAR) invocations done while making distribution tarballs.
- "git index-pack" learned to resolve deltified objects with greater parallelism.
- "diff-highlight" (in contrib/) had a logic to flush its output upon seeing a blank line but the way it detected a blank line was broken.
- The logic to skip testing on the tagged commit and the tag itself was not quite consistent which led to failure of Windows test tasks. It has been revamped to consistently skip revisions that have already been tested, based on the tree object of the revision.
Fixes since v2.28 -----------------
- The "mediawiki" remote backend which lives in contrib/mw-to-git/ and is not built with git by default, had an RCE bug allowing a malicious MediaWiki server operator to inject arbitrary commands for execution by a cloning client. This has been fixed.
The bug was discovered and reported by Joern Schneeweisz of GitLab
to the git-security mailing list. Its practical impact due to the
obscurity of git-remote-mediawiki was deemed small enough to forgo
a dedicated security release.
- "git clone --separate-git-dir=$elsewhere" used to stomp on the contents of the existing directory $elsewhere, which has been taught to fail when $elsewhere is not an empty directory. (merge dfaa209a79 bw/fail-cloning-into-non-empty later to maint).
- With the base fix to 2.27 regresion, any new extensions in a v0 repository would still be silently honored, which is not quite right. Instead, complain and die loudly. (merge ec91ffca04 jk/reject-newer-extensions-in-v0 later to maint).
- Fetching from a lazily cloned repository resulted at the server side in attempts to lazy fetch objects that the client side has, many of which will not be available from the third-party anyway. (merge 77aa0941ce jt/avoid-lazy-fetching-upon-have-check later to maint).
- Fix to an ancient bug caused by an over-eager attempt for optimization. (merge a98f7fb366 rs/add-index-entry-optim-fix later to maint).
- Pushing a ref whose name contains non-ASCII character with the "--force-with-lease" option did not work over smart HTTP protocol, which has been corrected. (merge cd85b447bf bc/push-cas-cquoted-refname later to maint).
- "git mv src dst", when src is an unmerged path, errored out correctly but with an incorrect error message to claim that src is not tracked, which has been clarified. (merge 9b906af657 ct/mv-unmerged-path-error later to maint).
- Fix to a regression introduced during 2.27 cycle. (merge cada7308ad en/fill-directory-exponential later to maint).
- Command line completion (in contrib/) update. (merge 688b87c81b mp/complete-show-color-moved later to maint).
- All "mergy" operations that internally use the merge-recursive machinery should honor the merge.renormalize configuration, but many of them didn’t.
- Doc cleanup around "worktree". (merge dc9c144be5 es/worktree-doc-cleanups later to maint).
- The "git blame --first-parent" option was not documented, but now it is. (merge 11bc12ae1e rp/blame-first-parent-doc later to maint).
- The logic to find the ref transaction hook script attempted to cache the path to the found hook without realizing that it needed to keep a copied value, as the API it used returned a transitory buffer space. This has been corrected. (merge 09b2aa30c9 ps/ref-transaction-hook later to maint).
- Recent versions of "git diff-files" shows a diff between the index and the working tree for "intent-to-add" paths as a "new file" patch; "git apply --cached" should be able to take "git diff-files" and should act as an equivalent to "git add" for the path, but the command failed to do so for such a path. (merge 4c025c667e rp/apply-cached-with-i-t-a later to maint).
- "git diff [<tree-ish>] $path" for a $path that is marked with i-t-a bit was not showing the mode bits from the working tree. (merge cb0dd22b82 rp/ita-diff-modefix later to maint).
- Ring buffer with size 4 used for bin-hex translation resulted in a wrong object name in the sequencer’s todo output, which has been corrected. (merge 5da69c0dac ak/sequencer-fix-find-uniq-abbrev later to maint).
- When given more than one target line ranges, "git blame -La,b -Lc,d" was over-eager to coalesce groups of original lines and showed incorrect results, which has been corrected. (merge c2ebaa27d6 jk/blame-coalesce-fix later to maint).
- The regexp to identify the function boundary for FORTRAN programs has been updated. (merge 75c3b6b2e8 pb/userdiff-fortran-update later to maint).
- A few end-user facing messages have been updated to be hash-algorithm agnostic. (merge 4279000d3e jc/object-names-are-not-sha-1 later to maint).
- "unlink" emulation on MinGW has been optimized. (merge 680e0b4524 jh/mingw-unlink later to maint).
- The purpose of "git init --separate-git-dir" is to initialize a new project with the repository separate from the working tree, or, in the case of an existing project, to move the repository (the .git/ directory) out of the working tree. It does not make sense to use --separate-git-dir with a bare repository for which there is no working tree, so disallow its use with bare repositories. (merge ccf236a23a es/init-no-separate-git-dir-in-bare later to maint).
- "ls-files -o" mishandled the top-level directory of another git working tree that hangs in the current git working tree. (merge ab282aa548 en/dir-nonbare-embedded later to maint).
- Fix some incorrect UNLEAK() annotations. (merge 3e19816dc0 jk/unleak-fixes later to maint).
- Use more buffered I/O where we used to call many small write(2)s. (merge a698d67b08 rs/more-buffered-io later to maint).
- The patch-id computation did not ignore the "incomplete last line" marker like whitespaces. (merge 82a62015a7 rs/patch-id-with-incomplete-line later to maint).
- Updates into a lazy/partial clone with a submodule did not work well with transfer.fsckobjects set.
- The parser for "git for-each-ref --format=…" was too loose when parsing the "%(trailers…)" atom, and forgot that "trailers" and "trailers:<modifiers>" are the only two allowed forms, which has been corrected. (merge 2c22e102f8 hv/ref-filter-trailers-atom-parsing-fix later to maint).
- Long ago, we decided to use 3 threads by default when running the index-pack task in parallel, which has been adjusted a bit upwards. (merge fbff95b67f jk/index-pack-w-more-threads later to maint).
- "git restore/checkout --no-overlay" with wildcarded pathspec mistakenly removed matching paths in subdirectories, which has been corrected. (merge bfda204ade rs/checkout-no-overlay-pathspec-fix later to maint).
- The description of --cached/--index options in "git apply --help" has been updated. (merge d064702be3 rp/apply-cached-doc later to maint).
- Feeding "$ZERO_OID" to "git log --ignore-missing --stdin", and running "git log --ignore-missing $ZERO_OID" fell back to start digging from HEAD; it has been corrected to become a no-op, like "git log --tags=no-tag-matches-this-pattern" does. (merge 04a0e98515 jk/rev-input-given-fix later to maint).
- Various callers of run_command API have been modernized. (merge afbdba391e jc/run-command-use-embedded-args later to maint).
- List of options offered and accepted by "git add -i/-p" were inconsistent, which have been corrected. (merge ce910287e7 pw/add-p-allowed-options-fix later to maint).
- "git diff --stat -w" showed 0-line changes for paths whose changes were only whitespaces, which was not intuitive. We now omit such paths from the stat output. (merge 1cf3d5db9b mr/diff-hide-stat-wo-textual-change later to maint).
- It was possible for xrealloc() to send a non-NULL pointer that has been freed, which has been fixed. (merge 6479ea4a8a jk/xrealloc-avoid-use-after-free later to maint).
- "git status" has trouble showing where it came from by interpreting reflog entries that record certain events, e.g. "checkout @{u}", and gives a hard/fatal error. Even though it inherently is impossible to give a correct answer because the reflog entries lose some information (e.g. "@{u}" does not record what branch the user was on hence which branch ’the upstream’ needs to be computed, and even if the record were available, the relationship between branches may have changed), at least hide the error and allow "status" to show its output.
- "git status --short" quoted a path with SP in it when tracked, but not those that are untracked, ignored or unmerged. They are all shown quoted consistently.
- "git diff/show" on a change that involves a submodule used to read the information on commits in the submodule from a wrong repository and gave a wrong information when the commit-graph is involved. (merge 85a1ec2c32 mf/submodule-summary-with-correct-repository later to maint).
- Unlike "git config --local", "git config --worktree" did not fail early and cleanly when started outside a git repository. (merge 378fe5fc3d mt/config-fail-nongit-early later to maint).
- There is a logic to estimate how many objects are in the repository, which is meant to run once per process invocation, but it ran every time the estimated value was requested. (merge 67bb65de5d jk/dont-count-existing-objects-twice later to maint).
- "git remote set-head" that failed still said something that hints the operation went through, which was misleading. (merge 5a07c6c3c2 cs/don-t-pretend-a-failed-remote-set-head-succeeded later to maint).
- "git fetch --all --ipv4/--ipv6" forgot to pass the protocol options to instances of the "git fetch" that talk to individual remotes, which has been corrected. (merge 4e735c1326 ar/fetch-ipversion-in-all later to maint).
- The "unshelve" subcommand of "git p4" incorrectly used commit^N where it meant to say commit~N to name the Nth generation ancestor, which has been corrected. (merge 0acbf5997f ld/p4-unshelve-fix later to maint).
- "git clone" that clones from SHA-1 repository, while GIT_DEFAULT_HASH set to use SHA-256 already, resulted in an unusable repository that half-claims to be SHA-256 repository with SHA-1 objects and refs. This has been corrected.
- Adjust sample hooks for hash algorithm other than SHA-1. (merge d8d3d632f4 dl/zero-oid-in-hooks later to maint).
- "git range-diff" showed incorrect diffstat, which has been corrected.
- Earlier we taught "git pull" to warn when the user does not say the histories need to be merged, rebased or accepts only fast- forwarding, but the warning triggered for those who have set the pull.ff configuration variable. (merge 54200cef86 ah/pull later to maint).
- Compilation fix around type punning. (merge 176380fd11 jk/drop-unaligned-loads later to maint).
- "git blame --ignore-rev/--ignore-revs-file" failed to validate their input are valid revision, and failed to take into account that the user may want to give an annotated tag instead of a commit, which has been corrected. (merge 610e2b9240 jc/blame-ignore-fix later to maint).
- "git bisect start X Y", when X and Y are not valid committish object names, should take X and Y as pathspec, but didn’t. (merge 73c6de06af cc/bisect-start-fix later to maint).
- The explanation of the "scissors line" has been clarified. (merge 287416dba6 eg/mailinfo-doc-scissors later to maint).
- A race that leads to an access to a free’d data was corrected in the codepath that reads pack files. (merge bda959c476 mt/delta-base-cache-races later to maint).
- in_merge_bases_many(), a way to see if a commit is reachable from any commit in a set of commits, was totally broken when the commit-graph feature was in use, which has been corrected. (merge 8791bf1841 ds/in-merge-bases-many-optim-bug later to maint).
- "git submodule update --quiet" did not squelch underlying "rebase" and "pull" commands. (merge 3ad0401e9e td/submodule-update-quiet later to maint).
- The lazy fetching done internally to make missing objects available in a partial clone incorrectly made permanent damage to the partial clone filter in the repository, which has been corrected.
- "log -c --find-object=X" did not work well to find a merge that involves a change to an object X from only one parent. (merge 957876f17d jk/diff-cc-oidfind-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 84544f2ea3 sk/typofixes later to maint). (merge b17f411ab5 ar/help-guides-doc later to maint). (merge 98c6871fad rs/grep-simpler-parse-object-or-die-call later to maint). (merge 861c4ce141 en/typofixes later to maint). (merge 60e47f6773 sg/ci-git-path-fix-with-pyenv later to maint). (merge e2bfa50ac3 jb/doc-packfile-name later to maint). (merge 918d8ff780 es/worktree-cleanup later to maint). (merge dc156bc31f ma/t1450-quotefix later to maint). (merge 56e743426b en/merge-recursive-comment-fixes later to maint). (merge 7d23ff818f rs/bisect-oid-to-hex-fix later to maint). (merge de20baf2c9 ny/notes-doc-sample-update later to maint). (merge f649aaaf82 so/rev-parser-errormessage-fix later to maint). (merge 6103d58b7f bc/sha-256-cvs-svn-updates later to maint). (merge ac900fddb7 ma/stop-progress-null-fix later to maint). (merge e767963ab6 rs/upload-pack-sigchain-fix later to maint). (merge a831908599 rs/preserve-merges-unused-code-removal later to maint). (merge 6dfefe70a9 jb/commit-graph-doc-fix later to maint). (merge 847b37271e pb/set-url-docfix later to maint). (merge 748f733d54 mt/checkout-entry-dead-code-removal later to maint). (merge ce820cbd58 dl/subtree-docs later to maint). (merge 55fe225dde jk/leakfix later to maint). (merge ee22a29215 so/pretty-abbrev-doc later to maint). (merge 3100fd5588 jc/post-checkout-doc later to maint). (merge 17bae89476 pb/doc-external-diff-env later to maint). (merge 27ed6ccc12 jk/worktree-check-clean-leakfix later to maint). (merge 1302badd16 ea/blame-use-oideq later to maint). (merge e6d5a11fed al/t3200-back-on-a-branch later to maint). (merge 324efcf6b6 pw/add-p-leakfix later to maint). (merge 1c6ffb546b jk/add-i-fixes later to maint). (merge e40e936551 cd/commit-graph-doc later to maint). (merge 0512eabd91 jc/sequencer-stopped-sha-simplify later to maint). (merge d01141de5a so/combine-diff-simplify later to maint). (merge 3be01e5ab1 sn/fast-import-doc later to maint).
2.29.1
Git v2.29.1 Release Notes =========================
This is to fix the build procedure change in 2.28 where we failed to install a few programs that should be installed in /usr/bin (namely, receive-pack, upload-archive and upload-pack) when the non-default SKIP_DASHED_BUILT_INS installation option is in effect.
A minor glitch in a non-default installation may usually not deserve a hotfix, but I know Git for Windows ship binaries built with this option, so let’s make an exception.
2.29.2
Git v2.29.2 Release Notes =========================
This release is primarily to fix brown-paper-bag breakages in the 2.29.0 release.
Fixes since v2.29.1 -------------------
- In 2.29, "--committer-date-is-author-date" option of "rebase" and "am" subcommands lost the e-mail address by mistake, which has been corrected.
2.29.3
Git v2.29.3 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5, v2.23.4, v2.24.4, v2.25.5, v2.26.3, v2.27.1 and v2.28.1 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.3.0
Git v2.3 Release Notes ======================
This one ended up to be a release with lots of small corrections and improvements without big uncomfortably exciting features. The recent security fix that went to 2.2.1 and older maintenance tracks is also contained in this update.
Updates since v2.2 ------------------
Ports
- Recent gcc toolchain on Cygwin started throwing compilation warning, which has been squelched.
- A few updates to build on platforms that lack tv_nsec, clock_gettime, CLOCK_MONOTONIC and HMAC_CTX_cleanup (e.g. older RHEL) have been added.
UI, Workflows & Features
- It was cumbersome to use "GIT_SSH" mechanism when the user wanted to pass an extra set of arguments to the underlying ssh. A new environment variable GIT_SSH_COMMAND can be used for this.
- A request to store an empty note via "git notes" meant to remove note from the object but with --allow-empty we will store a (surprise!) note that is empty.
- "git interpret-trailers" learned to properly handle the "Conflicts:" block at the end.
- "git am" learned "--message-id" option to copy the message ID of the incoming e-mail to the log message of resulting commit.
- "git clone --reference=<over there>" learned the "--dissociate" option to go with it; it borrows objects from the reference object store while cloning only to reduce network traffic and then dissociates the resulting clone from the reference by performing local copies of borrowed objects.
- "git send-email" learned "--transfer-encoding" option to force a non-fault Content-Transfer-Encoding header (e.g. base64).
- "git send-email" normally identifies itself via X-Mailer: header in the message it sends out. A new command line flag --no-xmailer allows the user to squelch the header.
- "git push" into a repository with a working tree normally refuses to modify the branch that is checked out. The command learned to optionally do an equivalent of "git reset --hard" only when there is no change to the working tree and the index instead, which would be useful to "deploy" by pushing into a repository.
- "git new-workdir" (in contrib/) can be used to populate an empty and existing directory now.
- Credential helpers are asked in turn until one of them give positive response, which is cumbersome to turn off when you need to run Git in an automated setting. The credential helper interface learned to allow a helper to say "stop, don’t ask other helpers." Also GIT_TERMINAL_PROMPT environment can be set to false to disable our built-in prompt mechanism for passwords.
- "git branch -d" (delete) and "git branch -m" (move) learned to honor "-f" (force) flag; unlike many other subcommands, the way to force these have been with separate "-D/-M" options, which was inconsistent.
- "diff-highlight" filter (in contrib/) allows its color output to be customized via configuration variables.
- "git imap-send" learned to take "-v" (verbose) and "-q" (quiet) command line options.
- "git remote add $name $URL" is now allowed when "url.$URL.insteadOf" is already defined.
- "git imap-send" now can be built to use cURL library to talk to IMAP servers (if the library is recent enough, of course). This allows you to use authenticate method other than CRAM-MD5, among other things.
- "git imap-send" now allows GIT_CURL_VERBOSE environment variable to control the verbosity when talking via the cURL library.
- The prompt script (in contrib/) learned to optionally hide prompt when in an ignored directory by setting GIT_PS1_HIDE_IF_PWD_IGNORED shell variable.
Performance, Internal Implementation, Development Support etc.
- Earlier we made "rev-list --object-edge" more aggressively list the objects at the edge commits, in order to reduce number of objects fetched into a shallow repository, but the change affected cases other than "fetching into a shallow repository" and made it unusably slow (e.g. fetching into a normal repository should not have to suffer the overhead from extra processing). Limit it to a more specific case by introducing --objects-edge-aggressive, a new option to rev-list.
- Squelched useless compiler warnings on Mac OS X regarding the crypto API.
- The procedure to generate unicode table has been simplified.
- Some filesystems assign filemodes in a strange way, fooling then automatic "filemode trustability" check done during a new repository creation. The initialization codepath has been hardened against this issue.
- The codepath in "git remote update --prune" to drop many refs has been optimized.
- The API into get_merge_bases*() family of functions was easy to misuse, which has been corrected to make it harder to do so.
- Long overdue departure from the assumption that S_IFMT is shared by everybody made in 2005, which was necessary to port to z/OS.
- "git push" and "git fetch" did not communicate an overlong refname correctly. Now it uses 64kB sideband to accommodate longer ones.
- Recent GPG changes the keyring format and drops support for RFC1991 formatted signatures, breaking our existing tests.
- "git-prompt" (in contrib/) used a variable from the global scope, possibly contaminating end-user’s namespace.
Also contains various documentation updates and code clean-ups.
Fixes since v2.2 ----------------
Unless otherwise noted, all the fixes since v2.2 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git http-push" over WebDAV (aka dumb http-push) was broken in v2.2.2 when parsing a symbolic ref, resulting in a bogus request that gets rejected by recent versions of cURL library. (merge f6786c8 jk/http-push-symref-fix later to maint).
- The logic in "git bisect bad HEAD" etc. to avoid forcing the test of the common ancestor of bad and good commits was broken. (merge 07913d5 cc/bisect-rev-parsing later to maint).
- "git checkout-index --temp=$target $path" did not work correctly for paths outside the current subdirectory in the project. (merge 74c4de5 es/checkout-index-temp later to maint).
- The report from "git checkout" on a branch that builds on another local branch by setting its branch.*.merge to branch name (not a full refname) incorrectly said that the upstream is gone. (merge 05e7368 jc/checkout-local-track-report later to maint).
- With The git-prompt support (in contrib/), using the exit status of the last command in the prompt, e.g. PS1=’$(__git_ps1) $? ’, did not work well, because the helper function stomped on the exit status. (merge 6babe76 tf/prompt-preserve-exit-status later to maint).
- Recent update to "git commit" broke amending an existing commit with bogus author/committer lines without a valid e-mail address. (merge c83a509 jk/commit-date-approxidate later to maint).
- The lockfile API used to get confused which file to clean up when the process moved the $cwd after creating a lockfile. (merge fa137f6 nd/lockfile-absolute later to maint).
- Traditionally we tried to avoid interpreting date strings given by the user as future dates, e.g. GIT_COMMITTER_DATE=2014-12-10 when used early November 2014 was taken as "October 12, 2014" because it is likely that a date in the future, December 10, is a mistake. This heuristics has been loosened to allow people to express future dates (most notably, --until=<date> may want to be far in the future) and we no longer tiebreak by future-ness of the date when
(1) ISO-like format is used, and
(2) the string can make sense interpreted as both y-m-d and y-d-m.
Git may still have to use the heuristics to tiebreak between dd/mm/yy
and mm/dd/yy, though.
(merge d372395 jk/approxidate-avoid-y-d-m-over-future-dates later to maint).
- Git did not correctly read an overlong refname from a packed refs file. (merge ea41783 jk/read-packed-refs-without-path-max later to maint).
- "git apply" was described in the documentation to take --ignore-date option, which it does not. (merge 0cef4e7 rw/apply-does-not-take-ignore-date later to maint).
- "git add -i" did not notice when the interactive command input stream went away and kept asking the same question. (merge a8bec7a jk/add-i-read-error later to maint).
- "git send-email" did not handle RFC 2047 encoded headers quite right. (merge ab47e2a rd/send-email-2047-fix later to maint).
- New tag object format validation added in 2.2 showed garbage after a tagname it reported in its error message. (merge a1e920a js/fsck-tag-validation later to maint).
- The code that reads the reflog from the newer to the older entries did not handle an entry that crosses a boundary of block it uses to read them correctly. (merge 69216bf jk/for-each-reflog-ent-reverse later to maint).
- "git diff -B -M" after making a new copy B out of an existing file A and then editing A extensively ought to report that B was created by copying A and A was modified, which is what "git diff -C" reports, but it instead said A was renamed to B and A was edited heavily in place. This was not just incoherent but also failed to apply with "git apply". The report has been corrected to match what "git diff -C" produces for this case. (merge 6936b58 jc/diff-b-m later to maint).
- In files we pre-populate for the user to edit with commented hints, a line of hint that is indented with a tab used to show as ’#’ (or any comment char), ’ ’ (space), and then the hint text that began with the tab, which some editors flag as an indentation error (tab following space). We now omit the space after the comment char in such a case. (merge d55aeb7 jc/strbuf-add-lines-avoid-sp-ht-sequence later to maint).
- "git ls-tree" does not support path selection based on negative pathspecs, but did not error out when negative pathspecs are given. (merge f1f6224 nd/ls-tree-pathspec later to maint).
- The function sometimes returned a non-freeable memory and some other times returned a piece of memory that must be freed, leading to inevitable leaks. (merge 59362e5 jc/exec-cmd-system-path-leak-fix later to maint).
- The code to abbreviate an object name to its short unique prefix has been optimized when no abbreviation was requested. (merge 61e704e mh/find-uniq-abbrev later to maint).
- "git add --ignore-errors …" did not ignore an error to give a file that did not exist. (merge 1d31e5a mg/add-ignore-errors later to maint).
- "git checkout $treeish $path", when $path in the index and the working tree already matched what is in $treeish at the $path, still overwrote the $path unnecessarily. (merge c5326bd jk/checkout-from-tree later to maint).
- "git config --get-color" did not parse its command line arguments carefully. (merge cb35722 jk/colors-fix later to maint).
- open() emulated on Windows platforms did not give EISDIR upon an attempt to open a directory for writing. (merge ba6fad0 js/windows-open-eisdir-error later to maint).
- A few code paths used abs() when they should have used labs() on long integers. (merge 83915ba rs/maint-config-use-labs later to maint). (merge 31a8aa1 rs/receive-pack-use-labs later to maint).
- "gitweb" used to depend on a behaviour recent CGI.pm deprecated. (merge 13dbf46 jk/gitweb-with-newer-cgi-multi-param later to maint).
- "git init" (hence "git clone") initialized the per-repository configuration file .git/config with x-bit by mistake. (merge 1f32ecf mh/config-flip-xbit-back-after-checking later to maint).
- Recent update in Git 2.2 started creating objects/info/packs and info/refs files with permission bits tighter than user’s umask. (merge d91175b jk/prune-packed-server-info later to maint).
- Git 2.0 was supposed to make the "simple" mode for the default of "git push", but it didn’t. (merge 00a6fa0 jk/push-simple later to maint).
- "Everyday" document had a broken link. (merge 366c8d4 po/everyday-doc later to maint).
- A few test fixes. (merge 880ef58 jk/no-perl-tests later to maint).
- The build procedure did not bother fixing perl and python scripts when NO_PERL and NO_PYTHON build-time configuration changed. (merge ca2051d jk/rebuild-perl-scripts-with-no-perl-seting-change later to maint).
- The usage string of "git log" command was marked incorrectly for l10n. (merge e66dc0c km/log-usage-string-i18n later to maint).
- "git for-each-ref" mishandled --format="%(upstream:track)" when a branch is marked to have forked from a non-existing branch. (merge b6160d9 rc/for-each-ref-tracking later to maint).
2.3.1
Git v2.3.1 Release Notes ========================
Fixes since v2.3 ----------------
- The interactive "show a list and let the user choose from it" interface "add -i" used showed and prompted to the user even when the candidate list was empty, against which the only "choice" the user could have made was to choose nothing.
- "git apply --whitespace=fix" used to under-allocate the memory when the fix resulted in a longer text than the original patch.
- "git log --help" used to show rev-list options that are irrelevant to the "log" command.
- The error message from "git commit", when a non-existing author name was given as value to the "--author=" parameter, has been reworded to avoid misunderstanding.
- A broken pack .idx file in the receiving repository prevented the dumb http transport from fetching a good copy of it from the other side.
- The documentation incorrectly said that C(opy) and R(ename) are the only ones that can be followed by the score number in the output in the --raw format.
- Fix a misspelled conditional that is always true.
- Code to read branch name from various files in .git/ directory would have misbehaved if the code to write them left an empty file.
- The "git push" documentation made the "--repo=<there>" option easily misunderstood.
- After attempting and failing a password-less authentication (e.g. kerberos), libcURL refuses to fall back to password based Basic authentication without a bit of help/encouragement.
- Setting diff.submodule to ’log’ made "git format-patch" produce broken patches.
- "git rerere" (invoked internally from many mergy operations) did not correctly signal errors when told to update the working tree files and failed to do so for whatever reason.
- "git blame HEAD — missing" failed to correctly say "HEAD" when it tried to say "No such path ’missing’ in HEAD".
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.10
Git v2.3.10 Release Notes =========================
Fixes since v2.3.9 ------------------
- xdiff code we use to generate diffs is not prepared to handle extremely large files. It uses "int" in many places, which can overflow if we have a very large number of lines or even bytes in our input files, for example. Cap the input size to somewhere around 1GB for now.
- Some protocols (like git-remote-ext) can execute arbitrary code found in the URL. The URLs that submodules use may come from arbitrary sources (e.g., .gitmodules files in a remote repository), and can hurt those who blindly enable recursive fetch. Restrict the allowed protocols to well known and safe ones.
2.3.2
Git v2.3.2 Release Notes ========================
Fixes since v2.3.1 ------------------
- "update-index --refresh" used to leak when an entry cannot be refreshed for whatever reason.
- "git fast-import" used to crash when it could not close and conclude the resulting packfile cleanly.
- "git blame" died, trying to free an uninitialized piece of memory.
- "git merge-file" did not work correctly in a subdirectory.
- "git submodule add" failed to squash "path/to/././submodule" to "path/to/submodule".
- In v2.2.0, we broke "git prune" that runs in a repository that borrows from an alternate object store.
- Certain older vintages of cURL give irregular output from "curl-config --vernum", which confused our build system.
- An earlier workaround to squelch unhelpful deprecation warnings from the compiler on Mac OSX unnecessarily set minimum required version of the OS, which the user might want to raise (or lower) for other reasons.
- Longstanding configuration variable naming rules has been added to the documentation.
- The credential helper for Windows (in contrib/) used to mishandle a user name with an at-sign in it.
- Older GnuPG implementations may not correctly import the keyring material we prepare for the tests to use.
- Clarify in the documentation that "remote.<nick>.pushURL" and "remote.<nick>.URL" are there to name the same repository accessed via different transports, not two separate repositories.
- The pack bitmap support did not build with older versions of GCC.
- Reading configuration from a blob object, when it ends with a lone CR, use to confuse the configuration parser.
- We didn’t format an integer that wouldn’t fit in "int" but in "uintmax_t" correctly.
- "git push --signed" gave an incorrectly worded error message when the other side did not support the capability.
- "git fetch" over a remote-helper that cannot respond to "list" command could not fetch from a symbolic reference e.g. HEAD.
- The insn sheet "git rebase -i" creates did not fully honor core.abbrev settings.
- The tests that wanted to see that file becomes unreadable after running "chmod a-r file", and the tests that wanted to make sure it is not run as root, we used "can we write into the / directory?" as a cheap substitute, but on some platforms that is not a good heuristics. The tests and their prerequisites have been updated to check what they really require.
- The configuration variable ’mailinfo.scissors’ was hard to discover in the documentation.
- Correct a breakage to git-svn around v2.2 era that triggers premature closing of FileHandle.
- Even though we officially haven’t dropped Perl 5.8 support, the Getopt::Long package that came with it does not support "--no-" prefix to negate a boolean option; manually add support to help people with older Getopt::Long package.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.3
Git v2.3.3 Release Notes ========================
Fixes since v2.3.2 ------------------
- A corrupt input to "git diff -M" used cause us to segfault.
- The borrowed code in kwset API did not follow our usual convention to use "unsigned char" to store values that range from 0-255.
- Description given by "grep -h" for its --exclude-standard option was phrased poorly.
- Documentation for "git remote add" mentioned "--tags" and "--no-tags" and it was not clear that fetch from the remote in the future will use the default behaviour when neither is given to override it.
- "git diff --shortstat --dirstat=changes" showed a dirstat based on lines that was never asked by the end user in addition to the dirstat that the user asked for.
- The interaction between "git submodule update" and the submodule.*.update configuration was not clearly documented.
- "git apply" was not very careful about reading from, removing, updating and creating paths outside the working tree (under --index/--cached) or the current directory (when used as a replacement for GNU patch).
- "git daemon" looked up the hostname even when "%CH" and "%IP" interpolations are not requested, which was unnecessary.
- The "interpolated-path" option of "git daemon" inserted any string client declared on the "host=" capability request without checking. Sanitize and limit %H and %CH to a saner and a valid DNS name.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.4
Git v2.3.4 Release Notes ========================
Fixes since v2.3.3 ------------------
- The ’color.status.unmerged’ configuration was not described.
- "git log --decorate" did not reset colors correctly around the branch names.
- "git -C ’’ subcmd" refused to work in the current directory, unlike "cd ’’" which silently behaves as a no-op.
- "git imap-send" learned to optionally talk with an IMAP server via libcURL; because there is no other option when Git is built with NO_OPENSSL option, use that codepath by default under such configuration.
- A workaround for certain build of GPG that triggered false breakage in a test has been added.
- "git rebase -i" recently started to include the number of commits in the insn sheet to be processed, but on a platform that prepends leading whitespaces to "wc -l" output, the numbers are shown with extra whitespaces that aren’t necessary.
- We did not parse username followed by literal IPv6 address in SSH transport URLs, e.g. ssh://user@[2001:db8::1]:22/repo.git correctly.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.5
Git v2.3.5 Release Notes ========================
Fixes since v2.3.4 ------------------
- The prompt script (in contrib/) did not show the untracked sign when working in a subdirectory without any untracked files.
- Even though "git grep --quiet" is run merely to ask for the exit status, we spawned the pager regardless. Stop doing that.
- Recommend format-patch and send-email for those who want to submit patches to this project.
- An failure early in the "git clone" that started creating the working tree and repository could have resulted in some directories and files left without getting cleaned up.
- "git fetch" that fetches a commit using the allow-tip-sha1-in-want extension could have failed to fetch all the requested refs.
- The split-index mode introduced at v2.3.0-rc0~41 was broken in the codepath to protect us against a broken reimplementation of Git that writes an invalid index with duplicated index entries, etc.
- "git prune" used to largely ignore broken refs when deciding which objects are still being used, which could spread an existing small damage and make it a larger one.
- "git tag -h" used to show the "--column" and "--sort" options that are about listing in a wrong section.
- The transfer.hiderefs support did not quite work for smart-http transport.
- The code that reads from the ctags file in the completion script (in contrib/) did not spell ${param/pattern/string} substitution correctly, which happened to work with bash but not with zsh.
- The explanation on "rebase --preserve-merges", "pull --rebase=preserve", and "push --force-with-lease" in the documentation was unclear.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.6
Git v2.3.6 Release Notes ========================
Fixes since v2.3.5 ------------------
- "diff-highlight" (in contrib/) used to show byte-by-byte differences, which meant that multi-byte characters can be chopped in the middle. It learned to pay attention to character boundaries (assuming the UTF-8 payload).
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.7
Git v2.3.7 Release Notes ========================
Fixes since v2.3.6 ------------------
- An earlier update to the parser that dissects a URL broke an address, followed by a colon, followed by an empty string (instead of the port number), e.g. ssh://example.com:/path/to/repo.
- The completion script (in contrib/) contaminated global namespace and clobbered on a shell variable $x.
- The "git push --signed" protocol extension did not limit what the "nonce" that is a server-chosen string can contain or how long it can be, which was unnecessarily lax. Limit both the length and the alphabet to a reasonably small space that can still have enough entropy.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.8
Git v2.3.8 Release Notes ========================
Fixes since v2.3.7 ------------------
- The usual "git diff" when seeing a file turning into a directory showed a patchset to remove the file and create all files in the directory, but "git diff --no-index" simply refused to work. Also, when asked to compare a file and a directory, imitate POSIX "diff" and compare the file with the file with the same name in the directory, instead of refusing to run.
- The default $HOME/.gitconfig file created upon "git config --global" that edits it had incorrectly spelled user.name and user.email entries in it.
- "git commit --date=now" or anything that relies on approxidate lost the daylight-saving-time offset.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.3.9
Git v2.3.9 Release Notes ========================
Fixes since v2.3.8 ------------------
- A handful of codepaths that used to use fixed-sized arrays to hold pathnames have been corrected to use strbuf and other mechanisms to allow longer pathnames without fearing overflows.
2.30.0
Git 2.30 Release Notes ======================
Updates since v2.29 -------------------
UI, Workflows & Features
- Userdiff for PHP update.
- Userdiff for Rust update.
- Userdiff for CSS update.
- The command line completion script (in contrib/) learned that "git stash show" takes the options "git diff" takes.
- "git worktree list" now shows if each worktree is locked. This possibly may open us to show other kinds of states in the future.
- "git maintenance", an extended big brother of "git gc", continues to evolve.
- "git push --force-with-lease[=<ref>]" can easily be misused to lose commits unless the user takes good care of their own "git fetch". A new option "--force-if-includes" attempts to ensure that what is being force-pushed was created after examining the commit at the tip of the remote ref that is about to be force-replaced.
- "git clone" learned clone.defaultremotename configuration variable to customize what nickname to use to call the remote the repository was cloned from.
- "git checkout" learned to use checkout.guess configuration variable and enable/disable its "--[no-]guess" option accordingly.
- "git resurrect" script (in contrib/) learned that the object names may be longer than 40-hex depending on the hash function in use.
- "git diff A…B" learned "git diff --merge-base A B", which is a longer short-hand to say the same thing.
- A sample ’push-to-checkout’ hook, that performs the same as what the built-in default action does, has been added.
- "git diff" family of commands learned the "-I<regex>" option to ignore hunks whose changed lines all match the given pattern.
- The userdiff pattern learned to identify the function definition in POSIX shells and bash.
- "git checkout-index" did not consistently signal an error with its exit status, but now it does.
- A commit and tag object may have CR at the end of each and every line (you can create such an object with hash-object or using --cleanup=verbatim to decline the default clean-up action), but it would make it impossible to have a blank line to separate the title from the body of the message. We are now more lenient and accept a line with lone CR on it as a blank line, too.
- Exit codes from "git remote add" etc. were not usable by scripted callers, but now they are.
- "git archive" now allows compression level higher than "-9" when generating tar.gz output.
- Zsh autocompletion (in contrib/) update.
- The maximum length of output filenames "git format-patch" creates has become configurable (used to be capped at 64).
- "git rev-parse" learned the "--end-of-options" to help scripts to safely take a parameter that is supposed to be a revision, e.g. "git rev-parse --verify -q --end-of-options $rev".
- The command line completion script (in contrib/) learned to expand commands that are alias of alias.
- "git update-ref --stdin" learns to take multiple transactions in a single session.
- Various subcommands of "git config" that take value_regex learned the "--literal-value" option to take the value_regex option as a literal string.
- The transport layer was taught to optionally exchange the session ID assigned by the trace2 subsystem during fetch/push transactions.
- "git imap-send" used to ignore configuration variables like core.askpass; this has been corrected.
- "git $cmd $args", when $cmd is not a recognised subcommand, by default tries to see if $cmd is a typo of an existing subcommand and optionally executes the corrected command if there is only one possibility, depending on the setting of help.autocorrect; the users can now disable the whole thing, including the cycles spent to find a likely typo, by setting the configuration variable to ’never’.
- "@" sometimes worked (e.g. "git push origin @:there") as a part of a refspec element, but "git push origin @" did not work, which has been corrected.
Performance, Internal Implementation, Development Support etc.
- Use "git archive" more to produce the release tarball.
- GitHub Actions automated test improvement to skip tests on a tree identical to what has already been tested.
- Test-coverage for running commit-graph task "git maintenance" has been extended.
- Our test scripts can be told to run only individual pieces while skipping others with the "--run=…" option; they were taught to take a substring of test title, in addition to numbers, to name the test pieces to run.
- Adjust tests so that they won’t scream when the default initial branch name is different from ’master’.
- Rewriting "git bisect" in C continues.
- More preliminary tests have been added to document desired outcomes of various "directory rename" situations.
- Micro clean-up of a couple of test scripts.
- "git diff" and other commands that share the same machinery to compare with working tree files have been taught to take advantage of the fsmonitor data when available.
- The code to detect premature EOF in the sideband demultiplexer has been cleaned up.
- "git fetch --depth=<n>" over the stateless RPC / smart HTTP transport handled EOF from the client poorly at the server end.
- A specialization of hashmap that uses a string as key has been introduced. Hopefully it will see wider use over time.
- "git bisect start/next" in a large span of history spends a lot of time trying to come up with exactly the half-way point; this can be optimized by stopping when we see a commit that is close enough to the half-way point.
- A lazily defined test prerequisite can now be defined in terms of another lazily defined test prerequisite.
- Expectation for the original contributor after responding to a review comment to use the explanation in a patch update has been described.
- Multiple "credential-store" backends can race to lock the same file, causing everybody else but one to fail---reattempt locking with some timeout to reduce the rate of the failure.
- "git-parse-remote" shell script library outlived its usefulness.
- Like die() and error(), a call to warning() will also trigger a trace2 event.
- Use of non-reentrant localtime() has been removed.
- Non-reentrant time-related library functions and ctime/asctime with awkward calling interfaces are banned from the codebase.
Fixes since v2.29 -----------------
- In 2.29, "--committer-date-is-author-date" option of "rebase" and "am" subcommands lost the e-mail address by mistake, which has been corrected. (merge 5f35edd9d7 jk/committer-date-is-author-date-fix later to maint).
- "git checkout -p A…B [-- <path>]" did not work, even though the same command without "-p" correctly used the merge-base between commits A and B. (merge 35166b1fb5 dl/checkout-p-merge-base later to maint).
- The side-band status report can be sent at the same time as the primary payload multiplexed, but the demultiplexer on the receiving end incorrectly split a single status report into two, which has been corrected. (merge 712b0377db js/avoid-split-sideband-message later to maint).
- "git fast-import" wasted a lot of memory when many marks were in use. (merge 3f018ec716 jk/fast-import-marks-alloc-fix later to maint).
- A test helper "test_cmp A B" was taught to diagnose missing files A or B as a bug in test, but some tests legitimately wanted to notice a failure to even create file B as an error, in addition to leaving the expected result in it, and were misdiagnosed as a bug. This has been corrected. (merge 262d5ad5a5 es/test-cmp-typocatcher later to maint).
- When "git commit-graph" detects the same commit recorded more than once while it is merging the layers, it used to die. The code now ignores all but one of them and continues. (merge 85102ac71b ds/commit-graph-merging-fix later to maint).
- The meaning of a Signed-off-by trailer can vary from project to project; this and also what it means to this project has been clarified in the documentation. (merge 3abd4a67d9 bk/sob-dco later to maint).
- "git credential’ didn’t honor the core.askPass configuration variable (among other things), which has been corrected. (merge 567ad2c0f9 tk/credential-config later to maint).
- Dev support to catch a tentative definition of a variable in our C code as an error. (merge 5539183622 jk/no-common later to maint).
- "git rebase --rebase-merges" did not correctly pass --gpg-sign command line option to underlying "git merge" when replaying a merge using non-default merge strategy or when replaying an octopus merge (because replaying a two-head merge with the default strategy was done in a separate codepath, the problem did not trigger for most users), which has been corrected. (merge 43ad4f2eca sc/sequencer-gpg-octopus later to maint).
- "git apply -R" did not handle patches that touch the same path twice correctly, which has been corrected. This is most relevant in a patch that changes a path from a regular file to a symbolic link (and vice versa). (merge b0f266de11 jt/apply-reverse-twice later to maint).
- A recent oid→hash conversion missed one spot, breaking "git svn". (merge 03bb366de4 bc/svn-hash-oid-fix later to maint).
- The documentation on the "--abbrev=<n>" option did not say the output may be longer than "<n>" hexdigits, which has been clarified. (merge cda34e0d0c jc/abbrev-doc later to maint).
- "git p4" now honors init.defaultBranch configuration. (merge 1b09d1917f js/p4-default-branch later to maint).
- Recently the format of an internal state file "rebase -i" uses has been tightened up for consistency, which would hurt those who start "rebase -i" with old git and then continue with new git. Loosen the reader side a bit (which we may want to tighten again in a year or so). (merge c779386182 jc/sequencer-stopped-sha-simplify later to maint).
- The code to see if "git stash drop" can safely remove refs/stash has been made more careful. (merge 4f44c5659b rs/empty-reflog-check-fix later to maint).
- "git log -L<range>:<path>" is documented to take no pathspec, but this was not enforced by the command line option parser, which has been corrected. (merge 39664cb0ac jc/line-log-takes-no-pathspec later to maint).
- "git format-patch --output=there" did not work as expected and instead crashed. The option is now supported. (merge dc1672dd10 jk/format-patch-output later to maint).
- Define ARM64 compiled with MSVC to be little-endian. (merge 0c038fc65a dg/bswap-msvc later to maint).
- "git rebase -i" did not store ORIG_HEAD correctly. (merge 8843302307 pw/rebase-i-orig-head later to maint).
- "git blame -L :funcname — path" did not work well for a path for which a userdiff driver is defined.
- "make DEVELOPER=1 sparse" used to run sparse and let it emit warnings; now such warnings will cause an error. (merge 521dc56270 jc/sparse-error-for-developer-build later to maint).
- "git blame --ignore-revs-file=<file>" learned to ignore a non-existent object name in the input, instead of complaining. (merge c714d05875 jc/blame-ignore-fix later to maint).
- Running "git diff" while allowing external diff in a state with unmerged paths used to segfault, which has been corrected. (merge d66851806f jk/diff-release-filespec-fix later to maint).
- Build configuration cleanup. (merge b990f02fd8 ab/config-mak-uname-simplify later to maint).
- Fix regression introduced when nvimdiff support in mergetool was added. (merge 12026f46e7 pd/mergetool-nvimdiff later to maint).
- The exchange between receive-pack and proc-receive hook did not carefully check for errors.
- The code was not prepared to deal with pack .idx file that is larger than 4GB. (merge 81c4c5cf2e jk/4gb-idx later to maint).
- Since jgit does not yet work with SHA-256 repositories, mark the tests that use it not to run unless we are testing with ShA-1 repositories. (merge ea699b4adc sg/t5310-jgit-wants-sha1 later to maint).
- Config parser fix for "git notes". (merge 45fef1599a na/notes-displayref-is-not-boolean later to maint).
- Move a definition of compatibility wrapper from cache.h to git-compat-util.h (merge a76b138daa hn/sleep-millisec-decl later to maint).
- Error message fix. (merge eaf5341538 km/stash-error-message-fix later to maint).
- "git pull --rebase --recurse-submodules" checked for local changes in a wrong range and failed to run correctly when it should. (merge 5176f20ffe pb/pull-rebase-recurse-submodules later to maint).
- "git push" that is killed may leave a pack-objects process behind, still computing to find a good compression, wasting cycles. This has been corrected. (merge 8b59935114 jk/stop-pack-objects-when-push-is-killed later to maint).
- "git fetch" that is killed may leave a pack-objects process behind, still computing to find a good compression, wasting cycles. This has been corrected. (merge 309a4028e7 jk/stop-pack-objects-when-fetch-is-killed later to maint).
- "git add -i" failed to honor custom colors configured to show patches, which has been corrected. (merge 96386faa03 js/add-i-color-fix later to maint).
- Processes that access packdata while the .idx file gets removed (e.g. while repacking) did not fail or fall back gracefully as they could. (merge 506ec2fbda tb/idx-midx-race-fix later to maint).
- "git apply" adjusted the permission bits of working-tree files and directories according to core.sharedRepository setting by mistake and for a long time, which has been corrected. (merge eb3c027e17 mt/do-not-use-scld-in-working-tree later to maint).
- "fetch-pack" could pass NULL pointer to unlink(2) when it sees an invalid filename; the error checking has been tightened to make this impossible. (merge 6031af387e rs/fetch-pack-invalid-lockfile later to maint).
- "git maintenance run/start/stop" needed to be run in a repository to hold the lockfile they use, but didn’t make sure they are actually in a repository, which has been corrected.
- The glossary described a branch as an "active" line of development, which is misleading---a stale and non-moving branch is still a branch. (merge eef1ceabd8 so/glossary-branch-is-not-necessarily-active later to maint).
- Newer versions of xsltproc can assign IDs in HTML documents it generates in a consistent manner. Use the feature to help format HTML version of the user manual reproducibly. (merge 3569e11d69 ae/doc-reproducible-html later to maint).
- Tighten error checking in the codepath that responds to "git fetch". (merge d43a21bdbb jk/check-config-parsing-error-in-upload-pack later to maint).
- "git pack-redundant" when there is only one packfile used to crash, which has been corrected. (merge 0696232390 jx/pack-redundant-on-single-pack later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 3e0a5dc9af cc/doc-filter-branch-typofix later to maint). (merge 32c83afc2c cw/ci-ghwf-check-ws-errors later to maint). (merge 5eb2ed691b rs/tighten-callers-of-deref-tag later to maint). (merge 6db29ab213 jk/fast-import-marks-cleanup later to maint). (merge e5cf6d3df4 nk/dir-c-comment-update later to maint). (merge 5710dcce74 jk/report-fn-typedef later to maint). (merge 9a82db1056 en/sequencer-rollback-lock-cleanup later to maint). (merge 4e1bee9a99 js/t7006-cleanup later to maint). (merge f5bcde6c58 es/tutorial-mention-asciidoc-early later to maint). (merge 714d491af0 so/format-patch-doc-on-default-diff-format later to maint). (merge 0795df4b9b rs/clear-commit-marks-in-repo later to maint). (merge 9542d56379 sd/prompt-local-variable later to maint). (merge 06d43fad18 rs/pack-write-hashwrite-simplify later to maint). (merge b7e20b4373 mc/typofix later to maint). (merge f6bcd9a8a4 js/test-whitespace-fixes later to maint). (merge 53b67a801b js/test-file-size later to maint). (merge 970909c2a7 rs/hashwrite-be64 later to maint). (merge 5a923bb1f0 ma/list-object-filter-opt-msgfix later to maint). (merge 1c3e412916 rs/archive-plug-leak-refname later to maint). (merge d44e5267ea rs/plug-diff-cache-leak later to maint). (merge 793c1464d3 ab/gc-keep-base-option later to maint). (merge b86339b12b mt/worktree-error-message-fix later to maint). (merge e01ae2a4a7 js/pull-rebase-use-advise later to maint). (merge e63d774242 sn/config-doc-typofix later to maint). (merge 08e9df2395 jk/multi-line-indent-style-fix later to maint). (merge e66590348a da/vs-build-iconv-fix later to maint). (merge 7fe07275be js/cmake-extra-built-ins-fix later to maint). (merge 633eebe142 jb/midx-doc-update later to maint). (merge 5885367e8f jh/index-v2-doc-on-fsmn later to maint). (merge 14639a4779 jc/compat-util-setitimer-fix later to maint). (merge 56f56ac50b ab/unreachable-break later to maint). (merge 731d578b4f rb/nonstop-config-mak-uname-update later to maint). (merge f4698738f9 es/perf-export-fix later to maint). (merge 773c694142 nk/refspecs-negative-fix later to maint).
2.30.1
Git v2.30.1 Release Notes =========================
This release is primarily to merge fixes accumulated on the ’master’ front to prepare for 2.31 release that are still relevant to 2.30.x maintenance track.
Fixes since v2.30 -----------------
- "git fetch --recurse-submodules" failed to update a submodule when it has an uninitialized (hence of no interest to the user) sub-submodule, which has been corrected.
- Command line error of "git rebase" are diagnosed earlier.
- "git stash" did not work well in a sparsely checked out working tree.
- Some tests expect that "ls -l" output has either ’-’ or ’x’ for group executable bit, but setgid bit can be inherited from parent directory and make these fields ’S’ or ’s’ instead, causing test failures.
- "git for-each-repo --config=<var> <cmd>" should not run <cmd> for any repository when the configuration variable <var> is not defined even once.
- "git mergetool --tool-help" was broken in 2.29 and failed to list all the available tools.
- Fix for procedure to building CI test environment for mac.
- Newline characters in the host and path part of git: now forbidden.
- When more than one commit with the same patch ID appears on one side, "git log --cherry-pick A…B" did not exclude them all when a commit with the same patch ID appears on the other side. Now it does.
- Documentation for "git fsck" lost stale bits that has become incorrect.
- Doc for packfile URI feature has been clarified.
- The implementation of "git branch --sort" wrt the detached HEAD display has always been hacky, which has been cleaned up.
- Our setting of GitHub CI test jobs were a bit too eager to give up once there is even one failure found. Tweak the knob to allow other jobs keep running even when we see a failure, so that we can find more failures in a single run.
Also contains minor documentation updates and code clean-ups.
2.30.2
Git v2.30.2 Release Notes =========================
This release merges up the fixes that appear in v2.17.6, v2.18.5, v2.19.6, v2.20.5, v2.21.4, v2.22.5, v2.23.4, v2.24.4, v2.25.5, v2.26.3, v2.27.1, v2.28.1 and v2.29.3 to address the security issue CVE-2021-21300; see the release notes for these versions for details.
2.30.3
Git v2.30.2 Release Notes =========================
This release addresses the security issue CVE-2022-24765.
Fixes since v2.30.2 -------------------
- Build fix on Windows.
- Fix
GIT_CEILING_DIRECTORIESwith Windows-style root directories.
- CVE-2022-24765: On multi-user machines, Git users might find themselves unexpectedly in a Git worktree, e.g. when another user created a repository in
C:.git, in a mounted network drive or in a scratch space. Merely having a Git-aware prompt that runsgitstatus(orgitdiff) and navigating to a directory which is supposedly not a Git worktree, or opening such a directory in an editor or IDE such as VS Code or Atom, will potentially run commands defined by that other user.
Credit for finding this vulnerability goes to 俞晨东; The fix was authored by Johannes Schindelin.
2.30.4
Git v2.30.4 Release Notes =========================
This release contains minor fix-ups for the changes that went into Git 2.30.3, which was made to address CVE-2022-24765.
- The code that was meant to parse the new
safe.directoryconfiguration variable was not checking what configuration variable was being fed to it, which has been corrected.
- ’*’ can be used as the value for the
safe.directoryvariable to signal that the user considers that any directory is safe.
Derrick Stolee (2): t0033: add tests for safe.directory setup: opt-out of check with safe.directory=*
Matheus Valadares (1): setup: fix safe.directory key not being checked
2.30.5
Git v2.30.5 Release Notes =========================
This release contains minor fix-ups for the changes that went into Git 2.30.3 and 2.30.4, addressing CVE-2022-29187.
- The safety check that verifies a safe ownership of the Git worktree is now extended to also cover the ownership of the Git directory (and the
.gitfile, if there is any).
Carlo Marcelo Arenas Belón (1): setup: tighten ownership checks post CVE-2022-24765
2.30.6
Git v2.30.6 Release Notes =========================
This release addresses the security issues CVE-2022-39253 and CVE-2022-39260.
Fixes since v2.30.5 -------------------
- CVE-2022-39253: When relying on the
--localclone optimization, Git dereferences symbolic links in the source repository before creating hardlinks (or copies) of the dereferenced link in the destination repository. This can lead to surprising behavior where arbitrary files are present in a repository’s$GIT_DIRwhen cloning from a malicious repository.
Git will no longer dereference symbolic links via the `--local`
clone mechanism, and will instead refuse to clone repositories that
have symbolic links present in the `$GIT_DIR/objects` directory.
Additionally, the value of `protocol.file.allow` is changed to be
"user" by default.
- CVE-2022-39260: An overly-long command string given to
gitshellcan result in overflow insplit_cmdline(), leading to arbitrary heap writes and remote code execution whengitshellis exposed and the directory$HOME/git-shell-commandsexists.
`git shell` is taught to refuse interactive commands that are
longer than 4MiB in size. `split_cmdline()` is hardened to reject
inputs larger than 2GiB.
Credit for finding CVE-2022-39253 goes to Cory Snider of Mirantis. The fix was authored by Taylor Blau, with help from Johannes Schindelin.
Credit for finding CVE-2022-39260 goes to Kevin Backhouse of GitHub. The fix was authored by Kevin Backhouse, Jeff King, and Taylor Blau.
Jeff King (2): shell: add basic tests shell: limit size of interactive commands
Kevin Backhouse (1): alias.c: reject too-long cmdline strings in split_cmdline()
Taylor Blau (11): builtin/clone.c: disallow --local clones with symlinks t/lib-submodule-update.sh: allow local submodules t/t1NNN: allow local submodules t/2NNNN: allow local submodules t/t3NNN: allow local submodules t/t4NNN: allow local submodules t/t5NNN: allow local submodules t/t6NNN: allow local submodules t/t7NNN: allow local submodules t/t9NNN: allow local submodules transport: make protocol.file.allow be "user" by default
2.30.7
Git v2.30.7 Release Notes =========================
This release addresses the security issues CVE-2022-41903 and CVE-2022-23521.
Fixes since v2.30.6 -------------------
- CVE-2022-41903:
git log has the ability to display commits using an arbitrary
format with its --format specifiers. This functionality is also
exposed to git archive via the export-subst gitattribute.
When processing the padding operators (e.g., %<(, %<|(, %>(,
%>>(, or %><( ), an integer overflow can occur in
pretty.c::format_and_pad_commit() where a size_t is improperly
stored as an int, and then added as an offset to a subsequent
memcpy() call.
This overflow can be triggered directly by a user running a
command which invokes the commit formatting machinery (e.g., git
log --format=...). It may also be triggered indirectly through
git archive via the export-subst mechanism, which expands format
specifiers inside of files within the repository during a git
archive.
This integer overflow can result in arbitrary heap writes, which
may result in remote code execution.
- CVE-2022-23521:
gitattributes are a mechanism to allow defining attributes for
paths. These attributes can be defined by adding a `.gitattributes`
file to the repository, which contains a set of file patterns and
the attributes that should be set for paths matching this pattern.
When parsing gitattributes, multiple integer overflows can occur
when there is a huge number of path patterns, a huge number of
attributes for a single pattern, or when the declared attribute
names are huge.
These overflows can be triggered via a crafted `.gitattributes` file
that may be part of the commit history. Git silently splits lines
longer than 2KB when parsing gitattributes from a file, but not when
parsing them from the index. Consequentially, the failure mode
depends on whether the file exists in the working tree, the index or
both.
This integer overflow can result in arbitrary heap reads and writes,
which may result in remote code execution.
Credit for finding CVE-2022-41903 goes to Joern Schneeweisz of GitLab. An initial fix was authored by Markus Vervier of X41 D-Sec. Credit for finding CVE-2022-23521 goes to Markus Vervier and Eric Sesterhenn of X41 D-Sec. This work was sponsored by OSTIF.
The proposed fixes have been polished and extended to cover additional findings by Patrick Steinhardt of GitLab, with help from others on the Git security mailing list.
Patrick Steinhardt (21): attr: fix overflow when upserting attribute with overly long name attr: fix out-of-bounds read with huge attribute names attr: fix integer overflow when parsing huge attribute names attr: fix out-of-bounds write when parsing huge number of attributes attr: fix out-of-bounds read with unreasonable amount of patterns attr: fix integer overflow with more than INT_MAX macros attr: harden allocation against integer overflows attr: fix silently splitting up lines longer than 2048 bytes attr: ignore attribute lines exceeding 2048 bytes attr: ignore overly large gitattributes files pretty: fix out-of-bounds write caused by integer overflow pretty: fix out-of-bounds read when left-flushing with stealing pretty: fix out-of-bounds read when parsing invalid padding format pretty: fix adding linefeed when placeholder is not expanded pretty: fix integer overflow in wrapping format utf8: fix truncated string lengths in utf8_strnwidth() utf8: fix returning negative string width utf8: fix overflow when returning string width utf8: fix checking for glyph width in strbuf_utf8_replace() utf8: refactor strbuf_utf8_replace to not rely on preallocated buffer pretty: restrict input lengths for padding and wrapping formats
2.30.8
Git v2.30.8 Release Notes =========================
This release addresses the security issues CVE-2023-22490 and CVE-2023-23946.
Fixes since v2.30.7 -------------------
- CVE-2023-22490:
Using a specially-crafted repository, Git can be tricked into using
its local clone optimization even when using a non-local transport.
Though Git will abort local clones whose source $GIT_DIR/objects
directory contains symbolic links (c.f., CVE-2022-39253), the objects
directory itself may still be a symbolic link.
These two may be combined to include arbitrary files based on known
paths on the victim's filesystem within the malicious repository's
working copy, allowing for data exfiltration in a similar manner as
CVE-2022-39253.
- CVE-2023-23946:
By feeding a crafted input to "git apply", a path outside the
working tree can be overwritten as the user who is running "git
apply".
- A mismatched type in
attr.c::read_attr_from_index()which could cause Git to errantly reject attributes on Windows and 32-bit Linux has been corrected.
Credit for finding CVE-2023-22490 goes to yvvdwf, and the fix was developed by Taylor Blau, with additional help from others on the Git security mailing list.
Credit for finding CVE-2023-23946 goes to Joern Schneeweisz, and the fix was developed by Patrick Steinhardt.
Johannes Schindelin (1): attr: adjust a mismatched data type
Patrick Steinhardt (1): apply: fix writing behind newly created symbolic links
Taylor Blau (3): t5619: demonstrate clone_local() with ambiguous transport clone: delay picking a transport until after get_repo_path() dir-iterator: prevent top-level symlinks without FOLLOW_SYMLINKS
2.30.9
Git v2.30.9 Release Notes =========================
This release addresses the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007.
Fixes since v2.30.8 -------------------
- CVE-2023-25652:
By feeding specially crafted input to `git apply --reject`, a
path outside the working tree can be overwritten with partially
controlled contents (corresponding to the rejected hunk(s) from
the given patch).
- CVE-2023-25815:
When Git is compiled with runtime prefix support and runs without
translated messages, it still used the gettext machinery to
display messages, which subsequently potentially looked for
translated messages in unexpected places. This allowed for
malicious placement of crafted messages.
- CVE-2023-29007:
When renaming or deleting a section from a configuration file,
certain malicious configuration values may be misinterpreted as
the beginning of a new configuration section, leading to arbitrary
configuration injection.
Credit for finding CVE-2023-25652 goes to Ry0taK, and the fix was developed by Taylor Blau, Junio C Hamano and Johannes Schindelin, with the help of Linus Torvalds.
Credit for finding CVE-2023-25815 goes to Maxime Escourbiac and Yassine BENGANA of Michelin, and the fix was developed by Johannes Schindelin.
Credit for finding CVE-2023-29007 goes to André Baptista and Vítor Pinho of Ethiack, and the fix was developed by Taylor Blau, and Johannes Schindelin, with help from Jeff King, and Patrick Steinhardt.
2.31.0
Git 2.31 Release Notes ======================
Updates since v2.30 -------------------
Backward incompatible and other important changes
- The "pack-redundant" command, which has been left stale with almost unusable performance issues, now warns loudly when it gets used, as we no longer want to recommend its use (instead just "repack -d" instead).
- The development community has adopted Contributor Covenant v2.0 to update from v1.4 that we have been using.
- The support for deprecated PCRE1 library has been dropped.
- Fixes for CVE-2021-21300 in Git 2.30.2 (and earlier) is included.
UI, Workflows & Features
- The "--format=%(trailers)" mechanism gets enhanced to make it easier to design output for machine consumption.
- When a user does not tell "git pull" to use rebase or merge, the command gives a loud message telling a user to choose between rebase or merge but creates a merge anyway, forcing users who would want to rebase to redo the operation. Fix an early part of this problem by tightening the condition to give the message---there is no reason to stop or force the user to choose between rebase or merge if the history fast-forwards.
- The configuration variable ’core.abbrev’ can be set to ’no’ to force no abbreviation regardless of the hash algorithm.
- "git rev-parse" can be explicitly told to give output as absolute or relative path with the
--path-format=(absolute|relative)option.
- Bash completion (in contrib/) update to make it easier for end-users to add completion for their custom "git" subcommands.
- "git maintenance" learned to drive scheduled maintenance on platforms whose native scheduling methods are not ’cron’.
- After expiring a reflog and making a single commit, the reflog for the branch would record a single entry that knows both @{0} and @{1}, but we failed to answer "what commit were we on?", i.e. @{1}
- "git bundle" learns "--stdin" option to read its refs from the standard input. Also, it now does not lose refs whey they point at the same object.
- "git log" learned a new "--diff-merges=<how>" option.
- "git ls-files" can and does show multiple entries when the index is unmerged, which is a source for confusion unless -s/-u option is in use. A new option --deduplicate has been introduced.
gitworktreelistnow annotates worktrees as prunable, shows locked and prunable attributes in --porcelain mode, and gained a --verbose option.
- "git clone" tries to locally check out the branch pointed at by HEAD of the remote repository after it is done, but the protocol did not convey the information necessary to do so when copying an empty repository. The protocol v2 learned how to do so.
- There are other ways than ".." for a single token to denote a "commit range", namely "<rev>^!" and "<rev>^-<n>", but "git range-diff" did not understand them.
- The "git range-diff" command learned "--(left|right)-only" option to show only one side of the compared range.
- "git mergetool" feeds three versions (base, local and remote) of a conflicted path unmodified. The command learned to optionally prepare these files with unconflicted parts already resolved.
- The .mailmap is documented to be read only from the root level of a working tree, but a stray file in a bare repository also was read by accident, which has been corrected.
- "git maintenance" tool learned a new "pack-refs" maintenance task.
- The error message given when a configuration variable that is expected to have a boolean value has been improved.
- Signed commits and tags now allow verification of objects, whose two object names (one in SHA-1, the other in SHA-256) are both signed.
- "git rev-list" command learned "--disk-usage" option.
- "git {diff,log} --{skip,rotate}-to=<path>" allows the user to discard diff output for early paths or move them to the end of the output.
- "git difftool" learned "--skip-to=<path>" option to restart an interrupted session from an arbitrary path.
- "git grep" has been tweaked to be limited to the sparse checkout paths.
- "git rebase --[no-]fork-point" gained a configuration variable rebase.forkPoint so that users do not have to keep specifying a non-default setting.
Performance, Internal Implementation, Development Support etc.
- A 3-year old test that was not testing anything useful has been corrected.
- Retire more names with "sha1" in it.
- The topological walk codepath is covered by new trace2 stats.
- Update the Code-of-conduct to version 2.0 from the upstream (we’ve been using version 1.4).
- "git mktag" validates its input using its own rules before writing a tag object---it has been updated to share the logic with "git fsck".
- Two new ways to feed configuration variable-value pairs via environment variables have been introduced, and the way GIT_CONFIG_PARAMETERS encodes variable/value pairs has been tweaked to make it more robust.
- Tests have been updated so that they do not to get affected by the name of the default branch "git init" creates.
- "git fetch" learns to treat ref updates atomically in all-or-none fashion, just like "git push" does, with the new "--atomic" option.
- The peel_ref() API has been replaced with peel_iterated_oid().
- The .use_shell flag in struct child_process that is passed to run_command() API has been clarified with a bit more documentation.
- Document, clean-up and optimize the code around the cache-tree extension in the index.
- The ls-refs protocol operation has been optimized to narrow the sub-hierarchy of refs/ it walks to produce response.
- When removing many branches and tags, the code used to do so one ref at a time. There is another API it can use to delete multiple refs, and it makes quite a lot of performance difference when the refs are packed.
- The "pack-objects" command needs to iterate over all the tags when automatic tag following is enabled, but it actually iterated over all refs and then discarded everything outside "refs/tags/" hierarchy, which was quite wasteful.
- A perf script was made more portable.
- Our setting of GitHub CI test jobs were a bit too eager to give up once there is even one failure found. Tweak the knob to allow other jobs keep running even when we see a failure, so that we can find more failures in a single run.
- We’ve carried compatibility codepaths for compilers without variadic macros for quite some time, but the world may be ready for them to be removed. Force compilation failure on exotic platforms where variadic macros are not available to find out who screams in such a way that we can easily revert if it turns out that the world is not yet ready.
- Code clean-up to ensure our use of hashtables using object names as keys use the "struct object_id" objects, not the raw hash values.
- Lose the debugging aid that may have been useful in the past, but no longer is, in the "grep" codepaths.
- Some pretty-format specifiers do not need the data in commit object (e.g. "%H"), but we were over-eager to load and parse it, which has been made even lazier.
- Get rid of "GETTEXT_POISON" support altogether, which may or may not be controversial.
- Introduce an on-disk file to record revindex for packdata, which traditionally was always created on the fly and only in-core.
- The commit-graph learned to use corrected commit dates instead of the generation number to help topological revision traversal.
- Piecemeal of rewrite of "git bisect" in C continues.
- When a pager spawned by us exited, the trace log did not record its exit status correctly, which has been corrected.
- Removal of GIT_TEST_GETTEXT_POISON continues.
- The code to implement "git merge-base --independent" was poorly done and was kept from the very beginning of the feature.
- Preliminary changes to fsmonitor integration.
- Performance improvements for rename detection.
- The common code to deal with "chunked file format" that is shared by the multi-pack-index and commit-graph files have been factored out, to help codepaths for both filetypes to become more robust.
- The approach to "fsck" the incoming objects in "index-pack" is attractive for performance reasons (we have them already in core, inflated and ready to be inspected), but fundamentally cannot be applied fully when we receive more than one pack stream, as a tree object in one pack may refer to a blob object in another pack as ".gitmodules", when we want to inspect blobs that are used as ".gitmodules" file, for example. Teach "index-pack" to emit objects that must be inspected later and check them in the calling "fetch-pack" process.
- The logic to handle "trailer" related placeholders in the "--format=" mechanisms in the "log" family and "for-each-ref" family is getting unified.
- Raise the buffer size used when writing the index file out from (obviously too small) 8kB to (clearly sufficiently large) 128kB.
- It is reported that open() on some platforms (e.g. macOS Big Sur) can return EINTR even though our timers are set up with SA_RESTART. A workaround has been implemented and enabled for macOS to rerun open() transparently from the caller when this happens.
Fixes since v2.30 -----------------
- Diagnose command line error of "git rebase" early.
- Clean up option descriptions in "git cmd --help".
- "git stash" did not work well in a sparsely checked out working tree.
- Some tests expect that "ls -l" output has either ’-’ or ’x’ for group executable bit, but setgid bit can be inherited from parent directory and make these fields ’S’ or ’s’ instead, causing test failures.
- "git for-each-repo --config=<var> <cmd>" should not run <cmd> for any repository when the configuration variable <var> is not defined even once.
- Fix 2.29 regression where "git mergetool --tool-help" fails to list all the available tools.
- Fix for procedure to building CI test environment for mac.
- The implementation of "git branch --sort" wrt the detached HEAD display has always been hacky, which has been cleaned up.
- Newline characters in the host and path part of git: now forbidden.
- "git diff" showed a submodule working tree with untracked cruft as "Submodule commit <objectname>-dirty", but a natural expectation is that the "-dirty" indicator would align with "git describe --dirty", which does not consider having untracked files in the working tree as source of dirtiness. The inconsistency has been fixed.
- When more than one commit with the same patch ID appears on one side, "git log --cherry-pick A…B" did not exclude them all when a commit with the same patch ID appears on the other side. Now it does.
- Documentation for "git fsck" lost stale bits that has become incorrect.
- Doc fix for packfile URI feature.
- When "git rebase -i" processes "fixup" insn, there is no reason to clean up the commit log message, but we did the usual stripspace processing. This has been corrected. (merge f7d42ceec5 js/rebase-i-commit-cleanup-fix later to maint).
- Fix in passing custom args from "git clone" to "upload-pack" on the other side. (merge ad6b5fefbd jv/upload-pack-filter-spec-quotefix later to maint).
- The command line completion (in contrib/) completed "git branch -d" with branch names, but "git branch -D" offered tagnames in addition, which has been corrected. "git branch -M" had the same problem. (merge 27dc071b9a jk/complete-branch-force-delete later to maint).
- When commands are started from a subdirectory, they may have to compare the path to the subdirectory (called prefix and found out from $(pwd)) with the tracked paths. On macOS, $(pwd) and readdir() yield decomposed path, while the tracked paths are usually normalized to the precomposed form, causing mismatch. This has been fixed by taking the same approach used to normalize the command line arguments. (merge 5c327502db tb/precompose-prefix-too later to maint).
- Even though invocations of "die()" were logged to the trace2 system, "BUG()"s were not, which has been corrected. (merge 0a9dde4a04 jt/trace2-BUG later to maint).
- "git grep --untracked" is meant to be "let’s ALSO find in these files on the filesystem" when looking for matches in the working tree files, and does not make any sense if the primary search is done against the index, or the tree objects. The "--cached" and "--untracked" options have been marked as mutually incompatible. (merge 0c5d83b248 mt/grep-cached-untracked later to maint).
- Fix "git fsck --name-objects" which apparently has not been used by anybody who is motivated enough to report breakage. (merge e89f89361c js/fsck-name-objects-fix later to maint).
- Avoid individual tests in t5411 from getting affected by each other by forcing them to use separate output files during the test. (merge 822ee894f6 jx/t5411-unique-filenames later to maint).
- Test to make sure "git rev-parse one-thing one-thing" gives the same thing twice (when one-thing is --since=X). (merge a5cdca4520 ew/rev-parse-since-test later to maint).
- When certain features (e.g. grafts) used in the repository are incompatible with the use of the commit-graph, we used to silently turned commit-graph off; we now tell the user what we are doing. (merge c85eec7fc3 js/commit-graph-warning later to maint).
- Objects that lost references can be pruned away, even when they have notes attached to it (and these notes will become dangling, which in turn can be pruned with "git notes prune"). This has been clarified in the documentation. (merge fa9ab027ba mz/doc-notes-are-not-anchors later to maint).
- The error codepath around the "--temp/--prefix" feature of "git checkout-index" has been improved. (merge 3f7ba60350 mt/checkout-index-corner-cases later to maint).
- The "git maintenance register" command had trouble registering bare repositories, which had been corrected.
- A handful of multi-word configuration variable names in documentation that are spelled in all lowercase have been corrected to use the more canonical camelCase. (merge 7dd0eaa39c dl/doc-config-camelcase later to maint).
- "git push $there --delete ’’" should have been diagnosed as an error, but instead turned into a matching push, which has been corrected. (merge 20e416409f jc/push-delete-nothing later to maint).
- Test script modernization. (merge 488acf15df sv/t7001-modernize later to maint).
- An under-allocation for the untracked cache data has been corrected. (merge 6347d649bc jh/untracked-cache-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge e3f5da7e60 sg/t7800-difftool-robustify later to maint). (merge 9d336655ba js/doc-proto-v2-response-end later to maint). (merge 1b5b8cf072 jc/maint-column-doc-typofix later to maint). (merge 3a837b58e3 cw/pack-config-doc later to maint). (merge 01168a9d89 ug/doc-commit-approxidate later to maint). (merge b865734760 js/params-vs-args later to maint).
2.31.1
Git 2.31.1 Release Notes ========================
Fixes since v2.31 -----------------
- The fsmonitor interface read from its input without making sure there is something to read from. This bug is new in 2.31 timeframe.
- The data structure used by fsmonitor interface was not properly duplicated during an in-core merge, leading to use-after-free etc.
- "git bisect" reimplemented more in C during 2.30 timeframe did not take an annotated tag as a good/bad endpoint well. This regression has been corrected.
- Fix macros that can silently inject unintended null-statements.
- CALLOC_ARRAY() macro replaces many uses of xcalloc().
- Update insn in Makefile comments to run fuzz-all target.
- Fix a corner case bug in "git mv" on case insensitive systems, which was introduced in 2.29 timeframe.
Also contains various documentation updates and code clean-ups.
2.31.2
Git v2.31.2 Release Notes =========================
This release merges up the fixes that appear in v2.30.3 to address the security issue CVE-2022-24765; see the release notes for that version for details.
2.31.3
Git Documentation/RelNotes/2.31.3.txt Release Notes =========================
This release merges up the fixes that appear in v2.31.3.
2.31.4
Git v2.31.4 Release Notes =========================
This release merges up the fixes that appear in v2.30.5 to address the security issue CVE-2022-29187; see the release notes for that version for details.
2.31.5
Git v2.31.5 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.31.6
Git v2.31.6 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.31.7
Git v2.31.7 Release Notes =========================
This release merges up the fixes that appear in v2.30.8 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for that version for details.
2.31.8
Git v2.31.8 Release Notes =========================
This release merges the fixes that appear in v2.30.9 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for that version for details.
2.32.0
Git 2.32 Release Notes ======================
Backward compatibility notes ----------------------------
- ".gitattributes", ".gitignore", and ".mailmap" files that are symbolic links are ignored.
- "git apply --3way" used to first attempt a straight application, and only fell back to the 3-way merge algorithm when the stright application failed. Starting with this version, the command will first try the 3-way merge algorithm and only when it fails (either resulting with conflict or the base versions of blobs are missing), falls back to the usual patch application.
Updates since v2.31 -------------------
UI, Workflows & Features
- It does not make sense to make ".gitattributes", ".gitignore" and ".mailmap" symlinks, as they are supposed to be usable from the object store (think: bare repositories where HEAD:.mailmap etc. are used). When these files are symbolic links, we used to read the contents of the files pointed by them by mistake, which has been corrected.
- "git stash show" learned to optionally show untracked part of the stash.
- "git log --format=’…’" learned "%(describe)" placeholder.
- "git repack" so far has been only capable of repacking everything under the sun into a single pack (or split by size). A cleverer strategy to reduce the cost of repacking a repository has been introduced.
- The http codepath learned to let the credential layer to cache the password used to unlock a certificate that has successfully been used.
- "git commit --fixup=<commit>", which was to tweak the changes made to the contents while keeping the original log message intact, learned "--fixup=(amend|reword):<commit>", that can be used to tweak both the message and the contents, and only the message, respectively.
- "git send-email" learned to honor the core.hooksPath configuration.
- "git format-patch -v<n>" learned to allow a reroll count that is not an integer.
- "git commit" learned "--trailer <key>[=<value>]" option; together with the interpret-trailers command, this will make it easier to support custom trailers.
- "git clone --reject-shallow" option fails the clone as soon as we notice that we are cloning from a shallow repository.
- A configuration variable has been added to force tips of certain refs to be given a reachability bitmap.
- "gitweb" learned "e-mail privacy" feature to redact strings that look like e-mail addresses on various pages.
- "git apply --3way" has always been "to fall back to 3-way merge only when straight application fails". Swap the order of falling back so that 3-way is always attempted first (only when the option is given, of course) and then straight patch application is used as a fallback when it fails.
- "git apply" now takes "--3way" and "--cached" at the same time, and work and record results only in the index.
- The command line completion (in contrib/) has learned that CHERRY_PICK_HEAD is a possible pseudo-ref.
- Userdiff patterns for "Scheme" has been added.
- "git log" learned "--diff-merges=<style>" option, with an associated configuration variable log.diffMerges.
- "git log --format=…" placeholders learned %ah/%ch placeholders to request the --date=human output.
- Replace GIT_CONFIG_NOSYSTEM mechanism to decline from reading the system-wide configuration file with GIT_CONFIG_SYSTEM that lets users specify from which file to read the system-wide configuration (setting it to an empty file would essentially be the same as setting NOSYSTEM), and introduce GIT_CONFIG_GLOBAL to override the per-user configuration in $HOME/.gitconfig.
- "git add" and "git rm" learned not to touch those paths that are outside of sparse checkout.
- "git rev-list" learns the "--filter=object:type=<type>" option, which can be used to exclude objects of the given kind from the packfile generated by pack-objects.
- The command line completion (in contrib/) for "git stash" has been updated.
- "git subtree" updates.
- It is now documented that "format-patch" skips merges.
- Options to "git pack-objects" that take numeric values like --window and --depth should not accept negative values; the input validation has been tightened.
- The way the command line specified by the trailer.<token>.command configuration variable receives the end-user supplied value was both error prone and misleading. An alternative to achieve the same goal in a safer and more intuitive way has been added, as the trailer.<token>.cmd configuration variable, to replace it.
- "git add -i --dry-run" does not dry-run, which was surprising. The combination of options has taught to error out.
- "git push" learns to discover common ancestor with the receiving end over protocol v2. This will hopefully make "git push" as efficient as "git fetch" in avoiding objects from getting transferred unnecessarily.
- "git mailinfo" (hence "git am") learned the "--quoted-cr" option to control how lines ending with CRLF wrapped in base64 or qp are handled.
Performance, Internal Implementation, Development Support etc.
- Rename detection rework continues.
- GIT_TEST_FAIL_PREREQS is a mechanism to skip test pieces with prerequisites to catch broken tests that depend on the side effects of optional pieces, but did not work at all when negative prerequisites were involved. (merge 27d578d904 jk/fail-prereq-testfix later to maint).
- "git diff-index" codepath has been taught to trust fsmonitor status to reduce number of lstat() calls. (merge 7e5aa13d2c nk/diff-index-fsmonitor later to maint).
- Reorganize Makefile to allow building git.o and other essential objects without extra stuff needed only for testing.
- Preparatory API changes for parallel checkout.
- A simple IPC interface gets introduced to build services like fsmonitor on top.
- Fsck API clean-up.
- SECURITY.md that is facing individual contributors and end users has been introduced. Also a procedure to follow when preparing embargoed releases has been spelled out. (merge 09420b7648 js/security-md later to maint).
- Optimize "rev-list --use-bitmap-index --objects" corner case that uses negative tags as the stopping points.
- CMake update for vsbuild.
- An on-disk reverse-index to map the in-pack location of an object back to its object name across multiple packfiles is introduced.
- Clean-up codepaths that implements "git send-email --validate" option and improves the message from it.
- The last remnant of gettext-poison has been removed.
- The test framework has been taught to optionally turn the default merge strategy to "ort" throughout the system where we use three-way merges internally, like cherry-pick, rebase etc., primarily to enhance its test coverage (the strategy has been available as an explicit "-s ort" choice).
- A bit of code clean-up and a lot of test clean-up around userdiff area.
- Handling of "promisor packs" that allows certain objects to be missing and lazily retrievable has been optimized (a bit).
- When packet_write() fails, we gave an extra error message unnecessarily, which has been corrected.
- The checkout machinery has been taught to perform the actual write-out of the files in parallel when able.
- Show errno in the trace output in the error codepath that calls read_raw_ref method.
- Effort to make the command line completion (in contrib/) safe with "set -u" continues.
- Tweak a few tests for "log --format=…" that show timestamps in various formats.
- The reflog expiry machinery has been taught to emit trace events.
- Over-the-wire protocol learns a new request type to ask for object sizes given a list of object names.
Fixes since v2.31 -----------------
- The fsmonitor interface read from its input without making sure there is something to read from. This bug is new in 2.31 timeframe.
- The data structure used by fsmonitor interface was not properly duplicated during an in-core merge, leading to use-after-free etc.
- "git bisect" reimplemented more in C during 2.30 timeframe did not take an annotated tag as a good/bad endpoint well. This regression has been corrected.
- Fix macros that can silently inject unintended null-statements.
- CALLOC_ARRAY() macro replaces many uses of xcalloc().
- Update insn in Makefile comments to run fuzz-all target.
- Fix a corner case bug in "git mv" on case insensitive systems, which was introduced in 2.29 timeframe.
- We had a code to diagnose and die cleanly when a required clean/smudge filter is missing, but an assert before that unnecessarily fired, hiding the end-user facing die() message. (merge 6fab35f748 mt/cleanly-die-upon-missing-required-filter later to maint).
- Update C code that sets a few configuration variables when a remote is configured so that it spells configuration variable names in the canonical camelCase. (merge 0f1da600e6 ab/remote-write-config-in-camel-case later to maint).
- A new configuration variable has been introduced to allow choosing which version of the generation number gets used in the commit-graph file. (merge 702110aac6 ds/commit-graph-generation-config later to maint).
- Perf test update to work better in secondary worktrees. (merge 36e834abc1 jk/perf-in-worktrees later to maint).
- Updates to memory allocation code around the use of pcre2 library. (merge c1760352e0 ab/grep-pcre2-allocfix later to maint).
- "git -c core.bare=false clone --bare …" would have segfaulted, which has been corrected. (merge 75555676ad bc/clone-bare-with-conflicting-config later to maint).
- When "git checkout" removes a path that does not exist in the commit it is checking out, it wasn’t careful enough not to follow symbolic links, which has been corrected. (merge fab78a0c3d mt/checkout-remove-nofollow later to maint).
- A few option description strings started with capital letters, which were corrected. (merge 5ee90326dc cc/downcase-opt-help later to maint).
- Plug or annotate remaining leaks that trigger while running the very basic set of tests. (merge 68ffe095a2 ah/plugleaks later to maint).
- The hashwrite() API uses a buffering mechanism to avoid calling write(2) too frequently. This logic has been refactored to be easier to understand. (merge ddaf1f62e3 ds/clarify-hashwrite later to maint).
- "git cherry-pick/revert" with or without "--[no-]edit" did not spawn the editor as expected (e.g. "revert --no-edit" after a conflict still asked to edit the message), which has been corrected. (merge 39edfd5cbc en/sequencer-edit-upon-conflict-fix later to maint).
- "git daemon" has been tightened against systems that take backslash as directory separator. (merge 9a7f1ce8b7 rs/daemon-sanitize-dir-sep later to maint).
- A NULL-dereference bug has been corrected in an error codepath in "git for-each-ref", "git branch --list" etc. (merge c685450880 jk/ref-filter-segfault-fix later to maint).
- Streamline the codepath to fix the UTF-8 encoding issues in the argv[] and the prefix on macOS. (merge c7d0e61016 tb/precompose-prefix-simplify later to maint).
- The command-line completion script (in contrib/) had a couple of references that would have given a warning under the "-u" (nounset) option. (merge c5c0548d79 vs/completion-with-set-u later to maint).
- When "git pack-objects" makes a literal copy of a part of existing packfile using the reachability bitmaps, its update to the progress meter was broken. (merge 8e118e8490 jk/pack-objects-bitmap-progress-fix later to maint).
- The dependencies for config-list.h and command-list.h were broken when the former was split out of the latter, which has been corrected. (merge 56550ea718 sg/bugreport-fixes later to maint).
- "git push --quiet --set-upstream" was not quiet when setting the upstream branch configuration, which has been corrected. (merge f3cce896a8 ow/push-quiet-set-upstream later to maint).
- The prefetch task in "git maintenance" assumed that "git fetch" from any remote would fetch all its local branches, which would fetch too much if the user is interested in only a subset of branches there. (merge 32f67888d8 ds/maintenance-prefetch-fix later to maint).
- Clarify that pathnames recorded in Git trees are most often (but not necessarily) encoded in UTF-8. (merge 9364bf465d ab/pathname-encoding-doc later to maint).
- "git --config-env var=val cmd" weren’t accepted (only --config-env=var=val was). (merge c331551ccf ps/config-env-option-with-separate-value later to maint).
- When the reachability bitmap is in effect, the "do not lose recently created objects and those that are reachable from them" safety to protect us from races were disabled by mistake, which has been corrected. (merge 2ba582ba4c jk/prune-with-bitmap-fix later to maint).
- Cygwin pathname handling fix. (merge bccc37fdc7 ad/cygwin-no-backslashes-in-paths later to maint).
- "git rebase --[no-]reschedule-failed-exec" did not work well with its configuration variable, which has been corrected. (merge e5b32bffd1 ab/rebase-no-reschedule-failed-exec later to maint).
- Portability fix for command line completion script (in contrib/). (merge f2acf763e2 si/zsh-complete-comment-fix later to maint).
- "git repack -A -d" in a partial clone unnecessarily loosened objects in promisor pack.
- "git bisect skip" when custom words are used for new/old did not work, which has been corrected.
- A few variants of informational message "Already up-to-date" has been rephrased. (merge ad9322da03 js/merge-already-up-to-date-message-reword later to maint).
- "git submodule update --quiet" did not propagate the quiet option down to underlying "git fetch", which has been corrected. (merge 62af4bdd42 nc/submodule-update-quiet later to maint).
- Document that our test can use "local" keyword. (merge a84fd3bcc6 jc/test-allows-local later to maint).
- The word-diff mode has been taught to work better with a word regexp that can match an empty string. (merge 0324e8fc6b pw/word-diff-zero-width-matches later to maint).
- "git p4" learned to find branch points more efficiently. (merge 6b79818bfb jk/p4-locate-branch-point-optim later to maint).
- When "git update-ref -d" removes a ref that is packed, it left empty directories under $GIT_DIR/refs/ for (merge 5f03e5126d wc/packed-ref-removal-cleanup later to maint).
- "git clean" and "git ls-files -i" had confusion around working on or showing ignored paths inside an ignored directory, which has been corrected. (merge b548f0f156 en/dir-traversal later to maint).
- The handling of "%(push)" formatting element of "for-each-ref" and friends was broken when the same codepath started handling "%(push:<what>)", which has been corrected. (merge 1e1c4c5eac zh/ref-filter-push-remote-fix later to maint).
- The bash prompt script (in contrib/) did not work under "set -u". (merge 5c0cbdb107 en/prompt-under-set-u later to maint).
- The "chainlint" feature in the test framework is a handy way to catch common mistakes in writing new tests, but tends to get expensive. An knob to selectively disable it has been introduced to help running tests that the developer has not modified. (merge 2d86a96220 jk/test-chainlint-softer later to maint).
- The "rev-parse" command did not diagnose the lack of argument to "--path-format" option, which was introduced in v2.31 era, which has been corrected. (merge 99fc555188 wm/rev-parse-path-format-wo-arg later to maint).
- Other code cleanup, docfix, build fix, etc. (merge f451960708 dl/cat-file-doc-cleanup later to maint). (merge 12604a8d0c sv/t9801-test-path-is-file-cleanup later to maint). (merge ea7e63921c jr/doc-ignore-typofix later to maint). (merge 23c781f173 ps/update-ref-trans-hook-doc later to maint). (merge 42efa1231a jk/filter-branch-sha256 later to maint). (merge 4c8e3dca6e tb/push-simple-uses-branch-merge-config later to maint). (merge 6534d436a2 bs/asciidoctor-installation-hints later to maint). (merge 47957485b3 ab/read-tree later to maint). (merge 2be927f3d1 ab/diff-no-index-tests later to maint). (merge 76593c09bb ab/detox-gettext-tests later to maint). (merge 28e29ee38b jc/doc-format-patch-clarify later to maint). (merge fc12b6fdde fm/user-manual-use-preface later to maint). (merge dba94e3a85 cc/test-helper-bloom-usage-fix later to maint). (merge 61a7660516 hn/reftable-tables-doc-update later to maint). (merge 81ed96a9b2 jt/fetch-pack-request-fix later to maint). (merge 151b6c2dd7 jc/doc-do-not-capitalize-clarification later to maint). (merge 9160068ac6 js/access-nul-emulation-on-windows later to maint). (merge 7a14acdbe6 po/diff-patch-doc later to maint). (merge f91371b948 pw/patience-diff-clean-up later to maint). (merge 3a7f0908b6 mt/clean-clean later to maint). (merge d4e2d15a8b ab/streaming-simplify later to maint). (merge 0e59f7ad67 ah/merge-ort-i18n later to maint). (merge e6f68f62e0 ls/typofix later to maint).
2.32.1
Git v2.32.1 Release Notes =========================
This release merges up the fixes that appear in v2.30.3 and v2.31.2 to address the security issue CVE-2022-24765; see the release notes for these versions for details.
2.32.2
Git Documentation/RelNotes/2.32.2.txt Release Notes =========================
This release merges up the fixes that appear in v2.32.2.
2.32.3
Git v2.32.3 Release Notes =========================
This release merges up the fixes that appear in v2.30.5 and v2.31.4 to address the security issue CVE-2022-29187; see the release notes for these versions for details.
2.32.4
Git v2.32.4 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.32.5
Git v2.32.5 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
In addition, included are additional code for "git fsck" to check for questionable .gitattributes files.
2.32.6
Git v2.32.6 Release Notes =========================
This release merges up the fixes that appear in v2.30.8 and v2.31.7 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.32.7
Git v2.32.7 Release Notes =========================
This release merges the fixes that appear in v2.30.9 and v2.31.8 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.33.0
Git 2.33 Release Notes ======================
Updates since Git 2.32 ----------------------
UI, Workflows & Features
- "git send-email" learned the "--sendmail-cmd" command line option and the "sendemail.sendmailCmd" configuration variable, which is a more sensible approach than the current way of repurposing the "smtp-server" that is meant to name the server to instead name the command to talk to the server.
- The userdiff pattern for C# learned the token "record".
- "git rev-list" learns to omit the "commit <object-name>" header lines from the output with the
--no-commit-headeroption.
- "git worktree add --lock" learned to record why the worktree is locked with a custom message.
Performance, Internal Implementation, Development Support etc.
- The code to handle the "--format" option in "for-each-ref" and friends made too many string comparisons on %(atom)s used in the format string, which has been corrected by converting them into enum when the format string is parsed.
- Use the hashfile API in the codepath that writes the index file to reduce code duplication.
- Repeated rename detections in a sequence of mergy operations have been optimized out for the ’ort’ merge strategy.
- Preliminary clean-up of tests before the main reftable changes hits the codebase.
- The backend for "diff -G/-S" has been updated to use pcre2 engine when available.
- Use ".DELETE_ON_ERROR" pseudo target to simplify our Makefile.
- Code cleanup around struct_type_init() functions.
- "git send-email" optimization.
- GitHub Actions / CI update. (merge 0dc787a9f2 js/ci-windows-update later to maint).
- Object accesses in repositories with many alternate object store have been optimized.
- "git log" has been optimized not to waste cycles to load ref decoration data that may not be needed.
- Many "printf"-like helper functions we have have been annotated with attribute() to catch placeholder/parameter mismatches.
- Tests that cover protocol bits have been updated and helpers used there have been consolidated.
- The CI gained a new job to run "make sparse" check.
- "git status" codepath learned to work with sparsely populated index without hydrating it fully.
- A guideline for gender neutral documentation has been added.
- Documentation on "git diff -l<n>" and diff.renameLimit have been updated, and the defaults for these limits have been raised.
- The completion support used to offer alternate spelling of options that exist only for compatibility, which has been corrected.
- "TEST_OUTPUT_DIRECTORY=there make test" failed to work, which has been corrected.
- "git bundle" gained more test coverage.
- "git read-tree" had a codepath where blobs are fetched one-by-one from the promisor remote, which has been corrected to fetch in bulk.
- Rewrite of "git submodule" in C continues.
- "git checkout" and "git commit" learn to work without unnecessarily expanding sparse indexes.
Fixes since v2.32 -----------------
- We historically rejected a very short string as an author name while accepting a patch e-mail, which has been loosened. (merge 72ee47ceeb ef/mailinfo-short-name later to maint).
- The parallel checkout codepath did not initialize object ID field used to talk to the worker processes in a futureproof way.
- Rewrite code that triggers undefined behaviour warning. (merge aafa5df0df jn/size-t-casted-to-off-t-fix later to maint).
- The description of "fast-forward" in the glossary has been updated. (merge e22f2daed0 ry/clarify-fast-forward-in-glossary later to maint).
- Recent "git clone" left a temporary directory behind when the transport layer returned an failure. (merge 6aacb7d861 jk/clone-clean-upon-transport-error later to maint).
- "git fetch" over protocol v2 left its side of the socket open after it finished speaking, which unnecessarily wasted the resource on the other side. (merge ae1a7eefff jk/fetch-pack-v2-half-close-early later to maint).
- The command line completion (in contrib/) learned that "git diff" takes the "--anchored" option. (merge d1e7c2cac9 tb/complete-diff-anchored later to maint).
- "git-svn" tests assumed that "locale -a", which is used to pick an available UTF-8 locale, is available everywhere. A knob has been introduced to allow testers to specify a suitable locale to use. (merge 482c962de4 dd/svn-test-wo-locale-a later to maint).
- Update "git subtree" to work better on Windows. (merge 77f37de39f js/subtree-on-windows-fix later to maint).
- Remove multimail from contrib/ (merge f74d11471f js/no-more-multimail later to maint).
- Make the codebase MSAN clean. (merge 4dbc55e87d ah/uninitialized-reads-fix later to maint).
- Work around inefficient glob substitution in older versions of bash by rewriting parts of a test. (merge eb87c6f559 jx/t6020-with-older-bash later to maint).
- Avoid duplicated work while building reachability bitmaps. (merge aa9ad6fee5 jk/bitmap-tree-optim later to maint).
- We broke "GIT_SKIP_TESTS=t?000" to skip certain tests in recent update, which got fixed.
- The side-band demultiplexer that is used to display progress output from the remote end did not clear the line properly when the end of line hits at a packet boundary, which has been corrected.
- Some test scripts assumed that readlink(1) was universally installed and available, which is not the case. (merge 7c0afdf23c jk/test-without-readlink-1 later to maint).
- Recent update to completion script (in contrib/) broke those who use the __git_complete helper to define completion to their custom command. (merge cea232194d fw/complete-cmd-idx-fix later to maint).
- Output from some of our tests were affected by the width of the terminal that they were run in, which has been corrected by exporting a fixed value in the COLUMNS environment. (merge c49a177bec ab/fix-columns-to-80-during-tests later to maint).
- On Windows, mergetool has been taught to find kdiff3.exe just like it finds winmerge.exe. (merge 47eb4c6890 ms/mergetools-kdiff3-on-windows later to maint).
- When we cannot figure out how wide the terminal is, we use a fallback value of 80 ourselves (which cannot be avoided), but when we run the pager, we export it in COLUMNS, which forces the pager to use the hardcoded value, even when the pager is perfectly capable to figure it out itself. Stop exporting COLUMNS when we fall back on the hardcoded default value for our own use. (merge 9b6e2c8b98 js/stop-exporting-bogus-columns later to maint).
- "git cat-file --batch-all-objects"" misbehaved when "--batch" is in use and did not ask for certain object traits. (merge ee02ac6164 zh/cat-file-batch-fix later to maint).
- Some code and doc clarification around "git push".
- The "union" conflict resultion variant misbehaved when used with binary merge driver. (merge 382b601acd jk/union-merge-binary later to maint).
- Prevent "git p4" from failing to submit changes to binary file. (merge 54662d5958 dc/p4-binary-submit-fix later to maint).
- "git grep --and -e foo" ought to have been diagnosed as an error but instead segfaulted, which has been corrected. (merge fe7fe62d8d rs/grep-parser-fix later to maint).
- The merge code had funny interactions between content based rename detection and directory rename detection. (merge 3585d0ea23 en/merge-dir-rename-corner-case-fix later to maint).
- When rebuilding the multi-pack index file reusing an existing one, we used to blindly trust the existing file and ended up carrying corrupted data into the updated file, which has been corrected. (merge f89ecf7988 tb/midx-use-checksum later to maint).
- Update the location of system-side configuration file on Windows. (merge e355307692 js/gfw-system-config-loc-fix later to maint).
- Code recently added to support common ancestry negotiation during "git push" did not sanity check its arguments carefully enough. (merge eff40457a4 ab/fetch-negotiate-segv-fix later to maint).
- Update the documentation not to assume users are of certain gender and adds to guidelines to do so. (merge 46a237f42f ds/gender-neutral-doc later to maint).
- "git commit --allow-empty-message" won’t abort the operation upon an empty message, but the hint shown in the editor said otherwise. (merge 6f70f00b4f hj/commit-allow-empty-message later to maint).
- The code that gives an error message in "git multi-pack-index" when no subcommand is given tried to print a NULL pointer as a strong, which has been corrected. (merge 88617d11f9 tb/reverse-midx later to maint).
- CI update. (merge a066a90db6 js/ci-check-whitespace-updates later to maint).
- Documentation fix for "git pull --rebase=no". (merge d3236becec fc/pull-no-rebase-merges-theirs-into-ours later to maint).
- A race between repacking and using pack bitmaps has been corrected. (merge dc1daacdcc jk/check-pack-valid-before-opening-bitmap later to maint).
- The local changes stashed by "git merge --autostash" were lost when the merge failed in certain ways, which has been corrected.
- Windows rmdir() equivalent behaves differently from POSIX ones in that when used on a symbolic link that points at a directory, the target directory gets removed, which has been corrected. (merge 3e7d4888e5 tb/mingw-rmdir-symlink-to-directory later to maint).
- Other code cleanup, docfix, build fix, etc. (merge bfe35a6165 ah/doc-describe later to maint). (merge f302c1e4aa jc/clarify-revision-range later to maint). (merge 3127ff90ea tl/fix-packfile-uri-doc later to maint). (merge a84216c684 jk/doc-color-pager later to maint). (merge 4e0a64a713 ab/trace2-squelch-gcc-warning later to maint). (merge 225f7fa847 ps/rev-list-object-type-filter later to maint). (merge 5317dfeaed dd/honor-users-tar-in-tests later to maint). (merge ace6d8e3d6 tk/partial-clone-repack-doc later to maint). (merge 7ba68e0cf1 js/trace2-discard-event-docfix later to maint). (merge 8603c419d3 fc/doc-default-to-upstream-config later to maint). (merge 1d72b604ef jk/revision-squelch-gcc-warning later to maint). (merge abcb66c614 ar/typofix later to maint). (merge 9853830787 ah/graph-typofix later to maint). (merge aac578492d ab/config-hooks-path-testfix later to maint). (merge 98c7656a18 ar/more-typofix later to maint). (merge 6fb9195f6c jk/doc-max-pack-size later to maint). (merge 4184cbd635 ar/mailinfo-memcmp-to-skip-prefix later to maint). (merge 91d2347033 ar/doc-libera-chat-in-my-first-contrib later to maint). (merge 338abb0f04 ab/cmd-foo-should-return later to maint). (merge 546096a5cb ab/xdiff-bug-cleanup later to maint). (merge b7b793d1e7 ab/progress-cleanup later to maint). (merge d94f9b8e90 ba/object-info later to maint). (merge 52ff891c03 ar/test-code-cleanup later to maint). (merge a0538e5c8b dd/document-log-decorate-default later to maint). (merge ce24797d38 mr/cmake later to maint). (merge 9eb542f2ee ab/pre-auto-gc-hook-test later to maint). (merge 9fffc38583 bk/doc-commit-typofix later to maint). (merge 1cf823d8f0 ks/submodule-cleanup later to maint). (merge ebbf5d2b70 js/config-mak-windows-pcre-fix later to maint). (merge 617480d75b hn/refs-iterator-peel-returns-boolean later to maint). (merge 6a24cc71ed ar/submodule-helper-include-cleanup later to maint). (merge 5632e838f8 rs/khash-alloc-cleanup later to maint). (merge b1d87fbaf1 jk/typofix later to maint). (merge e04170697a ab/gitignore-discovery-doc later to maint). (merge 8232a0ff48 dl/packet-read-response-end-fix later to maint). (merge eb448631fb dl/diff-merge-base later to maint). (merge c510928a25 hn/refs-debug-empty-prefix later to maint). (merge ddcb189d9d tb/bitmap-type-filter-comment-fix later to maint). (merge 878b399734 pb/submodule-recurse-doc later to maint). (merge 734283855f jk/config-env-doc later to maint). (merge 482e1488a9 ab/getcwd-test later to maint). (merge f0b922473e ar/doc-markup-fix later to maint).
2.33.1
Git 2.33.1 Release Notes ========================
This primarily is to backport various fixes accumulated during the development towards Git 2.34, the next feature release.
Fixes since v2.33 -----------------
- The unicode character width table (used for output alignment) has been updated.
- Input validation of "git pack-objects --stdin-packs" has been corrected.
- Bugfix for common ancestor negotiation recently introduced in "git push" codepath.
- "git pull" had various corner cases that were not well thought out around its --rebase backend, e.g. "git pull --ff-only" did not stop but went ahead and rebased when the history on other side is not a descendant of our history. The series tries to fix them up.
- "git apply" miscounted the bytes and failed to read to the end of binary hunks.
- "git range-diff" code clean-up.
- "git commit --fixup" now works with "--edit" again, after it was broken in v2.32.
- Use upload-artifacts v1 (instead of v2) for 32-bit linux, as the new version has a blocker bug for that architecture.
- Checking out all the paths from HEAD during the last conflicted step in "git rebase" and continuing would cause the step to be skipped (which is expected), but leaves MERGE_MSG file behind in $GIT_DIR and confuses the next "git commit", which has been corrected.
- Various bugs in "git rebase -r" have been fixed.
- mmap() imitation used to call xmalloc() that dies upon malloc() failure, which has been corrected to just return an error to the caller to be handled.
- "git diff --relative" segfaulted and/or produced incorrect result when there are unmerged paths.
- The delayed checkout code path in "git checkout" etc. were chatty even when --quiet and/or --no-progress options were given.
- "git branch -D <branch>" used to refuse to remove a broken branch ref that points at a missing commit, which has been corrected.
- Build update for Apple clang.
- The parser for the "--nl" option of "git column" has been corrected.
- "git upload-pack" which runs on the other side of "git fetch" forgot to take the ref namespaces into account when handling want-ref requests.
- The sparse-index support can corrupt the index structure by storing a stale and/or uninitialized data, which has been corrected.
- Buggy tests could damage repositories outside the throw-away test area we created. We now by default export GIT_CEILING_DIRECTORIES to limit the damage from such a stray test.
- Even when running "git send-email" without its own threaded discussion support, a threading related header in one message is carried over to the subsequent message to result in an unwanted threading, which has been corrected.
- The output from "git fast-export", when its anonymization feature is in use, showed an annotated tag incorrectly.
- Recent "diff -m" changes broke "gitk", which has been corrected.
- "git maintenance" scheduler fix for macOS.
- A pathname in an advice message has been made cut-and-paste ready.
- The "git apply -3" code path learned not to bother the lower level merge machinery when the three-way merge can be trivially resolved without the content level merge.
- The code that optionally creates the *.rev reverse index file has been optimized to avoid needless computation when it is not writing the file out.
- "git range-diff -I… <range> <range>" segfaulted, which has been corrected.
- The order in which various files that make up a single (conceptual) packfile has been reevaluated and straightened up. This matters in correctness, as an incomplete set of files must not be shown to a running Git.
- The "mode" word is useless in a call to open(2) that does not create a new file. Such a call in the files backend of the ref subsystem has been cleaned up.
- "git update-ref --stdin" failed to flush its output as needed, which potentially led the conversation to a deadlock.
- When "git am --abort" fails to abort correctly, it still exited with exit status of 0, which has been corrected.
- Correct nr and alloc members of strvec struct to be of type size_t.
- "git stash", where the tentative change involves changing a directory to a file (or vice versa), was confused, which has been corrected.
- "git clone" from a repository whose HEAD is unborn into a bare repository didn’t follow the branch name the other side used, which is corrected.
- "git cvsserver" had a long-standing bug in its authentication code, which has finally been corrected (it is unclear and is a separate question if anybody is seriously using it, though).
- "git difftool --dir-diff" mishandled symbolic links.
- Sensitive data in the HTTP trace were supposed to be redacted, but we failed to do so in HTTP/2 requests.
- "make clean" has been updated to remove leftover .depend/ directories, even when it is not told to use them to compute header dependencies.
- Protocol v0 clients can get stuck parsing a malformed feature line.
Also contains various documentation updates and code clean-ups.
2.33.2
Git v2.33.2 Release Notes =========================
This release merges up the fixes that appear in v2.30.3, v2.31.2 and v2.32.1 to address the security issue CVE-2022-24765; see the release notes for these versions for details.
In addition, it contains the following fixes:
- Squelch over-eager warning message added during this cycle.
- A bug in "git rebase -r" has been fixed.
- One CI task based on Fedora image noticed a not-quite-kosher construct recently, which has been corrected.
2.33.3
Git Documentation/RelNotes/2.33.3.txt Release Notes =========================
This release merges up the fixes that appear in v2.33.3.
2.33.4
Git v2.33.4 Release Notes =========================
This release merges up the fixes that appear in v2.30.5, v2.31.4 and v2.32.3 to address the security issue CVE-2022-29187; see the release notes for these versions for details.
2.33.5
Git v2.33.5 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.33.6
Git v2.33.6 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.33.7
Git v2.33.7 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7 and v2.32.6 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.33.8
Git v2.33.8 Release Notes =========================
This release merges the fixes that appear in v2.30.9, v2.31.8 and v2.32.7 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.34.0
Git 2.34 Release Notes ======================
Updates since Git 2.33 ----------------------
Backward compatibility notes
- The "--preserve-merges" option of "git rebase" has been removed.
UI, Workflows & Features
- Pathname expansion (like "~username/") learned a way to specify a location relative to Git installation (e.g. its $sharedir which is $(prefix)/share), with "%(prefix)".
- The
ortstrategy is used instead ofrecursiveas the default merge strategy.
- The userdiff pattern for "java" language has been updated.
- "git rebase" by default skips changes that are equivalent to commits that are already in the history the branch is rebased onto; give messages when this happens to let the users be aware of skipped commits, and also teach them how to tell "rebase" to keep duplicated changes.
- The advice message that "git cherry-pick" gives when it asks conflicted replay of a commit to be resolved by the end user has been updated.
- After "git clone --recurse-submodules", all submodules are cloned but they are not by default recursed into by other commands. With submodule.stickyRecursiveClone configuration set, submodule.recurse configuration is set to true in a repository created by "clone" with "--recurse-submodules" option.
- The logic for auto-correction of misspelt subcommands learned to go interactive when the help.autocorrect configuration variable is set to ’prompt’.
- "git maintenance" scheduler learned to use systemd timers as a possible backend.
- "git diff --submodule=diff" showed failure from run_command() when trying to run diff inside a submodule, when the user manually removes the submodule directory.
- "git bundle unbundle" learned to show progress display.
- In cone mode, the sparse-index code path learned to remove ignored files (like build artifacts) outside the sparse cone, allowing the entire directory outside the sparse cone to be removed, which is especially useful when the sparse patterns change.
- Taking advantage of the CGI interface, http-backend has been updated to enable protocol v2 automatically when the other side asks for it.
- The credential-cache helper has been adjusted to Windows.
- The error in "git help no-such-git-command" is handled better.
- The unicode character width table (used for output alignment) has been updated.
- The ref iteration code used to optionally allow dangling refs to be shown, which has been tightened up.
- "git add", "git mv", and "git rm" have been adjusted to avoid updating paths outside of the sparse-checkout definition unless the user specifies a "--sparse" option.
- "git repack" has been taught to generate multi-pack reachability bitmaps.
- "git fsck" has been taught to report mismatch between expected and actual types of an object better.
- In addition to GnuPG, ssh public crypto can be used for object and push-cert signing. Note that this feature cannot be used with ssh-keygen from OpenSSH 8.7, whose support for it is broken. Avoid using it unless you update to OpenSSH 8.8.
- "git log --grep=string --author=name" learns to highlight hits just like "git grep string" does.
Performance, Internal Implementation, Development Support etc.
- "git bisect" spawned "git show-branch" only to pretty-print the title of the commit after checking out the next version to be tested; this has been rewritten in C.
- "git add" can work better with the sparse index.
- Support for ancient versions of cURL library (pre 7.19.4) has been dropped.
- A handful of tests that assumed implementation details of files backend for refs have been cleaned up.
- trace2 logs learned to show parent process name to see in what context Git was invoked.
- Loading of ref tips to prepare for common ancestry negotiation in "git fetch-pack" has been optimized by taking advantage of the commit graph when available.
- Remind developers that the userdiff patterns should be kept simple and permissive, assuming that the contents they apply are always syntactically correct.
- The current implementation of GIT_TEST_FAIL_PREREQS is broken in that checking for the lack of a prerequisite would not work. Avoid the use of "if ! test_have_prereq X" in a test script.
- The revision traversal API has been optimized by taking advantage of the commit-graph, when available, to determine if a commit is reachable from any of the existing refs.
- "git fetch --quiet" optimization to avoid useless computation of info that will never be displayed.
- Callers from older advice_config[] based API has been updated to use the newer advice_if_enabled() and advice_enabled() API.
- Teach "test_pause" and "debug" helpers to allow using the HOME and TERM environment variables the user usually uses.
- "make INSTALL_STRIP=-s install" allows the installation step to use "install -s" to strip the binaries as they get installed.
- Code that handles large number of refs in the "git fetch" code path has been optimized.
- The reachability bitmap file used to be generated only for a single pack, but now we’ve learned to generate bitmaps for history that span across multiple packfiles.
- The code to make "git grep" recurse into submodules has been updated to migrate away from the "add submodule’s object store as an alternate object store" mechanism (which is suboptimal).
- The tracing of process ancestry information has been enhanced.
- Reduce number of write(2) system calls while sending the ref advertisement.
- Update the build procedure to use the "-pedantic" build when DEVELOPER makefile macro is in effect.
- Large part of "git submodule add" gets rewritten in C.
- The run-command API has been updated so that the callers can easily ask the file descriptors open for packfiles to be closed immediately before spawning commands that may trigger auto-gc.
- An oddball OPTION_ARGUMENT feature has been removed from the parse-options API.
- The mergesort implementation used to sort linked list has been optimized.
- Remove external declaration of functions that no longer exist.
- "git multi-pack-index write --bitmap" learns to propagate the hashcache from original bitmap to resulting bitmap.
- CI learns to run the leak sanitizer builds.
- "git grep --recurse-submodules" takes trees and blobs from the submodule repository, but the textconv settings when processing a blob from the submodule is not taken from the submodule repository. A test is added to demonstrate the issue, without fixing it.
- Teach "git help -c" into helping the command line completion of configuration variables.
- When "git cmd -h" shows more than one line of usage text (e.g. the cmd subcommand may take sub-sub-command), parse-options API learned to align these lines, even across i18n/l10n.
- Prevent "make sparse" from running for the source files that haven’t been modified.
- The code path to write a new version of .midx multi-pack index files has learned to release the mmaped memory holding the current version of .midx before removing them from the disk, as some platforms do not allow removal of a file that still has mapping.
- A new feature has been added to abort early in the test framework.
Fixes since v2.33 -----------------
- Input validation of "git pack-objects --stdin-packs" has been corrected.
- Bugfix for common ancestor negotiation recently introduced in "git push" code path.
- "git pull" had various corner cases that were not well thought out around its --rebase backend, e.g. "git pull --ff-only" did not stop but went ahead and rebased when the history on other side is not a descendant of our history. The series tries to fix them up.
- "git apply" miscounted the bytes and failed to read to the end of binary hunks.
- "git range-diff" code clean-up.
- "git commit --fixup" now works with "--edit" again, after it was broken in v2.32.
- Use upload-artifacts v1 (instead of v2) for 32-bit linux, as the new version has a blocker bug for that architecture.
- Checking out all the paths from HEAD during the last conflicted step in "git rebase" and continuing would cause the step to be skipped (which is expected), but leaves MERGE_MSG file behind in $GIT_DIR and confuses the next "git commit", which has been corrected.
- Various bugs in "git rebase -r" have been fixed.
- mmap() imitation used to call xmalloc() that dies upon malloc() failure, which has been corrected to just return an error to the caller to be handled.
- "git diff --relative" segfaulted and/or produced incorrect result when there are unmerged paths.
- The delayed checkout code path in "git checkout" etc. were chatty even when --quiet and/or --no-progress options were given.
- "git branch -D <branch>" used to refuse to remove a broken branch ref that points at a missing commit, which has been corrected.
- Build update for Apple clang.
- The parser for the "--nl" option of "git column" has been corrected.
- "git upload-pack" which runs on the other side of "git fetch" forgot to take the ref namespaces into account when handling want-ref requests.
- The sparse-index support can corrupt the index structure by storing a stale and/or uninitialized data, which has been corrected.
- Buggy tests could damage repositories outside the throw-away test area we created. We now by default export GIT_CEILING_DIRECTORIES to limit the damage from such a stray test.
- Even when running "git send-email" without its own threaded discussion support, a threading related header in one message is carried over to the subsequent message to result in an unwanted threading, which has been corrected.
- The output from "git fast-export", when its anonymization feature is in use, showed an annotated tag incorrectly.
- Recent "diff -m" changes broke "gitk", which has been corrected.
- The "git apply -3" code path learned not to bother the lower level merge machinery when the three-way merge can be trivially resolved without the content level merge. This fixes a regression caused by recent "-3way first and fall back to direct application" change.
- The code that optionally creates the *.rev reverse index file has been optimized to avoid needless computation when it is not writing the file out.
- "git range-diff -I… <range> <range>" segfaulted, which has been corrected.
- The order in which various files that make up a single (conceptual) packfile has been reevaluated and straightened up. This matters in correctness, as an incomplete set of files must not be shown to a running Git.
- The "mode" word is useless in a call to open(2) that does not create a new file. Such a call in the files backend of the ref subsystem has been cleaned up.
- "git update-ref --stdin" failed to flush its output as needed, which potentially led the conversation to a deadlock.
- When "git am --abort" fails to abort correctly, it still exited with exit status of 0, which has been corrected.
- Correct nr and alloc members of strvec struct to be of type size_t.
- "git stash", where the tentative change involves changing a directory to a file (or vice versa), was confused, which has been corrected.
- "git clone" from a repository whose HEAD is unborn into a bare repository didn’t follow the branch name the other side used, which is corrected.
- "git cvsserver" had a long-standing bug in its authentication code, which has finally been corrected (it is unclear and is a separate question if anybody is seriously using it, though).
- "git difftool --dir-diff" mishandled symbolic links.
- Sensitive data in the HTTP trace were supposed to be redacted, but we failed to do so in HTTP/2 requests.
- "make clean" has been updated to remove leftover .depend/ directories, even when it is not told to use them to compute header dependencies.
- Protocol v0 clients can get stuck parsing a malformed feature line.
- A few kinds of changes "git status" can show were not documented. (merge d2a534c515 ja/doc-status-types-and-copies later to maint).
- The mergesort implementation used to sort linked list has been optimized. (merge c90cfc225b rs/mergesort later to maint).
- An editor session launched during a Git operation (e.g. during ’git commit’) can leave the terminal in a funny state. The code path has updated to save the terminal state before, and restore it after, it spawns an editor. (merge 3d411afabc cm/save-restore-terminal later to maint).
- "git cat-file --batch" with the "--batch-all-objects" option is supposed to iterate over all the objects found in a repository, but it used to translate these object names using the replace mechanism, which defeats the point of enumerating all objects in the repository. This has been corrected. (merge bf972896d7 jk/cat-file-batch-all-wo-replace later to maint).
- Recent sparse-index work broke safety against attempts to add paths with trailing slashes to the index, which has been corrected. (merge c8ad9d04c6 rs/make-verify-path-really-verify-again later to maint).
- The "--color-lines" and "--color-by-age" options of "git blame" have been missing, which are now documented. (merge 8c32856133 bs/doc-blame-color-lines later to maint).
- The PATH used in CI job may be too wide and let incompatible dlls to be grabbed, which can cause the build&test to fail. Tighten it. (merge 7491ef6198 js/windows-ci-path-fix later to maint).
- Avoid performance measurements from getting ruined by gc and other housekeeping pauses interfering in the middle. (merge be79131a53 rs/disable-gc-during-perf-tests later to maint).
- Stop "git add --dry-run" from creating new blob and tree objects. (merge e578d0311d rs/add-dry-run-without-objects later to maint).
- "git commit" gave duplicated error message when the object store was unwritable, which has been corrected. (merge 4ef91a2d79 ab/fix-commit-error-message-upon-unwritable-object-store later to maint).
- Recent sparse-index addition, namely any use of index_name_pos(), can expand sparse index entries and breaks any code that walks cache-tree or existing index entries. One such instance of such a breakage has been corrected.
- The xxdiff difftool backend can exit with status 128, which the difftool-helper that launches the backend takes as a significant failure, when it is not significant at all. Work it around. (merge 571f4348dd da/mergetools-special-case-xxdiff-exit-128 later to maint).
- Improve test framework around unwritable directories. (merge 5d22e18965 ab/test-cleanly-recreate-trash-directory later to maint).
- "git push" client talking to an HTTP server did not diagnose the lack of the final status report from the other side correctly, which has been corrected. (merge c5c3486f38 jk/http-push-status-fix later to maint).
- Update "git archive" documentation and give explicit mention on the compression level for both zip and tar.gz format. (merge c4b208c309 bs/archive-doc-compression-level later to maint).
- Drop "git sparse-checkout" from the list of common commands. (merge 6a9a50a8af sg/sparse-index-not-that-common-a-command later to maint).
- "git branch -c/-m new old" was not described to copy config, which has been corrected. (merge 8252ec300e jc/branch-copy-doc later to maint).
- Squelch over-eager warning message added during this cycle.
- Fix long-standing shell syntax error in the completion script. (merge 46b0585286 re/completion-fix-test-equality later to maint).
- Teach "git commit-graph" command not to allow using replace objects at all, as we do not use the commit-graph at runtime when we see object replacement. (merge 095d112f8c ab/ignore-replace-while-working-on-commit-graph later to maint).
- "git pull --no-verify" did not affect the underlying "git merge". (merge 47bfdfb3fd ar/fix-git-pull-no-verify later to maint).
- One CI task based on Fedora image noticed a not-quite-kosher construct recently, which has been corrected.
- "git pull --ff-only" and "git pull --rebase --ff-only" should make it a no-op to attempt pulling from a remote that is behind us, but instead the command errored out by saying it was impossible to fast-forward, which may technically be true, but not a useful thing to diagnose as an error. This has been corrected. (merge 361cb52383 jc/fix-pull-ff-only-when-already-up-to-date later to maint).
- The way Cygwin emulates a unix-domain socket, on top of which the simple-ipc mechanism is implemented, can race with the program on the other side that wants to use the socket, and briefly make it appear as a regular file before lstat(2) starts reporting it as a socket. We now have a workaround on the side that connects to a unix domain socket.
- Other code cleanup, docfix, build fix, etc. (merge f188160be9 ab/bundle-remove-verbose-option later to maint). (merge 8c6b4332b4 rs/close-pack-leakfix later to maint). (merge 51b04c05b7 bs/difftool-msg-tweak later to maint). (merge dd20e4a6db ab/make-compdb-fix later to maint). (merge 6ffb990dc4 os/status-docfix later to maint). (merge 100c2da2d3 rs/p3400-lose-tac later to maint). (merge 76f3b69896 tb/aggregate-ignore-leading-whitespaces later to maint). (merge 6e4fd8bfcd tz/doc-link-to-bundle-format-fix later to maint). (merge f6c013dfa1 jc/doc-commit-header-continuation-line later to maint). (merge ec9a37d69b ab/pkt-line-cleanup later to maint). (merge 8650c6298c ab/fix-make-lint-docs later to maint). (merge 1c720357ce ab/test-lib-diff-cleanup later to maint). (merge 6b615dbece ks/submodule-add-message-fix later to maint). (merge 203eb8381a jc/doc-format-patch-clarify-auto-base later to maint). (merge 559664c792 ab/test-lib later to maint).
2.34.1
Git v2.34.1 Release Notes =========================
This release is primarily to fix a handful of regressions in Git 2.34.
Fixes since v2.34 -----------------
- "git grep" looking in a blob that has non-UTF8 payload was completely broken when linked with certain versions of PCREv2 library in the latest release.
- "git pull" with any strategy when the other side is behind us should succeed as it is a no-op, but doesn’t.
- An earlier change in 2.34.0 caused JGit application (that abused GIT_EDITOR mechanism when invoking "git config") to get stuck with a SIGTTOU signal; it has been reverted.
- An earlier change that broke .gitignore matching has been reverted.
- SubmittingPatches document gained a syntactically incorrect mark-up, which has been corrected.
2.34.2
Git v2.34.2 Release Notes =========================
This release merges up the fixes that appear in v2.30.3, v2.31.2, v2.32.1 and v2.33.2 to address the security issue CVE-2022-24765; see the release notes for these versions for details.
2.34.3
Git Documentation/RelNotes/2.34.3.txt Release Notes =========================
This release merges up the fixes that appear in v2.34.3.
2.34.4
Git v2.34.4 Release Notes =========================
This release merges up the fixes that appear in v2.30.5, v2.31.4, v2.32.3 and v2.33.4 to address the security issue CVE-2022-29187; see the release notes for these versions for details.
2.34.5
Git v2.34.5 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.34.6
Git v2.34.6 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.34.7
Git v2.34.7 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7, v2.32.6 and v2.33.7 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.34.8
Git v2.34.8 Release Notes =========================
This release merges the fixes that appear in v2.30.9, v2.31.8, v2.32.7 and v2.33.8 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.35.0
Git 2.35 Release Notes ======================
Updates since Git 2.34 ----------------------
Backward compatibility warts
- "_" is now treated as any other URL-valid characters in an URL when matching the per-URL configuration variable names.
- The color palette used by "git grep" has been updated to match that of GNU grep.
Note to those who build from the source
- You may need to define NO_UNCOMPRESS2 Makefile macro if you build with zlib older than 1.2.9.
- If your compiler cannot grok C99, the build will fail. See the instruction at the beginning of git-compat-util.h if this happens to you.
UI, Workflows & Features
- "git status --porcelain=v2" now show the number of stash entries with --show-stash like the normal output does.
- "git stash" learned the "--staged" option to stash away what has been added to the index (and nothing else).
- "git var GIT_DEFAULT_BRANCH" is a way to see what name is used for the newly created branch if "git init" is run.
- Various operating modes of "git reset" have been made to work better with the sparse index.
- "git submodule deinit" for a submodule whose .git metadata directory is embedded in its working tree refused to work, until the submodule gets converted to use the "absorbed" form where the metadata directory is stored in superproject, and a gitfile at the top-level of the working tree of the submodule points at it. The command is taught to convert such submodules to the absorbed form as needed.
- The completion script (in contrib/) learns that the "--date" option of commands from the "git log" family takes "human" and "auto" as valid values.
- "Zealous diff3" style of merge conflict presentation has been added.
- The "git log --format=%(describe)" placeholder has been extended to allow passing selected command-line options to the underlying "git describe" command.
- "default" and "reset" have been added to our color palette.
- The cryptographic signing using ssh keys can specify literal keys for keytypes whose name do not begin with the "ssh-" prefix by using the "key::" prefix mechanism (e.g. "key::ecdsa-sha2-nistp256").
- "git fetch" without the "--update-head-ok" option ought to protect a checked out branch from getting updated, to prevent the working tree that checks it out to go out of sync. The code was written before the use of "git worktree" got widespread, and only checked the branch that was checked out in the current worktree, which has been updated.
- "git name-rev" has been tweaked to give output that is shorter and easier to understand.
- "git apply" has been taught to ignore a message without a patch with the "--allow-empty" option. It also learned to honor the "--quiet" option given from the command line.
- The "init" and "set" subcommands in "git sparse-checkout" have been unified for a better user experience and performance.
- Many git commands that deal with working tree files try to remove a directory that becomes empty (i.e. "git switch" from a branch that has the directory to another branch that does not would attempt remove all files in the directory and the directory itself). This drops users into an unfamiliar situation if the command was run in a subdirectory that becomes subject to removal due to the command. The commands have been taught to keep an empty directory if it is the directory they were started in to avoid surprising users.
- "git am" learns "--empty=(stop|drop|keep)" option to tweak what is done to a piece of e-mail without a patch in it.
- The default merge message prepared by "git merge" records the name of the current branch; the name can be overridden with a new option to allow users to pretend a merge is made on a different branch.
- The way "git p4" shows file sizes in its output has been updated to use human-readable units.
- "git -c branch.autosetupmerge=inherit branch new old" makes "new" to have the same upstream as the "old" branch, instead of marking "old" itself as its upstream.
Performance, Internal Implementation, Development Support etc.
- The use of errno as a means to carry the nature of error in the ref API implementation has been reworked and reduced.
- Teach and encourage first-time contributors to this project to state the base commit when they submit their topic.
- The command line completion for "git send-email" options have been tweaked to make it easier to keep it in sync with the command itself.
- Ensure that the sparseness of the in-core index matches the index.sparse configuration specified by the repository immediately after the on-disk index file is read.
- Code clean-up to eventually allow information on remotes defined for an arbitrary repository to be read.
- Build optimization.
- Tighten code for testing pack-bitmap.
- Weather balloon to break people with compilers that do not support C99.
- The "reftable" backend for the refs API, without integrating into the refs subsystem, has been added.
- More tests are marked as leak-free.
- The test framework learns to list unsatisfied test prerequisites, and optionally error out when prerequisites that are expected to be satisfied are not.
- The default setting for trace2 event nesting was too low to cause test failures, which is worked around by bumping it up in the test framework.
- Drop support for TravisCI and update test workflows at GitHub.
- Many tests that used to need GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME mechanism to force "git" to use ’master’ as the default name for the initial branch no longer need it; the use of the mechanism from them have been removed.
- Allow running our tests while disabling fsync.
- Document the parameters given to the reflog entry iterator callback functions. (merge e6e94f34b2 jc/reflog-iterator-callback-doc later to maint).
- The test helper for refs subsystem learned to write bogus and/or nonexistent object name to refs to simulate error situations we want to test Git in.
- "diff --histogram" optimization.
- Weather balloon to find compilers that do not grok variable declaration in the for() loop.
- diff and blame commands have been taught to work better with sparse index.
- The chainlint test script linter in the test suite has been updated.
- The DEVELOPER=yes build uses -std=gnu99 now.
- "git format-patch" uses a single rev_info instance and then exits. Mark the structure with UNLEAK() macro to squelch leak sanitizer.
- New interface into the tmp-objdir API to help in-core use of the quarantine feature.
- Broken &&-chains in the test scripts have been corrected.
- The RCS keyword substitution in "git p4" used to be done assuming that the contents are UTF-8 text, which can trigger decoding errors. We now treat the contents as a bytestring for robustness and correctness.
- The conditions to choose different definitions of the FLEX_ARRAY macro for vendor compilers has been simplified to make it easier to maintain.
- Correctness and performance update to "diff --color-moved" feature.
- "git upload-pack" (the other side of "git fetch") used a 8kB buffer but most of its payload came on 64kB "packets". The buffer size has been enlarged so that such a packet fits.
- "git fetch" and "git pull" are now declared sparse-index clean. Also "git ls-files" learns the "--sparse" option to help debugging.
- Similar message templates have been consolidated so that translators need to work on fewer number of messages.
Fixes since v2.34 -----------------
- "git grep" looking in a blob that has non-UTF8 payload was completely broken when linked with certain versions of PCREv2 library in the latest release.
- Other code cleanup, docfix, build fix, etc.
- "git pull" with any strategy when the other side is behind us should succeed as it is a no-op, but doesn’t.
- An earlier change in 2.34.0 caused JGit application (that abused GIT_EDITOR mechanism when invoking "git config") to get stuck with a SIGTTOU signal; it has been reverted.
- An earlier change that broke .gitignore matching has been reverted.
- Things like "git -c branch.sort=bogus branch new HEAD", i.e. the operation modes of the "git branch" command that do not need the sort key information, no longer errors out by seeing a bogus sort key. (merge 98e7ab6d42 jc/fix-ref-sorting-parse later to maint).
- The compatibility implementation for unsetenv(3) were written to mimic ancient, non-POSIX, variant seen in an old glibc; it has been changed to return an integer to match the more modern era. (merge a38989bd5b jc/unsetenv-returns-an-int later to maint).
- The clean/smudge conversion code path has been prepared to better work on platforms where ulong is narrower than size_t. (merge 596b5e77c9 mc/clean-smudge-with-llp64 later to maint).
- Redact the path part of packfile URI that appears in the trace output. (merge 0ba558ffb1 if/redact-packfile-uri later to maint).
- CI has been taught to catch some Unicode directional formatting sequence that can be used in certain mischief. (merge 0e7696c64d js/ci-no-directional-formatting later to maint).
- The "--date=format:<strftime>" gained a workaround for the lack of system support for a non-local timezone to handle "%s" placeholder. (merge 9b591b9403 jk/strbuf-addftime-seconds-since-epoch later to maint).
- The "merge" subcommand of "git jump" (in contrib/) silently ignored pathspec and other parameters. (merge 67ba13e5a4 jk/jump-merge-with-pathspec later to maint).
- The code to decode the length of packed object size has been corrected. (merge 34de5b8eac jt/pack-header-lshift-overflow later to maint).
- The advice message given by "git pull" when the user hasn’t made a choice between merge and rebase still said that the merge is the default, which no longer is the case. This has been corrected. (merge 71076d0edd ah/advice-pull-has-no-preference-between-rebase-and-merge later to maint).
- "git fetch", when received a bad packfile, can fail with SIGPIPE. This wasn’t wrong per-se, but we now detect the situation and fail in a more predictable way. (merge 2a4aed42ec jk/fetch-pack-avoid-sigpipe-to-index-pack later to maint).
- The function to cull a child process and determine the exit status had two separate code paths for normal callers and callers in a signal handler, and the latter did not yield correct value when the child has caught a signal. The handling of the exit status has been unified for these two code paths. An existing test with flakiness has also been corrected. (merge 5263e22cba jk/t7006-sigpipe-tests-fix later to maint).
- When a non-existent program is given as the pager, we tried to reuse an uninitialized child_process structure and crashed, which has been fixed. (merge f917f57f40 em/missing-pager later to maint).
- The single-key-input mode in "git add -p" had some code to handle keys that generate a sequence of input via ReadKey(), which did not handle end-of-file correctly, which has been fixed. (merge fc8a8126df cb/add-p-single-key-fix later to maint).
- "git rebase -x" added an unnecessary ’exec’ instructions before ’noop’, which has been corrected. (merge cc9dcdee61 en/rebase-x-fix later to maint).
- When the "git push" command is killed while the receiving end is trying to report what happened to the ref update proposals, the latter used to die, due to SIGPIPE. The code now ignores SIGPIPE to increase our chances to run the post-receive hook after it happens. (merge d34182b9e3 rj/receive-pack-avoid-sigpipe-during-status-reporting later to maint).
- "git worktree add" showed "Preparing worktree" message to the standard output stream, but when it failed, the message from die() went to the standard error stream. Depending on the order the stdio streams are flushed at the program end, this resulted in confusing output. It has been corrected by sending all the chatty messages to the standard error stream. (merge b50252484f es/worktree-chatty-to-stderr later to maint).
- Coding guideline document has been updated to clarify what goes to standard error in our system. (merge e258eb4800 es/doc-stdout-vs-stderr later to maint).
- The sparse-index/sparse-checkout feature had a bug in its use of the matching code to determine which path is in or outside the sparse checkout patterns. (merge 8c5de0d265 ds/sparse-deep-pattern-checkout-fix later to maint).
- "git rebase -x" by mistake started exporting the GIT_DIR and GIT_WORK_TREE environment variables when the command was rewritten in C, which has been corrected. (merge 434e0636db en/rebase-x-wo-git-dir-env later to maint).
- When "git log" implicitly enabled the "decoration" processing without being explicitly asked with "--decorate" option, it failed to read and honor the settings given by the "--decorate-refs" option.
- "git fetch --set-upstream" did not check if there is a current branch, leading to a segfault when it is run on a detached HEAD, which has been corrected. (merge 17baeaf82d ab/fetch-set-upstream-while-detached later to maint).
- Among some code paths that ask an yes/no question, only one place gave a prompt that looked different from the others, which has been updated to match what the others create. (merge 0fc8ed154c km/help-prompt-fix later to maint).
- "git log --invert-grep --author=<name>" used to exclude commits written by the given author, but now "--invert-grep" only affects the matches made by the "--grep=<pattern>" option. (merge 794c000267 rs/log-invert-grep-with-headers later to maint).
- "git grep --perl-regexp" failed to match UTF-8 characters with wildcard when the pattern consists only of ASCII letters, which has been corrected. (merge 32e3e8bc55 rs/pcre2-utf later to maint).
- Certain sparse-checkout patterns that are valid in non-cone mode led to segfault in cone mode, which has been corrected.
- Use of certain "git rev-list" options with "git fast-export" created nonsense results (the worst two of which being "--reverse" and "--invert-grep --grep=<foo>"). The use of "--first-parent" is made to behave a bit more sensible than before. (merge 726a228dfb ws/fast-export-with-revision-options later to maint).
- Perf tests were run with end-user’s shell, but it has been corrected to use the shell specified by $TEST_SHELL_PATH. (merge 9ccab75608 ja/perf-use-specified-shell later to maint).
- Fix dependency rules to generate hook-list.h header file. (merge d3fd1a6667 ab/makefile-hook-list-dependency-fix later to maint).
- "git stash" by default triggers its "push" action, but its implementation also made "git stash -h" to show short help only for "git stash push", which has been corrected. (merge ca7990cea5 ab/do-not-limit-stash-help-to-push later to maint).
- "git apply --3way" bypasses the attempt to do a three-way application in more cases to address the regression caused by the recent change to use direct application as a fallback. (merge 34d607032c jz/apply-3-corner-cases later to maint).
- Fix performance-releated bug in "git subtree" (in contrib/). (merge 3ce8888fb4 jl/subtree-check-parents-argument-passing-fix later to maint).
- Extend the guidance to choose the base commit to build your work on, and hint/nudge contributors to read others’ changes. (merge fdfae830f8 jc/doc-submitting-patches-choice-of-base later to maint).
- A corner case bug in the ort merge strategy has been corrected. (merge d30126c20d en/merge-ort-renorm-with-rename-delete-conflict-fix later to maint).
- "git stash apply" forgot to attempt restoring untracked files when it failed to restore changes to tracked ones. (merge 71cade5a0b en/stash-df-fix later to maint).
- Calling dynamically loaded functions on Windows has been corrected. (merge 4a9b204920 ma/windows-dynload-fix later to maint).
- Some lockfile code called free() in signal-death code path, which has been corrected. (merge 58d4d7f1c5 ps/lockfile-cleanup-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 74db416c9c cw/protocol-v2-doc-fix later to maint). (merge f9b2b6684d ja/doc-cleanup later to maint). (merge 7d1b866778 jc/fix-first-object-walk later to maint). (merge 538ac74604 js/trace2-avoid-recursive-errors later to maint). (merge 152923b132 jk/t5319-midx-corruption-test-deflake later to maint). (merge 9081a421a6 ab/checkout-branch-info-leakfix later to maint). (merge 42c456ff81 rs/mergesort later to maint). (merge ad506e6780 tl/midx-docfix later to maint). (merge bf5b83fd8a hk/ci-checkwhitespace-commentfix later to maint). (merge 49f1eb3b34 jk/refs-g11-workaround later to maint). (merge 7d3fc7df70 jt/midx-doc-fix later to maint). (merge 7b089120d9 hn/create-reflog-simplify later to maint). (merge 9e12400da8 cb/mingw-gmtime-r later to maint). (merge 0bf0de6cc7 tb/pack-revindex-on-disk-cleanup later to maint). (merge 2c68f577fc ew/cbtree-remove-unused-and-broken-cb-unlink later to maint). (merge eafd6e7e55 ab/die-with-bug later to maint). (merge 91028f7659 jc/grep-patterntype-default-doc later to maint). (merge 47ca93d071 ds/repack-fixlets later to maint). (merge e6a9bc0c60 rs/t4202-invert-grep-test-fix later to maint). (merge deb5407a42 gh/gpg-doc-markup-fix later to maint). (merge 999bba3e0b rs/daemon-plug-leak later to maint). (merge 786eb1ba39 js/l10n-mention-ngettext-early-in-readme later to maint). (merge 2f12b31b74 ab/makefile-msgfmt-wo-stats later to maint). (merge 0517f591ca fs/gpg-unknown-key-test-fix later to maint). (merge 97d6fb5a1f ma/header-dup-cleanup later to maint).
2.35.1
Git v2.35.1 Release Notes =========================
Git 2.35 shipped with a regression that broke use of "rebase" and "stash" in a secondary worktree. This maintenance release ought to fix it.
2.35.2
Git v2.35.2 Release Notes =========================
This release merges up the fixes that appear in v2.30.3, v2.31.2, v2.32.1, v2.33.2 and v2.34.2 to address the security issue CVE-2022-24765; see the release notes for these versions for details.
2.35.3
Git Documentation/RelNotes/2.35.3.txt Release Notes =========================
This release merges up the fixes that appear in v2.35.3.
2.35.4
Git v2.35.4 Release Notes =========================
This release merges up the fixes that appear in v2.30.5, v2.31.4, v2.32.3, v2.33.4 and v2.34.4 to address the security issue CVE-2022-29187; see the release notes for these versions for details.
2.35.5
Git v2.35.5 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.35.6
Git v2.35.6 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.35.7
Git v2.35.7 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7, v2.32.6, v2.33.7 and v2.34.7 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.35.8
Git v2.35.8 Release Notes =========================
This release merges the fixes that appear in v2.30.9, v2.31.8, v2.32.7, v2.33.8 and v2.34.8 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.36.0
Git 2.36 Release Notes ======================
Updates since Git 2.35 ----------------------
Backward compatibility warts
- "git name-rev --stdin" has been deprecated and issues a warning when used; use "git name-rev --annotate-stdin" instead.
- "git clone --filter=… --recurse-submodules" only makes the top-level a partial clone, while submodules are fully cloned. This behaviour is changed to pass the same filter down to the submodules.
- With the fixes for CVE-2022-24765 that are common with versions of Git 2.30.4, 2.31.3, 2.32.2, 2.33.3, 2.34.3, and 2.35.3, Git has been taught not to recognise repositories owned by other users, in order to avoid getting affected by their config files and hooks. You can list the path to the safe/trusted repositories that may be owned by others on a multi-valued configuration variable
safe.directoryto override this behaviour, or use ’*’ to declare that you trust anything.
Note to those who build from the source
- Since Git 2.31, our source assumed that the compiler you use to build Git supports variadic macros, with an easy-to-use escape hatch to allow compilation without variadic macros with an request to report that you had to use the escape hatch to the list. Because we haven’t heard from anybody who actually needed to use the escape hatch, it has been removed, making support of variadic macros a hard requirement.
UI, Workflows & Features
- Assorted updates to "git cat-file", especially "-h".
- The command line completion (in contrib/) learns to complete arguments to give to "git sparse-checkout" command.
- "git log --remerge-diff" shows the difference from mechanical merge result and the result that is actually recorded in a merge commit.
- "git log" and friends learned an option --exclude-first-parent-only to propagate UNINTERESTING bit down only along the first-parent chain, just like --first-parent option shows commits that lack the UNINTERESTING bit only along the first-parent chain.
- The command line completion script (in contrib/) learned to complete all Git subcommands, including the ones that are normally hidden, when GIT_COMPLETION_SHOW_ALL_COMMANDS is used.
- "git branch" learned the "--recurse-submodules" option.
- A user can forget to make a script file executable before giving it to "git bisect run". In such a case, all tests will exit with 126 or 127 error codes, even on revisions that are marked as good. Try to recognize this situation and stop iteration early.
- When "index-pack" dies due to incoming data exceeding the maximum allowed input size, include the value of the limit in the error message.
- The error message given by "git switch HEAD~4" has been clarified to suggest the "--detach" option that is required.
- In sparse-checkouts, files mis-marked as missing from the working tree could lead to later problems. Such files were hard to discover, and harder to correct. Automatically detecting and correcting the marking of such files has been added to avoid these problems.
- "git cat-file" learns "--batch-command" mode, which is a more flexible interface than the existing "--batch" or "--batch-check" modes, to allow different kinds of inquiries made.
- The level of verbose output from the ort backend during inner merge has been aligned to that of the recursive backend.
- "git remote rename A B", depending on the number of remote-tracking refs involved, takes long time renaming them. The command has been taught to show progress bar while making the user wait.
- Bundle file format gets extended to allow a partial bundle, filtered by similar criteria you would give when making a partial/lazy clone.
- A new built-in userdiff driver for kotlin has been added.
- "git repack" learned a new configuration to disable triggering of age-old "update-server-info" command, which is rarely useful these days.
- "git stash" does not allow subcommands it internally runs as its implementation detail, except for "git reset", to emit messages; now "git reset" part has also been squelched.
- "git ls-tree" learns "--oid-only" option, similar to "--name-only", and more generalized "--format" option.
- "git fetch --refetch" learned to fetch everything without telling the other side what we already have, which is useful when you cannot trust what you have in the local object store.
- "git branch" gives hint when branch tracking cannot be established because fetch refspecs from multiple remote repositories overlap.
- "git worktree list --porcelain" did not c-quote pathnames and lock reasons with unsafe bytes correctly, which is worked around by introducing NUL terminated output format with "-z".
Performance, Internal Implementation, Development Support etc.
- "git apply" (ab)used the util pointer of the string-list to keep track of how each symbolic link needs to be handled, which has been simplified by using strset.
- Fix a hand-rolled alloca() imitation that may have violated alignment requirement of data being sorted in compatibility implementation of qsort_s() and stable qsort().
- Use the parse-options API in "git reflog" command.
- The conditional inclusion mechanism of configuration files using "[includeIf <condition>]" learns to base its decision on the URL of the remote repository the repository interacts with. (merge 399b198489 jt/conditional-config-on-remote-url later to maint).
- "git name-rev --stdin" does not behave like usual "--stdin" at all. Start the process of renaming it to "--annotate-stdin". (merge a2585719b3 jc/name-rev-stdin later to maint).
- "git update-index", "git checkout-index", and "git clean" are taught to work better with the sparse checkout feature.
- Use an internal call to reset_head() helper function instead of spawning "git checkout" in "rebase", and update code paths that are involved in the change.
- Messages "ort" merge backend prepares while dealing with conflicted paths were unnecessarily confusing since it did not differentiate inner merges and outer merges.
- Small modernization of the rerere-train script (in contrib/).
- Use designated initializers we started using in mid 2017 in more parts of the codebase that are relatively quiescent.
- Improve failure case behaviour of xdiff library when memory allocation fails.
- General clean-up in reftable implementation, including clarification of the API documentation, tightening the code to honor documented length limit, etc.
- Remove the escape hatch we added when we introduced the weather balloon to use variadic macros unconditionally, to make it official that we now have a hard dependency on the feature.
- Makefile refactoring with a bit of suffixes rule stripping to optimize the runtime overhead.
- "git stash drop" is reimplemented as an internal call to reflog_delete() function, instead of invoking "git reflog delete" via run_command() API.
- Count string_list items in size_t, not "unsigned int".
- The single-key interactive operation used by "git add -p" has been made more robust.
- Remove unneeded <meta http-equiv=content-type…> from gitweb output.
- "git name-rev" learned to use the generation numbers when setting the lower bound of searching commits used to explain the revision, when available, instead of committer time.
- Replace core.fsyncObjectFiles with two new configuration variables, core.fsync and core.fsyncMethod.
- Updates to refs traditionally weren’t fsync’ed, but we can configure using core.fsync variable to do so.
- "git reflog" command now uses parse-options API to parse its command line options.
Fixes since v2.35 -----------------
- "rebase" and "stash" in secondary worktrees are broken in Git 2.35.0, which has been corrected.
- "git pull --rebase" ignored the rebase.autostash configuration variable when the remote history is a descendant of our history, which has been corrected. (merge 3013d98d7a pb/pull-rebase-autostash-fix later to maint).
- "git update-index --refresh" has been taught to deal better with racy timestamps (just like "git status" already does). (merge 2ede073fd2 ms/update-index-racy later to maint).
- Avoid tests that are run under GIT_TRACE2 set from failing unnecessarily. (merge 944d808e42 js/test-unset-trace2-parents later to maint).
- The merge-ort misbehaved when merge.renameLimit configuration is set too low and failed to find all renames. (merge 9ae39fef7f en/merge-ort-restart-optim-fix later to maint).
- We explain that revs come first before the pathspec among command line arguments, but did not spell out that dashed options come before other args, which has been corrected. (merge c11f95010c tl/doc-cli-options-first later to maint).
- "git add -p" rewritten in C regressed hunk splitting in some cases, which has been corrected. (merge 7008ddc645 pw/add-p-hunk-split-fix later to maint).
- "git fetch --negotiate-only" is an internal command used by "git push" to figure out which part of our history is missing from the other side. It should never recurse into submodules even when fetch.recursesubmodules configuration variable is set, nor it should trigger "gc". The code has been tightened up to ensure it only does common ancestry discovery and nothing else. (merge de4eaae63a gc/fetch-negotiate-only-early-return later to maint).
- The code path that verifies signatures made with ssh were made to work better on a system with CRLF line endings. (merge caeef01ea7 fs/ssh-signing-crlf later to maint).
- "git sparse-checkout init" failed to write into $GIT_DIR/info directory when the repository was created without one, which has been corrected to auto-create it. (merge 7f44842ac1 jt/sparse-checkout-leading-dir-fix later to maint).
- Cloning from a repository that does not yet have any branches or tags but has other refs resulted in a "remote transport reported error", which has been corrected. (merge dccea605b6 jt/clone-not-quite-empty later to maint).
- Mark in various places in the code that the sparse index and the split index features are mutually incompatible. (merge 451b66c533 js/sparse-vs-split-index later to maint).
- Update the logic to compute alignment requirement for our mem-pool. (merge e38bcc66d8 jc/mem-pool-alignment later to maint).
- Pick a better random number generator and use it when we prepare temporary filenames. (merge 47efda967c bc/csprng-mktemps later to maint).
- Update the contributor-facing documents on proposed log messages. (merge cdba0295b0 jc/doc-log-messages later to maint).
- When "git fetch --prune" failed to prune the refs it wanted to prune, the command issued error messages but exited with exit status 0, which has been corrected. (merge c9e04d905e tg/fetch-prune-exit-code-fix later to maint).
- Problems identified by Coverity in the reftable code have been corrected. (merge 01033de49f hn/reftable-coverity-fixes later to maint).
- A bug that made multi-pack bitmap and the object order out-of-sync, making the .midx data corrupt, has been fixed. (merge f8b60cf99b tb/midx-bitmap-corruption-fix later to maint).
- The build procedure has been taught to notice older version of zlib and enable our replacement uncompress2() automatically. (merge 07564773c2 ab/auto-detect-zlib-compress2 later to maint).
- Interaction between fetch.negotiationAlgorithm and feature.experimental configuration variables has been corrected. (merge 714edc620c en/fetch-negotiation-default-fix later to maint).
- "git diff --diff-filter=aR" is now parsed correctly. (merge 75408ca949 js/diff-filter-negation-fix later to maint).
- When "git subtree" wants to create a merge, it used "git merge" and let it be affected by end-user’s "merge.ff" configuration, which has been corrected. (merge 9158a3564a tk/subtree-merge-not-ff-only later to maint).
- Unlike "git apply", "git patch-id" did not handle patches with hunks that has only 1 line in either preimage or postimage, which has been corrected. (merge 757e75c81e jz/patch-id-hunk-header-parsing-fix later to maint).
- "receive-pack" checks if it will do any ref updates (various conditions could reject a push) before received objects are taken out of the temporary directory used for quarantine purposes, so that a push that is known-to-fail will not leave crufts that a future "gc" needs to clean up. (merge 5407764069 cb/clear-quarantine-early-on-all-ref-update-errors later to maint).
- When there is no object to write .bitmap file for, "git multi-pack-index" triggered an error, instead of just skipping, which has been corrected. (merge eb57277ba3 tb/midx-no-bitmap-for-no-objects later to maint).
- "git cmd -h" outside a repository should error out cleanly for many commands, but instead it hit a BUG(), which has been corrected. (merge 87ad07d735 js/short-help-outside-repo-fix later to maint).
- "working tree" and "per-worktree ref" were in glossary, but "worktree" itself wasn’t, which has been corrected. (merge 2df5387ed0 jc/glossary-worktree later to maint).
- L10n support for a few error messages. (merge 3d3c23b3a7 bs/forbid-i18n-of-protocol-token-in-fetch-pack later to maint).
- Test modernization. (merge d4fe066e4b sy/t0001-use-path-is-helper later to maint).
- "git log --graph --graph" used to leak a graph structure, and there was no way to countermand "--graph" that appear earlier on the command line. A "--no-graph" option has been added and resource leakage has been plugged.
- Error output given in response to an ambiguous object name has been improved. (merge 3a73c1dfaf ab/ambiguous-object-name later to maint).
- "git sparse-checkout" wants to work with per-worktree configuration, but did not work well in a worktree attached to a bare repository. (merge 3ce1138272 ds/sparse-checkout-requires-per-worktree-config later to maint).
- Setting core.untrackedCache to true failed to add the untracked cache extension to the index.
- Workaround we have for versions of PCRE2 before their version 10.36 were in effect only for their versions newer than 10.36 by mistake, which has been corrected. (merge 97169fc361 rs/pcre-invalid-utf8-fix-fix later to maint).
- Document Taylor as a new member of Git PLC at SFC. Welcome. (merge e8d56ca863 tb/coc-plc-update later to maint).
- "git checkout -b branch/with/multi/level/name && git stash" only recorded the last level component of the branch name, which has been corrected.
- Check the return value from parse_tree_indirect() to turn segfaults into calls to die(). (merge 8d2eaf649a gc/parse-tree-indirect-errors later to maint).
- Newer version of GPGSM changed its output in a backward incompatible way to break our code that parses its output. It also added more processes our tests need to kill when cleaning up. Adjustments have been made to accommodate these changes. (merge b0b70d54c4 fs/gpgsm-update later to maint).
- The untracked cache newly computed weren’t written back to the on-disk index file when there is no other change to the index, which has been corrected.
- "git config -h" did not describe the "--type" option correctly. (merge 5445124fad mf/fix-type-in-config-h later to maint).
- The way generation number v2 in the commit-graph files are (not) handled has been corrected. (merge 6dbf4b8172 ds/commit-graph-gen-v2-fixes later to maint).
- The method to trigger malloc check used in our tests no longer work with newer versions of glibc. (merge baedc59543 ep/test-malloc-check-with-glibc-2.34 later to maint).
- When "git fetch --recurse-submodules" grabbed submodule commits that would be needed to recursively check out newly fetched commits in the superproject, it only paid attention to submodules that are in the current checkout of the superproject. We now do so for all submodules that have been run "git submodule init" on.
- "git rebase $base $non_branch_commit", when $base is an ancestor or the $non_branch_commit, modified the current branch, which has been corrected.
- When "shallow" information is updated, we forgot to update the in-core equivalent, which has been corrected.
- When creating a loose object file, we didn’t report the exact filename of the file we failed to fsync, even though the information was readily available, which has been corrected.
- "git am" can read from the standard input when no mailbox is given on the command line, but the end-user gets no indication when it happens, making Git appear stuck. (merge 7b20af6a06 jc/mailsplit-warn-on-tty later to maint).
- "git mv" failed to refresh the cached stat information for the entry it moved. (merge b7f9130a06 vd/mv-refresh-stat later to maint).
- Other code cleanup, docfix, build fix, etc. (merge cfc5cf428b jc/find-header later to maint). (merge 40e7cfdd46 jh/p4-fix-use-of-process-error-exception later to maint). (merge 727e6ea350 jh/p4-spawning-external-commands-cleanup later to maint). (merge 0a6adc26e2 rs/grep-expr-cleanup later to maint). (merge 4ed7dfa713 po/readme-mention-contributor-hints later to maint). (merge 6046f7a91c en/plug-leaks-in-merge later to maint). (merge 8c591dbfce bc/clarify-eol-attr later to maint). (merge 518e15db74 rs/parse-options-lithelp-help later to maint). (merge cbac0076ef gh/doc-typos later to maint). (merge ce14de03db ab/no-errno-from-resolve-ref-unsafe later to maint). (merge 2826ffad8c rc/negotiate-only-typofix later to maint). (merge 0f03f04c5c en/sparse-checkout-leakfix later to maint). (merge 74f3390dde sy/diff-usage-typofix later to maint). (merge 45d0212a71 ll/doc-mktree-typofix later to maint). (merge e9b272e4c1 js/no-more-legacy-stash later to maint). (merge 6798b08e84 ab/do-not-hide-failures-in-git-dot-pm later to maint). (merge 9325285df4 po/doc-check-ignore-markup-fix later to maint). (merge cd26cd6c7c sy/modernize-t-lib-read-tree-m-3way later to maint). (merge d17294a05e ab/hash-object-leakfix later to maint). (merge b8403129d3 jd/t0015-modernize later to maint). (merge 332acc248d ds/mailmap later to maint). (merge 04bf052eef ab/grep-patterntype later to maint). (merge 6ee36364eb ab/diff-free-more later to maint). (merge 63a36017fe nj/read-tree-doc-reffix later to maint). (merge eed36fce38 sm/no-git-in-upstream-of-pipe-in-tests later to maint). (merge c614beb933 ep/t6423-modernize later to maint). (merge 57be9c6dee ab/reflog-prep-fix later to maint). (merge 5327d8982a js/in-place-reverse-in-sequencer later to maint). (merge 2e2c0be51e dp/worktree-repair-in-usage later to maint). (merge 6563706568 jc/coding-guidelines-decl-in-for-loop later to maint).
2.36.1
Git v2.36.1 Release Notes =========================
Fixes since v2.36 -----------------
- "git submodule update" without pathspec should silently skip an uninitialized submodule, but it started to become noisy by mistake.
- "diff-tree --stdin" has been broken for about a year, but 2.36 release broke it even worse by breaking running the command with <pathspec>, which in turn broke "gitk" and got noticed. This has been corrected by aligning its behaviour to that of "log".
- Regression fix for 2.36 where "git name-rev" started to sometimes reference strings after they are freed.
- "git show <commit1> <commit2>… — <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected.
- "git fast-export — <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected.
- "git format-patch <args> — <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected.
- Get rid of a bogus and over-eager coccinelle rule.
- Correct choices of C compilers used in various CI jobs.
Also contains minor documentation updates and code clean-ups.
2.36.2
Git v2.36.2 Release Notes =========================
This release merges up the fixes that appear in v2.30.5, v2.31.4, v2.32.3, v2.33.4, v2.34.4 and v2.35.4 to address the security issue CVE-2022-29187; see the release notes for these versions for details.
Apart from that, this maintenance release is primarily to merge down updates to the build and CI procedures from the ’master’ front, in order to ensure that we can cut healthy maintenance releases in the future. It also contains a handful of small and trivially-correct bugfixes.
Fixes since v2.36.1 -------------------
- Fixes real problems noticed by gcc 12 and works around false positives.
- Update URL to the gitk repository.
- The "--current" option of "git show-branch" should have been made incompatible with the "--reflog" mode, but this was not enforced, which has been corrected.
- "git archive --add-file=<path>" picked up the raw permission bits from the path and propagated to zip output in some cases, without normalization, which has been corrected (tar output did not have this issue).
- A bit of test framework fixes with a few fixes to issues found by valgrind.
- macOS CI jobs have been occasionally flaky due to tentative version skew between perforce and the homebrew packager. Instead of failing the whole CI job, just let it skip the p4 tests when this happens.
- The commit summary shown after making a commit is matched to what is given in "git status" not to use the break-rewrite heuristics.
- Avoid problems from interaction between malloc_check and address sanitizer.
- "git rebase --keep-base <upstream> <branch-to-rebase>" computed the commit to rebase onto incorrectly, which has been corrected.
- The path taken by "git multi-pack-index" command from the end user was compared with path internally prepared by the tool withut first normalizing, which lead to duplicated paths not being noticed, which has been corrected.
- "git clone --origin X" leaked piece of memory that held value read from the clone.defaultRemoteName configuration variable, which has been plugged.
2.36.3
Git v2.36.3 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.36.4
Git v2.36.4 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.36.5
Git v2.36.5 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7, v2.32.6, v2.33.7, v2.34.7 and v2.35.7 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.36.6
Git v2.36.6 Release Notes =========================
This release merges the fixes that appear in v2.30.9, v2.31.8, v2.32.7, v2.33.8, v2.34.8 and v2.35.8 to address the security issues CVE-2023-25652, CVS-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.37.0
Git v2.37 Release Notes =======================
UI, Workflows & Features
- "vimdiff[123]" mergetool drivers have been reimplemented with a more generic layout mechanism.
- "git -v" and "git -h" are now understood as "git --version" and "git --help".
- The temporary files fed to external diff command are now generated inside a new temporary directory under the same basename.
- "git log --since=X" will stop traversal upon seeing a commit that is older than X, but there may be commits behind it that is younger than X when the commit was created with a faulty clock. A new option is added to keep digging without stopping, and instead filter out commits with timestamp older than X.
- "git -c branch.autosetupmerge=simple branch $A $B" will set the $B as $A’s upstream only when $A and $B shares the same name, and "git -c push.default=simple" on branch $A would push to update the branch $A at the remote $B came from. Also more places use the sole remote, if exists, before defaulting to ’origin’.
- A new doc has been added that lists tips for tools to work with Git’s codebase.
- "git remote -v" now shows the list-objects-filter used during fetching from the remote, if available.
- With the new http.curloptResolve configuration, the CURLOPT_RESOLVE mechanism that allows cURL based applications to use pre-resolved IP addresses for the requests is exposed to the scripts.
- "git add -i" was rewritten in C some time ago and has been in testing; the reimplementation is now exposed to general public by default.
- Deprecate non-cone mode of the sparse-checkout feature.
- Introduce a filesystem-dependent mechanism to optimize the way the bits for many loose object files are ensured to hit the disk platter.
- The "do not remove the directory the user started Git in" logic, when Git cannot tell where that directory is, is disabled. Earlier we refused to run in such a case.
- A mechanism to pack unreachable objects into a "cruft pack", instead of ejecting them into loose form to be reclaimed later, has been introduced.
- Update the doctype written in gitweb output to xhtml5.
- The "transfer.credentialsInURL" configuration variable controls what happens when a URL with embedded login credential is used on either "fetch" or "push". Credentials are currently only detected in
remote.<name>.urlconfig, notremote.<name>.pushurl.
- "git revert" learns "--reference" option to use more human-readable reference to the commit it reverts in the message template it prepares for the user.
- Various error messages that talk about the removal of "--preserve-merges" in "rebase" have been strengthened, and "rebase --abort" learned to get out of a state that was left by an earlier use of the option.
Performance, Internal Implementation, Development Support etc.
- The performance of the "untracked cache" feature has been improved when "--untracked-files=<mode>" and "status.showUntrackedFiles" are combined.
- "git stash" works better with sparse index entries.
- "git show :<path>" learned to work better with the sparse-index feature.
- Introduce and apply coccinelle rule to discourage an explicit comparison between a pointer and NULL, and applies the clean-up to the maintenance track.
- Preliminary code refactoring around transport and bundle code.
- "sparse-checkout" learns to work better with the sparse-index feature.
- A workflow change for translators are being proposed. git.pot is no longer version controlled and it is local responsibility of translators to generate it.
- Plug the memory leaks from the trickiest API of all, the revision walker.
- Rename .env_array member to .env in the child_process structure.
- The fsmonitor—daemon handles even more corner cases when watching filesystem events.
- A new bug() and BUG_if_bug() API is introduced to make it easier to uniformly log "detect multiple bugs and abort in the end" pattern.
Fixes since v2.36 -----------------
- "git submodule update" without pathspec should silently skip an uninitialized submodule, but it started to become noisy by mistake. (merge 4f1ccef87c gc/submodule-update-part2 later to maint).
- "diff-tree --stdin" has been broken for about a year, but 2.36 release broke it even worse by breaking running the command with <pathspec>, which in turn broke "gitk" and got noticed. This has been corrected by aligning its behaviour to that of "log". (merge f8781bfda3 jc/diff-tree-stdin-fix later to maint).
- Regression fix for 2.36 where "git name-rev" started to sometimes reference strings after they are freed. (merge 45a14f578e rs/name-rev-fix-free-after-use later to maint).
- "git show <commit1> <commit2>… — <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected. (merge 5cdb38458e jc/show-pathspec-fix later to maint).
- "git fast-export — <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected. (merge d1c25272f5 rs/fast-export-pathspec-fix later to maint).
- "git format-patch <args> — <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected. (merge 91f8f7e46f rs/format-patch-pathspec-fix later to maint).
- "git clone --origin X" leaked piece of memory that held value read from the clone.defaultRemoteName configuration variable, which has been plugged. (merge 6dfadc8981 jc/clone-remote-name-leak-fix later to maint).
- Get rid of a bogus and over-eager coccinelle rule. (merge 08bdd3a185 jc/cocci-xstrdup-or-null-fix later to maint).
- The path taken by "git multi-pack-index" command from the end user was compared with path internally prepared by the tool without first normalizing, which lead to duplicated paths not being noticed, which has been corrected. (merge 11f9e8de3d ds/midx-normalize-pathname-before-comparison later to maint).
- Correct choices of C compilers used in various CI jobs. (merge 3506cae04f ab/cc-package-fixes later to maint).
- Various cleanups to "git p4". (merge 4ff0108d9e jh/p4-various-fixups later to maint).
- The progress meter of "git blame" was showing incorrect numbers when processing only parts of the file. (merge e5f5d7d42e ea/progress-partial-blame later to maint).
- "git rebase --keep-base <upstream> <branch-to-rebase>" computed the commit to rebase onto incorrectly, which has been corrected. (merge 9e5ebe9668 ah/rebase-keep-base-fix later to maint).
- Fix a leak of FILE * in an error codepath. (merge c0befa0c03 kt/commit-graph-plug-fp-leak-on-error later to maint).
- Avoid problems from interaction between malloc_check and address sanitizer. (merge 067109a5e7 pw/test-malloc-with-sanitize-address later to maint).
- The commit summary shown after making a commit is matched to what is given in "git status" not to use the break-rewrite heuristics. (merge 84792322ed rs/commit-summary-wo-break-rewrite later to maint).
- Update a few end-user facing messages around EOL conversion. (merge c970d30c2c ah/convert-warning-message later to maint).
- Trace2 documentation updates. (merge a6c80c313c js/trace2-doc-fixes later to maint).
- Build procedure fixup. (merge 1fbfd96f50 mg/detect-compiler-in-c-locale later to maint).
- "git pull" without "--recurse-submodules=<arg>" made submodule.recurse take precedence over fetch.recurseSubmodules by mistake, which has been corrected. (merge 5819417365 gc/pull-recurse-submodules later to maint).
- "git bisect" was too silent before it is ready to start computing the actual bisection, which has been corrected. (merge f11046e6de cd/bisect-messages-from-pre-flight-states later to maint).
- macOS CI jobs have been occasionally flaky due to tentative version skew between perforce and the homebrew packager. Instead of failing the whole CI job, just let it skip the p4 tests when this happens. (merge f15e00b463 cb/ci-make-p4-optional later to maint).
- A bit of test framework fixes with a few fixes to issues found by valgrind. (merge 7c898554d7 ab/valgrind-fixes later to maint).
- "git archive --add-file=<path>" picked up the raw permission bits from the path and propagated to zip output in some cases, without normalization, which has been corrected (tar output did not have this issue). (merge 6a61661967 jc/archive-add-file-normalize-mode later to maint).
- "make coverage-report" without first running "make coverage" did not produce any meaningful result, which has been corrected. (merge 96ddfecc5b ep/coverage-report-wants-test-to-have-run later to maint).
- The "--current" option of "git show-branch" should have been made incompatible with the "--reflog" mode, but this was not enforced, which has been corrected. (merge 41c64ae0e7 jc/show-branch-g-current later to maint).
- "git fetch" unnecessarily failed when an unexpected optional section appeared in the output, which has been corrected. (merge 7709acf7be jt/fetch-peek-optional-section later to maint).
- The way "git fetch" without "--update-head-ok" ensures that HEAD in no worktree points at any ref being updated was too wasteful, which has been optimized a bit. (merge f7400da800 os/fetch-check-not-current-branch later to maint).
- "git fetch --recurse-submodules" from multiple remotes (either from a remote group, or "--all") used to make one extra "git fetch" in the submodules, which has been corrected. (merge 0353c68818 jc/avoid-redundant-submodule-fetch later to maint).
- With a recent update to refuse access to repositories of other people by default, "sudo make install" and "sudo git describe" stopped working, which has been corrected. (merge 6b11e3d52e cb/path-owner-check-with-sudo-plus later to maint).
- The tests that ensured merges stop when interfering local changes are present did not make sure that local changes are preserved; now they do. (merge 4b317450ce jc/t6424-failing-merge-preserve-local-changes later to maint).
- Some real problems noticed by gcc 12 have been fixed, while false positives have been worked around.
- Update the version of FreeBSD image used in Cirrus CI. (merge c58bebd4c6 pb/use-freebsd-12.3-in-cirrus-ci later to maint).
- The multi-pack-index code did not protect the packfile it is going to depend on from getting removed while in use, which has been corrected. (merge 4090511e40 tb/midx-race-in-pack-objects later to maint).
- Teach "git repack --geometric" work better with "--keep-pack" and avoid corrupting the repository when packsize limit is used. (merge 66731ff921 tb/geom-repack-with-keep-and-max later to maint).
- The documentation on the interaction between "--add-file" and "--prefix" options of "git archive" has been improved. (merge a75910602a rs/document-archive-prefix later to maint).
- A git subcommand like "git add -p" spawns a separate git process while relaying its command line arguments. A pathspec with only negative elements was mistakenly passed with an empty string, which has been corrected. (merge b02fdbc80a jc/all-negative-pathspec later to maint).
- With a more targeted workaround in http.c in another topic, we may be able to lift this blanket "GCC12 dangling-pointer warning is broken and unsalvageable" workaround. (merge 419141e495 cb/buggy-gcc-12-workaround later to maint).
- A misconfigured ’branch..remote’ led to a bug in configuration parsing. (merge f1dfbd9ee0 gc/zero-length-branch-config-fix later to maint).
- "git -c diff.submodule=log range-diff" did not show anything for submodules that changed in the ranges being compared, and "git -c diff.submodule=diff range-diff" did not work correctly. Fix this by including the "--submodule=short" output unconditionally to be compared.
- In Git 2.36 we revamped the way how hooks are invoked. One change that is end-user visible is that the output of a hook is no longer directly connected to the standard output of "git" that spawns the hook, which was noticed post release. This is getting corrected. (merge a082345372 ab/hooks-regression-fix later to maint).
- Updating the graft information invalidates the list of parents of in-core commit objects that used to be in the graft file.
- "git show-ref --heads" (and "--tags") still iterated over all the refs only to discard refs outside the specified area, which has been corrected. (merge c0c9d35e27 tb/show-ref-optim later to maint).
- Remove redundant copying (with index v3 and older) or possible over-reading beyond end of mmapped memory (with index v4) has been corrected. (merge 6d858341d2 zh/read-cache-copy-name-entry-fix later to maint).
- Sample watchman interface hook sometimes failed to produce correctly formatted JSON message, which has been corrected. (merge 134047b500 sn/fsmonitor-missing-clock later to maint).
- Use-after-free (with another forget-to-free) fix. (merge 323822c72b ab/remote-free-fix later to maint).
- Remove a coccinelle rule that is no longer relevant. (merge b1299de4a1 jc/cocci-cleanup later to maint).
- Other code cleanup, docfix, build fix, etc. (merge e6b2582da3 cm/reftable-0-length-memset later to maint). (merge 0b75e5bf22 ab/misc-cleanup later to maint). (merge 52e1ab8a76 ea/rebase-code-simplify later to maint). (merge 756d15923b sg/safe-directory-tests-and-docs later to maint). (merge d097a23bfa ds/do-not-call-bug-on-bad-refs later to maint). (merge c36c27e75c rs/t7812-pcre2-ws-bug-test later to maint). (merge 1da312742d gf/unused-includes later to maint). (merge 465b30a92d pb/submodule-recurse-mode-enum later to maint). (merge 82b28c4ed8 km/t3501-use-test-helpers later to maint). (merge 72315e431b sa/t1011-use-helpers later to maint). (merge 95b3002201 cg/vscode-with-gdb later to maint). (merge fbe5f6b804 tk/p4-utf8-bom later to maint). (merge 17f273ffba tk/p4-with-explicity-sync later to maint). (merge 944db25c60 kf/p4-multiple-remotes later to maint). (merge b014cee8de jc/update-ozlabs-url later to maint). (merge 4ec5008062 pb/ggg-in-mfc-doc later to maint). (merge af845a604d tb/receive-pack-code-cleanup later to maint). (merge 2acf4cf001 js/ci-gcc-12-fixes later to maint). (merge 05e280c0a6 jc/http-clear-finished-pointer later to maint). (merge 8c49d704ef fh/transport-push-leakfix later to maint). (merge 1d232d38bd tl/ls-tree-oid-only later to maint). (merge db7961e6a6 gc/document-config-worktree-scope later to maint). (merge ce18a30bb7 fs/ssh-default-key-command-doc later to maint).
2.37.1
Git 2.37.1 Release Notes ========================
This release merges up the fixes that appear in v2.30.5, v2.31.4, v2.32.3, v2.33.4, v2.34.4, v2.35.4, and v2.36.2 to address the security issue CVE-2022-29187; see the release notes for these versions for details.
Fixes since Git 2.37 --------------------
- Rewrite of "git add -i" in C that appeared in Git 2.25 didn’t correctly record a removed file to the index, which is an old regression but has become widely known because the C version has become the default in the latest release.
- Fix for CVS-2022-29187.
2.37.2
Git 2.37.2 Release Notes ========================
This primarily is to backport various fixes accumulated on the ’master’ front since 2.37.1.
Fixes since v2.37.1 -------------------
- "git shortlog -n" relied on the underlying qsort() to be stable, which shouldn’t have. Fixed.
- Variable quoting fix in the vimdiff driver of "git mergetool".
- An earlier attempt to plug leaks placed a clean-up label to jump to at a bogus place, which as been corrected.
- Fixes a long-standing corner case bug around directory renames in the merge-ort strategy.
- Recent update to vimdiff layout code has been made more robust against different end-user vim settings.
- In a non-bare repository, the behavior of Git when the core.worktree configuration variable points at a directory that has a repository as its subdirectory, regressed in Git 2.27 days.
- References to commands-to-be-typed-literally in "git rebase" documentation mark-up have been corrected.
- Give _() markings to fatal/warning/usage: labels that are shown in front of these messages.
- "git mktree --missing" lazily fetched objects that are missing from the local object store, which was totally unnecessary for the purpose of creating the tree object(s) from its input.
- Fixes for tests when the source directory has unusual characters in its path, e.g. whitespaces, double-quotes, etc.
- Adjust technical/bitmap-format to be formatted by AsciiDoc, and add some missing information to the documentation.
- Certain diff options are currently ignored when combined-diff is shown; mark them as incompatible with the feature.
- "git clone" from a repository with some ref whose HEAD is unborn did not set the HEAD in the resulting repository correctly, which has been corrected.
- mkstemp() emulation on Windows has been improved.
- Add missing documentation for "include" and "includeIf" features in "git config" file format, which incidentally teaches the command line completion to include them in its offerings.
- Avoid "white/black-list" in documentation and code comments.
- Workaround for a compiler warning against use of die() in osx-keychain (in contrib/).
- Workaround for a false positive compiler warning.
- The resolve-undo information in the index was not protected against GC, which has been corrected.
- A corner case bug where lazily fetching objects from a promisor remote resulted in infinite recursion has been corrected.
- "git p4" working on UTF-16 files on Windows did not implement CRLF-to-LF conversion correctly, which has been corrected.
- "git p4" did not handle non-ASCII client name well, which has been corrected.
- "rerere-train" script (in contrib/) used to honor commit.gpgSign while recreating the throw-away merges.
- "git checkout" miscounted the paths it updated, which has been corrected.
- Fix for a bug that makes write-tree to fail to write out a non-existent index as a tree, introduced in 2.37.
- There was a bug in the codepath to upgrade generation information in commit-graph from v1 to v2 format, which has been corrected.
Also contains minor documentation updates and code clean-ups.
2.37.3
Git 2.37.3 Release Notes ========================
This primarily is to backport various fixes accumulated on the ’master’ front since 2.37.2.
Fixes since v2.37.2 -------------------
- The build procedure for Windows that uses CMake has been updated to pick up the shell interpreter from local installation location.
- Conditionally allow building Python interpreter on Windows
- Fix to lstat() emulation on Windows.
- Older gcc with -Wall complains about the universal zero initializer "struct s = { 0 };" idiom, which makes developers’ lives inconvenient (as -Werror is enabled by DEVELOPER=YesPlease). The build procedure has been tweaked to help these compilers.
- Plug memory leaks in the failure code path in the "merge-ort" merge strategy backend.
- Avoid repeatedly running getconf to ask libc version in the test suite, and instead just as it once per script.
- Platform-specific code that determines if a directory is OK to use as a repository has been taught to report more details, especially on Windows.
- "vimdiff3" regression has been corrected.
- "git fsck" reads mode from tree objects but canonicalizes the mode before passing it to the logic to check object sanity, which has hid broken tree objects from the checking logic. This has been corrected, but to help exiting projects with broken tree objects that they cannot fix retroactively, the severity of anomalies this code detects has been demoted to "info" for now.
- Fixes to sparse index compatibility work for "reset" and "checkout" commands.
- Documentation for "git add --renormalize" has been improved.
Also contains other minor documentation updates and code clean-ups.
2.37.4
Git 2.37.4 Release Notes ========================
This primarily is to backport various fixes accumulated on the ’master’ front since 2.37.3, and also includes the same security fixes as in v2.30.6.
Fixes since v2.37.3 -------------------
- CVE-2022-39253: When relying on the
--localclone optimization, Git dereferences symbolic links in the source repository before creating hardlinks (or copies) of the dereferenced link in the destination repository. This can lead to surprising behavior where arbitrary files are present in a repository’s$GIT_DIRwhen cloning from a malicious repository.
Git will no longer dereference symbolic links via the `--local`
clone mechanism, and will instead refuse to clone repositories that
have symbolic links present in the `$GIT_DIR/objects` directory.
Additionally, the value of `protocol.file.allow` is changed to be
"user" by default.
Credit for finding CVE-2022-39253 goes to Cory Snider of Mirantis.
The fix was authored by Taylor Blau, with help from Johannes
Schindelin.
- CVE-2022-39260: An overly-long command string given to
gitshellcan result in overflow insplit_cmdline(), leading to arbitrary heap writes and remote code execution whengitshellis exposed and the directory$HOME/git-shell-commandsexists.
`git shell` is taught to refuse interactive commands that are
longer than 4MiB in size. `split_cmdline()` is hardened to reject
inputs larger than 2GiB.
Credit for finding CVE-2022-39260 goes to Kevin Backhouse of
GitHub. The fix was authored by Kevin Backhouse, Jeff King, and
Taylor Blau.
- An earlier optimization discarded a tree-object buffer that is still in use, which has been corrected.
- Fix deadlocks between main Git process and subprocess spawned via the pipe_command() API, that can kill "git add -p" that was reimplemented in C recently.
- xcalloc(), imitating calloc(), takes "number of elements of the array", and "size of a single element", in this order. A call that does not follow this ordering has been corrected.
- The preload-index codepath made copies of pathspec to give to multiple threads, which were left leaked.
- Update the version of Ubuntu used for GitHub Actions CI from 18.04 to 22.04.
- The auto-stashed local changes created by "git merge --autostash" was mixed into a conflicted state left in the working tree, which has been corrected.
Also contains other minor documentation updates and code clean-ups.
2.37.5
Git v2.37.5 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.37.6
Git v2.37.6 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7, v2.32.6, v2.33.7, v2.34.7, v2.35.7 and v2.36.5 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.37.7
Git v2.37.7 Release Notes =========================
This release merges up the fix that appears in v2.30.9, v2.31.8, v2.32.7, v2.33.8, v2.34.8, v2.35.8 and v2.36.6 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.38.0
Git v2.38 Release Notes =======================
UI, Workflows & Features
- "git remote show [-n] frotz" now pays attention to negative pathspec.
- "git push" sometimes performs poorly when reachability bitmaps are used, even in a repository where other operations are helped by bitmaps. The push.useBitmaps configuration variable is introduced to allow disabling use of reachability bitmaps only for "git push".
- "git grep -m<max-hits>" is a way to limit the hits shown per file.
- "git merge-tree" learned a new mode where it takes two commits and computes a tree that would result in the merge commit, if the histories leading to these two commits were to be merged.
- "git mv A B" in a sparsely populated working tree can be asked to move a path between directories that are "in cone" (i.e. expected to be materialized in the working tree) and "out of cone" (i.e. expected to be hidden). The handling of such cases has been improved.
- Earlier, HTTP transport clients learned to tell the server side what locale they are in by sending Accept-Language HTTP header, but this was done only for some requests but not others.
- Introduce a safe.barerepository configuration variable that allows users to forbid discovery of bare repositories.
- Various messages that come from the pack-bitmap codepaths have been tweaked.
- "git rebase -i" learns to update branches whose tip appear in the rebased range with "--update-refs" option.
- "git ls-files" learns the "--format" option to tweak its output.
- "git cat-file" learned an option to use the mailmap when showing commit and tag objects.
- When "git merge" finds that it cannot perform a merge, it should restore the working tree to the state before the command was initiated, but in some corner cases it didn’t.
- Operating modes like "--batch" of "git cat-file" command learned to take NUL-terminated input, instead of one-item-per-line.
- "git rm" has become more aware of the sparse-index feature.
- "git rev-list --disk-usage" learned to take an optional value "human" to show the reported value in human-readable format, like "3.40MiB".
- The "diagnose" feature to create a zip archive for diagnostic material has been lifted from "scalar" and made into a feature of "git bugreport".
- The namespaces used by "log --decorate" from "refs/" hierarchy by default has been tightened.
- "git rev-list --ancestry-path=C A..B" is a natural extension of "git rev-list A..B"; instead of choosing a subset of A..B to those that have ancestry relationship with A, it lets a subset with ancestry relationship with C.
- "scalar" now enables built-in fsmonitor on enlisted repositories, when able.
- The bash prompt (in contrib/) learned to optionally indicate when the index is unmerged.
- "git clone" command learned the "--bundle-uri" option to coordinate with hosting sites the use of pre-prepared bundle files.
- "git range-diff" learned to honor pathspec argument if given.
- "git format-patch --from=<ident>" can be told to add an in-body "From:" line even for commits that are authored by the given <ident> with "--force-in-body-from" option.
- The built-in fsmonitor refuses to work on a network mounted repositories; a configuration knob for users to override this has been introduced.
- The "scalar" addition from Microsoft is now part of the core Git installation.
Performance, Internal Implementation, Development Support etc.
- Collection of what is referenced by objects in promisor packs have been optimized to inspect these objects in the in-pack order.
- Introduce a helper to see if a branch is already being worked on (hence should not be newly checked out in a working tree), which performs much better than the existing find_shared_symref() to replace many uses of the latter.
- Teach "git archive" to (optionally and then by default) avoid spawning an external "gzip" process when creating ".tar.gz" (and ".tgz") archives.
- Allow large objects read from a packstream to be streamed into a loose object file straight, without having to keep it in-core as a whole.
- Further preparation to turn git-submodule.sh into a builtin continues.
- Apply Coccinelle rule to turn raw memmove() into MOVE_ARRAY() cpp macro, which would improve maintainability and readability.
- Teach "make all" to build gitweb as well.
- Tweak tests so that they still work when the "git init" template did not create .git/info directory.
- Add Coccinelle rules to detect the pattern of initializing and then finalizing a structure without using it in between at all, which happens after code restructuring and the compilers fail to recognize as an unused variable.
- The code to convert between GPG trust level strings and internal constants we use to represent them have been cleaned up.
- Support for libnettle as SHA256 implementation has been added.
- The way "git multi-pack" uses parse-options API has been improved.
- A Coccinelle rule (in contrib/) to encourage use of COPY_ARRAY macro has been improved.
- API tweak to make it easier to run fuzz testing on commit-graph parser.
- The codepath to write multi-pack index has been taught to release a large chunk of memory that holds an array of objects in the packs, as soon as it is done with the array, to reduce memory consumption.
- Add a level of redirection to array allocation API in xdiff part, to make it easier to share with the libgit2 project.
- "git fetch" client logs the partial clone filter used in the trace2 output.
- The "bundle URI" design gets documented.
- The common ancestor negotiation exchange during a "git fetch" session now leaves trace log.
- Test portability improvements. (merge 4d1d843be7 mt/rot13-in-c later to maint).
- The "subcommand" mode is introduced to parse-options API and update the command line parser of Git commands with subcommands.
- The pack bitmap file gained a bitmap-lookup table to speed up locating the necessary bitmap for a given commit.
- The assembly version of SHA-1 implementation for PPC has been removed.
- The server side that responds to "git fetch" and "git clone" request has been optimized by allowing it to send objects in its object store without recomputing and validating the object names.
- Annotate function parameters that are not used (but cannot be removed for structural reasons), to prepare us to later compile with -Wunused warning turned on.
- "git mv A B" in a sparsely populated working tree can be asked to move a path from a directory that is "in cone" to another directory that is "out of cone". Handling of such a case has been improved.
- The chainlint script for our tests has been revamped.
Fixes since v2.37 -----------------
- Rewrite of "git add -i" in C that appeared in Git 2.25 didn’t correctly record a removed file to the index, which was fixed.
- Certain diff options are currently ignored when combined-diff is shown; mark them as incompatible with the feature.
- Adjust technical/bitmap-format to be formatted by AsciiDoc, and add some missing information to the documentation.
- Fixes for tests when the source directory has unusual characters in its path, e.g. whitespaces, double-quotes, etc.
- "git mktree --missing" lazily fetched objects that are missing from the local object store, which was totally unnecessary for the purpose of creating the tree object(s) from its input.
- Give _() markings to fatal/warning/usage: labels that are shown in front of these messages.
- References to commands-to-be-typed-literally in "git rebase" documentation mark-up have been corrected.
- In a non-bare repository, the behavior of Git when the core.worktree configuration variable points at a directory that has a repository as its subdirectory, regressed in Git 2.27 days.
- Recent update to vimdiff layout code has been made more robust against different end-user vim settings.
- Plug various memory leaks, both in the main code and in test-tool commands.
- Fixes a long-standing corner case bug around directory renames in the merge-ort strategy.
- The resolve-undo information in the index was not protected against GC, which has been corrected.
- A corner case bug where lazily fetching objects from a promisor remote resulted in infinite recursion has been corrected.
- "git clone" from a repository with some ref whose HEAD is unborn did not set the HEAD in the resulting repository correctly, which has been corrected.
- An earlier attempt to plug leaks placed a clean-up label to jump to at a bogus place, which as been corrected.
- Variable quoting fix in the vimdiff driver of "git mergetool"
- "git shortlog -n" relied on the underlying qsort() to be stable, which shouldn’t have. Fixed.
- A fix for a regression in test framework.
- mkstemp() emulation on Windows has been improved.
- Add missing documentation for "include" and "includeIf" features in "git config" file format, which incidentally teaches the command line completion to include them in its offerings.
- Avoid "white/black-list" in documentation and code comments.
- Workaround for a compiler warning against use of die() in osx-keychain (in contrib/).
- Workaround for a false positive compiler warning.
- "git p4" working on UTF-16 files on Windows did not implement CRLF-to-LF conversion correctly, which has been corrected.
- "git p4" did not handle non-ASCII client name well, which has been corrected.
- "rerere-train" script (in contrib/) used to honor commit.gpgSign while recreating the throw-away merges.
- "git checkout" miscounted the paths it updated, which has been corrected.
- Fix for a bug that makes write-tree to fail to write out a non-existent index as a tree, introduced in 2.37.
- There was a bug in the codepath to upgrade generation information in commit-graph from v1 to v2 format, which has been corrected.
- Gitweb had legacy URL shortener that is specific to the way projects hosted on kernel.org used to (but no longer) work, which has been removed.
- Fix build procedure for Windows that uses CMake so that it can pick up the shell interpreter from local installation location.
- Conditionally allow building Python interpreter on Windows
- Fix to lstat() emulation on Windows.
- Older gcc with -Wall complains about the universal zero initializer "struct s = { 0 };" idiom, which makes developers’ lives inconvenient (as -Werror is enabled by DEVELOPER=YesPlease). The build procedure has been tweaked to help these compilers.
- Plug memory leaks in the failure code path in the "merge-ort" merge strategy backend.
- "git symbolic-ref symref non..sen..se" is now diagnosed as an error.
- A follow-up fix to a fix for a regression in 2.36 around hooks.
- Avoid repeatedly running getconf to ask libc version in the test suite, and instead just as it once per script.
- Platform-specific code that determines if a directory is OK to use as a repository has been taught to report more details, especially on Windows.
- "vimdiff3" regression fix.
- "git fsck" reads mode from tree objects but canonicalizes the mode before passing it to the logic to check object sanity, which has hid broken tree objects from the checking logic. This has been corrected, but to help existing projects with broken tree objects that they cannot fix retroactively, the severity of anomalies this code detects has been demoted to "info" for now.
- Fixes to sparse index compatibility work for "reset" and "checkout" commands.
- An earlier optimization discarded a tree-object buffer that is still in use, which has been corrected.
- Fix deadlocks between main Git process and subprocess spawned via the pipe_command() API, that can kill "git add -p" that was reimplemented in C recently.
- The sequencer machinery translated messages left in the reflog by mistake, which has been corrected.
- xcalloc(), imitating calloc(), takes "number of elements of the array", and "size of a single element", in this order. A call that does not follow this ordering has been corrected.
- The preload-index codepath made copies of pathspec to give to multiple threads, which were left leaked.
- Update the version of Ubuntu used for GitHub Actions CI from 18.04 to 22.04.
- The auto-stashed local changes created by "git merge --autostash" was mixed into a conflicted state left in the working tree, which has been corrected.
- Multi-pack index got corrupted when preferred pack changed from one pack to another in a certain way, which has been corrected. (merge 99e4d084ff tb/midx-with-changing-preferred-pack-fix later to maint).
- The clean-up of temporary files created via mks_tempfile_dt() was racy and attempted to unlink() the leading directory when signals are involved, which has been corrected. (merge babe2e0559 rs/tempfile-cleanup-race-fix later to maint).
- FreeBSD portability fix for "git maintenance" that spawns "crontab" to schedule tasks. (merge ee69e7884e bc/gc-crontab-fix later to maint).
- Those who use diff-so-fancy as the diff-filter noticed a regression or two in the code that parses the diff output in the built-in version of "add -p", which has been corrected. (merge 0a101676e5 js/add-p-diff-parsing-fix later to maint).
- Segfault fix-up to an earlier fix to the topic to teach "git reset" and "git checkout" work better in a sparse checkout. (merge 037f8ea6d9 vd/sparse-reset-checkout-fixes later to maint).
- "git diff --no-index A B" managed its the pathnames of its two input files rather haphazardly, sometimes leaking them. The command line argument processing has been straightened out to clean it up. (merge 2b43dd0eb5 rs/diff-no-index-cleanup later to maint).
- "git rev-list --verify-objects" ought to inspect the contents of objects and notice corrupted ones, but it didn’t when the commit graph is in use, which has been corrected. (merge b27ccae34b jk/rev-list-verify-objects-fix later to maint).
- More fixes to "add -p" (merge 64ec8efb83 js/builtin-add-p-portability-fix later to maint).
- The parser in the script interface to parse-options in "git rev-parse" has been updated to diagnose a bogus input correctly. (merge f20b9c36d0 ow/rev-parse-parseopt-fix later to maint).
- The code that manages list-object-filter structure, used in partial clones, leaked the instances, which has been plugged. (merge 66eede4a37 jk/plug-list-object-filter-leaks later to maint).
- Fix another UI regression in the reimplemented "add -p". (merge f6f0ee247f rs/add-p-worktree-mode-prompt-fix later to maint).
- "git fetch" over protocol v2 sent an incorrect ref prefix request to the server and made "git pull" with configured fetch refspec that does not cover the remote branch to merge with fail, which has been corrected. (merge 49ca2fba39 jk/proto-v2-ref-prefix-fix later to maint).
- A result from opendir() was leaking in the commit-graph expiration codepath, which has been plugged. (merge 12f1ae5324 ml/commit-graph-expire-dir-leak-fix later to maint).
- Just like we have coding guidelines, we now have guidelines for reviewers. (merge e01b851923 vd/doc-reviewing-guidelines later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 77b9e85c0f vd/fix-perf-tests later to maint). (merge 0682bc43f5 jk/test-crontab-fixes later to maint). (merge b46dd1726c cc/doc-trailer-whitespace-rules later to maint).
2.38.1
Git v2.38.1 Release Notes =========================
This release merges the security fix that appears in v2.30.6; see the release notes for that version for details.
2.38.2
Git 2.38.2 Release Notes ========================
This is to backport various fixes accumulated during the development towards Git 2.39, the next feature release.
Fixes since v2.38.1 -------------------
- Update CodingGuidelines to clarify what features to use and avoid in C99.
- The codepath that reads from the index v4 had unaligned memory accesses, which has been corrected.
- "git remote rename" failed to rename a remote without fetch refspec, which has been corrected.
- "git clone" did not like to see the "--bare" and the "--origin" options used together without a good reason.
- Fix messages incorrectly marked for translation.
- "git fsck" failed to release contents of tree objects already used from the memory, which has been fixed.
- "git rebase -i" can mistakenly attempt to apply a fixup to a commit itself, which has been corrected.
- In read-only repositories, "git merge-tree" tried to come up with a merge result tree object, which it failed (which is not wrong) and led to a segfault (which is bad), which has been corrected.
- Force C locale while running tests around httpd to make sure we can find expected error messages in the log.
- Fix a logic in "mailinfo -b" that miscomputed the length of a substring, which lead to an out-of-bounds access.
- The codepath to sign learned to report errors when it fails to read from "ssh-keygen".
- "GIT_EDITOR=: git branch --edit-description" resulted in failure, which has been corrected.
- Documentation on various Boolean GIT_* environment variables have been clarified.
- "git multi-pack-index repack/expire" used to repack unreachable cruft into a new pack, which have been corrected.
- The code to clean temporary object directories (used for quarantine) tried to remove them inside its signal handler, which was a no-no.
- "git branch --edit-description" on an unborh branch misleadingly said that no such branch exists, which has been corrected.
- GitHub CI settings have been adjusted to recent reality, merging and cherry-picking necessary topics that have been prepared for Git 2.39.
gitrebase--update-refswould delete references when allupdate-refcommands in the sequencer were removed, which has been corrected.
Also contains various documentation updates and code clean-ups.
2.38.3
Git v2.38.3 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.38.4
Git v2.38.4 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7, v2.32.6, v2.33.7, v2.34.7, v2.35.7, v2.36.5 and v2.37.6 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.38.5
Git v2.38.5 Release Notes =========================
This release merges up the fix that appears in v2.30.9, v2.31.8, v2.32.7, v2.33.8, v2.34.8, v2.35.8, v2.36.6 and v2.37.7 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.39.0
Git v2.39 Release Notes =======================
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 etc. --------------------------------------------------------------
- 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.
- 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.
Fixes since v2.38 -----------------
- The codepath that reads from the index v4 had unaligned memory accesses, which has been corrected.
- Fix messages incorrectly marked for translation.
- "git fsck" failed to release contents of tree objects already used from the memory, which has been fixed.
- "git clone" did not like to see the "--bare" and the "--origin" options used together without a good reason.
- "git remote rename" failed to rename a remote without fetch refspec, which has been corrected.
- Documentation on various Boolean GIT_* environment variables have been clarified.
- "git rebase -i" can mistakenly attempt to apply a fixup to a commit itself, which has been corrected.
- "git multi-pack-index repack/expire" used to repack unreachable cruft into a new pack, which have been corrected.
- In read-only repositories, "git merge-tree" tried to come up with a merge result tree object, which it failed (which is not wrong) and led to a segfault (which is bad), which has been corrected.
- Force C locale while running tests around httpd to make sure we can find expected error messages in the log.
- Fix a logic in "mailinfo -b" that miscomputed the length of a substring, which lead to an out-of-bounds access.
- The codepath to sign learned to report errors when it fails to read from "ssh-keygen".
- Code clean-up that results in plugging a leak.
- "GIT_EDITOR=: git branch --edit-description" resulted in failure, which has been corrected.
- The code to clean temporary object directories (used for quarantine) tried to remove them inside its signal handler, which was a no-no.
- Update comment in the Makefile about the RUNTIME_PREFIX config knob.
- Clarify that "the sentence after <area>: prefix does not begin with a capital letter" rule applies only to the commit title.
- "git branch --edit-description" on an unborn branch misleadingly said that no such branch exists, which has been corrected.
- Work around older clang that warns against C99 zero initialization syntax for struct.
- Giving "--invert-grep" and "--all-match" without "--grep" to the "git log" command resulted in an attempt to access grep pattern expression structure that has not been allocated, which has been corrected. (merge db84376f98 ab/grep-simplify-extended-expression later to maint).
- "git diff rev^!" did not show combined diff to go to the rev from its parents. (merge a79c6b6081 rs/diff-caret-bang-with-parents later to maint).
- Allow configuration files in "protected" scopes to include other configuration files. (merge ecec57b3c9 gc/bare-repo-discovery later to maint).
- Give a bit more diversity to macOS CI by using sha1dc in one of the jobs (the other one tests Apple Common Crypto). (merge 1ad5c3df35 jc/ci-osx-with-sha1dc later to maint).
- A bugfix with tracing support in midx codepath (merge e9c3839944 tb/midx-bitmap-selection-fix later to maint).
- When geometric repacking feature is in use together with the --pack-kept-objects option, we lost packs marked with .keep files. (merge 197443e80a tb/save-keep-pack-during-geometric-repack later to maint).
- Move a global variable added as a hack during regression fixes to its proper place in the API. (merge 0b0ab95f17 ab/run-hook-api-cleanup later to maint).
- Update to build procedure with VS using CMake/CTest. (merge c858750b41 js/cmake-updates later to maint).
- The short-help text shown by "git cmd -h" and the synopsis text shown at the beginning of "git help cmd" have been made more consistent.
- When creating a multi-pack bitmap, remove per-pack bitmap files unconditionally as they will never be consulted. (merge 55d902cd61 tb/remove-unused-pack-bitmap later to maint).
- Fix a longstanding syntax error in Git.pm error codepath.
- "git diff --stat" etc. were invented back when everything was ASCII and strlen() was a way to measure the display width of a string; adjust them to compute the display width assuming UTF-8 pathnames. (merge ce8529b2bb tb/diffstat-with-utf8-strwidth later to maint).
- "git branch --edit-description" can exit with status -1 which is not a good practice; it learned to use 1 as everybody else instead.
- "git apply" limits its input to a bit less than 1 GiB.
- Merging a branch with directory renames into a branch that changes the directory to a symlink was mishandled by the ort merge strategy, which has been corrected.
- A bugfix to "git subtree" in its split and merge features.
- Fix some bugs in the reflog messages when rebasing and changes the reflog messages of "rebase --apply" to match "rebase --merge" with the aim of making the reflog easier to parse.
- "git rebase --keep-base" used to discard the commits that are already cherry-picked to the upstream, even when "keep-base" meant that the base, on top of which the history is being rebuilt, does not yet include these cherry-picked commits. The --keep-base option now implies --reapply-cherry-picks and --no-fork-point options.
- The way "git repack" created temporary files when it received a signal was prone to deadlocking, which has been corrected.
- Various tests exercising the transfer.credentialsInUrl configuration are taught to avoid making requests which require resolving localhost to reduce CI-flakiness.
- "git archive" mistakenly complained twice about a missing executable, which has been corrected.
- Fix a bug where
gitbranch-ddid not work on an orphaned HEAD.
gitrebase--update-refswould delete references when allupdate-refcommands in the sequencer were removed, which has been corrected.
- Fix a regression in the bisect-helper which mistakenly treats arguments to the command given to ’git bisect run’ as arguments to the helper.
- Correct an error where
gitrebasewould mistakenly use a branch or tag named "refs/rewritten/xyz" when missing a rebase label.
- Assorted fixes of parsing end-user input as integers. (merge 14770cf0de pw/config-int-parse-fixes later to maint).
- "git prune" may try to iterate over .git/objects/pack for trash files to remove in it, and loudly fail when the directory is missing, which is not necessary. The command has been taught to ignore such a failure. (merge 6974765352 ew/prune-with-missing-objects-pack later to maint).
- Add one more candidate directory that may house httpd modules while running tests. (merge 1c7dc23d41 es/locate-httpd-module-location-in-test later to maint).
- A handful of leaks in the line-log machinery have been plugged.
- The format of a line in /proc/cpuinfo that describes a CPU on s390x looked different from everybody else, and the code in chainlint.pl failed to parse it. (merge 1f51b77f4f ah/chainlint-cpuinfo-parse-fix later to maint).
- Adjust the GitHub CI to newer ubuntu release. (merge 0d3507f3e7 jx/ci-ubuntu-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 413bc6d20a ds/cmd-main-reorder later to maint). (merge 8d2863e4ed nw/t1002-cleanup later to maint). (merge 7c2dc122f9 rs/list-objects-filter-leakfix later to maint). (merge 288fcb1c94 zk/push-use-bitmaps later to maint). (merge 42db324c0f km/merge-recursive-typofix later to maint).
2.39.1
Git v2.39.1 Release Notes =========================
This release merges the security fix that appears in v2.30.7; see the release notes for that version for details.
2.39.2
Git v2.39.2 Release Notes =========================
This release merges up the fixes that appear in v2.30.8, v2.31.7, v2.32.6, v2.33.7, v2.34.7, v2.35.7, v2.36.5, v2.37.6 and v2.38.4 to address the security issues CVE-2023-22490 and CVE-2023-23946; see the release notes for these versions for details.
2.39.3
Git v2.39.3 Release Notes =========================
This release merges up the fix that appears in v2.30.9, v2.31.8, v2.32.7, v2.33.8, v2.34.8, v2.35.8, v2.36.6, v2.37.7 and v2.38.5 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
This release also merges fixes that have accumulated on the ’master’ front to prepare for the 2.40 release that are still relevant to 2.39.x maintenance track.
Fixes since v2.39.2 -------------------
- Stop running win+VS build by default.
- CI updates. We probably want a clean-up to move the long shell script embedded in yaml file into a separate file, but that can come later.
- Avoid unnecessary builds in CI, with settings configured in ci-config.
- Redefining system functions for a few functions did not follow our usual "implement git_foo() and #define foo(args) git_foo(args)" pattern, which has broken build for some folks.
- Deal with a few deprecation warning from cURL library.
- Newer regex library macOS stopped enabling GNU-like enhanced BRE, where ’(A\|B)’ works as alternation, unless explicitly asked with the REG_ENHANCED flag. "git grep" now can be compiled to do so, to retain the old behaviour.
- When given a pattern that matches an empty string at the end of a line, the code to parse the "git diff" line-ranges fell into an infinite loop, which has been corrected.
- Fix the sequence to fsync $GIT_DIR/packed-refs file that forgot to flush its output to the disk..
- "git diff --relative" did not mix well with "git diff --ext-diff", which has been corrected.
- The logic to see if we are using the "cone" mode by checking the sparsity patterns has been tightened to avoid mistaking a pattern that names a single file as specifying a cone.
- Doc update for environment variables set when hooks are invoked.
- Document ORIG_HEAD a bit more.
- "git ls-tree --format=’%(path) %(path)’ $tree $path" showed the path three times, which has been corrected.
- Document that "branch -f <branch>" disables only the safety to avoid recreating an existing branch.
- Clarify how "checkout -b/-B" and "git branch [-f]" are similar but different in the documentation.
Also contains minor documentation updates and code clean-ups.
2.39.4
Git v2.39.4 Release Notes =========================
This addresses the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020 and CVE-2024-32021.
This release also backports fixes necessary to let the CI builds pass successfully.
Fixes since v2.39.3 -------------------
- CVE-2024-32002:
Recursive clones on case-insensitive filesystems that support symbolic
links are susceptible to case confusion that can be exploited to
execute just-cloned code during the clone operation.
- CVE-2024-32004:
Repositories can be configured to execute arbitrary code during local
clones. To address this, the ownership checks introduced in v2.30.3
are now extended to cover cloning local repositories.
- CVE-2024-32020:
Local clones may end up hardlinking files into the target repository's
object database when source and target repository reside on the same
disk. If the source repository is owned by a different user, then
those hardlinked files may be rewritten at any point in time by the
untrusted user.
- CVE-2024-32021:
When cloning a local source repository that contains symlinks via the
filesystem, Git may create hardlinks to arbitrary user-readable files
on the same filesystem as the target repository in the objects/
directory.
- CVE-2024-32465:
It is supposed to be safe to clone untrusted repositories, even those
unpacked from zip archives or tarballs originating from untrusted
sources, but Git can be tricked to run arbitrary code as part of the
clone.
- Defense-in-depth: submodule: require the submodule path to contain directories only.
- Defense-in-depth: clone: when symbolic links collide with directories, keep the latter.
- Defense-in-depth: clone: prevent hooks from running during a clone.
- Defense-in-depth: core.hooksPath: add some protection while cloning.
- Defense-in-depth: fsck: warn about symlink pointing inside a gitdir.
- Various fix-ups on HTTP tests.
- Test update.
- HTTP Header redaction code has been adjusted for a newer version of cURL library that shows its traces differently from earlier versions.
- Fix was added to work around a regression in libcURL 8.7.0 (which has already been fixed in their tip of the tree).
- Replace macos-12 used at GitHub CI with macos-13.
- ci(linux-asan/linux-ubsan): let’s save some time
- Tests with LSan from time to time seem to emit harmless message that makes our tests unnecessarily flakey; we work it around by filtering the uninteresting output.
- Update GitHub Actions jobs to avoid warnings against using deprecated version of Node.js.
2.39.5
Git v2.39.5 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.39.4 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.4.0
Git 2.4 Release Notes =====================
Backward compatibility warning(s) ---------------------------------
This release has a few changes in the user-visible output from Porcelain commands. These are not meant to be parsed by scripts, but users still may want to be aware of the changes:
- The output from "git log --decorate" (and, more generally, the "%d" format specifier used in the "--format=<string>" parameter to the "git log" family of commands) has changed. It used to list "HEAD" just like other branches; e.g.,
$ git log --decorate -1 master
commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD, master)
...
This release changes the output slightly when HEAD refers to a
branch whose name is also shown in the output. The above is now
shown as:
$ git log --decorate -1 master
commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD -> master)
...
- The phrasing "git branch" uses to describe a detached HEAD has been updated to agree with the phrasing used by "git status":
- When HEAD is at the same commit as when it was originally detached, they now both show "detached at <commit object name>".
- When HEAD has moved since it was originally detached, they now both show "detached from <commit object name>".
Previously, "git branch" always used "from".
Updates since v2.3 ------------------
Ports
- Our default I/O size (8 MiB) for large files was too large for some platforms with smaller SSIZE_MAX, leading to read(2)/write(2) failures.
- We did not check the curl library version before using the CURLOPT_PROXYAUTH feature, which did not exist in older versions of the library.
- We now detect number of CPUs on older BSD-derived systems.
- Portability fixes and workarounds for shell scripts have been added to help BSD-derived systems.
UI, Workflows & Features
- The command usage info strings given by "git cmd -h" and in documentation have been tweaked for consistency.
- The "sync" subcommand of "git p4" now allows users to exclude subdirectories like its "clone" subcommand does.
- "git log --invert-grep --grep=WIP" will show only commits that do not have the string "WIP" in their messages.
- "git push" has been taught an "--atomic" option that makes a push that updates more than one ref an "all-or-none" affair.
- Extending the "push to deploy" feature that was added in 2.3, the behaviour of "git push" when updating the branch that is checked out can now be tweaked by a "push-to-checkout" hook.
- HTTP-based transports now send Accept-Language when making requests. The languages to accept are inferred from environment variables on the client side (LANGUAGE, etc).
- "git send-email" used to accept a mistaken "y" (or "yes") as an answer to "What encoding do you want to use [UTF-8]?" without questioning. Now it asks for confirmation when the answer looks too short to be a valid encoding name.
- When "git apply --whitespace=fix" fixed whitespace errors in the common context lines, the command reports that it did so.
- "git status" now allows the "-v" option to be given twice, in which case it also shows the differences in the working tree that are not staged to be committed.
- "git cherry-pick" used to clean up the log message even when it is merely replaying an existing commit. It now replays the message verbatim unless you are editing the message of the resulting commit.
- "git archive" can now be told to set the ’text’ attribute in the resulting zip archive.
- Output from "git log --decorate" now distinguishes between a detached HEAD vs. a HEAD that points at a branch.
This is a potentially backward-incompatible change; see above for
more information.
- When HEAD was detached when at commit xyz and hasn’t been moved since it was detached, "git status" would report "detached at xyz" whereas "git branch" would report "detached from xyz". Now the output of "git branch" agrees with that of "git status".
This is a potentially backward-incompatible change; see above for
more information.
- "git -C ’’ subcmd" now works in the current directory (analogously to "cd ’’") rather than dying with an error message. (merge 6a536e2 kn/git-cd-to-empty later to maint).
- The versionsort.prereleaseSuffix configuration variable can be used to specify that, for example, v1.0-pre1 comes before v1.0.
- A new "push.followTags" configuration turns the "--follow-tags" option on by default for the "git push" command.
- "git log --graph --no-walk A B…" is a nonsensical combination of options: "--no-walk" requests discrete points in the history, while "--graph" asks to draw connections between these discrete points. Forbid the use of these options together.
- "git rev-list --bisect --first-parent" does not work (yet) and can even cause SEGV; forbid it. "git log --bisect --first-parent" would not be useful until "git bisect --first-parent" materializes, so also forbid it for now.
Performance, Internal Implementation, Development Support etc.
- Slightly change the implementation of the N_() macro to help us detect mistakes.
- Restructure the implementation of "reflog expire" to fit better with the recently updated reference API.
- The transport-helper did not pass transport options such as verbosity, progress, cloning, etc. to import and export based helpers, like it did for fetch and push based helpers, robbing them of the chance to honor the wish of the end-users better.
- The tests that wanted to see that a file becomes unreadable after running "chmod a-r file", and the tests that wanted to make sure that they are not run as root, used "can we write into the / directory?" as a cheap substitute. But on some platforms that is not a good heuristic. The tests and their prerequisites have been updated to check what they really require. (merge f400e51 jk/sanity later to maint).
- Various issues around "reflog expire", e.g. using --updateref when expiring a reflog for a symbolic reference, have been corrected and/or made saner.
- The documentation for the strbuf API had been split between the API documentation and the header file. Consolidate the documentation in strbuf.h.
- The error handling functions and conventions are now documented in the API manual (in api-error-handling.txt).
- Optimize gitattribute look-up, mostly useful in "git grep" on a project that does not use many attributes, by avoiding it when we (should) know that the attributes are not defined in the first place.
- Typofix in comments. (merge ef2956a ak/git-pm-typofix later to maint).
- Code clean-up. (merge 0b868f0 sb/hex-object-name-is-at-most-41-bytes-long later to maint). (merge 5d30851 dp/remove-duplicated-header-inclusion later to maint).
- Simplify the ref transaction API for verifying that "the ref should be pointing at this object".
- Simplify the code in "git daemon" that parses out and holds hostnames used in request interpolation.
- Restructure the "git push" codepath to make it easier to add new configuration bits.
- The run-command interface made it easy to make a pipe for us to read from a process, wait for the process to finish, and then attempt to read its output. But this pattern can lead to deadlock. So introduce a helper to do this correctly (i.e., first read, and then wait the process to finish) and also add code to prevent such abuse in the run-command helper.
- People often forget to chain the commands in their test together with &&, letting a failure from an earlier command in the test go unnoticed. The new GIT_TEST_CHAIN_LINT mechanism allows you to catch such a mistake more easily.
Also contains various documentation updates and code clean-ups.
Fixes since v2.3 ----------------
Unless otherwise noted, all the fixes since v2.3 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git blame HEAD — missing" failed to correctly say "HEAD" when it tried to say "No such path ’missing’ in HEAD". (merge a46442f jk/blame-commit-label later to maint).
- "git rerere" (invoked internally from many mergy operations) did not correctly signal errors when it attempted to update the working tree files but failed for whatever reason. (merge 89ea903 jn/rerere-fail-on-auto-update-failure later to maint).
- Setting diff.submodule to ’log’ made "git format-patch" produce broken patches. (merge 339de50 dk/format-patch-ignore-diff-submodule later to maint).
- After attempting and failing a password-less authentication (e.g., Kerberos), libcURL refuses to fall back to password-based Basic authentication without a bit of help/encouragement. (merge 4dbe664 bc/http-fallback-to-password-after-krb-fails later to maint).
- The "git push" documentation for the "--repo=<there>" option was easily misunderstood. (merge 57b92a7 mg/push-repo-option-doc later to maint).
- Code to read a branch name from various files in the .git/ directory would have overrun array limits if asked to read an empty file. (merge 66ec904 jk/status-read-branch-name-fix later to maint).
- Remove a superfluous conditional that is always true. (merge 94ee8e2 jk/remote-curl-an-array-in-struct-cannot-be-null later to maint).
- The "git diff --raw" documentation incorrectly implied that C(opy) and R(ename) are the only statuses that can be followed by a score number. (merge ac1c2d9 jc/diff-format-doc later to maint).
- A broken pack .idx file in the receiving repository prevented the dumb http transport from fetching a good copy of it from the other side. (merge 8b9c2dd jk/dumb-http-idx-fetch-fix later to maint).
- The error message from "git commit", when a non-existing author name was given as value to the "--author=" parameter, has been reworded to avoid misunderstanding. (merge 1044b1f mg/commit-author-no-match-malformed-message later to maint).
- "git log --help" used to show rev-list options that are irrelevant to the "log" command. (merge 3cab02d jc/doc-log-rev-list-options later to maint).
- "git apply --whitespace=fix" used to under-allocate memory when the fix resulted in a longer text than the original patch. (merge 407a792 jc/apply-ws-fix-expands later to maint).
- The interactive "show a list and let the user choose from it" interface used by "git add -i" unnecessarily prompted the user even when the candidate list was empty, against which the only "choice" the user could have made was to choose nothing. (merge a9c4641 ak/add-i-empty-candidates later to maint).
- The todo list created by "git rebase -i" did not fully honor core.abbrev settings. (merge edb72d5 ks/rebase-i-abbrev later to maint).
- "git fetch" over a remote-helper that cannot respond to the "list" command could not fetch from a symbolic reference (e.g., HEAD). (merge 33cae54 mh/deref-symref-over-helper-transport later to maint).
- "git push --signed" gave an incorrectly worded error message when the other side did not support the capability.
- The "git push --signed" protocol extension did not limit what the "nonce" (a server-chosen string) could contain nor how long it could be, which was unnecessarily lax. Limit both the length and the alphabet to a reasonably small space that can still have enough entropy. (merge afcb6ee jc/push-cert later to maint).
- The completion script (in contrib/) clobbered the shell variable $x in the global shell namespace. (merge 852ff1c ma/bash-completion-leaking-x later to maint).
- We incorrectly formatted a "uintmax_t" integer that doesn’t fit in "int". (merge d306f3d jk/decimal-width-for-uintmax later to maint).
- The configuration parser used to be confused when reading configuration from a blob object that ends with a lone CR. (merge 1d0655c jk/config-no-ungetc-eof later to maint).
- The pack bitmap support did not build with older versions of GCC. (merge bd4e882 jk/pack-bitmap later to maint).
- The documentation wasn’t clear that "remote.<nick>.pushURL" and "remote.<nick>.URL" are there to name the same repository accessed via different transports, not two separate repositories. (merge 697f652 jc/remote-set-url-doc later to maint).
- Older GnuPG implementations may not correctly import the keyring material we prepare for the tests to use. (merge 1f985d6 ch/new-gpg-drops-rfc-1991 later to maint).
- The credential helper for Windows (in contrib/) used to mishandle user names that contain an at-sign. (merge 13d261e av/wincred-with-at-in-username-fix later to maint).
- "diff-highlight" (in contrib/) used to show byte-by-byte differences, which could cause multi-byte characters to be chopped in the middle. It learned to pay attention to character boundaries (assuming UTF-8). (merge 8d00662 jk/colors later to maint).
- Document longstanding configuration variable naming rules in CodingGuidelines. (merge 35840a3 jc/conf-var-doc later to maint).
- An earlier workaround to squelch unhelpful deprecation warnings from the compiler on OS X unnecessarily set a minimum required version of the OS, which the user might want to raise (or lower) for other reasons. (merge 88c03eb es/squelch-openssl-warnings-on-macosx later to maint).
- Certain older vintages of cURL give irregular output from "curl-config --vernum", which confused our build system. (merge 3af6792 tc/curl-vernum-output-broken-in-7.11 later to maint).
- In v2.2.0, we broke "git prune" that runs in a repository that borrows from an alternate object store. (merge b0a4264 jk/prune-mtime later to maint).
- "git submodule add" failed to squash "path/to/././submodule" to "path/to/submodule". (merge 8196e72 ps/submodule-sanitize-path-upon-add later to maint).
- "git merge-file" did not work correctly when invoked in a subdirectory. (merge 204a8ff ab/merge-file-prefix later to maint).
- "git blame" could die trying to free an uninitialized piece of memory. (merge e600592 es/blame-commit-info-fix later to maint).
- "git fast-import" used to crash when it could not close and finalize the resulting packfile cleanly. (merge 5e915f3 jk/fast-import-die-nicely-fix later to maint).
- "update-index --refresh" used to leak memory when an entry could not be refreshed for whatever reason. (merge bc1c2ca sb/plug-leak-in-make-cache-entry later to maint).
- The "interpolated-path" option of "git daemon" inserted any string the client declared on the "host=" capability request without checking. Sanitize and limit %H and %CH to a saner and a valid DNS name. (merge b485373 jk/daemon-interpolate later to maint).
- "git daemon" unnecessarily looked up the hostname even when "%CH" and "%IP" interpolations were not requested. (merge dc8edc8 rs/daemon-interpolate later to maint).
- We relied on "--no-" prefix handling in Perl’s Getopt::Long package, even though that support didn’t exist in Perl 5.8 (which we still support). Manually add support to help people with older Getopt::Long packages. (merge f471494 km/send-email-getopt-long-workarounds later to maint).
- "git apply" was not very careful about reading from, removing, updating and creating paths outside the working tree (under --index/--cached) or the current directory (when used as a replacement for GNU patch). (merge e0d201b jc/apply-beyond-symlink later to maint).
- Correct a breakage in git-svn, introduced around the v2.2 era, that can cause FileHandles to be closed prematurely. (merge e426311 ew/svn-maint-fixes later to maint).
- We did not parse usernames followed by literal IPv6 addresses correctly in SSH transport URLs; e.g., ssh://user@[2001:db8::1]:22/repo.git. (merge 6b6c5f7 tb/connect-ipv6-parse-fix later to maint).
- The configuration variable ’mailinfo.scissors’ was hard to discover in the documentation. (merge afb5de7 mm/am-c-doc later to maint).
- The interaction between "git submodule update" and the submodule.*.update configuration was not clearly documented. (merge 5c31acf ms/submodule-update-config-doc later to maint).
- "git diff --shortstat" used together with "--dirstat=changes" or "--dirstat=files" incorrectly output dirstat information twice. (merge ab27389 mk/diff-shortstat-dirstat-fix later to maint).
- The manpage for "git remote add" mentioned "--tags" and "--no-tags" but did not explain what happens if neither option is provided. (merge aaba0ab mg/doc-remote-tags-or-not later to maint).
- The description of "--exclude-standard option" in the output of "git grep -h" was phrased poorly. (merge 77fdb8a nd/grep-exclude-standard-help-fix later to maint).
- "git rebase -i" recently started to include the number of commits in the todo list, but that output included extraneous whitespace on a platform that prepends leading whitespaces to its "wc -l" output. (merge 2185d3b es/rebase-i-count-todo later to maint).
- The borrowed code in the kwset API did not follow our usual convention to use "unsigned char" to store values that range from 0-255. (merge 189c860 bw/kwset-use-unsigned later to maint).
- A corrupt input to "git diff -M" used to cause it to segfault. (merge 4d6be03 jk/diffcore-rename-duplicate later to maint).
- Certain builds of GPG triggered false breakages in a test. (merge 3f88c1b mg/verify-commit later to maint).
- "git imap-send" learned to optionally talk with an IMAP server via libcURL. Because there is no other option when Git is built with the NO_OPENSSL option, use libcURL by default in that case. (merge dcd01ea km/imap-send-libcurl-options later to maint).
- "git log --decorate" did not reset colors correctly around the branch names. (merge 5ee8758 jc/decorate-leaky-separator-color later to maint).
- The code that reads from the ctags file in the completion script (in contrib/) did not spell ${param/pattern/string} substitution correctly, which happened to work with bash but not with zsh. (merge db8d750 js/completion-ctags-pattern-substitution-fix later to maint).
- The transfer.hiderefs support did not quite work for smart-http transport. (merge 8ddf3ca jk/smart-http-hide-refs later to maint).
- In the "git tag -h" output, move the documentation for the "--column" and "--sort" options to the "Tag listing options" section. (merge dd059c6 jk/tag-h-column-is-a-listing-option later to maint).
- "git prune" used to largely ignore broken refs when deciding which objects are still being used, which could cause reference corruption to lead to object loss. (merge ea56c4e jk/prune-with-corrupt-refs later to maint).
- The split-index mode introduced in v2.3.0-rc0~41 was broken in the codepath to protect us against a broken reimplementation of Git that writes an invalid index with duplicated index entries, etc. (merge 03f15a7 tg/fix-check-order-with-split-index later to maint).
- "git fetch", when fetching a commit using the allow-tip-sha1-in-want extension, could have failed to fetch all of the requested refs. (merge 32d0462 jk/fetch-pack later to maint).
- An failure early in the "git clone" that started creating the working tree and repository could have resulted in the failure to clean up some directories and files. (merge 16eff6c jk/cleanup-failed-clone later to maint).
- Recommend format-patch and send-email for those who want to submit patches to this project. (merge b25c469 jc/submitting-patches-mention-send-email later to maint).
- Do not spawn the pager when "git grep" is run with "--quiet". (merge c2048f0 ws/grep-quiet-no-pager later to maint).
- The prompt script (in contrib/) did not show the untracked sign when working in a subdirectory without any untracked files. (merge 9bdc517 ct/prompt-untracked-fix later to maint).
- An earlier update to the URL parser broke an address that contains a colon but an empty string for the port number, like ssh://example.com:/path/to/repo. (merge 6b6c5f7 tb/connect-ipv6-parse-fix later to maint).
- Code cleanups and documentation updates. (merge 2ce63e9 rs/simple-cleanups later to maint). (merge 33baa69 rj/no-xopen-source-for-cygwin later to maint). (merge 817d03e jc/diff-test-updates later to maint). (merge eb32c66 ak/t5516-typofix later to maint). (merge bcd57cb mr/doc-clean-f-f later to maint). (merge 0d6accc mg/doc-status-color-slot later to maint). (merge 53e53c7 sg/completion-remote later to maint). (merge 8fa7975 ak/git-done-help-cleanup later to maint). (merge 9a6f128 rs/deflate-init-cleanup later to maint). (merge 6f75d45 rs/use-isxdigit later to maint). (merge 376e4b3 jk/test-annoyances later to maint). (merge 7032054 nd/doc-git-index-version later to maint). (merge e869c5e tg/test-index-v4 later to maint). (merge 599d223 jk/simplify-csum-file-sha1fd-check later to maint). (merge 260d585 sg/completion-gitcomp-nl-for-refs later to maint). (merge 777c55a jc/report-path-error-to-dir later to maint). (merge fddfaf8 ph/push-doc-cas later to maint). (merge d50d31e ss/pull-rebase-preserve later to maint). (merge c8c3f1d pt/enter-repo-comment-fix later to maint). (merge d7bfb9e jz/gitweb-conf-doc-fix later to maint). (merge f907282 jk/cherry-pick-docfix later to maint). (merge d3c0811 iu/fix-parse-options-h-comment later to maint). (merge 6c3b2af jg/cguide-we-cannot-count later to maint). (merge 2b8bd44 jk/pack-corruption-post-mortem later to maint). (merge 9585cb8 jn/doc-fast-import-no-16-octopus-limit later to maint). (merge 5dcd1b1 ps/grep-help-all-callback-arg later to maint). (merge f1f4c84 va/fix-git-p4-tests later to maint).
2.4.1
Git v2.4.1 Release Notes ========================
Fixes since v2.4 ----------------
- The usual "git diff" when seeing a file turning into a directory showed a patchset to remove the file and create all files in the directory, but "git diff --no-index" simply refused to work. Also, when asked to compare a file and a directory, imitate POSIX "diff" and compare the file with the file with the same name in the directory, instead of refusing to run.
- The default $HOME/.gitconfig file created upon "git config --global" that edits it had incorrectly spelled user.name and user.email entries in it.
- "git commit --date=now" or anything that relies on approxidate lost the daylight-saving-time offset.
- "git cat-file bl $blob" failed to barf even though there is no object type that is "bl".
- Teach the codepaths that read .gitignore and .gitattributes files that these files encoded in UTF-8 may have UTF-8 BOM marker at the beginning; this makes it in line with what we do for configuration files already.
- Access to objects in repositories that borrow from another one on a slow NFS server unnecessarily got more expensive due to recent code becoming more cautious in a naive way not to lose objects to pruning.
- We avoid setting core.worktree when the repository location is the ".git" directory directly at the top level of the working tree, but the code misdetected the case in which the working tree is at the root level of the filesystem (which arguably is a silly thing to do, but still valid).
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.10
Git v2.4.10 Release Notes =========================
Fixes since v2.4.9 ------------------
- xdiff code we use to generate diffs is not prepared to handle extremely large files. It uses "int" in many places, which can overflow if we have a very large number of lines or even bytes in our input files, for example. Cap the input size to somewhere around 1GB for now.
- Some protocols (like git-remote-ext) can execute arbitrary code found in the URL. The URLs that submodules use may come from arbitrary sources (e.g., .gitmodules files in a remote repository), and can hurt those who blindly enable recursive fetch. Restrict the allowed protocols to well known and safe ones.
2.4.11
Git v2.4.11 Release Notes =========================
Fixes since v2.4.10 -------------------
- Bugfix patches were backported from the ’master’ front to plug heap corruption holes, to catch integer overflow in the computation of pathname lengths, and to get rid of the name_path API. Both of these would have resulted in writing over an under-allocated buffer when formulating pathnames while tree traversal.
2.4.12
Git v2.4.12 Release Notes =========================
Fixes since v2.4.11 -------------------
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
2.4.2
Git v2.4.2 Release Notes ========================
Fixes since v2.4.1 ------------------
- "git rev-list --objects $old --not --all" to see if everything that is reachable from $old is already connected to the existing refs was very inefficient.
- "hash-object --literally" introduced in v2.2 was not prepared to take a really long object type name.
- "git rebase --quiet" was not quite quiet when there is nothing to do.
- The completion for "log --decorate=" parameter value was incorrect.
- "filter-branch" corrupted commit log message that ends with an incomplete line on platforms with some "sed" implementations that munge such a line. Work it around by avoiding to use "sed".
- "git daemon" fails to build from the source under NO_IPV6 configuration (regression in 2.4).
- "git stash pop/apply" forgot to make sure that not just the working tree is clean but also the index is clean. The latter is important as a stash application can conflict and the index will be used for conflict resolution.
- We have prepended $GIT_EXEC_PATH and the path "git" is installed in (typically "/usr/bin") to $PATH when invoking subprograms and hooks for almost eternity, but the original use case the latter tried to support was semi-bogus (i.e. install git to /opt/foo/git and run it without having /opt/foo on $PATH), and more importantly it has become less and less relevant as Git grew more mainstream (i.e. the users would want to have it on their $PATH). Stop prepending the path in which "git" is installed to users’ $PATH, as that would interfere the command search order people depend on (e.g. they may not like versions of programs that are unrelated to Git in /usr/bin and want to override them by having different ones in /usr/local/bin and have the latter directory earlier in their $PATH).
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.3
Git v2.4.3 Release Notes ========================
Fixes since v2.4.3 ------------------
- Error messages from "git branch" called remote-tracking branches as "remote branches".
- "git rerere forget" in a repository without rerere enabled gave a cryptic error message; it should be a silent no-op instead.
- "git pull --log" and "git pull --no-log" worked as expected, but "git pull --log=20" did not.
- The pull.ff configuration was supposed to override the merge.ff configuration, but it didn’t.
- The code to read pack-bitmap wanted to allocate a few hundred pointers to a structure, but by mistake allocated and leaked memory enough to hold that many actual structures. Correct the allocation size and also have it on stack, as it is small enough.
- Various documentation mark-up fixes to make the output more consistent in general and also make AsciiDoctor (an alternative formatter) happier.
- "git bundle verify" did not diagnose extra parameters on the command line.
- Multi-ref transaction support we merged a few releases ago unnecessarily kept many file descriptors open, risking to fail with resource exhaustion.
- The ref API did not handle cases where ’refs/heads/xyzzy/frotz’ is removed at the same time as ’refs/heads/xyzzy’ is added (or vice versa) very well.
- The "log --decorate" enhancement in Git 2.4 that shows the commit at the tip of the current branch e.g. "HEAD → master", did not work with --decorate=full.
- There was a commented-out (instead of being marked to expect failure) test that documented a breakage that was fixed since the test was written; turn it into a proper test.
- core.excludesfile (defaulting to $XDG_HOME/git/ignore) is supposed to be overridden by repository-specific .git/info/exclude file, but the order was swapped from the beginning. This belatedly fixes it.
- The connection initiation code for "ssh" transport tried to absorb differences between the stock "ssh" and Putty-supplied "plink" and its derivatives, but the logic to tell that we are using "plink" variants were too loose and falsely triggered when "plink" appeared anywhere in the path (e.g. "/home/me/bin/uplink/ssh").
- "git rebase -i" moved the "current" command from "todo" to "done" a bit too prematurely, losing a step when a "pick" did not even start.
- "git add -e" did not allow the user to abort the operation by killing the editor.
- Git 2.4 broke setting verbosity and progress levels on "git clone" with native transports.
- Some time ago, "git blame" (incorrectly) lost the convert_to_git() call when synthesizing a fake "tip" commit that represents the state in the working tree, which broke folks who record the history with LF line ending to make their project portable across platforms while terminating lines in their working tree files with CRLF for their platform.
- Code clean-up for xdg configuration path support.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.4
Git v2.4.4 Release Notes ========================
Fixes since v2.4.3 ------------------
- l10n updates for German.
- An earlier leakfix to bitmap testing code was incomplete.
- "git clean pathspec…" tried to lstat(2) and complain even for paths outside the given pathspec.
- Communication between the HTTP server and http_backend process can lead to a dead-lock when relaying a large ref negotiation request. Diagnose the situation better, and mitigate it by reading such a request first into core (to a reasonable limit).
- The clean/smudge interface did not work well when filtering an empty contents (failed and then passed the empty input through). It can be argued that a filter that produces anything but empty for an empty input is nonsense, but if the user wants to do strange things, then why not?
- Make "git stash something --help" error out, so that users can safely say "git stash drop --help".
- Clarify that "log --raw" and "log --format=raw" are unrelated concepts.
- Catch a programmer mistake to feed a pointer not an array to ARRAY_SIZE() macro, by using a couple of GCC extensions.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.5
Git v2.4.5 Release Notes ========================
Fixes since v2.4.4 ------------------
- The setup code used to die when core.bare and core.worktree are set inconsistently, even for commands that do not need working tree.
- There was a dead code that used to handle "git pull --tags" and show special-cased error message, which was made irrelevant when the semantics of the option changed back in Git 1.9 days.
- "color.diff.plain" was a misnomer; give it ’color.diff.context’ as a more logical synonym.
- The configuration reader/writer uses mmap(2) interface to access the files; when we find a directory, it barfed with "Out of memory?".
- Recent "git prune" traverses young unreachable objects to safekeep old objects in the reachability chain from them, which sometimes showed unnecessary error messages that are alarming.
- "git rebase -i" fired post-rewrite hook when it shouldn’t (namely, when it was told to stop sequencing with ’exec’ insn).
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.6
Git v2.4.6 Release Notes ========================
Fixes since v2.4.5 ------------------
- "git fetch --depth=<depth>" and "git clone --depth=<depth>" issued a shallow transfer request even to an upload-pack that does not support the capability.
- "git fsck" used to ignore missing or invalid objects recorded in reflog.
- The tcsh completion writes a bash scriptlet but that would have failed for users with noclobber set.
- Recent Mac OS X updates breaks the logic to detect that the machine is on the AC power in the sample pre-auto-gc script.
- "git format-patch --ignore-if-upstream A..B" did not like to be fed tags as boundary commits.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.7
Git v2.4.7 Release Notes ========================
Fixes since v2.4.6 ------------------
- A minor regression to "git fsck" in v2.2 era was fixed; it complained about a body-less tag object when it lacked a separator empty line after its header to separate it with a non-existent body.
- We used to ask libCURL to use the most secure authentication method available when talking to an HTTP proxy only when we were told to talk to one via configuration variables. We now ask libCURL to always use the most secure authentication method, because the user can tell libCURL to use an HTTP proxy via an environment variable without using configuration variables.
- When you say "!<ENTER>" while running say "git log", you’d confuse yourself in the resulting shell, that may look as if you took control back to the original shell you spawned "git log" from but that isn’t what is happening. To that new shell, we leaked GIT_PAGER_IN_USE environment variable that was meant as a local communication between the original "Git" and subprocesses that was spawned by it after we launched the pager, which caused many "interesting" things to happen, e.g. "git diff | cat" still paints its output in color by default.
Stop leaking that environment variable to the pager's half of the
fork; we only need it on "Git" side when we spawn the pager.
- Avoid possible ssize_t to int truncation.
- "git config" failed to update the configuration file when the underlying filesystem is incapable of renaming a file that is still open.
- A minor bugfix when pack bitmap is used with "rev-list --count".
- An ancient test framework enhancement to allow color was not entirely correct; this makes it work even when tput needs to read from the ~/.terminfo under the user’s real HOME directory.
- Fix a small bug in our use of umask() return value.
- "git rebase" did not exit with failure when format-patch it invoked failed for whatever reason.
- Disable "have we lost a race with competing repack?" check while receiving a huge object transfer that runs index-pack.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.8
Git v2.4.8 Release Notes ========================
Fixes since v2.4.7 ------------------
- Abandoning an already applied change in "git rebase -i" with "--continue" left CHERRY_PICK_HEAD and confused later steps.
- Various fixes around "git am" that applies a patch to a history that is not there yet.
- "git for-each-ref" reported "missing object" for 0{40} when it encounters a broken ref. The lack of object whose name is 0{40} is not the problem; the ref being broken is.
- "git commit --cleanup=scissors" was not careful enough to protect against getting fooled by a line that looked like scissors.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.4.9
Git v2.4.9 Release Notes ========================
Fixes since v2.4.9 ------------------
- A handful of codepaths that used to use fixed-sized arrays to hold pathnames have been corrected to use strbuf and other mechanisms to allow longer pathnames without fearing overflows.
2.40.0
Git v2.40 Release Notes =======================
UI, Workflows & Features
- "merge-tree" learns a new
--merge-baseoption.
- "git jump" (in contrib/) learned to present the "quickfix list" to its standard output (instead of letting it consumed by the editor it invokes), and learned to also drive emacs/emacsclient.
- "git var UNKNOWN_VARIABLE" and "git var VARIABLE" with the variable given an empty value used to behave identically. Now the latter just gives an empty output, while the former still gives an error message.
- Introduce a case insensitive mode to the Bash completion helpers.
- The advice message given by "git status" when it takes long time to enumerate untracked paths has been updated.
- Just like "git var GIT_EDITOR" abstracts the complex logic to choose which editor gets used behind it, "git var" now give support to GIT_SEQUENCE_EDITOR.
- "git format-patch" learned to honor format.mboxrd even when sending patches to the standard output stream,
- ’cat-file’ gains mailmap support for its '--batch-check’ and ’-s’ options.
- Conditionally skip the pre-applypatch and applypatch-msg hooks when applying patches with ’git am’.
- Introduce an optional configuration to allow the trailing hash that protects the index file from bit flipping.
- "git check-attr" learned to take an optional tree-ish to read the .gitattributes file from.
- "scalar" learned to give progress bar.
- "grep -P" learned to use Unicode Character Property to grok character classes when processing b and w etc.
- "git rebase" often ignored incompatible options instead of complaining, which has been corrected.
- "scalar" warns but continues when its periodic maintenance feature cannot be enabled.
- The bundle-URI subsystem adds support for creation-token heuristics to help incremental fetches.
- Userdiff regexp update for Java language.
- "git fetch --jobs=0" used to hit a BUG(), which has been corrected to use the available CPUs.
- An invalid label or ref in the "rebase -i" todo file used to trigger an runtime error. SUch an error is now diagnosed while the todo file is parsed.
- The "diff" drivers specified by the "diff" attribute attached to paths can now specify which algorithm (e.g. histogram) to use.
- "git range-diff" learned --abbrev=<num> option.
- "git archive HEAD^{tree}" records the paths with the current timestamp in the archive, making it harder to obtain a stable output. The command learned the --mtime option to specify an arbitrary timestamp (e.g. --mtime="@0 +0000" for the epoch).
- The credential subsystem learned that a password may have an explicit expiration.
- The format.attach configuration variable lacked a way to override a value defined in a lower-priority configuration file (e.g. the system one) by redefining it in a higher-priority configuration file. Now, setting format.attach to an empty string means show the patch inline in the e-mail message, without using MIME attachment.
This is a backward incompatible change.
Performance, Internal Implementation, Development Support etc.
gitbisectbecomes a builtin.
- The pack-bitmap machinery is taught to log the paths of redundant bitmap(s) to trace2 instead of stderr.
- Use the SHA1DC implementation on macOS, just like other platforms, by default.
- Even in a repository with promisor remote, it is useless to attempt to lazily attempt fetching an object that is expected to be commit, because no "filter" mode omits commit objects. Take advantage of this assumption to fail fast on errors.
- Stop using "git --super-prefix" and narrow the scope of its use to the submodule—helper.
- Stop running win+VS build by default.
- CI updates. We probably want a clean-up to move the long shell script embedded in yaml file into a separate file, but that can come later.
- Use
gitdiff--no-indexas a test_cmp on Windows.
We'd probably need to revisit "do we really want to, and have to,
lose CRLF vs LF?" later, at which time we may be able to further
clean this up by replacing "git diff --no-index" with "diff -u".
- Avoid unnecessary builds in CI, with settings configured in ci-config.
- Plug leaks in sequencer subsystem and its users.
- In-tree .gitattributes update to match the way we recommend our users to mark a file as text. (merge 1f34e0cd3d po/attributes-text later to maint).
- Finally retire the scripted "git add -p/-i" implementation and have everybody use the one reimplemented in C.
Fixes since v2.39 -----------------
- Various leak fixes.
- Fix a bug where
pack-objectswould not respect multiple--filterarguments when invoked directly. (merge d4f7036887 rs/multi-filter-args later to maint).
- Make fsmonitor more robust to avoid the flakiness seen in t7527. (merge 6692d45477 jh/t7527-unflake-by-forcing-cookie later to maint).
- Stop using deprecated macOS API in fsmonitor. (merge b0226007f0 jh/fsmonitor-darwin-modernize later to maint).
- Redefining system functions for a few functions did not follow our usual "implement git_foo() and #define foo(args) git_foo(args)" pattern, which has broken build for some folks.
- The way the diff machinery prepares the options array for the parse_options API has been refactored to avoid resource leaks. (merge 189e97bc4b rs/diff-parseopts later to maint).
- Correct pthread API usage. (merge 786e67611d sx/pthread-error-check-fix later to maint).
- The code to auto-correct a misspelt subcommand unnecessarily called into git_default_config() from the early config codepath, which was a no-no. This has bee corrected. (merge 0918d08887 sg/help-autocorrect-config-fix later to maint).
- "git http-fetch" (which is rarely used) forgot to identify itself in the trace2 output. (merge 7abb43cbc8 jt/http-fetch-trace2-report-name later to maint).
- The output from "git diff --stat" on an unmerged path lost the terminating LF in Git 2.39, which has been corrected. (merge 209d9cb011 pg/diff-stat-unmerged-regression-fix later to maint).
- "git pull -v --recurse-submodules" attempted to pass "-v" down to underlying "git submodule update", which did not understand the request and barfed, which has been corrected. (merge 6f65f84766 ss/pull-v-recurse-fix later to maint).
- When given a pattern that matches an empty string at the end of a line, the code to parse the "git diff" line-ranges fell into an infinite loop, which has been corrected.
- Fix the sequence to fsync $GIT_DIR/packed-refs file that forgot to flush its output to the disk..
- Fix to a small regression in 2.38 days.
- "git diff --relative" did not mix well with "git diff --ext-diff", which has been corrected.
- The logic to see if we are using the "cone" mode by checking the sparsity patterns has been tightened to avoid mistaking a pattern that names a single file as specifying a cone.
- Deal with a few deprecation warning from cURL library.
- Doc update for environment variables set when hooks are invoked.
- Document ORIG_HEAD a bit more.
- "git ls-tree --format=’%(path) %(path)’ $tree $path" showed the path three times, which has been corrected.
- Remove "git env—helper" and demote it to a test-tool subcommand. (merge 4a1baacd46 ab/test-env-helper later to maint).
- Newer regex library macOS stopped enabling GNU-like enhanced BRE, where ’(A\|B)’ works as alternation, unless explicitly asked with the REG_ENHANCED flag. "git grep" now can be compiled to do so, to retain the old behaviour.
- Pthread emulation on Win32 leaked thread handle when a thread is joined. (merge 238a9dfe86 sk/win32-close-handle-upon-pthread-join later to maint).
- "git send-email -v 3" used to be expanded to "git send-email --validate 3" when the user meant to pass them down to "format-patch", which has been corrected. (merge 8774aa56ad km/send-email-with-v-reroll-count later to maint).
- Document that "branch -f <branch>" disables only the safety to avoid recreating an existing branch.
- "git fetch <group>", when "<group>" of remotes lists the same remote twice, unnecessarily failed when parallel fetching was enabled, which has been corrected. (merge 06a668cb90 cw/fetch-remote-group-with-duplication later to maint).
- Clarify how "checkout -b/-B" and "git branch [-f]" are similar but different in the documentation.
- "git hash-object" now checks that the resulting object is well formed with the same code as "git fsck". (merge 8e4309038f jk/hash-object-fsck later to maint).
- Improve the error message given when private key is not loaded in the ssh agent in the codepath to sign with an ssh key. (merge dce7b31126 as/ssh-signing-improve-key-missing-error later to maint).
- Adjust "git request-pull" to strip embedded signature from signed tags to notice non-PGP signatures. (merge a9cad02538 gm/request-pull-with-non-pgp-signed-tags later to maint).
- Remove support for MSys, which now lags way behind MSys2. (merge 2987407f3c hj/remove-msys-support later to maint).
- Fix use of CreateThread() API call made early in the windows start-up code. (merge 592bcab61b sk/winansi-createthread-fix later to maint).
- "git pack-objects" learned to release delta-island bitmap data when it is done using it, saving peak heap memory usage. (merge 647982bb71 ew/free-island-marks later to maint).
- In an environment where dynamically generated code is prohibited to run (e.g. SELinux), failure to JIT pcre patterns is expected. Fall back to interpreted execution in such a case. (merge 50b6ad55b0 cb/grep-fallback-failing-jit later to maint).
- "git name-rev" heuristics update. (merge b2182a8730 en/name-rev-make-taggerdate-much-less-important later to maint).
- Remove more remaining uses of macros that relies on the_index singleton instance without explicitly spelling it out.
- Remove unnecessary explicit sizing of strbuf. (merge 93ea118bed rs/cache-tree-strbuf-growth-fix later to maint).
- Doc update. (merge d9ec3b0dc0 jk/doc-ls-remote-matching later to maint).
- Error messages given upon a signature verification failure used to discard the errors from underlying gpg program, which has been corrected. (merge ad6b320756 js/gpg-errors later to maint).
- Update --date=default documentation. (merge 9deef088ae rd/doc-default-date-format later to maint).
- A test helper had a single write(2) of 256kB, which was too big for some platforms (e.g. NonStop), which has been corrected by using xwrite() wrapper appropriately. (merge 58eab6ff13 jc/genzeros-avoid-raw-write later to maint).
- sscanf(3) used in "git symbolic-ref --short" implementation found to be not working reliably on macOS in UTF-8 locales. Rewrite the code to avoid sscanf() altogether to work it around. (merge 613bef56b8 jk/shorten-unambiguous-ref-wo-sscanf later to maint).
- Various fix-ups on HTTP tests. (merge 8f2146dbf1 jk/http-test-fixes later to maint).
- Fixes to code that parses the todo file used in "rebase -i". (merge 666b6e1135 pw/rebase-i-parse-fix later to maint).
- Test library clean-up. (merge c600a91c94 ar/test-lib-remove-stale-comment later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 4eb1ccecd4 dh/mingw-ownership-check-typofix later to maint). (merge f95526419b ar/typofix-gitattributes-doc later to maint). (merge 27875aeec9 km/doc-branch-start-point later to maint). (merge 35c194dc57 es/t1509-root-fixes later to maint). (merge 7b341645e3 pw/ci-print-failure-name-fix later to maint). (merge bcb71d45bf jx/t1301-updates later to maint). (merge ebdc46c242 jc/doc-diff-patch.txt later to maint). (merge a87a20cbb4 ar/test-cleanup later to maint). (merge f5156f1885 ar/bisect-doc-update later to maint). (merge fca2d86c97 jk/interop-error later to maint). (merge cf4936ed74 tl/ls-tree-code-clean-up later to maint). (merge dcb47e52b0 en/t6426-todo-cleanup later to maint). (merge 5b8db44bdd jc/format-patch-v-unleak later to maint). (merge 590b636737 jk/hash-object-literally-fd-leak later to maint). (merge 5458ba0a4d tb/t0003-invoke-dd-more-portably later to maint). (merge 70661d288b ar/markup-em-dash later to maint). (merge e750951e74 en/ls-files-doc-update later to maint). (merge 4f542975d1 mh/doc-credential-cache-only-in-core later to maint). (merge 3a2ebaebc7 gc/index-format-doc later to maint). (merge b08edf709d jk/httpd-test-updates later to maint). (merge d85e9448dd wl/new-command-doc later to maint). (merge d912a603ed kf/t5000-modernise later to maint). (merge e65b868d07 rs/size-t-fixes later to maint). (merge 3eb1e1ca9a ab/config-h-remove-unused later to maint). (merge d390e08076 cw/doc-pushurl-vs-url later to maint). (merge 567342fc77 rs/ctype-test later to maint). (merge d35d8f2e7a ap/t2015-style-update later to maint).
2.40.1
Git v2.40.1 Release Notes =========================
This release merges up the fix that appears in v2.30.9, v2.31.8, v2.32.7, v2.33.8, v2.34.8, v2.35.8, v2.36.6, v2.37.7, v2.38.5 and v2.39.3 to address the security issues CVE-2023-25652, CVE-2023-25815, and CVE-2023-29007; see the release notes for these versions for details.
2.40.2
Git v2.40.2 Release Notes =========================
This release merges up the fix that appears in v2.39.4 to address the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release notes for that version for details.
2.40.3
Git v2.40.3 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.40.2 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.40.4
Git v2.40.4 Release Notes =========================
This release lets Git refuse to accept URLs that contain control sequences. This addresses CVE-2024-50349 and CVE-2024-52006.
2.41.0
Git v2.41 Release Notes =======================
UI, Workflows & Features
- Allow information carried on the WWW-Authenticate header to be passed to the credential helpers.
- A new "fetch.hideRefs" option can be used to exclude specified refs from "rev-list --objects --stdin --not --all" traversal for checking object connectivity, most useful when there are many unrelated histories in a single repository.
- "git push" has been taught to allow deletion of refs with one-level names to help repairing a repository who acquired such a ref by mistake. In general, we don’t encourage use of such a ref, and creation or update to such a ref is rejected as before.
- Allow "git bisect reset" to check out the original branch when the branch is already checked out in a different worktree linked to the same repository.
- A few subcommands have been taught to stop users from working on a branch that is being used in another worktree linked to the same repository.
- "git format-patch" learned to write a log-message only output file for empty commits.
- "git format-patch" honors the src/dst prefixes set to nonstandard values with configuration variables like "diff.noprefix", causing receiving end of the patch that expects the standard -p1 format to break. "format-patch" has been taught to ignore end-user configuration and always use the standard prefixes.
This is a backward compatibility breaking change.
- Lift the limitation that colored prompts can only be used with PROMPT_COMMAND mode.
- "git blame --contents=<file> <rev> — <path>" used to be forbidden, but now it finds the origins of lines starting at <file> contents through the history that leads to <rev>.
- "git pack-redundant" gave a warning when run, as the command has outlived its usefulness long ago and is nominated for future removal. Now we escalate to give an error.
- "git clone" from an empty repository learned to propagate the choice of the hash algorithm from the source repository to the newly created repository over any one of the v0/v1/v2 protocol.
- "git mergetool" and "git difftool" learns a new configuration guiDefault to optionally favor configured guitool over non-gui-tool automatically when $DISPLAY is set.
- "git branch -d origin/master" would say "no such branch", but it is likely a missed "-r" if refs/remotes/origin/master exists. The command has been taught to give such a hint in its error message.
- Clean-up of the code path that deals with merge strategy option handling in "git rebase".
- "git clone --local" stops copying from an original repository that has symbolic links inside its $GIT_DIR; an error message when that happens has been updated.
- The "--format=…" option of "git for-each-ref", "git branch", and "git tag" commands learn "--omit-empty" to hide refs whose formatting results in an empty string from the output.
- The sendemail-validate validate hook learned to pass the total number of input files and where in the sequence each invocation is via environment variables.
- When "gc" needs to retain unreachable objects, packing them into cruft packs (instead of exploding them into loose object files) has been offered as a more efficient option for some time. Now the use of cruft packs has been made the default and no longer considered an experimental feature.
- The output given by "git blame" that attributes a line to contents taken from the file specified by the "--contents" option shows it differently from a line attributed to the working tree file.
- "git send-email" learned to give the e-mail headers to the validate hook by passing an extra argument from the command line.
- The credential subsystem learns to help OAuth framework.
- The titles of manual pages used to be chomped at an unreasonably short limit, which has been removed.
- Error messages given when working on an unborn branch that is checked out in another worktree have been improved.
- The documentation was misleading about the interaction between GIT_DEFAULT_HASH and "git clone", which has been clarified to stress that the variable is to be ignored by the command.
- "git send-email" learned "--header-cmd=<cmd>" that can inject arbitrary e-mail header lines to the outgoing messages.
- "git fsck" learned to detect bit-flip breakages in the reachability bitmap files.
- The "--stdin" option of "git name-rev" has been replaced with the "--annotate-stdin" option more than a year ago. We stop advertising it in the "git name-rev -h" output.
- "git push --all" gained an alias "git push --branches".
- "git fetch" learned the "--porcelain" option that emits what it did in a machine-parseable format.
- "git --attr-source=<tree> cmd $args" is a new way to have any command to read attributes not from the working tree but from the given tree object.
Performance, Internal Implementation, Development Support etc.
- Code clean-up to clarify directory traversal API.
- Code clean-up to clarify the rule that "git-compat-util.h" must be the first to be included.
- More work towards -Wunused.
- Instead of forcing each command to choose to honor GPG related configuration variables, make the subsystem lazily initialize itself.
- Remove workaround for ancient versions of DocBook to make it work correctly with groff, which has not been necessary since docbook 1.76 from 2010.
- Code clean-up to include and/or uninclude parse-options.h file as needed.
- The code path that reports what "git fetch" did to each ref has been cleaned up.
- Assorted config API updates.
- A few configuration variables to tell the cURL library that different types of ssl-cert and ssl-key are in use have been added.
- Split key function and data structure definitions out of cache.h to new header files and adjust the users.
- "git fetch --all" does not have to download and handle the same bundleURI over and over, which has been corrected.
- "git sparse-checkout" command learns a debugging aid for the sparse rule definitions.
- "git write-tree" learns to work better with sparse-index.
- The on-disk reverse index that allows mapping from the pack offset to the object name for the object stored at the offset has been enabled by default.
- "git fsck" learned to validate the on-disk pack reverse index files.
- strtok() and strtok_r() are banned in this codebase.
- The detect-compilers script to help auto-tweaking the build system had trouble working with compilers whose version number has extra suffixes. The script has been taught that certain suffixes (like "-win32" in "gcc 10-win32") can be safely stripped as they share the same features and bugs with the version without the suffix.
- ctype tests have been taught to test EOF, too.
- The implementation of credential helpers used fgets() over fixed size buffers to read protocol messages, causing the remainder of the folded long line to trigger unexpected behaviour, which has been corrected.
- The implementation of the default "negotiator", used to find common ancestor over the network for object tranfer, used to be recursive; it was updated to be iterative to conserve stackspace usage.
- Our custom callout formatter is no longer used in the documentation formatting toolchain, as the upstream default ones give better output these days.
- The tracing mechanism learned to notice and report when auto-discovered bare repositories are being used, as allowing so without explicitly stating the user intends to do so (with setting GIT_DIR for example) can be used with social engineering as an attack vector.
- "git diff-files" learned not to expand sparse-index unless needed.
Fixes since v2.40 -----------------
- "git fsck" learned to check the index files in other worktrees, just like "git gc" honors them as anchoring points. (merge 8d3e7eac52 jk/fsck-indices-in-worktrees later to maint).
- Fix a segfaulting loop. The function and its caller may need further clean-up. (merge c5773dc078 ew/commit-reach-clean-up-flags-fix later to maint).
- "git restore" supports options like "--ours" that are only meaningful during a conflicted merge, but these options are only meaningful when updating the working tree files. These options are marked to be incompatible when both "--staged" and "--worktree" are in effect. (merge ee8a88826a ak/restore-both-incompatible-with-conflicts later to maint).
- Simplify UI to control progress meter given by "git bundle" command. (merge 8b95521edb jk/bundle-progress later to maint).
- "git bundle" learned that "-" is a common way to say that the input comes from the standard input and/or the output goes to the standard output. It used to work only for output and only from the root level of the working tree. (merge 0bbe10313e jk/bundle-use-dash-for-stdfiles later to maint).
- Once we start running, we assumed that the list of alternate object databases would never change. Hook into the machinery used to update the list of packfiles during runtime to update this list as well. (merge e2d003dbed ds/reprepare-alternates-when-repreparing-packfiles later to maint).
- The code to parse "git rebase -X<opt>" was not prepared to see an unparsable option string, which has been corrected. (merge 15a4cc912e ab/fix-strategy-opts-parsing later to maint).
- "git add -p" while the index is unmerged sometimes failed to parse the diff output it internally produces and died, which has been corrected. (merge 28d1122f9c jk/add-p-unmerged-fix later to maint).
- Fix for a "ls-files --format="%(path)" that produced nonsense output, which was a bug in 2.38. (merge cfb62dd006 aj/ls-files-format-fix later to maint).
- "git receive-pack" that responds to "git push" requests failed to clean a stale lockfile when killed in the middle, which has been corrected. (merge c55c30669c ps/receive-pack-unlock-before-die later to maint).
- "git rev-parse --quiet foo@{u}", or anything that asks @{u} to be parsed with GET_OID_QUIETLY option, did not quietly fail, which has been corrected. (merge dfbfdc521d fc/oid-quietly-parse-upstream later to maint).
- Transports that do not support protocol v2 did not correctly fall back to protocol v0 under certain conditions, which has been corrected. (merge eaa0fd6584 jk/fix-proto-downgrade-to-v0 later to maint).
- time(2) on glib 2.31+, especially on Linux, goes out of sync with higher resolution timers used for gettimeofday(2) and by the filesystem. Replace all calls to it with a git_time() wrapper and (merge 370ddcbc89 pe/time-use-gettimeofday later to maint).
- Code clean-up to use designated initializers in parse-options API. (merge 353e6d4554 sg/parse-options-h-initializers later to maint).
- A recent-ish change to allow unicode character classes to be used with "grep -P" triggered a JIT bug in older pcre2 libraries. The problematic change in Git built with these older libraries has been disabled to work around the bug. (merge 14b9a04479 mk/workaround-pcre-jit-ucp-bug later to maint).
- The wildmatch library code unlearns exponential behaviour it acquired some time ago since it was borrowed from rsync. (merge 3dc0b7f0dc pw/wildmatch-fixes later to maint).
- The index files can become corrupt under certain conditions when the split-index feature is in use, especially together with fsmonitor, which have been corrected. (merge 061dd722dc js/split-index-fixes later to maint).
- Document what the pathname-looking strings in "rev-list --object" output are for and what they mean. (merge 15364d2a3c jk/document-rev-list-object-name later to maint).
- Fix unnecessary truncation of generation numbers used in-core. (merge d3af1c193d ps/ahead-behind-truncation-fix later to maint).
- Code clean-up around the use of the_repository. (merge 4a93b899c1 ab/remove-implicit-use-of-the-repository later to maint).
- Consistently spell "Message-ID" as such, not "Message-Id". (merge ba4324c4e1 jc/spell-id-in-both-caps-in-message-id later to maint).
- Correct use of an uninitialized structure member. (merge dc12ee77ab jx/cap-object-info-uninitialized-fix later to maint).
- Tests had a few places where we ignored PERL_PATH and blindly used /usr/bin/perl, which have been corrected. (merge c1917156a0 jk/use-perl-path-consistently later to maint).
- Documentation mark-up fix. (merge 78b6369e67 la/mfc-markup-fix later to maint).
- Doc toolchain update to remove old workaround for AsciiDoc. (merge 8806120de6 fc/remove-header-workarounds-for-asciidoc later to maint).
- The userdiff regexp patterns for various filetypes that are built into the system have been updated to avoid triggering regexp errors from UTF-8 aware regex engines. (merge be39144954 rs/userdiff-multibyte-regex later to maint).
- The approxidate() API has been simplified by losing an extra function that did the same thing as another one. (merge 8a7f0b666f rs/remove-approxidate-relative later to maint).
- Code clean-up to replace a hardcoded constant with a CPP macro. (merge c870de6502 rs/get-tar-commit-id-use-defined-const later to maint).
- Doc build simplification. (merge 9a09ed3229 fc/doc-stop-using-manversion later to maint).
- "git archive" run from a subdirectory mishandled attributes and paths outside the current directory. (merge 92b1dd1b9e rs/archive-from-subdirectory-fixes later to maint).
- The code to parse capability list for v0 on-wire protocol fell into an infinite loop when a capability appears multiple times, which has been corrected.
- Geometric repacking ("git repack --geometric=<n>") in a repository that borrows from an alternate object database had various corner case bugs, which have been corrected. (merge d85cd18777 ps/fix-geom-repack-with-alternates later to maint).
- The "%GT" placeholder for the "--format" option of "git log" and friends caused BUG() to trigger on a commit signed with an unknown key, which has been corrected. (merge 7891e46585 jk/gpg-trust-level-fix later to maint).
- The completion script used to use bare "read" without the "-r" option to read the contents of various state files, which risked getting confused with backslashes in them. This has been corrected. (merge 197152098a ek/completion-use-read-r-to-read-literally later to maint).
- A small API fix to the ort merge strategy backend. (merge 000c4ceca7 en/ort-finalize-after-0-merges-fix later to maint).
- The commit object parser has been taught to be a bit more lenient to parse timestamps on the author/committer line with a malformed author/committer ident. (merge 90ef0f14eb jk/parse-commit-with-malformed-ident later to maint).
- Retitle a test script with an overly narrow name. (merge 8bb19c14fb ob/t3501-retitle later to maint).
- Doc update to clarify how text and eol attributes interact to specify the end-of-line conversion. (merge 6696077ace ah/doc-attributes-text later to maint).
- Gitk updates from GfW project. (merge 99e70f3077 js/gitk-fixes-from-gfw later to maint).
- "git diff --dirstat" leaked memory, which has been plugged. (merge 83973981eb jc/dirstat-plug-leaks later to maint).
- "git merge-tree" reads the basic configuration, which can be used by git forges to disable replace-refs feature. (merge b6551feadf ds/merge-tree-use-config later to maint).
- A few bugs in the sequencer machinery that results in miscounting the steps have been corrected. (merge 170eea9750 js/rebase-count-fixes later to maint).
- Other code cleanup, docfix, build fix, etc. (merge f7111175df as/doc-markup-fix later to maint). (merge 90ff7c9898 fc/test-aggregation-clean-up later to maint). (merge 9b0c7f308a jc/am-doc-refer-to-format-patch later to maint). (merge b10cbdac4c bb/unicode-width-table-15 later to maint). (merge 3457b50e8c ab/retire-scripted-add-p later to maint). (merge d52fcf493b ds/p2000-fix-grep-sparse later to maint). (merge ec063d2591 ss/hashmap-typofix later to maint). (merge 1aaed69d11 rs/archive-mtime later to maint). (merge 2da2cc9b28 ob/rollback-after-commit-lock-failure later to maint). (merge 54dbd0933b ob/sequencer-save-head-simplify later to maint). (merge a93cbe8d78 ar/test-cleanup-unused-file-creation later to maint). (merge cc48ddd937 jk/chainlint-fixes later to maint). (merge 4833b08426 ow/ref-format-remove-unused-member later to maint). (merge d0ea2ca1cf dw/doc-submittingpatches-grammofix later to maint). (merge fd72637423 ar/t2024-checkout-output-fix later to maint). (merge d45cbe3fe0 ob/sequencer-i18n-fix later to maint). (merge b734fe49fd ob/messages-capitalize-exception later to maint). (merge ad353d7e77 ma/gittutorial-fixes later to maint). (merge a5855fd8d4 ar/test-cleanup-unused-file-creation-part2 later to maint). (merge 0c5308af30 sd/doc-gitignore-and-rm-cached later to maint). (merge cbb83daeaf kh/doc-interpret-trailers-updates later to maint). (merge 3d77fbb664 ar/config-count-tests-updates later to maint). (merge b7cf25c8f4 jc/t9800-fix-use-of-show-s-raw later to maint).
2.41.1
Git v2.41.1 Release Notes =========================
This release merges up the fix that appears in v2.39.4 and v2.40.2 to address the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release notes for these versions for details.
2.41.2
Git v2.41.2 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.41.1 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.41.3
Git v2.41.3 Release Notes =========================
This release merges up the fix that appears in v2.40.4 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for that version for details.
2.42.0
Git v2.42 Release Notes =======================
UI, Workflows & Features
- "git pack-refs" learns "--include" and "--exclude" to tweak the ref hierarchy to be packed using pattern matching.
- ’git worktree add’ learned how to create a worktree based on an orphaned branch with
--orphan.
- "git pack-objects" learned to invoke a new hook program that enumerates extra objects to be used as anchoring points to keep otherwise unreachable objects in cruft packs.
- Add more "git var" for toolsmiths to learn various locations Git is configured with either via the configuration or hard-coded defaults.
- ’git notes append’ was taught '--separator’ to specify string to insert between paragraphs.
- The "git for-each-ref" family of commands learned placeholders related to GPG signature verification.
- "git diff --no-index" learned to read from named pipes as if they were regular files, to allow "git diff <(process) <(substitution)" some shells support.
- Help newbies by suggesting that there are cases where force-pushing is a valid and sensible thing to update a branch at a remote repository, rather than reconciling with merge/rebase.
- "git blame --contents=file" has been taught to work in a bare repository.
- "git branch -f X" to repoint the branch X said that X was "checked out" in another worktree, even when branch X was not and instead being bisected or rebased. The message was reworded to say the branch was "in use".
- Tone down the warning on SHA-256 repositories being an experimental curiosity. We do not have support for them to interoperate with traditional SHA-1 repositories, but at this point, we do not plan to make breaking changes to SHA-256 repositories and there is no longer need for such a strongly phrased warning.
Performance, Internal Implementation, Development Support etc.
- "git diff-tree" has been taught to take advantage of the sparse-index feature.
- Clang’s sanitizer implementation seems to work better than GCC’s. (merge d88d727143 jk/ci-use-clang-for-sanitizer-jobs later to maint).
- The object traversal using reachability bitmap done by "pack-object" has been tweaked to take advantage of the fact that using "boundary" commits as representative of all the uninteresting ones can save quite a lot of object enumeration.
- discover_git_directory() no longer touches the_repository.
- "git worktree" learned to work better with sparse index feature.
- When the external merge driver is killed by a signal, its output should not be trusted as a resolution with conflicts that is proposed by the driver, but the code did.
- The set-up code for the get_revision() API now allows feeding options like --all and --not in the --stdin mode.
- Move functions that are not about pure string manipulation out of strbuf.[ch]
- "imap-send" codepaths got cleaned up to get rid of unused parameters.
- Enumerating refs in the packed-refs file, while excluding refs that match certain patterns, has been optimized.
- Mark-up unused parameters in the code so that we can eventually enable -Wunused-parameter by default.
- Instead of inventing a custom counter variables for debugging, use existing trace2 facility in the fsync customization codepath.
- "git branch --list --format=<format>" and friends are taught a new "%(describe)" placeholder.
- Clarify how to choose the starting point for a new topic in developer guidance document.
- The implementation of "get_sha1_hex()" that reads a hexadecimal string that spells a full object name has been extended to cope with any hash function used in the repository, but the "sha1" in its name survived. Rename it to get_hash_hex(), a name that is more consistent within its friends like get_hash_hex_algop().
- Command line parser fix, and a small parse-options API update.
Fixes since v2.41 -----------------
- "git tag" learned to leave the "$GIT_DIR/TAG_EDITMSG" file when the command failed, so that the user can salvage what they typed. (merge 08c12ec1d0 kh/keep-tag-editmsg-upon-failure later to maint).
- The "-s" (silent, squelch) option of the "diff" family of commands did not interact with other options that specify the output format well. This has been cleaned up so that it will clear all the formatting options given before. (merge 9d484b92ed jc/diff-s-with-other-options later to maint).
- Update documentation regarding Coccinelle patches. (merge 3bd0097cfc gc/doc-cocci-updates later to maint).
- Some atoms that can be used in "--format=<format>" for "git ls-tree" were not supported by "git ls-files", even though they were relevant in the context of the latter. (merge 4d28c4f75f zh/ls-files-format-atoms later to maint).
- Document more pseudo-refs and teach the command line completion machinery to complete AUTO_MERGE. (merge 982ff3a649 pb/complete-and-document-auto-merge-and-friends later to maint).
- "git submodule" code trusted the data coming from the config (and the in-tree .gitmodules file) too much without validating, leading to NULL dereference if the user mucks with a repository (e.g. submodule.<name>.url is removed). This has been corrected. (merge fbc806acd1 tb/submodule-null-deref-fix later to maint).
- The value of config.worktree is per-repository, but has been kept in a singleton global variable per process. This has been OK as most Git operations interacted with a single repository at a time, but not right for operations like recursive "grep" that want to access multiple repositories from a single process without forking.
The global variable has been eliminated and made into a member in
the per-repository data structure.
(merge 3867f6d650 vd/worktree-config-is-per-repository later to maint).
- "git [-c log.follow=true] log [--follow] ’:(glob)f**’" used to barf. (merge 8260bc5902 jk/log-follow-with-non-literal-pathspec later to maint).
- Introduce a mechanism to disable replace refs globally and per repository. (merge 9c7d1b057f ds/disable-replace-refs later to maint).
- "git cat-file --batch" and friends learned "-Z" that uses NUL delimiter for both input and output. (merge f79e18849b ps/cat-file-null-output later to maint).
- The reimplemented "git add -i" did not honor color.ui configuration. (merge 6f74648cea ds/add-i-color-configuration-fix later to maint).
- Compilation fix for platforms without D_TYPE in struct dirent. (merge 03bf92b9bf as/dtype-compilation-fix later to maint).
- Suggest to refrain from using hex literals that are non-portable when writing printf(1) format strings. (merge f0b68f0546 jt/doc-use-octal-with-printf later to maint).
- Simplify error message when run-command fails to start a command. (merge 6d224ac286 rs/run-command-exec-error-on-noent later to maint).
- Gracefully deal with a stale MIDX file that lists a packfile that no longer exists. (merge 06f3867865 tb/open-midx-bitmap-fallback later to maint).
- Even when diff.ignoreSubmodules tells us to ignore submodule changes, "git commit" with an index that already records changes to submodules should include the submodule changes in the resulting commit, but it did not. (merge 5768478edc js/defeat-ignore-submodules-config-with-explicit-addition later to maint).
- When "git commit --trailer=…" invokes the interpret-trailers machinery, it knows what it feeds to interpret-trailers is a full log message without any patch, but failed to express that by passing the "--no-divider" option, which has been corrected. (merge be3d654343 jk/commit-use-no-divider-with-interpret-trailers later to maint).
- Avoid breakage of "git pack-objects --cruft" due to inconsistency between the way the code enumerates packfiles in the repository. (merge 73320e49ad tb/collect-pack-filenames-fix later to maint).
- We create .pack and then .idx, we consider only packfiles that have .idx usable (those with only .pack are not ready yet), so we should remove .idx before removing .pack for consistency. (merge 0dd1324a73 ds/remove-idx-before-pack later to maint).
- Partially revert a sanity check that the rest of the config code was not ready, to avoid triggering it in a corner case. (merge a53f43f900 gc/config-partial-submodule-kvi-fix later to maint).
- "git apply" punts when it is fed too large a patch input; the error message it gives when it happens has been clarified. (merge 42612e18d2 pw/apply-too-large later to maint).
- During a cherry-pick or revert session that works on multiple commits, "git status" did not give correct information, which has been corrected. (merge a096a889f4 jk/cherry-pick-revert-status later to maint).
- A few places failed to differentiate the case where the index is truly empty (nothing added) and we haven’t yet read from the on-disk index file, which have been corrected. (merge 2ee045eea1 js/empty-index-fixes later to maint).
- "git bugreport" tests did not test what it wanted to test, which has been corrected. (merge 1aa92b8500 ma/t0091-fixup later to maint).
- Code snippets in a tutorial document no longer compiled after recent header shuffling, which have been corrected. (merge bbd7c7b7c0 vd/adjust-mfow-doc-to-updated-headers later to maint).
- "git ls-files ’(attr:X)D/’" that triggers the common prefix optimization codepath failed to read from "D/.gitattributes", which has been corrected. (merge f4a8fde057 jc/pathspec-match-with-common-prefix later to maint).
- "git fsck --no-progress" still spewed noise from the commit-graph subsystem, which has been corrected. (merge 9281cd07f0 tb/fsck-no-progress later to maint).
- Various offset computation in the code that accesses the packfiles and other data in the object layer has been hardened against arithmetic overflow, especially on 32-bit systems. (merge 9a25cad7e0 tb/object-access-overflow-protection later to maint).
- Names of MinGW header files are spelled in mixed case in some source files, but the build host can be using case sensitive filesystem with header files with their name spelled in all lowercase. (merge 4a53d0d0bc mh/mingw-case-sensitive-build later to maint).
- Update message mark-up for i18n in "git bundle". (merge bbb6acd998 dk/bundle-i18n-more later to maint).
- "git tag --list --points-at X" showed tags that directly refers to object X, but did not list a tag that points at such a tag, which has been corrected.
- "./configure --with-expat=no" did not work as a way to refuse use of the expat library on a system with the library installed, which has been corrected. (merge fb8f7269c2 ah/autoconf-fixes later to maint).
- When the user edits "rebase -i" todo file so that it starts with a "fixup", which would make it invalid, the command truncated the rest of the file before giving an error and returning the control back to the user. Stop truncating to make it easier to correct such a malformed todo file. (merge 9645a087c2 ah/sequencer-rewrite-todo-fix later to maint).
- Rewrite the description of giving a custom command to the submodule.<name>.update configuration variable. (merge 7cebc5bd78 pv/doc-submodule-update-settings later to maint).
- Adjust to OpenSSL 3+, which deprecates its SHA-1 functions based on its traditional API, by using its EVP API instead. (merge bda9c12073 ew/hash-with-openssl-evp later to maint).
- Exclude "." from the set of characters to be removed from the beginning and the end of the human-readable name. (merge 1c04cb0744 bc/ident-dot-is-no-longer-crud-letter later to maint).
- "git bisect visualize" stopped running "gitk" on Git for Windows when the command was reimplemented in C around Git 2.34 timeframe. This has been corrected. (merge fff1594fa7 ma/locate-in-path-for-windows later to maint).
- "git rebase -i" with a series of squash/fixup, when one of the steps stopped in conflicts and ended up getting skipped, did not handle the accumulated commit log messages, which has been corrected. (merge 6ce7afe163 pw/rebase-skip-commit-message-fix later to maint).
- Adjust to newer Term::ReadLine to prevent it from breaking the interactive prompt code in send-email. (merge c016726c2d jk/send-email-with-new-readline later to maint).
- Windows updates. (merge 0050f8e401 ds/maintenance-on-windows-fix later to maint).
- Correct use of lstat() that assumed a failing call would not clobber the statbuf. (merge 72695d8214 st/mv-lstat-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 51f9d2e563 sa/doc-ls-remote later to maint). (merge c6d26a9dda jk/format-patch-message-id-unleak later to maint). (merge f7e063f326 ps/fetch-cleanups later to maint). (merge e4cf013468 tl/quote-problematic-arg-for-clarity later to maint). (merge 20025fdfc7 tz/test-ssh-verifytime-fix later to maint). (merge e48a21df65 tz/test-fix-pthreads-prereq later to maint). (merge 68b51172e3 mh/commit-reach-get-reachable-plug-leak later to maint). (merge aeee1408ce kh/use-default-notes-doc later to maint). (merge 3b8724bce6 jc/test-modernization later to maint). (merge 447a3b7331 jc/test-modernization-2 later to maint). (merge d57fa7fc73 la/doc-interpret-trailers later to maint). (merge 548afb0d9a la/docs-typofixes later to maint). (merge 3744ffcbcd rs/doc-ls-tree-hex-literal later to maint). (merge 6c26da8404 mh/credential-erase-improvements later to maint). (merge 78e56cff69 tz/lib-gpg-prereq-fix later to maint). (merge 80d32e84b5 rj/leakfixes later to maint). (merge 0a868031ed pb/complete-diff-options later to maint). (merge d4f28279ad jc/doc-hash-object-types later to maint). (merge 1876a5ae15 ks/t4205-test-describe-with-abbrev-fix later to maint). (merge 6e6a529b57 jk/fsck-indices-in-worktrees later to maint). (merge 3e81b896f7 rs/packet-length-simplify later to maint). (merge 4c9cb51fe7 mh/doc-credential-helpers later to maint). (merge 3437f549dd jr/gitignore-doc-example-markup later to maint). (merge 947ebd62a0 jc/am-parseopt-fix later to maint). (merge e12cb98e1e jc/branch-parseopt-fix later to maint). (merge d6f598e443 jc/gitignore-doc-pattern-markup later to maint). (merge a2dad4868b jc/transport-parseopt-fix later to maint). (merge 68cbb20e73 jc/parse-options-show-branch later to maint). (merge 3821eb6c3d jc/parse-options-reset later to maint). (merge c48af99a3e bb/trace2-comment-fix later to maint). (merge c95ae3ff9c rs/describe-parseopt-fix later to maint). (merge 36f76d2a25 rs/pack-objects-parseopt-fix later to maint). (merge 30c8c55cbf jc/tree-walk-drop-base-offset later to maint). (merge d089a06421 rs/bundle-parseopt-cleanup later to maint). (merge 823839bda1 ew/sha256-gcrypt-leak-fixes later to maint). (merge a5c01603b3 bc/ignore-clangd-cache later to maint). (merge 12009a182b js/allow-t4000-to-be-indented-with-spaces later to maint). (merge b3dcd24b8a jc/send-email-pre-process-fix later to maint).
2.42.1
Git 2.42.1 Release Notes ========================
There is nothing exciting to see here. Relative to Git 2.42, this release contains the fixes that have already been merged to the ’master’ branch of the development towards Git 2.43 that has been tagged as Git 2.43.0-rc0.
Fixes since Git 2.42.0 ----------------------
- Tests that are known to pass with LSan are now marked as such.
- Flaky "git p4" tests, as well as "git svn" tests, are now skipped in the (rather expensive) sanitizer CI job.
- Tests with LSan from time to time seem to emit harmless message that makes our tests unnecessarily flaky; we work it around by filtering the uninteresting output.
- GitHub CI workflow has learned to trigger Coverity check.
- Overly long label names used in the sequencer machinery are now chopped to fit under filesystem limitation.
- Scalar updates.
- Tweak GitHub Actions CI so that pushing the same commit to multiple branch tips at the same time will not waste building and testing the same thing twice.
- The commit-graph verification code that detects mixture of zero and non-zero generation numbers has been updated.
- "git diff -w --exit-code" with various options did not work correctly, which is being addressed.
- transfer.unpackLimit ought to be used as a fallback, but overrode fetch.unpackLimit and receive.unpackLimit instead.
- The use of API between two calls to require_clean_work_tree() from the sequencer code has been cleaned up for consistency.
- "git diff --no-such-option" and other corner cases around the exit status of the "diff" command has been corrected.
- "git for-each-ref --sort=’contents:size’" sorts the refs according to size numerically, giving a ref that points at a blob twelve-byte (12) long before showing a blob hundred-byte (100) long.
- Various fixes to the behavior of "rebase -i" when the command got interrupted by conflicting changes.
- References from description of the
--patchoption in various manual pages have been simplified and improved.
- "git grep -e A --no-or -e B" is accepted, even though the negation of "or" did not mean anything, which has been tightened.
- The completion script (in contrib/) has been taught to treat the "-t" option to "git checkout" and "git switch" just like the "--track" option, to complete remote-tracking branches.
- "git diff --no-index -R <(one) <(two)" did not work correctly, which has been corrected.
- Update "git maintenance" timers’ implementation based on systemd timers to work with WSL.
- "git diff --cached" codepath did not fill the necessary stat information for a file when fsmonitor knows it is clean and ended up behaving as if it is not clean, which has been corrected.
- Clarify how "alias.foo = : git cmd ; aliased-command-string" should be spelled with necessary whitespaces around punctuation marks to work.
- HTTP Header redaction code has been adjusted for a newer version of cURL library that shows its traces differently from earlier versions.
- An error message given by "git send-email" when given a malformed address did not give correct information, which has been corrected.
- UBSan options were not propagated through the test framework to git run via the httpd, unlike ASan options, which has been corrected.
Also contains various documentation updates, code clean-ups and minor fixups.
2.42.2
Git v2.42.2 Release Notes =========================
This release merges up the fix that appears in v2.39.4, v2.40.2 and v2.41.1 to address the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release notes for these versions for details.
2.42.3
Git v2.42.3 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.42.2 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.42.4
Git v2.42.4 Release Notes =========================
This release merges up the fix that appears in v2.40.4 and v2.41.3 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
2.43.0
Git v2.43 Release Notes =======================
Backward Compatibility Notes
- The "--rfc" option of "git format-patch" used to be a valid way to override an earlier "--subject-prefix=<something>" on the command line and replace it with "[RFC PATCH]", but from this release, it merely prefixes the string "RFC " in front of the given subject prefix. If you are negatively affected by this change, please use "--subject-prefix=PATCH --rfc" as a replacement.
- In Git 2.42, "git rev-list --stdin" learned to take non-revisions (like "--not") from the standard input, but the way such a "--not" was handled was quite confusing, which has been rethought. The updated rule is that "--not" given from the command line only affects revs given from the command line that comes but not revs read from the standard input, and "--not" read from the standard input affects revs given from the standard input and not revs given from the command line.
UI, Workflows & Features
- A message written in olden time prevented a branch from getting checked out, saying it is already checked out elsewhere. But these days, we treat a branch that is being bisected or rebased just like a branch that is checked out and protect it from getting modified with the same codepath. The message has been rephrased to say that the branch is "in use" to avoid confusion.
- Hourly and other schedules of "git maintenance" jobs are randomly distributed now.
- "git cmd -h" learned to signal which options can be negated by listing such options like "--[no-]opt".
- The way authentication related data other than passwords (e.g., oauth token and password expiration data) are stored in libsecret keyrings has been rethought.
- Update the libsecret and wincred credential helpers to correctly match which credential to erase; they erased the wrong entry in some cases.
- Git GUI updates.
- "git format-patch" learned a new "--description-file" option that lets cover letter description to be fed; this can be used on detached HEAD where there is no branch description available, and also can override the branch description if there is one.
- Use of the "--max-pack-size" option to allow multiple packfiles to be created is now supported even when we are sending unreachable objects to cruft packs.
- "git format-patch --rfc --subject-prefix=<foo>" used to ignore the "--subject-prefix" option and used "[RFC PATCH]"; now we will add "RFC" prefix to whatever subject prefix is specified.
- "git log --format" has been taught the %(decorate) placeholder for further customization over what the "--decorate" option offers.
- The default log message created by "git revert", when reverting a commit that records a revert, has been tweaked, to encourage people to describe complex "revert of revert of revert" situations better in their own words.
- The command-line completion support (in contrib/) learned to complete "git commit --trailer=" for possible trailer keys.
- "git update-index" learned the "--show-index-version" option to inspect the index format version used by the on-disk index file.
- "git diff" learned the "diff.statNameWidth" configuration variable, to give the default width for the name part in the "--stat" output.
- "git range-diff --notes=foo" compared "log --notes=foo --notes" of the two ranges, instead of using just the specified notes tree, which has been corrected to use only the specified notes tree.
- The command line completion script (in contrib/) can be told to complete aliases by including ": git <cmd> ;" in the alias to tell it that the alias should be completed in a similar way to how "git <cmd>" is completed. The parsing code for the alias has been loosened to allow ’;’ without an extra space before it.
- "git for-each-ref" and friends learned to apply mailmap to authorname and other fields in a more flexible way than using separate placeholder letters like %a[eElL] every time we want to come up with small variants.
- "git repack" machinery learned to pay attention to the "--filter=" option.
- "git repack" learned the "--max-cruft-size" option to prevent cruft packs from growing without bounds.
- "git merge-tree" learned to take strategy backend specific options via the "-X" option, like "git merge" does.
- "git log" and friends learned the "--dd" option that is a short-hand for "--diff-merges=first-parent -p".
- The attribute subsystem learned to honor the "attr.tree" configuration variable that specifies which tree to read the .gitattributes files from.
- "git merge-file" learns a mode to read three variants of the contents to be merged from blob objects.
Performance, Internal Implementation, Development Support etc.
- "git check-attr" has been taught to work better with sparse-index.
- It may be tempting to leave the help text NULL for a command line option that is either hidden or too obvious, but "git subcmd -h" and "git subcmd --help-all" would have segfaulted if done so. Now the help text is truly optional.
- Tests that are known to pass with LSan are now marked as such.
- Flaky "git p4" tests, as well as "git svn" tests, are now skipped in the (rather expensive) sanitizer CI job.
- Tests with LSan from time to time seem to emit harmless messages that make our tests unnecessarily flaky; we work around it by filtering the uninteresting output.
- Unused parameters to functions are marked as such, and/or removed, in order to bring us closer to "-Wunused-parameter" clean.
- The code to keep track of existing packs in the repository while repacking has been refactored.
- The "streaming" interface used for bulk-checkin codepath has been narrowed to take only blob objects for now, with no real loss of functionality.
- GitHub CI workflow has learned to trigger Coverity check.
- Test coverage for trailers has been improved.
- The code to iterate over loose references has been optimized to reduce the number of lstat() system calls.
- The codepaths that read "chunk" formatted files have been corrected to pay attention to the chunk size and notice broken files.
- Replace macos-12 used at GitHub CI with macos-13. (merge 682a868f67 js/ci-use-macos-13 later to maint).
Fixes since v2.42 -----------------
- Overly long label names used in the sequencer machinery are now chopped to fit under filesystem limitation.
- Scalar updates.
- Tweak GitHub Actions CI so that pushing the same commit to multiple branch tips at the same time will not waste building and testing the same thing twice.
- The commit-graph verification code that detects a mixture of zero and non-zero generation numbers has been updated.
- "git diff -w --exit-code" with various options did not work correctly, which has been corrected.
- The "transfer.unpackLimit" configuration variable ought to be used as a fallback, but overrode the more specific "fetch.unpackLimit" and "receive.unpackLimit" configuration variables by mistake, which has been corrected.
- The use of API between two calls to require_clean_work_tree() from the sequencer code has been cleaned up for consistency.
- "git diff --no-such-option" and other corner cases around the exit status of the "diff" command have been corrected.
- "git for-each-ref --sort=’contents:size’" sorted the refs according to size numerically, giving a ref that points at a blob twelve-byte (12) long before showing a blob hundred-byte (100) long, which has been corrected.
- We now limit the depth of the tree objects and maximum length of pathnames recorded in tree objects. (merge 4d5693ba05 jk/tree-name-and-depth-limit later to maint).
- Various fixes to the behavior of "rebase -i", when the command got interrupted by conflicting changes, have been made.
- References from a description of the
--patchoption in various manual pages have been simplified and improved.
- "git grep -e A --no-or -e B" is accepted, even though the negation of the "--or" option did not mean anything, which has been tightened.
- The completion script (in contrib/) has been taught to treat the "-t" option to "git checkout" and "git switch" just like the "--track" option, to complete remote-tracking branches.
- "git diff --no-index -R <(one) <(two)" did not work correctly, which has been corrected.
- "git maintenance" timers’ implementation has been updated, based on systemd timers, to work with WSL.
- "git diff --cached" codepath did not fill the necessary stat information for a file when fsmonitor knows it is clean and ended up behaving as if it were not clean, which has been corrected.
- How "alias.foo = : git cmd ; aliased-command-string" should be spelled with necessary whitespace around punctuation marks to work has been more clearly documented (but this will be moot with newer versions of Git where the parsing rules have been improved).
- HTTP Header redaction code has been adjusted for a newer version of cURL library that shows its traces differently from earlier versions.
- An error message given by "git send-email", when given a malformed address, did not show the offending address, which has been corrected.
- UBSan options were not propagated through the test framework to git run via the httpd, unlike ASan options, which has been corrected.
- "checkout --merge — path" and "update-index --unresolve path" did not resurrect conflicted state that was resolved to remove path, but now they do. (merge 5bdedac3c7 jc/unresolve-removal later to maint).
- The display width table for unicode characters has been updated for Unicode 15.1 (merge 872976c37e bb/unicode-width-table-15 later to maint).
- Update mailmap entry for Derrick. (merge 6e5457d8c7 ds/mailmap-entry-update later to maint).
- In the ".gitmodules" files, submodules are keyed by their names, and the path to the submodule whose name is $name is specified by the submodule.$name.path variable. There were a few codepaths that mixed the name and path up when consulting the submodule database, which have been corrected. It took long for these bugs to be found as the name of a submodule initially is the same as its path, and the problem does not surface until it is moved to a different path, which apparently happens very rarely.
- "git diff --merge-base X other args…" insisted that X must be a commit and errored out when given an annotated tag that peels to a commit, but we only need it to be a committish. This has been corrected. (merge 4adceb5a29 ar/diff-index-merge-base-fix later to maint).
- "git merge-tree" used to segfault when the "--attr-source" option is used, which has been corrected. (merge e95bafc52f jc/merge-ort-attr-index-fix later to maint).
- Unlike "git log --pretty=%D", "git log --pretty="%(decorate)" did not auto-initialize the decoration subsystem, which has been corrected.
- Feeding "git stash store" with a random commit that was not created by "git stash create" now errors out. (merge d9b6634589 jc/fail-stash-to-store-non-stash later to maint).
- The index file has room only for the lower 32-bit of the file size in the cached stat information, which means cached stat information will have 0 in its sd_size member for a file whose size is a multiple of 4GiB. This is mistaken for a racily clean path. Avoid it by storing a bogus sd_size value instead for such files. (merge 5143ac07b1 bc/racy-4gb-files later to maint).
- "git p4" tried to store symlinks to LFS when told, but has been fixed not to do so, because it does not make sense. (merge 10c89a02b0 mm/p4-symlink-with-lfs later to maint).
- The codepath to handle recipient addresses
gitsend-email--composelearns from the user was completely broken, which has been corrected. (merge 3ec6167567 jk/send-email-fix-addresses-from-composed-messages later to maint).
- "cd sub && git grep -f patterns" tried to read "patterns" file at the top level of the working tree; it has been corrected to read "sub/patterns" instead.
- "git reflog expire --single-worktree" has been broken for the past 20 months or so, which has been corrected.
- "git send-email" did not have certain pieces of data computed yet when it tried to validate the outgoing messages and its recipient addresses, which has been sorted out.
- "git bugreport" learned to complain when it received a command line argument that it will not use.
- The codepath to traverse the commit-graph learned to notice that a commit is missing (e.g., corrupt repository lost an object), even though it knows something about the commit (like its parents) from what is in commit-graph. (merge 7a5d604443 ps/do-not-trust-commit-graph-blindly-for-existence later to maint).
- "git rev-list --missing" did not work for missing commit objects, which has been corrected.
- "git rev-list --unpacked --objects" failed to exclude packed non-commit objects, which has been corrected. (merge 7b3c8e9f38 tb/rev-list-unpacked-fix later to maint).
- "To dereference" and "to peel" were sometimes used in in-code comments and documentation but without description in the glossary. (merge 893dce2ffb vd/glossary-dereference-peel later to maint).
- Other code cleanup, docfix, build fix, etc. (merge c2c349a15c xz/commit-title-soft-limit-doc later to maint). (merge 1bd809938a tb/format-pack-doc-update later to maint). (merge 8f81532599 an/clang-format-typofix later to maint). (merge 3ca86adc2d la/strvec-header-fix later to maint). (merge 6789275d37 jc/test-i18ngrep later to maint). (merge 9972cd6004 ps/leakfixes later to maint). (merge 46edab516b tz/send-email-helpfix later to maint).
2.43.1
Git 2.43.1 Release Notes ========================
There is nothing exciting to see here. Relative to Git 2.43, this release contains the fixes that have already been merged to the ’master’ branch of the development towards the next major release.
Fixes since Git 2.43.0 ----------------------
- The way CI testing used "prove" could lead to running the test suite twice needlessly, which has been corrected.
- Newer versions of Getopt::Long started giving warnings against our (ab)use of it in "git send-email". Bump the minimum version requirement for Perl to 5.8.1 (from September 2002) to allow simplifying our implementation.
- Earlier we stopped relying on commit-graph that (still) records information about commits that are lost from the object store, which has negative performance implications. The default has been flipped to disable this pessimization.
- Stale URLs have been updated to their current counterparts (or archive.org) and HTTP links are replaced with working HTTPS links.
- trace2 streams used to record the URLs that potentially embed authentication material, which has been corrected.
- The sample pre-commit hook that tries to catch introduction of new paths that use potentially non-portable characters did not notice an existing path getting renamed to such a problematic path, when rename detection was enabled.
- The command line parser for the "log" family of commands was too loose when parsing certain numbers, e.g., silently ignoring the extra ’q’ in "git log -n 1q" without complaining, which has been tightened up.
- "git $cmd --end-of-options --rev — --path" for some $cmd failed to interpret "--rev" as a rev, and "--path" as a path. This was fixed for many programs like "reset" and "checkout".
- "git bisect reset" has been taught to clean up state files and refs even when BISECT_START file is gone.
- Some codepaths did not correctly parse configuration variables specified with valueless "true", which has been corrected.
- Code clean-up for sanity checking of command line options for "git show-ref".
- The code to parse the From e-mail header has been updated to avoid recursion.
- "git fetch --atomic" issued an unnecessary empty error message, which has been corrected.
- Command line completion script (in contrib/) learned to work better with the reftable backend.
- "git status" is taught to show both the branch being bisected and being rebased when both are in effect at the same time. cf. <xmqqil76kyov.fsf@gitster.g>
- "git archive --list extra garbage" silently ignored excess command line parameters, which has been corrected.
- "git sparse-checkout set" added default patterns even when the patterns are being fed from the standard input, which has been corrected.
- Unlike other environment variables that took the usual true/false/yes/no as well as 0/1, GIT_FLUSH only understood 0/1, which has been corrected.
- Clearing in-core repository (happens during e.g., "git fetch --recurse-submodules" with commit graph enabled) made in-core commit object in an inconsistent state by discarding the necessary data from commit-graph too early, which has been corrected.
Also contains various documentation updates, code clean-ups and minor fixups.
2.43.2
Git 2.43.2 Release Notes ========================
Relative to Git 2.43.1, this release has two important fixes to allow "git imap-send" to be built with NO_CURL defined, and to restore the forced flushing behaviour when GIT_FLUSH=1 is set. It also contains other, unexciting, fixes that have already been merged to the ’master’ branch of the development towards the next major release.
Fixes since Git 2.43.1 ----------------------
- Update to a new feature recently added, "git show-ref --exists".
- Rename detection logic ignored the final line of a file if it is an incomplete line.
- "git diff --no-rename A B" did not disable rename detection but did not trigger an error from the command line parser.
- "git diff --no-index file1 file2" segfaulted while invoking the external diff driver, which has been corrected.
- Rewrite //-comments to /* comments */ in files whose comments prevalently use the latter.
- A failed "git tag -s" did not necessarily result in an error depending on the crypto backend, which has been corrected.
- "git stash" sometimes was silent even when it failed due to unwritable index file, which has been corrected.
- Recent conversion to allow more than 0/1 in GIT_FLUSH broke the mechanism by flipping what yes/no means by mistake, which has been corrected.
Also contains documentation updates, code clean-ups and minor fixups.
2.43.3
Git 2.43.3 Release Notes ========================
Relative to Git 2.43.2, this release fixes one regression that manifests while running "git commit -v --trailer".
Fixes since Git 2.43.2 ----------------------
- "git commit -v --trailer=…" was broken with recent update and placed the trailer after the divider line, which has been corrected.
2.43.4
Git v2.43.4 Release Notes =========================
This release merges up the fix that appears in v2.39.4, v2.40.2, v2.41.1 and v2.42.2 to address the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release notes for these versions for details.
2.43.5
Git v2.43.5 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.43.4 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.43.6
Git v2.43.6 Release Notes =========================
This release merges up the fix that appears in v2.40.4, v2.41.3 and v2.42.4 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
2.43.7
Git v2.43.7 Release Notes =========================
This release includes fixes for CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386.
Fixes since v2.43.6 -------------------
- CVE-2025-27613, Gitk:
When a user clones an untrusted repository and runs Gitk without
additional command arguments, any writable file can be created and
truncated. The option "Support per-file encoding" must have been
enabled. The operation "Show origin of this line" is affected as
well, regardless of the option being enabled or not.
- CVE-2025-27614, Gitk:
A Git repository can be crafted in such a way that a user who has
cloned the repository can be tricked into running any script
supplied by the attacker by invoking `gitk filename`, where
`filename` has a particular structure.
- CVE-2025-46334, Git GUI (Windows only):
A malicious repository can ship versions of sh.exe or typical
textconv filter programs such as astextplain. On Windows, path
lookup can find such executables in the worktree. These programs
are invoked when the user selects "Git Bash" or "Browse Files" from
the menu.
- CVE-2025-46835, Git GUI:
When a user clones an untrusted repository and is tricked into
editing a file located in a maliciously named directory in the
repository, then Git GUI can create and overwrite any writable
file.
- CVE-2025-48384, Git:
When reading a config value, Git strips any trailing carriage
return and line feed (CRLF). When writing a config entry, values
with a trailing CR are not quoted, causing the CR to be lost when
the config is later read. When initializing a submodule, if the
submodule path contains a trailing CR, the altered path is read
resulting in the submodule being checked out to an incorrect
location. If a symlink exists that points the altered path to the
submodule hooks directory, and the submodule contains an executable
post-checkout hook, the script may be unintentionally executed
after checkout.
- CVE-2025-48385, Git:
When cloning a repository Git knows to optionally fetch a bundle
advertised by the remote server, which allows the server-side to
offload parts of the clone to a CDN. The Git client does not
perform sufficient validation of the advertised bundles, which
allows the remote side to perform protocol injection.
This protocol injection can cause the client to write the fetched
bundle to a location controlled by the adversary. The fetched
content is fully controlled by the server, which can in the worst
case lead to arbitrary code execution.
- CVE-2025-48386, Git:
The wincred credential helper uses a static buffer (`target`) as a
unique key for storing and comparing against internal storage. This
credential helper does not properly bounds check the available
space remaining in the buffer before appending to it with
`wcsncat()`, leading to potential buffer overflows.
2.44.0
Git v2.44 Release Notes =======================
Backward Compatibility Notes
- "git checkout -B <branch>" used to allow switching to a branch that is in use on another worktree, but this was by mistake. The users need to use "--ignore-other-worktrees" option.
UI, Workflows & Features
- "git add" and "git stash" learned to support the ":(attr:…)" magic pathspec.
- "git rebase --autosquash" is now enabled for non-interactive rebase, but it is still incompatible with the apply backend.
- Introduce "git replay", a tool meant on the server side without working tree to recreate a history.
- "git merge-file" learned to take the "--diff-algorithm" option to use algorithm different from the default "myers" diff.
- Command line completion (in contrib/) learned to complete path arguments to the "add/set" subcommands of "git sparse-checkout" better.
- "git checkout -B <branch> [<start-point>]" allowed a branch that is in use in another worktree to be updated and checked out, which might be a bit unexpected. The rule has been tightened, which is a breaking change. "--ignore-other-worktrees" option is required to unbreak you, if you are used to the current behaviour that "-B" overrides the safety.
- The builtin_objectmode attribute is populated for each path without adding anything in .gitattributes files, which would be useful in magic pathspec, e.g., ":(attr:builtin_objectmode=100755)" to limit to executables.
- "git fetch" learned to pay attention to "fetch.all" configuration variable, which pretends as if "--all" was passed from the command line when no remote parameter was given.
- In addition to (rather cryptic) Security Identifiers, show username and domain in the error message when we barf on mismatch between the Git directory and the current user on Windows.
- The error message given when "git branch -d branch" fails due to commits unique to the branch has been split into an error and a new conditional advice message.
- When given an existing but unreadable file as a configuration file, gitweb behaved as if the file did not exist at all, but now it errors out. This is a change that may break backward compatibility.
- When $HOME/.gitconfig is missing but XDG config file is available, we should write into the latter, not former. "git gc" and "git maintenance" wrote into a wrong "global config" file, which have been corrected.
- Define "special ref" as a very narrow set that consists of FETCH_HEAD and MERGE_HEAD, and clarify everything else that used to be classified as such are actually just pseudorefs.
- All conditional "advice" messages show how to turn them off, which becomes repetitive. Setting advice.* configuration explicitly on now omits the instruction part.
- The "disable repository discovery of a bare repository" check, triggered by setting safe.bareRepository configuration variable to ’explicit’, has been loosened to exclude the ".git/" directory inside a non-bare repository from the check. So you can do "cd .git && git cmd" to run a Git command that works on a bare repository without explicitly specifying $GIT_DIR now.
- The completion script (in contrib/) learned more options that can be used with "git log".
- The labels on conflict markers for the common ancestor, our version, and the other version are available to custom 3-way merge driver via %S, %X, and %Y placeholders.
- The write codepath for the reftable data learned to honor core.fsync configuration.
- The "--fsck-objects" option of "git index-pack" now can take the optional parameter to tweak severity of different fsck errors.
- The wincred credential backend has been taught to support oauth refresh token the same way as credential-cache and credential-libsecret backends.
- Command line completion support (in contrib/) has been updated for "git bisect".
- "git branch" and friends learned to use the formatted text as sorting key, not the underlying timestamp value, when the --sort option is used with author or committer timestamp with a format specifier (e.g., "--sort=creatordate:format:%H:%M:%S").
- The command line completion script (in contrib/) learned to complete configuration variable names better.
Performance, Internal Implementation, Development Support etc.
- Process to add some form of low-level unit tests has started.
- Add support for GitLab CI.
- "git for-each-ref --no-sort" still sorted the refs alphabetically which paid non-trivial cost. It has been redefined to show output in an unspecified order, to allow certain optimizations to take advantage of.
- Simplify API implementation to delete references by eliminating duplication.
- Subject approxidate() and show_date() machinery to OSS-Fuzz.
- A new helper to let us pretend that we called lstat() when we know our cache_entry is up-to-date via fsmonitor.
- The optimization based on fsmonitor in the "diff --cached" codepath is resurrected with the "fake-lstat" introduced earlier.
- Test balloon to use C99 "bool" type from <stdbool.h> has been added.
- "git clone" has been prepared to allow cloning a repository with non-default hash function into a repository that uses the reftable backend.
- Streaming spans of packfile data used to be done only from a single, primary, pack in a repository with multiple packfiles. It has been extended to allow reuse from other packfiles, too.
- Comment updates to help developers not to attempt to modify messages from plumbing commands that must stay constant.
It might make sense to reassess the plumbing needs every few years,
but that should be done as a separate effort.
- Move test-ctype helper to the unit-test framework.
- Instead of manually creating refs/ hierarchy on disk upon a creation of a secondary worktree, which is only usable via the files backend, use the refs API to populate it.
- CI for GitLab learned to drive macOS jobs.
- A few tests to "git commit -o <pathspec>" and "git commit -i <pathspec>" has been added.
- Tests on ref API are moved around to prepare for reftable.
- The Makefile often had to say "-L$(path) -R$(path)" that repeats the path to the same library directory for link time and runtime. A Makefile template is used to reduce such repetition.
- The priority queue test has been migrated to the unit testing framework.
- Setting
feature.experimentalopts the user into multi-pack reuse experiment
- Squelch node.js 16 deprecation warnings from GitHub Actions CI by updating actions/github-script and actions/checkout that use node.js 20.
- The mechanism to report the filename in the source code, used by the unit-test machinery, assumed that the compiler expanded FILE to the path to the source given to the $(CC), but some compilers give full path, breaking the output. This has been corrected.
Fixes since v2.43 -----------------
- The way CI testing used "prove" could lead to running the test suite twice needlessly, which has been corrected.
- "git format-patch --encode-email-headers" ignored the option when preparing the cover letter, which has been corrected.
- Newer versions of Getopt::Long started giving warnings against our (ab)use of it in "git send-email". Bump the minimum version requirement for Perl to 5.8.1 (from September 2002) to allow simplifying our implementation.
- Earlier we stopped relying on commit-graph that (still) records information about commits that are lost from the object store, which has negative performance implications. The default has been flipped to disable this pessimization.
- Stale URLs have been updated to their current counterparts (or archive.org) and HTTP links are replaced with working HTTPS links.
- trace2 streams used to record the URLs that potentially embed authentication material, which has been corrected.
- The sample pre-commit hook that tries to catch introduction of new paths that use potentially non-portable characters did not notice an existing path getting renamed to such a problematic path, when rename detection was enabled.
- The command line parser for the "log" family of commands was too loose when parsing certain numbers, e.g., silently ignoring the extra ’q’ in "git log -n 1q" without complaining, which has been tightened up.
- "git $cmd --end-of-options --rev — --path" for some $cmd failed to interpret "--rev" as a rev, and "--path" as a path. This was fixed for many programs like "reset" and "checkout".
- "git bisect reset" has been taught to clean up state files and refs even when BISECT_START file is gone.
- Some codepaths did not correctly parse configuration variables specified with valueless "true", which has been corrected.
- Code clean-up for sanity checking of command line options for "git show-ref".
- The code to parse the From e-mail header has been updated to avoid recursion.
- "git fetch --atomic" issued an unnecessary empty error message, which has been corrected.
- Command line completion script (in contrib/) learned to work better with the reftable backend.
- "git status" is taught to show both the branch being bisected and being rebased when both are in effect at the same time.
- "git archive --list extra garbage" silently ignored excess command line parameters, which has been corrected.
- "git sparse-checkout set" added default patterns even when the patterns are being fed from the standard input, which has been corrected.
- "git sparse-checkout (add|set) --[no-]cone --end-of-options" did not handle "--end-of-options" correctly after a recent update.
- Unlike other environment variables that took the usual true/false/yes/no as well as 0/1, GIT_FLUSH only understood 0/1, which has been corrected.
- Clearing in-core repository (happens during e.g., "git fetch --recurse-submodules" with commit graph enabled) made in-core commit object in an inconsistent state by discarding the necessary data from commit-graph too early, which has been corrected.
- Update to a new feature recently added, "git show-ref --exists".
- oss-fuzz tests are built and run in CI. (merge c4a9cf1df3 js/oss-fuzz-build-in-ci later to maint).
- Rename detection logic ignored the final line of a file if it is an incomplete line.
- GitHub CI update. (merge 0188b2c8e0 pb/ci-github-skip-logs-for-broken-tests later to maint).
- "git diff --no-rename A B" did not disable rename detection but did not trigger an error from the command line parser.
- "git archive --remote=<remote>" learned to talk over the smart http (aka stateless) transport. (merge 176cd68634 jx/remote-archive-over-smart-http later to maint).
- Fetching via protocol v0 over Smart HTTP transport sometimes failed to correctly auto-follow tags. (merge fba732c462 jk/fetch-auto-tag-following-fix later to maint).
- The documentation for the --exclude-per-directory option marked it as deprecated, which confused readers into thinking there may be a plan to remove it in the future, which was not our intention. (merge 0009542cab jc/ls-files-doc-update later to maint).
- "git diff --no-index file1 file2" segfaulted while invoking the external diff driver, which has been corrected.
- Rewrite //-comments to /* comments */ in files whose comments prevalently use the latter.
- Cirrus CI jobs started breaking because we specified version of FreeBSD that is no longer available, which has been corrected. (merge 81fffb66d3 cb/use-freebsd-13-2-at-cirrus-ci later to maint).
- A caller called index_file_exists() that takes a string expressed as <ptr, length> with a wrong length, which has been corrected. (merge 156e28b36d jh/sparse-index-expand-to-path-fix later to maint).
- A failed "git tag -s" did not necessarily result in an error depending on the crypto backend, which has been corrected.
- "git stash" sometimes was silent even when it failed due to unwritable index file, which has been corrected.
- "git show-ref --verify" did not show things like "CHERRY_PICK_HEAD", which has been corrected.
- Recent conversion to allow more than 0/1 in GIT_FLUSH broke the mechanism by flipping what yes/no means by mistake, which has been corrected.
- The sequencer machinery does not use the ref API and instead records names of certain objects it needs for its correct operation in temporary files, which makes these objects susceptible to loss by garbage collection. These temporary files have been added as starting points for reachability analysis to fix this. (merge bc7f5db896 pw/gc-during-rebase later to maint).
- "git cherry-pick" invoked during "git rebase -i" session lost the authorship information, which has been corrected. (merge e4301f73ff vn/rebase-with-cherry-pick-authorship later to maint).
- The code paths that call repo_read_object_file() have been tightened to react to errors. (merge 568459bf5e js/check-null-from-read-object-file later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 5aea3955bc rj/clarify-branch-doc-m later to maint). (merge 9cce3be2df bk/bisect-doc-fix later to maint). (merge 8430b438f6 vd/fsck-submodule-url-test later to maint). (merge 3cb4384683 jc/t0091-with-unknown-git later to maint). (merge 020456cb74 rs/receive-pack-remove-find-header later to maint). (merge bc47139f4f la/trailer-cleanups later to maint).
2.44.1
Git v2.44.1 Release Notes =========================
This release merges up the fix that appears in v2.39.4, v2.40.2, v2.41.1, v2.42.2 and v2.43.4 to address the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release notes for these versions for details.
2.44.2
Git v2.44.2 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.44.1 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.44.3
Git v2.44.3 Release Notes =========================
This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4 and v2.43.6 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
2.44.4
Git v2.44.4 Release Notes =========================
This release merges up the fixes that appears in v2.43.7 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
2.45.0
Git v2.45 Release Notes =======================
Backward Compatibility Notes
UI, Workflows & Features
- Integrate the reftable code into the refs framework as a backend. With "git init --ref-format=reftable", hopefully it would be a lot more efficient to manage a repository with many references.
- "git checkout -p" and friends learned that "@" is a synonym for "HEAD".
- Variants of vimdiff learned to honor mergetool.<variant>.layout settings.
- "git reflog" learned a "list" subcommand that enumerates known reflogs.
- When a merge conflicted at a submodule, merge-ort backend used to unconditionally give a lengthy message to suggest how to resolve it. Now the message can be squelched as an advice message.
- "git for-each-ref" learned "--include-root-refs" option to show even the stuff outside the ’refs/’ hierarchy.
- "git rev-list --missing=print" has learned to optionally take "--allow-missing-tips", which allows the objects at the starting points to be missing.
- "git merge-tree" has learned that the three trees involved in the 3-way merge only need to be trees, not necessarily commits.
- "git log --merge" learned to pay attention to CHERRY_PICK_HEAD and other kinds of *_HEAD pseudorefs.
- Platform specific tweaks for OS/390 has been added to config.mak.uname.
- Users with safe.bareRepository=explicit can still work from within $GIT_DIR of a seconary worktree (which resides at .git/worktrees/$name/) of the primary worktree without explicitly specifying the $GIT_DIR environment variable or the --git-dir=<path> option.
- The output format for dates "iso-strict" has been tweaked to show a time in the Zulu timezone with "Z" suffix, instead of "+00:00".
- "git diff" and friends learned two extra configuration variables, diff.srcPrefix and diff.dstPrefix.
- The status.showUntrackedFiles configuration variable had a name that tempts users to set a Boolean value expressed in our usual "false", "off", and "0", but it only took "no". This has been corrected so "true" and its synonyms are taken as "normal", while "false" and its synonyms are taken as "no".
- Remove an ancient and not well maintained Hg-to-git migration script from contrib/.
- Hints that suggest what to do after resolving conflicts can now be squelched by disabling advice.mergeConflict.
- Allow git-cherry-pick(1) to automatically drop redundant commits via a new
--emptyoption, similar to the--emptyoptions for git-rebase(1) and git-am(1). Includes a soft deprecation of--keep-redundant-commitsas well as some related docs changes and sequencer code cleanup.
- "git config" learned "--comment=<message>" option to leave a comment immediately after the "variable = value" on the same line in the configuration file.
- core.commentChar used to be limited to a single byte, but has been updated to allow an arbitrary multi-byte sequence.
- "git add -p" and other "interactive hunk selection" UI has learned to skip showing the hunk immediately after it has already been shown, and an additional action to explicitly ask to reshow the current hunk.
- "git pack-refs" learned the "--auto" option, which defers the decision of whether and how to pack to the ref backend. This is used by the reftable backend to avoid repacking of an already-optimal ref database. The new mode is triggered from "git gc --auto".
- "git add -u <pathspec>" and "git commit [-i] <pathspec>" did not diagnose a pathspec element that did not match any files in certain situations, unlike "git add <pathspec>" did.
- The userdiff patterns for C# has been updated.
- Git writes a "waiting for your editor" message on an incomplete line after launching an editor, and then append another error message on the same line if the editor errors out. It now clears the "waiting for…" line before giving the error message.
- The filename used for rejected hunks "git apply --reject" creates was limited to PATH_MAX, which has been lifted.
- When "git bisect" reports the commit it determined to be the culprit, we used to show it in a format that does not honor common UI tweaks, like log.date and log.decorate. The code has been taught to use "git show" to follow more customizations.
Performance, Internal Implementation, Development Support etc.
- The code to iterate over refs with the reftable backend has seen some optimization.
- More tests that are marked as "ref-files only" have been updated to improve test coverage of reftable backend.
- Some parts of command line completion script (in contrib/) have been micro-optimized.
- The way placeholders are to be marked-up in documentation have been specified; use "<placeholder>" to typeset the word inside a pair of <angle-brackets> emphasized.
- "git --no-lazy-fetch cmd" allows to run "cmd" while disabling lazy fetching of objects from the promisor remote, which may be handy for debugging.
- The implementation in "git clean" that makes "-n" and "-i" ignore clean.requireForce has been simplified, together with the documentation.
- Uses of xwrite() helper have been audited and updated for better error checking and simpler code.
- Some trace2 events that lacked def_param have learned to show it, enriching the output.
- The parse-options code that deals with abbreviated long option names have been cleaned up.
- The code in reftable backend that creates new table files works better with the tempfile framework to avoid leaving cruft after a failure.
- The reftable code has its own custom binary search function whose comparison callback has an unusual interface, which caused the binary search to degenerate into a linear search, which has been corrected.
- The code to iterate over reflogs in the reftable has been optimized to reduce memory allocation and deallocation.
- Work to support a repository that work with both SHA-1 and SHA-256 hash algorithms has started.
- A new fuzz target that exercises config parsing code has been added.
- Fix the way recently added tests interpolate variables defined outside them, and document the best practice to help future developers.
- Introduce an experimental protocol for contributors to propose the topic description to be used in the "What’s cooking" report, the merge commit message for the topic, and in the release notes and document it in the SubmittingPatches document.
- The t/README file now gives a hint on running individual tests in the "t/" directory with "make t<num>-.sh t<num>-.sh". (merge 8d383806fc pb/test-scripts-are-build-targets later to maint).
- The "hint:" messages given by the advice mechanism, when given a message with a blank line, left a line with trailing whitespace, which has been cleansed.
- Documentation rules has been explicitly described how to mark-up literal parts and a few manual pages have been updated as examples.
- The .editorconfig file has been taught that a Makefile uses HT indentation.
- t-prio-queue test has been cleaned up by using C99 compound literals; this is meant to also serve as a weather-balloon to smoke out folks with compilers who have trouble compiling code that uses the feature.
- Windows binary used to decide the use of unix-domain socket at build time, but it learned to make the decision at runtime instead.
- Document and apply workaround for a buggy version of dash that mishandles "local var=val" construct.
- The codepaths that reach date_mode_from_type() have been updated to pass "struct date_mode" by value to make them thread safe.
- The strategy to compact multiple tables of reftables after many operations accumulate many entries has been improved to avoid accumulating too many tables uncollected.
- The code to iterate over reftable blocks has seen some optimization to reduce memory allocation and deallocation.
- The way "git fast-import" handles paths described in its input has been tightened up and more clearly documented.
- The cvsimport tests required that the platform understands traditional timezone notations like CST6CDT, which has been updated to work on those systems as long as they understand POSIX notation with explicit tz transition dates.
- The code to format trailers have been cleaned up.
Fixes since v2.44 -----------------
- "git apply" on a filesystem without filemode support have learned to take a hint from what is in the index for the path, even when not working with the "--index" or "--cached" option, when checking the executable bit match what is required by the preimage in the patch. (merge 45b625142d cp/apply-core-filemode later to maint).
- "git column" has been taught to reject negative padding value, as it would lead to nonsense behaviour including division by zero. (merge 76fb807faa kh/column-reject-negative-padding later to maint).
- "git am --help" now tells readers what actions are available in "git am --whitespace=<action>", in addition to saying that the option is passed through to the underlying "git apply". (merge a171dac734 jc/am-whitespace-doc later to maint).
- "git tag --column" failed to check the exit status of its "git column" invocation, which has been corrected. (merge 92e66478fc rj/tag-column-fix later to maint).
- Credential helper based on libsecret (in contrib/) has been updated to handle an empty password correctly. (merge 8f1f2023b7 mh/libsecret-empty-password-fix later to maint).
- "git difftool --dir-diff" learned to honor the "--trust-exit-code" option; it used to always exit with 0 and signalled success. (merge eb84c8b6ce ps/difftool-dir-diff-exit-code later to maint).
- The code incorrectly attempted to use textconv cache when asked, even when we are not running in a repository, which has been corrected. (merge affe355fe7 jk/textconv-cache-outside-repo-fix later to maint).
- Remove an empty file that shouldn’t have been added in the first place. (merge 4f66942215 js/remove-cruft-files later to maint).
- The logic to access reflog entries by date and number had ugly corner cases at the boundaries, which have been cleaned up. (merge 5edd126720 jk/reflog-special-cases-fix later to maint).
- An error message from "git upload-pack", which responds to "git fetch" requests, had a trailing NUL in it, which has been corrected. (merge 3f4c7a0805 sg/upload-pack-error-message-fix later to maint).
- Clarify wording in the CodingGuidelines that requires <git-compat-util.h> to be the first header file. (merge 4e89f0e07c jc/doc-compat-util later to maint).
- "git commit -v --cleanup=scissors" used to add the scissors line twice in the log message buffer, which has been corrected. (merge e90cc075cc jt/commit-redundant-scissors-fix later to maint).
- A custom remote helper no longer cannot access the newly created repository during "git clone", which is a regression in Git 2.44. This has been corrected. (merge 199f44cb2e ps/remote-helper-repo-initialization-fix later to maint).
- Various parts of upload-pack have been updated to bound the resource consumption relative to the size of the repository to protect from abusive clients. (merge 6cd05e768b jk/upload-pack-bounded-resources later to maint).
- The upload-pack program, when talking over v2, accepted the packfile-uris protocol extension from the client, even if it did not advertise the capability, which has been corrected. (merge a922bfa3b5 jk/upload-pack-v2-capability-cleanup later to maint).
- Make sure failure return from merge_bases_many() is properly caught. (merge 25fd20eb44 js/merge-base-with-missing-commit later to maint).
- FSMonitor client code was confused when FSEvents were given in a different case on a case-insensitive filesystem, which has been corrected. (merge 29c139ce78 jh/fsmonitor-icase-corner-case-fix later to maint).
- The "core.commentChar" configuration variable only allows an ASCII character, which was not clearly documented, which has been corrected. (merge fb7c556f58 kh/doc-commentchar-is-a-byte later to maint).
- With release 2.44 we got rid of all uses of test_i18ngrep and there is no in-flight topic that adds a new use of it. Make a call to test_i18ngrep a hard failure, so that we can remove it at the end of this release cycle. (merge 381a83dfa3 jc/test-i18ngrep later to maint).
- The command line completion script (in contrib/) learned to complete "git reflog" better. (merge 1284f9cc11 rj/complete-reflog later to maint).
- The logic to complete the command line arguments to "git worktree" subcommand (in contrib/) has been updated to correctly honor things like "git -C dir" etc. (merge 3574816d98 rj/complete-worktree-paths-fix later to maint).
- When git refuses to create a branch because the proposed branch name is not a valid refname, an advice message is given to refer the user to exact naming rules. (merge 8fbd903e58 kh/branch-ref-syntax-advice later to maint).
- Code simplification by getting rid of code that sets an environment variable that is no longer used. (merge 72a8d3f027 pw/rebase-i-ignore-cherry-pick-help-environment later to maint).
- The code to find the effective end of log messages can fall into an endless loop, which has been corrected. (merge 2541cba2d6 fs/find-end-of-log-message-fix later to maint).
- Mark-up used in the documentation has been improved for consistency. (merge 45d5ed3e50 ja/doc-markup-fixes later to maint).
- The status.showUntrackedFiles configuration variable was incorrectly documented to accept "false", which has been corrected.
- Leaks from "git restore" have been plugged. (merge 2f64da0790 rj/restore-plug-leaks later to maint).
- "git bugreport --no-suffix" was not supported and instead segfaulted, which has been corrected. (merge b3b57c69da js/bugreport-no-suffix-fix later to maint).
- The documentation for "%(trailers[:options])" placeholder in the "--pretty" option of commands in the "git log" family has been updated. (merge bff85a338c bl/doc-key-val-sep-fix later to maint).
- "git checkout --conflict=bad" reported a bad conflictStyle as if it were given to a configuration variable; it has been corrected to report that the command line option is bad. (merge 5a99c1ac1a pw/checkout-conflict-errorfix later to maint).
- Code clean-up in the "git log" machinery that implements custom log message formatting. (merge 1c10b8e5b0 jk/pretty-subject-cleanup later to maint).
- "git config" corrupted literal HT characters written in the configuration file as part of a value, which has been corrected. (merge e6895c3f97 ds/config-internal-whitespace-fix later to maint).
- A unit test for reftable code tried to enumerate all files in a directory after reftable operations and expected to see nothing but the files it wanted to leave there, but was fooled by .nfs* cruft files left, which has been corrected. (merge 0068aa7946 ps/reftable-unit-test-nfs-workaround later to maint).
- The implementation and documentation of "object-format" option exchange between the Git itself and its remote helpers did not quite match, which has been corrected.
- The "--pretty=<shortHand>" option of the commands in the "git log" family, defined as "[pretty] shortHand = <expansion>" should have been looked up case insensitively, but was not, which has been corrected. (merge f999d5188b bl/pretty-shorthand-config-fix later to maint).
- "git apply" failed to extract the filename the patch applied to, when the change was about an empty file created in or deleted from a directory whose name ends with a SP, which has been corrected. (merge 776ffd1a30 jc/apply-parse-diff-git-header-names-fix later to maint).
- Update a more recent tutorial doc. (merge 95ab557b4b dg/myfirstobjectwalk-updates later to maint).
- The test script had an incomplete and ineffective attempt to avoid clobbering the testing user’s real crontab (and its equivalents), which has been completed. (merge 73cb87773b es/test-cron-safety later to maint).
- Use advice_if_enabled() API to rewrite a simple pattern to call advise() after checking advice_enabled(). (merge 6412d01527 rj/use-adv-if-enabled later to maint).
- Another "set -u" fix for the bash prompt (in contrib/) script. (merge d7805bc743 vs/complete-with-set-u-fix later to maint).
- "git checkout/switch --detach foo", after switching to the detached HEAD state, gave the tracking information for the ’foo’ branch, which was pointless.
- "git apply" has been updated to lift the hardcoded pathname length limit, which in turn allowed a mksnpath() function that is no longer used. (merge 708f7e0590 rs/apply-lift-path-length-limit later to maint).
- A file descriptor leak in an error codepath, used when "git apply --reject" fails to create the *.rej file, has been corrected. (merge 2b1f456adf rs/apply-reject-fd-leakfix later to maint).
- A config parser callback function fell through instead of returning after recognising and processing a variable, wasting cycles, which has been corrected. (merge a816ccd642 ds/fetch-config-parse-microfix later to maint).
- Fix was added to work around a regression in libcURL 8.7.0 (which has already been fixed in their tip of the tree). (merge 92a209bf24 jk/libcurl-8.7-regression-workaround later to maint).
- The variable that holds the value read from the core.excludefile configuration variable used to leak, which has been corrected. (merge 0e0fefb29f jc/unleak-core-excludesfile later to maint).
- vreportf(), which is used by error() and friends, has been taught to give the error message printf-format string when its vsnprintf() call fails, instead of showing nothing useful to identify the nature of the error. (merge c63adab961 rs/usage-fallback-to-show-message-format later to maint).
- Adjust to an upcoming changes to GNU make that breaks our Makefiles. (merge 227b8fd902 tb/make-indent-conditional-with-non-spaces later to maint).
- Git 2.44 introduced a regression that makes the updated code to barf in repositories with multi-pack index written by older versions of Git, which has been corrected.
- When .git/rr-cache/ rerere database gets corrupted or rerere is fed to work on a file with conflicted hunks resolved incompletely, the rerere machinery got confused and segfaulted, which has been corrected. (merge 167395bb47 mr/rerere-crash-fix later to maint).
- The "receive-pack" program (which responds to "git push") was not converted to run "git maintenance --auto" when other codepaths that used to run "git gc --auto" were updated, which has been corrected. (merge 7bf3057d9c ps/run-auto-maintenance-in-receive-pack later to maint).
- Other code cleanup, docfix, build fix, etc. (merge f0e578c69c rs/use-xstrncmpz later to maint). (merge 83e6eb7d7a ba/credential-test-clean-fix later to maint). (merge 64562d784d jb/doc-interactive-singlekey-do-not-need-perl later to maint). (merge c431a235e2 cp/t9146-use-test-path-helpers later to maint). (merge 82d75402d5 ds/doc-send-email-capitalization later to maint). (merge 41bff66e35 jc/doc-add-placeholder-fix later to maint). (merge 6835f0efe9 jw/remote-doc-typofix later to maint). (merge 244001aa20 hs/rebase-not-in-progress later to maint). (merge 2ca6c07db2 jc/no-include-of-compat-util-from-headers later to maint). (merge 87bd7fbb9c rs/fetch-simplify-with-starts-with later to maint). (merge f39addd0d9 rs/name-rev-with-mempool later to maint). (merge 9a97b43e03 rs/submodule-prefix-simplify later to maint). (merge 40b8076462 ak/rebase-autosquash later to maint). (merge 3223204456 eg/add-uflags later to maint). (merge 5f78d52dce es/config-doc-sort-sections later to maint). (merge 781fb7b4c2 as/option-names-in-messages later to maint). (merge 51d41dc243 jk/doc-remote-helpers-markup-fix later to maint). (merge e1aaf309db pb/ci-win-artifact-names-fix later to maint). (merge ad538c61da jc/index-pack-fsck-levels later to maint). (merge 67471bc704 ja/doc-formatting-fix later to maint). (merge 86f9ce7dd6 bl/doc-config-fixes later to maint). (merge 0d527842b7 az/grep-group-error-message-update later to maint). (merge 7c43bdf07b rs/strbuf-expand-bad-format later to maint). (merge 8b68b48d5c ds/typofix-core-config-doc later to maint). (merge 39bb692152 rs/imap-send-use-xsnprintf later to maint). (merge 8d320cec60 jc/t2104-style-fixes later to maint). (merge b4454d5a7b pw/t3428-cleanup later to maint). (merge 84a7c33a4b pf/commitish-committish later to maint). (merge 8882ee9d68 la/mailmap-entry later to maint). (merge 44bdba2fa6 rs/no-openssl-compilation-fix-on-macos later to maint). (merge f412d72c19 yb/replay-doc-linkfix later to maint). (merge 5da40be8d7 xx/rfc2822-date-format-in-doc later to maint).
2.45.1
Git v2.45.1 Release Notes =========================
This release merges up the fix that appears in v2.39.4, v2.40.2, v2.41.1, v2.42.2, v2.43.4 and v2.44.1 to address the security issues CVE-2024-32002, CVE-2024-32004, CVE-2024-32020, CVE-2024-32021 and CVE-2024-32465; see the release notes for these versions for details.
2.45.2
Git v2.45.2 Release Notes =========================
In preparing security fixes for four CVEs, we made overly aggressive "defense in depth" changes that broke legitimate use cases like ’git lfs’ and ’git annex.’ This release is to revert these misguided, if well-intentioned, changes that were shipped in 2.45.1 and were not direct security fixes.
Jeff King (5): send-email: drop FakeTerm hack send-email: avoid creating more than one Term::ReadLine object ci: drop mention of BREW_INSTALL_PACKAGES variable ci: avoid bare "gcc" for osx-gcc job ci: stop installing "gcc-13" for osx-gcc
Johannes Schindelin (6): hook: plug a new memory leak init: use the correct path of the templates directory again Revert "core.hooksPath: add some protection while cloning" tests: verify that clone -c core.hooksPath=/dev/null works again clone: drop the protections where hooks aren’t run Revert "Add a helper function to compare file contents"
Junio C Hamano (1): Revert "fsck: warn about symlink pointing inside a gitdir"
2.45.3
Git v2.45.3 Release Notes =========================
This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4, v2.43.6 and v2.44.3 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
This version also backports various small fixes accumulated on the ’master’ front during the development towards Git 2.46, the next feature release.
Fixes since v2.45.2 -------------------
- Git-GUI has a new maintainer, Johannes Sixt.
- Tests that try to corrupt in-repository files in chunked format did not work well on macOS due to its broken "mv", which has been worked around.
- The maximum size of attribute files is enforced more consistently.
- Unbreak CI jobs so that we do not attempt to use Python 2 that has been removed from the platform.
- Git 2.43 started using the tree of HEAD as the source of attributes in a bare repository, which has severe performance implications. For now, revert the change, without ripping out a more explicit support for the attr.tree configuration variable.
- Windows CI running in GitHub Actions started complaining about the order of arguments given to calloc(); the imported regex code uses the wrong order almost consistently, which has been corrected.
- The SubmittingPatches document now refers folks to manpages translation project.
- "git rebase --signoff" used to forget that it needs to add a sign-off to the resulting commit when told to continue after a conflict stops its operation.
- The procedure to build multi-pack-index got confused by the replace-refs mechanism, which has been corrected by disabling the latter.
- "git stash -S" did not handle binary files correctly, which has been corrected.
- A scheduled "git maintenance" job is expected to work on all repositories it knows about, but it stopped at the first one that errored out. Now it keeps going.
- zsh can pretend to be a normal shell pretty well except for some glitches that we tickle in some of our scripts. Work them around so that "vimdiff" and our test suite works well enough with it.
- Command line completion support for zsh (in contrib/) has been updated to stop exposing internal state to end-user shell interaction.
- The documentation for "git diff --name-only" has been clarified that it is about showing the names in the post-image tree.
- The chainlint script (invoked during "make test") did nothing when it failed to detect the number of available CPUs. It now falls back to 1 CPU to avoid the problem.
- "git init" in an already created directory, when the user configuration has includeif.onbranch, started to fail recently, which has been corrected.
- The safe.directory configuration knob has been updated to optionally allow leading path matches.
- An overly large ".gitignore" files are now rejected silently.
- Fix for an embarrassing typo that prevented Python2 tests from running anywhere.
- Varargs functions that are unannotated as printf-like or execl-like have been annotated as such.
- The "-k" and "--rfc" options of "format-patch" will now error out when used together, as one tells us not to add anything to the title of the commit, and the other one tells us to add "RFC" in addition to "PATCH".
- When the user adds to "git rebase -i" instruction to "pick" a merge commit, the error experience is not pleasant. Such an error is now caught earlier in the process that parses the todo list.
- We forgot to normalize the result of getcwd() to NFC on macOS where all other paths are normalized, which has been corrected. This still does not address the case where core.precomposeUnicode configuration is not defined globally.
- Earlier we stopped using the tree of HEAD as the default source of attributes in a bare repository, but failed to document it. This has been corrected.
- An unused extern declaration for mingw has been removed to prevent it from causing build failure.
- A helper function shared between two tests had a copy-paste bug, which has been corrected.
- "git fetch-pack -k -k" without passing "--lock-pack" (which we never do ourselves) did not work at all, which has been corrected.
Also contains various documentation updates and code clean-ups.
2.45.4
Git v2.45.4 Release Notes =========================
This release merges up the fixes that appears in v2.43.7, and v2.44.4 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
2.46.0
Git v2.46 Release Notes =======================
UI, Workflows & Features
- The "--rfc" option of "git format-patch" learned to take an optional string value to be used in place of "RFC" to tweak the "[PATCH]" on the subject header.
- The credential helper protocol, together with the HTTP layer, have been enhanced to support authentication schemes different from username & password pair, like Bearer and NTLM.
- Command line completion script (in contrib/) learned to complete "git symbolic-ref" a bit better (you need to enable plumbing commands to be completed with GIT_COMPLETION_SHOW_ALL_COMMANDS).
- When the user responds to a prompt given by "git add -p" with an unsupported command, list of available commands were given, which was too much if the user knew what they wanted to type but merely made a typo. Now the user gets a much shorter error message.
- The color parsing code learned to handle 12-bit RGB colors, spelled as "#RGB" (in addition to "#RRGGBB" that is already supported).
- The operation mode options (like "--get") the "git config" command uses have been deprecated and replaced with subcommands (like "git config get").
- "git tag" learned the "--trailer" option to futz with the trailers in the same way as "git commit" does.
- A new global "--no-advice" option can be used to disable all advice messages, which is meant to be used only in scripts.
- Updates to symbolic refs can now be made as a part of ref transaction.
- The trailer API has been reshuffled a bit.
- Terminology to call various ref-like things are getting straightened out.
- The command line completion script (in contrib/) has been adjusted to the recent update to "git config" that adopted subcommand based UI.
- The knobs to tweak how reftable files are written have been made available as configuration variables.
- When "git push" notices that the commit at the tip of the ref on the other side it is about to overwrite does not exist locally, it used to first try fetching it if the local repository is a partial clone. The command has been taught not to do so and immediately fail instead.
- The promisor.quiet configuration knob can be set to true to make lazy fetching from promisor remotes silent.
- The inter/range-diff output has been moved to the end of the patch when format-patch adds it to a single patch, instead of writing it before the patch text, to be consistent with what is done for a cover letter for a multi-patch series.
- A new command has been added to migrate a repository that uses the files backend for its ref storage to use the reftable backend, with limitations.
- "git diff --exit-code --ext-diff" learned to take the exit status of the external diff driver into account when deciding the exit status of the overall "git diff" invocation when configured to do so.
- "git update-ref --stdin" learned to handle transactional updates of symbolic-refs.
- "git format-patch --interdiff" for multi-patch series learned to turn on cover letters automatically (unless told never to enable cover letter with "--no-cover-letter" and such).
- The "--heads" option of "ls-remote" and "show-ref" has been deprecated; "--branches" replaces "--heads".
- For over a year, setting add.interactive.useBuiltin configuration variable did nothing but giving a "this does not do anything" warning. The warning has been removed.
- The http transport can now be told to send request with authentication material without first getting a 401 response.
- A handful of entries are added to the GitFAQ document.
- "git var GIT_SHELL_PATH" should report the path to the shell used to spawn external commands, but it didn’t do so on Windows, which has been corrected.
Performance, Internal Implementation, Development Support etc.
- Advertise "git contacts", a tool for newcomers to find people to ask review for their patches, a bit more in our developer documentation.
- In addition to building the objects needed, try to link the objects that are used in fuzzer tests, to make sure at least they build without bitrot, in Linux CI runs.
- Code to write out reftable has seen some optimization and simplification.
- Tests to ensure interoperability between reftable written by jgit and our code have been added and enabled in CI.
- The singleton index_state instance "the_index" has been eliminated by always instantiating "the_repository" and replacing references to "the_index" with references to its .index member.
- Git-GUI has a new maintainer, Johannes Sixt.
- The "test-tool" has been taught to run testsuite tests in parallel, bypassing the need to use the "prove" tool.
- The "whitespace check" task that was enabled for GitHub Actions CI has been ported to GitLab CI.
- The refs API lost functions that implicitly assumes to work on the primary ref_store by forcing the callers to pass a ref_store as an argument.
- Code clean-up to reduce inter-function communication inside builtin/config.c done via the use of global variables.
- The pack bitmap code saw some clean-up to prepare for a follow-up topic.
- Preliminary code clean-up for "git send-email".
- The default "creation-factor" used by "git format-patch" has been raised to make it more aggressively find matching commits.
- Before discovering the repository details, We used to assume SHA-1 as the "default" hash function, which has been corrected. Hopefully this will smoke out codepaths that rely on such an unwarranted assumptions.
- The project decision making policy has been documented.
- The strcmp-offset tests have been rewritten using the unit test framework.
- "git add -p" learned to complain when an answer with more than one letter is given to a prompt that expects a single letter answer.
- The alias-expanded command lines are logged to the trace output.
- A new test was added to ensure git commands that are designed to run outside repositories do work.
- A few tests in reftable library have been rewritten using the unit test framework.
- A pair of test helpers that essentially are unit tests on hash algorithms have been rewritten using the unit-tests framework.
- A test helper that essentially is unit tests on the "decorate" logic has been rewritten using the unit-tests framework.
- Many memory leaks in the sparse-checkout code paths have been plugged.
- "make check-docs" noticed problems and reported to its output but failed to signal its findings with its exit status, which has been corrected.
- Building with "-Werror -Wwrite-strings" is now supported.
- To help developers, the build procedure now allows builders to use CFLAGS_APPEND to specify additional CFLAGS.
- "oidtree" tests were rewritten to use the unit test framework.
- The structure of the document that records longer-term project decisions to deprecate/remove/update various behaviour has been outlined.
- The pseudo-merge reachability bitmap to help more efficient storage of the reachability bitmap in a repository with too many refs has been added.
- When "git merge" sees that the index cannot be refreshed (e.g. due to another process doing the same in the background), it died but after writing MERGE_HEAD etc. files, which was useless for the purpose to recover from the failure.
- The output from "git cat-file --batch-check" and "--batch-command (info)" should not be unbuffered, for which some tests have been added.
- A CPP macro USE_THE_REPOSITORY_VARIABLE is introduced to help transition the codebase to rely less on the availability of the singleton the_repository instance.
- "git version --build-options" reports the version information of OpenSSL and other libraries (if used) in the build.
- Memory ownership rules for the in-core representation of remote.*.url configuration values have been straightened out, which resulted in a few leak fixes and code clarification.
- When bundleURI interface fetches multiple bundles, Git failed to take full advantage of all bundles and ended up slurping duplicated objects, which has been corrected.
- The code to deal with modified paths that are out-of-cone in a sparsely checked out working tree has been optimized.
- An existing test of oidmap API has been rewritten with the unit-test framework.
- The "ort" merge backend saw one bugfix for a crash that happens when inner merge gets killed, and assorted code clean-ups.
- A new warning message is issued when a command has to expand a sparse index to handle working tree cruft that are outside of the sparse checkout.
- The test framework learned to take the test body not as a single string but as a here-document.
- "git push ’’ HEAD:there" used to hit a BUG(); it has been corrected to die with "fatal: bad repository ’’".
- What happens when http.cookieFile gets the special value "" has been clarified in the documentation.
Fixes since v2.45 -----------------
- "git rebase --signoff" used to forget that it needs to add a sign-off to the resulting commit when told to continue after a conflict stops its operation.
- The procedure to build multi-pack-index got confused by the replace-refs mechanism, which has been corrected by disabling the latter.
- The "-k" and "--rfc" options of "format-patch" will now error out when used together, as one tells us not to add anything to the title of the commit, and the other one tells us to add "RFC" in addition to "PATCH".
- "git stash -S" did not handle binary files correctly, which has been corrected.
- A scheduled "git maintenance" job is expected to work on all repositories it knows about, but it stopped at the first one that errored out. Now it keeps going.
- zsh can pretend to be a normal shell pretty well except for some glitches that we tickle in some of our scripts. Work them around so that "vimdiff" and our test suite works well enough with it.
- Command line completion support for zsh (in contrib/) has been updated to stop exposing internal state to end-user shell interaction.
- Tests that try to corrupt in-repository files in chunked format did not work well on macOS due to its broken "mv", which has been worked around.
- The maximum size of attribute files is enforced more consistently.
- Unbreak CI jobs so that we do not attempt to use Python 2 that has been removed from the platform.
- Git 2.43 started using the tree of HEAD as the source of attributes in a bare repository, which has severe performance implications. For now, revert the change, without ripping out a more explicit support for the attr.tree configuration variable.
- The "--exit-code" option of "git diff" command learned to work with the "--ext-diff" option.
- Windows CI running in GitHub Actions started complaining about the order of arguments given to calloc(); the imported regex code uses the wrong order almost consistently, which has been corrected.
- Expose "name conflict" error when a ref creation fails due to D/F conflict in the ref namespace, to improve an error message given by "git fetch". (merge 9339fca23e it/refs-name-conflict later to maint).
- The SubmittingPatches document now refers folks to manpages translation project.
- The documentation for "git diff --name-only" has been clarified that it is about showing the names in the post-image tree.
- The credential helper that talks with osx keychain learned to avoid storing back the authentication material it just got received from the keychain. (merge e1ab45b2da kn/osxkeychain-skip-idempotent-store later to maint).
- The chainlint script (invoked during "make test") did nothing when it failed to detect the number of available CPUs. It now falls back to 1 CPU to avoid the problem.
- Revert overly aggressive "layered defence" that went into 2.45.1 and friends, which broke "git-lfs", "git-annex", and other use cases, so that we can rebuild necessary counterparts in the open.
- "git init" in an already created directory, when the user configuration has includeif.onbranch, started to fail recently, which has been corrected.
- Memory leaks in "git mv" has been plugged.
- The safe.directory configuration knob has been updated to optionally allow leading path matches.
- An overly large ".gitignore" files are now rejected silently.
- Upon expiration event, the credential subsystem forgot to clear in-core authentication material other than password (whose support was added recently), which has been corrected.
- Fix for an embarrassing typo that prevented Python2 tests from running anywhere.
- Varargs functions that are unannotated as printf-like or execl-like have been annotated as such.
- "git am" has a safety feature to prevent it from starting a new session when there already is a session going. It reliably triggers when a mbox is given on the command line, but it has to rely on the tty-ness of the standard input. Add an explicit way to opt out of this safety with a command line option. (merge 62c71ace44 jk/am-retry later to maint).
- A leak in "git imap-send" that somehow escapes LSan has been plugged.
- Setting core.abbrev too early before the repository set-up (typically in "git clone") caused segfault, which as been corrected.
- When the user adds to "git rebase -i" instruction to "pick" a merge commit, the error experience is not pleasant. Such an error is now caught earlier in the process that parses the todo list.
- We forgot to normalize the result of getcwd() to NFC on macOS where all other paths are normalized, which has been corrected. This still does not address the case where core.precomposeUnicode configuration is not defined globally.
- Earlier we stopped using the tree of HEAD as the default source of attributes in a bare repository, but failed to document it. This has been corrected.
- "git update-server-info" and "git commit-graph --write" have been updated to use the tempfile API to avoid leaving cruft after failing.
- An unused extern declaration for mingw has been removed to prevent it from causing build failure.
- A helper function shared between two tests had a copy-paste bug, which has been corrected.
- "git fetch-pack -k -k" without passing "--lock-pack" (which we never do ourselves) did not work at all, which has been corrected.
- CI job to build minimum fuzzers learned to pass NO_CURL=NoThanks to the build procedure, as its build environment does not offer, or the rest of the build needs, anything cURL. (merge 4e66b5a990 jc/fuzz-sans-curl later to maint).
- "git diff --no-ext-diff" when diff.external is configured ignored the "--color-moved" option. (merge 0f4b0d4cf0 rs/diff-color-moved-w-no-ext-diff-fix later to maint).
- "git archive --add-virtual-file=<path>:<contents>" never paid attention to the --prefix=<prefix> option but the documentation said it would. The documentation has been corrected. (merge 72c282098d jc/archive-prefix-with-add-virtual-file later to maint).
- When GIT_PAGER failed to spawn, depending on the code path taken, we failed immediately (correct) or just spew the payload to the standard output (incorrect). The code now always fail immediately when GIT_PAGER fails. (merge 78f0a5d187 rj/pager-die-upon-exec-failure later to maint).
- date parser updates to be more careful about underflowing epoch based timestamp. (merge 9d69789770 db/date-underflow-fix later to maint).
- The Bloom filter used for path limited history traversal was broken on systems whose "char" is unsigned; update the implementation and bump the format version to 2. (merge 9c8a9ec787 tb/path-filter-fix later to maint).
- Typofix. (merge 231cf7370e as/pathspec-h-typofix later to maint).
- Code clean-up. (merge 4b837f821e rs/simplify-submodule-helper-super-prefix-invocation later to maint).
- "git describe --dirty --broken" forgot to refresh the index before seeing if there is any chang, ("git describe --dirty" correctly did so), which has been corrected. (merge b8ae42e292 as/describe-broken-refresh-index-fix later to maint).
- Test suite has been taught not to unnecessarily rely on DNS failing a bogus external name. (merge 407cdbd271 jk/tests-without-dns later to maint).
- GitWeb update to use committer date consistently in rss/atom feeds. (merge cf6ead095b am/gitweb-feed-use-committer-date later to maint).
- Custom control structures we invented more recently have been taught to the clang-format file. (merge 1457dff9be rs/clang-format-updates later to maint).
- Developer build procedure fix. (merge df32729866 tb/dev-build-pedantic-fix later to maint).
- "git push" that pushes only deletion gave an unnecessary and harmless error message when push negotiation is configured, which has been corrected. (merge 4d8ee0317f jc/disable-push-nego-for-deletion later to maint).
- Address-looking strings found on the trailer are now placed on the Cc: list after running through sanitize_address by "git send-email". (merge c852531f45 cb/send-email-sanitize-trailer-addresses later to maint).
- Tests that use GIT_TEST_SANITIZE_LEAK_LOG feature got their exit status inverted, which has been corrected. (merge 8c1d6691bc rj/test-sanitize-leak-log-fix later to maint).
- Repacking a repository with multi-pack index started making stupid pack selections in Git 2.45, which has been corrected. (merge 8fb6d11fad ds/midx-write-repack-fix later to maint).
- Fix documentation mark-up regression in 2.45. (merge 6474da0aa4 ja/doc-markup-updates-fix later to maint).
- Work around asciidoctor’s css that renders
monospacematerial in the SYNOPSIS section of manual pages as block elements. (merge d44ce6ddd5 js/doc-markup-updates-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 493fdae046 ew/object-convert-leakfix later to maint). (merge 00f3661a0a ss/doc-eol-attr-fix later to maint). (merge 428c40da61 ri/doc-show-branch-fix later to maint). (merge 58696bfcaa jc/where-is-bash-for-ci later to maint). (merge 616e94ca24 tb/doc-max-tree-depth-fix later to maint).
2.46.1
Git 2.46.1 Release Notes ========================
This release is primarily to merge fixes accumulated on the ’master’ front to prepare for 2.47 release that are still relevant to 2.46.x maintenance track.
Fixes since Git 2.46 --------------------
- "git checkout --ours" (no other arguments) complained that the option is incompatible with branch switching, which is technically correct, but found confusing by some users. It now says that the user needs to give pathspec to specify what paths to checkout.
- It has been documented that we avoid "VAR=VAL shell_func" and why.
- "git add -p" by users with diff.suppressBlankEmpty set to true failed to parse the patch that represents an unmodified empty line with an empty line (not a line with a single space on it), which has been corrected.
- "git rebase --help" referred to "offset" (the difference between the location a change was taken from and the change gets replaced) incorrectly and called it "fuzz", which has been corrected.
- "git notes add -m ’’ --allow-empty" and friends that take prepared data to create notes should not invoke an editor, but it started doing so since Git 2.42, which has been corrected.
- An expensive operation to prepare tracing was done in re-encoding code path even when the tracing was not requested, which has been corrected.
- Perforce tests have been updated.
- The credential helper to talk to OSX keychain sometimes sent garbage bytes after the username, which has been corrected.
- A recent update broke "git ls-remote" used outside a repository, which has been corrected.
- "git config --value=foo --fixed-value section.key newvalue" barfed when the existing value in the configuration file used the valueless true syntax, which has been corrected.
- "git reflog expire" failed to honor annotated tags when computing reachable commits.
- A flakey test and incorrect calls to strtoX() functions have been fixed.
- Follow-up on 2.45.1 regression fix.
- "git rev-list … | git diff-tree -p --remerge-diff --stdin" should behave more or less like "git log -p --remerge-diff" but instead it crashed, forgetting to prepare a temporary object store needed.
- The patch parser in "git patch-id" has been tightened to avoid getting confused by lines that look like a patch header in the log message.
- "git bundle unbundle" outside a repository triggered a BUG() unnecessarily, which has been corrected.
- The code forgot to discard unnecessary in-core commit buffer data for commits that "git log --skip=<number>" traversed but omitted from the output, which has been corrected.
- "git verify-pack" and "git index-pack" started dying outside a repository, which has been corrected.
- A corner case bug in "git stash" was fixed.
Also contains minor documentation updates and code clean-ups.
2.46.2
Git 2.46.2 Release Notes ========================
This release is primarily to merge changes to unbreak the 32-bit GitHub actions jobs we use for CI testing, so that we can release real fixes for the 2.46.x track after they pass CI.
It also reverts the "git patch-id" change that went into 2.46.1, as it seems to have got a regression reported (I haven’t verified, but it is better to keep a known breakage than adding an unintended regression).
Other than that, a handful of minor bugfixes are included.
- In a few corner cases "git diff --exit-code" failed to report "changes" (e.g., renamed without any content change), which has been corrected.
- Cygwin does have /dev/tty support that is needed by things like single-key input mode.
- The interpret-trailers command failed to recognise the end of the message when the commit log ends in an incomplete line.
2.46.3
Git v2.46.3 Release Notes =========================
This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4, v2.43.6, v2.44.3 and v2.45.3 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
2.46.4
Git v2.46.4 Release Notes =========================
This release merges up the fixes that appears in v2.43.7, v2.44.4, and v2.45.4 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
2.47.0
Git v2.47 Release Notes =======================
UI, Workflows & Features ------------------------
- Many Porcelain commands that internally use the merge machinery were taught to consistently honor the diff.algorithm configuration.
- A few descriptions in "git show-ref -h" have been clarified.
- A ’P’ command to "git add -p" that passes the patch hunk to the pager has been added.
- "git grep -W" omits blank lines that follow the found function at the end of the file, just like it omits blank lines before the next function.
- The value of http.proxy can have "path" at the end for a socks proxy that listens to a unix-domain socket, but we started to discard it when we taught proxy auth code path to use the credential helpers, which has been corrected.
- The code paths to compact multiple reftable files have been updated to correctly deal with multiple compaction triggering at the same time.
- Support to specify ref backend for submodules has been enhanced.
- "git svn" has been taught about svn:global-ignores property recent versions of Subversion has.
- The default object hash and ref backend format used to be settable only with explicit command line option to "git init" and environment variables, but now they can be configured in the user’s global and system wide configuration.
- "git send-email" learned "--translate-aliases" option that reads addresses from the standard input and emits the result of applying aliases on them to the standard output.
- ’git for-each-ref’ learned a new "--format" atom to find the branch that the history leading to a given commit "%(is-base:<commit>)" is likely based on.
- The command line prompt support used to be littered with bash-isms, which has been corrected to work with more shells.
- Support for the RUNTIME_PREFIX feature has been added to z/OS port.
- "git send-email" learned "--mailmap" option to allow rewriting the recipient addresses.
- "git mergetool" learned to use VSCode as a merge backend.
- "git pack-redundant" has been marked for removal in Git 3.0.
- One-line messages to "die" and other helper functions will get LF added by these helper functions, but many existing messages had an unnecessary LF at the end, which have been corrected.
- The "scalar clone" command learned the "--no-tags" option.
- The environment GIT_ADVICE has been intentionally kept undocumented to discourage its use by interactive users. Add documentation to help tool writers.
- "git apply --3way" learned to take "--ours" and other options.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- A build tweak knob has been simplified by not setting the value that is already the default; another unused one has been removed.
- A CI job that use clang-format to check coding style issues in new code has been added.
- The reviewing guidelines document now explicitly encourages people to give positive reviews and how.
- Test script linter has been updated to catch an attempt to use one-shot export construct "VAR=VAL func" for shell functions (which does not work for some shells) better.
- Some project conventions have been added to CodingGuidelines.
- In the refs subsystem, implicit reliance of the_repository has been eliminated; the repository associated with the ref store object is used instead.
- Various tests in reftable library have been rewritten using the unit test framework.
- A test that fails on an unusually slow machine was found, and made less likely to cause trouble by lengthening the expiry value it uses.
- An existing test of hashmap API has been rewritten with the unit-test framework.
- A policy document that describes platform support levels and expectation on platform stakeholders has been introduced.
- The refs API has been taught to give symref target information to the users of ref iterators, allowing for-each-ref and friends to avoid an extra ref_resolve_* API call per a symbolic ref.
- Unit-test framework has learned a simple control structure to allow embedding test statements in-line instead of having to create a new function to contain them.
- Incremental updates of multi-pack index files is getting worked on.
- Use of API functions that implicitly depend on the_repository object in the config subsystem has been rewritten to pass a repository object through the callchain.
- Unused parameters have been either marked as UNUSED to squelch -Wunused warnings or dropped from many functions..
- The code in the reftable library has been cleaned up by discarding unused "generic" interface.
- The underlying machinery for "git diff-index" has long been made to expand the sparse index as needed, but the command fully expanded the sparse index upfront, which now has been taught not to do.
- More trace2 events at key points on push and fetch code paths have been added.
- Make our codebase compilable with the -Werror=unused-parameter option.
- "git cat-file" works well with the sparse-index, and gets marked as such.
- CI started failing completely for linux32 jobs, as the step to upload failed test directory uses GitHub actions that is deprecated and is now disabled.
- Import clar unit tests framework libgit2 folks invented for our use.
- The error messages from the test script checker have been improved.
- The convention to calling into built-in command implementation has been updated to pass the repository, if known, together with the prefix value.
- "git apply" had custom buffer management code that predated before use of strbuf got widespread, which has been updated to use strbuf, which also plugged some memory leaks.
- The reftable backend learned to more efficiently handle exclude patterns while enumerating the refs.
- CI updates. FreeBSD image has been updated to 13.4. (merge 2eeb29702e cb/ci-freebsd-13-4 later to maint).
- Give timeout to the locking code to write to reftable, instead of failing on the first failure without retrying.
- The checksum at the tail of files are now computed without collision detection protection. This is safe as the consumer of the information to protect itself from replay attacks checks for hash collisions independently.
Fixes since v2.46 -----------------
- "git add -p" by users with diff.suppressBlankEmpty set to true failed to parse the patch that represents an unmodified empty line with an empty line (not a line with a single space on it), which has been corrected.
- "git checkout --ours" (no other arguments) complained that the option is incompatible with branch switching, which is technically correct, but found confusing by some users. It now says that the user needs to give pathspec to specify what paths to checkout.
- It has been documented that we avoid "VAR=VAL shell_func" and why.
- "git rebase --help" referred to "offset" (the difference between the location a change was taken from and the change gets replaced) incorrectly and called it "fuzz", which has been corrected.
- "git notes add -m ’’ --allow-empty" and friends that take prepared data to create notes should not invoke an editor, but it started doing so since Git 2.42, which has been corrected.
- An expensive operation to prepare tracing was done in re-encoding code path even when the tracing was not requested, which has been corrected.
- More leakfixes.
- The credential helper to talk to OSX keychain sometimes sent garbage bytes after the username, which has been corrected.
- A recent update broke "git ls-remote" used outside a repository, which has been corrected.
- The patch parser in ’git apply’ has been a bit more lenient against unexpected mode bits, like 100664, recorded on extended header lines.
- "git config --value=foo --fixed-value section.key newvalue" barfed when the existing value in the configuration file used the valueless true syntax, which has been corrected.
- The patch parser in "git patch-id" has been tightened to avoid getting confused by lines that look like a patch header in the log message.
- "git reflog expire" failed to honor annotated tags when computing reachable commits.
- A flakey test and incorrect calls to strtoX() functions have been fixed.
- Follow-up on 2.45.1 regression fix.
- "git rev-list … | git diff-tree -p --remerge-diff --stdin" should behave more or less like "git log -p --remerge-diff" but instead it crashed, forgetting to prepare a temporary object store needed.
- "git bundle unbundle" outside a repository triggered a BUG() unnecessarily, which has been corrected.
- Maintenance tasks other than "gc" now properly go background when "git maintenance" runs them.
- We created a useless pseudo-merge reachability bitmap that is about 0 commits, and attempted to include commits that are not in packs, which made no sense. These bugs have been corrected. (merge a72dfab8b8 tb/pseudo-merge-bitmap-fixes later to maint).
- "git rebase -x --quiet" was not quiet, which was corrected.
- The code path for compacting reftable files saw some bugfixes against concurrent operation.
- The code forgot to discard unnecessary in-core commit buffer data for commits that "git log --skip=<number>" traversed but omitted from the output, which has been corrected.
- "git verify-pack" and "git index-pack" started dying outside a repository, which has been corrected.
- A data corruption bug when multi-pack-index is used and the same objects are stored in multiple packfiles has been corrected.
- "git pack-refs --auto" for the files backend was too aggressive, which has been a bit tamed. (merge c3459ae9ef ps/pack-refs-auto-heuristics later to maint).
- A file descriptor left open is now properly closed when "git sparse-checkout" updates the sparse patterns.
- In a few corner cases "git diff --exit-code" failed to report "changes" (e.g., renamed without any content change), which has been corrected.
- Cygwin does have /dev/tty support that is needed by things like single-key input mode.
- The interpret-trailers command failed to recognise the end of the message when the commit log ends in an incomplete line.
- "git rebase --autostash" failed to resurrect the autostashed changes when the command gets aborted after giving back control asking for hlep in conflict resolution. (merge bf6ab087d1 pw/rebase-autostash-fix later to maint).
- The "imap-send" now allows to be compiled with NO_OPENSSL and OPENSSL_SHA1 defined together. (merge 997950a750 jk/no-openssl-with-openssl-sha1 later to maint).
- The support to customize build options to adjust for older versions and/or older systems for the interop tests has been improved. (merge 22ef5f02a8 jk/interop-test-build-options later to maint).
- Update the character width table for Unicode 16. (merge 44dc651132 bb/unicode-width-table-16 later to maint).
- In Git 2.39, Git.pm stopped working in a bare repository, which has been corrected. (merge d3edb0bdde jk/git-pm-bare-repo-fix later to maint).
- When a remote-helper dies before Git writes to it, SIGPIPE killed Git silently. We now explain the situation a bit better to the end user in our error message. (merge 6e7fac9bca jk/diag-unexpected-remote-helper-death later to maint).
- A few usability fixes to "git jump" (in contrib/). (merge 083b82544d jk/jump-quickfix-fixes later to maint).
- "git diff --exit-code" ignored modified binary files, which has been corrected. (merge 9a41735af6 rs/diff-exit-code-binary later to maint).
- When a subprocess to work in a submodule spawned by "git submodule" fails with SIGPIPE, the parent Git process caught the death of it, but gave a generic "failed to work in that submodule", which was misleading. We now behave as if the parent got SIGPIPE and die. (merge 082caf527e pw/submodule-process-sigpipe later to maint).
- "git archive" with pathspec magic that uses the attribute information did not work well, which has been corrected. (merge 296743a7ca rs/archive-with-attr-pathspec-fix later to maint).
- Background tasks "git maintenance" runs may need to use credential information when going over the network, but a credential helper may work only in an interactive environment, and end up blocking a scheduled task waiting for UI. Credential helpers can now behave differently when they are not running interactively. (merge b9183b0a02 ds/background-maintenance-with-credential later to maint).
- "git --git-dir=nowhere cmd" failed to properly notice that it wasn’t in any repository while processing includeIf.onbranch configuration and instead crashed.
- When "git sparse-checkout disable" turns a sparse checkout into a regular checkout, the index is fully expanded. This totally expected behaviour however had an "oops, we are expanding the index" advice message, which has been corrected. (merge 537e516a39 ds/sparse-checkout-expansion-advice later to maint).
- macOS with fsmonitor daemon can hang forever when a submodule is involved, which has been corrected.
- Other code cleanup, docfix, build fix, etc. (merge be10ac7037 jc/mailinfo-header-cleanup later to maint). (merge 4460e052e0 jc/range-diff-lazy-setup later to maint). (merge 0627c58e7a ak/typofixes later to maint). (merge 83799f1500 jk/t9001-deflake later to maint). (merge e02cc08a88 ak/typofix-2.46-maint later to maint). (merge 5c5d29e1c4 ps/ci-gitlab-upgrade later to maint). (merge 9c4c840901 jc/doc-discarding-stalled-topics later to maint). (merge 5e6f359f6b ds/read-cache-mempool-leakfix later to maint).
2.47.1
Git 2.47.1 Release Notes ========================
This is to flush accumulated fixes since 2.47.0 on the ’master’ front down to the maintenance track.
Fixes since Git 2.47 --------------------
- Use after free and double freeing at the end in "git log -L… -p" had been identified and fixed.
- On macOS, fsmonitor can fall into a race condition that results in a client waiting forever to be notified for an event that have already happened. This problem has been corrected.
- "git maintenance start" crashed due to an uninitialized variable reference, which has been corrected.
- Fail gracefully instead of crashing when attempting to write the contents of a corrupt in-core index as a tree object.
- A "git fetch" from the superproject going down to a submodule used a wrong remote when the default remote names are set differently between them.
- The "gitk" project tree has been synchronized again with its new maintainer, Johannes Sixt.
Also contains minor documentation updates and code clean-ups.
2.47.2
Git v2.47.2 Release Notes =========================
This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4, v2.43.6, v2.44.3, v2.45.3 and v2.46.3 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
2.47.3
Git v2.47.3 Release Notes =========================
This release merges up the fixes that appears in v2.43.7, v2.44.4, v2.45.4, and v2.46.4 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
2.48.0
Git v2.48 Release Notes =======================
UI, Workflows & Features ------------------------
- A new configuration variable remote.<name>.serverOption makes the transport layer act as if the --serverOption=<value> option is given from the command line.
- "git rebase --rebase-merges" now uses branch names as labels when able.
- Describe the policy to introduce breaking changes.
- Teach ’git notes add’ and ’git notes append’ a new ’-e’ flag, instructing them to open the note in $GIT_EDITOR before saving.
- Documentation for "git bundle" saw improvements to more prominently call out the use of '--all’ when creating bundles.
- Drop support for older libcURL and Perl.
- End-user experience of "git mergetool" when the command errors out has been improved.
- "git bundle --unbundle" and "git clone" running on a bundle file both learned to trigger fsck over the new objects with configurable fck check levels.
- When "git fetch $remote" notices that refs/remotes/$remote/HEAD is missing and discovers what branch the other side points with its HEAD, refs/remotes/$remote/HEAD is updated to point to it.
- "git fetch" honors "remote.<remote>.followRemoteHEAD" settings to tweak the remote-tracking HEAD in "refs/remotes/<remote>/HEAD".
- "git range-diff" learned to optionally show and compare merge commits in the ranges being compared, with the --diff-merges option.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- Document "amlog" notes.
- The way AsciiDoc is used for SYNOPSIS part of the manual pages has been revamped. The sources, at least for the simple cases, got vastly more pleasant to work with.
- The reftable library is now prepared to expect that the memory allocation function given to it may fail to allocate and to deal with such an error.
- An extra worktree attached to a repository points at each other to allow finding the repository from the worktree (and vice versa) possible. Use relative paths for this linkage.
- Enable Windows-based CI in GitLab.
- Commands that can also work outside Git have learned to take the repository instance "repo" when we know we are in a repository, and NULL when we are not, in a parameter. The uses of the_repository variable in a few of them have been removed using the new calling convention.
- The reftable sub-system grew a new reftable-specific strbuf replacement to reduce its dependency on Git-specific data structures.
- The ref-filter machinery learns to recognize and avoid cases where sorting would be redundant.
- Various platform compatibility fixes split out of the larger effort to use Meson as the primary build tool.
- Treat ECONNABORTED the same as ECONNRESET in ’git credential-cache’ to work around a possible Cygwin regression. This resolves a race condition caused by changes in Cygwin’s handling of socket closures, allowing the client to exit cleanly when encountering ECONNABORTED.
- Demonstrate an assertion failure in ’git mv’.
- Documentation update to clarify that ’uploadpack.allowAnySHA1InWant’ implies both ’allowTipSHA1InWant’ and ’allowReachableSHA1InWant’.
- Replace various calls to atoi() with strtol_i() and strtoul_ui(), and add improved error handling.
- Documentation updates to ’git-update-ref(1)’.
- Update the project’s CodingGuidelines to discourage naming functions with a "_1()" suffix.
- Update ’.clang-format’ to match project conventions.
- Centralize documentation for repository extensions into a single place.
- Buildfix and upgrade of Clar to a newer version.
- Documentation mark-up updates.
- Renaming a handful of variables and structure fields.
- Fix for clar unit tests to support CMake build.
- C23 compatibility updates.
- GCC 15 compatibility updates.
- We now ensure "index-pack" is used with the "--promisor" option only during a "git fetch".
- The migration procedure between two ref backends has been optimized.
- "git fsck" learned to issue warnings on "curiously formatted" ref contents that have always been treated as valid but that Git wouldn’t have written itself (e.g., missing terminating end-of-line after the full object name).
- Work around Coverity warning that would not trigger in practice.
- Built-in Git subcommands are supplied the repository object to work with; they learned to do the same when they invoke sub-subcommands.
- Drop support for ancient environments in various CI jobs.
- Isolate the reftable subsystem from the rest of Git’s codebase by using fewer pieces of Git’s infrastructure.
- Optimize reading random references out of the reftable backend by allowing reuse of iterator objects.
- Backport oss-fuzz tests to our codebase.
- Introduce a new repository extension to prevent older Git versions from mis-interpreting worktrees created with relative paths.
- Yet another "pass the repository through the callchain" topic.
- "git describe" learned to stop digging the history needlessly deeper.
- Build procedure update plus introduction of Meson based builds.
- Recent reftable updates mistook a NULL return from a request for 0-byte allocation as OOM and died unnecessarily, which has been corrected.
- Reftable backend adds check for upper limit of log’s update_index.
- Start working to make the codebase buildable with -Wsign-compare.
- Regression fix for ’show-index’ when run outside of a repository.
- The meson-build procedure is integrated into CI to catch and prevent bitrotting.
- "git refs migrate" learned to also migrate the reflog data across backends.
- The developer documentation has been updated to give the latest info on gitk and git-gui maintainer.
- CI jobs that run threaded programs under LSan has been giving false positives from time to time, which has been worked around.
Fixes since v2.47 -----------------
- Doc update to clarify how periodical maintenance are scheduled, spread across time to avoid thundering herds.
- Use after free and double freeing at the end in "git log -L… -p" had been identified and fixed.
- On macOS, fsmonitor can fall into a race condition that results in a client waiting forever to be notified about an event that has already happened. This problem has been corrected.
- "git maintenance start" crashed due to an uninitialized variable reference, which has been corrected.
- Fail gracefully instead of crashing when attempting to write the contents of a corrupt in-core index as a tree object.
- A "git fetch" from the superproject going down to a submodule used a wrong remote when the default remote names are set differently between them.
- Fixes compile time warnings with 64-bit MSVC.
- Teaches ’shortlog’ to explicitly use SHA-1 when operating outside of a repository.
- Fix ’git grep’ regression on macOS by disabling lookahead when encountering invalid UTF-8 byte sequences.
- The dumb-http code regressed when the result of re-indexing a pack yielded an .idx file that differs in content from the.idx file it downloaded from the remote. This has been corrected by no longer relying on the *.idx file we got from the remote.
- When called with '--left-right’ and '--use-bitmap-index’, ’rev-list’ will produce output without any left/right markers, which has been corrected.
- More leakfixes.
- Test modernization.
- The "--shallow-exclude=<ref>" option to various history transfer commands takes a ref, not an arbitrary revision.
- A regression where commit objects missing from a commit-graph can cause an infinite loop when doing a fetch in a partial clone has been fixed.
- The MinGW compatibility layer has been taught to support POSIX semantics for atomic renames when other process(es) have a file opened at the destination path.
- "git gc" discards any objects that are outside promisor packs that are referred to by an object in a promisor pack, and we do not refetch them from the promisor at runtime, resulting an unusable repository. Work around it by including these objects in the referring promisor pack at the receiving end of the fetch.
- Avoid build/test breakage on a system without working malloc debug support dynamic library. (merge 72ad6dc368 jk/test-malloc-debug-check later to maint).
- Double-free fix. (merge fe17a25905 jk/fetch-prefetch-double-free-fix later to maint).
- Use of some uninitialized variables in "git difftool" has been corrected.
- Object reuse code based on multi-pack-index sent an unwanted copy of object. (merge e199290592 tb/multi-pack-reuse-dupfix later to maint).
- "git fast-import" can be tricked into a replace ref that maps an object to itself, which is a useless thing to do. (merge 5e904f1a4a en/fast-import-avoid-self-replace later to maint).
- The ref-transaction hook triggered for reflog updates, which has been corrected. (merge b886db48c6 kn/ref-transaction-hook-with-reflog later to maint).
- Give a bit of advice/hint message when "git maintenance" stops finding a lock file left by another instance that still is potentially running. (merge ba874d1dac ps/gc-stale-lock-warning later to maint).
- Use the right helper program to measure file size in performance tests. (merge 3f97f1bce6 tb/use-test-file-size-more later to maint).
- A double-free that may not trigger in practice by luck has been corrected in the reference resolution code. (merge b6318cf23a sj/refs-symref-referent-fix later to maint).
- The sequencer failed to honor core.commentString in some places.
- Describe a case where an option value needs to be spelled as a separate argument, i.e. "--opt val", not "--opt=val". (merge 1bc1e94091 jc/doc-opt-tilde-expand later to maint).
- Loosen overly strict ownership check introduced in the recent past, to keep the promise "cloning a suspicious repository is a safe first step to inspect it". (merge 0ffb5a6bf1 bc/allow-upload-pack-from-other-people later to maint).
- "git fast-import" learned to reject paths with ".." and "." as their components to avoid creating invalid tree objects. (merge 8cb4c6e62f en/fast-import-verify-path later to maint).
- The --ancestry-path option is designed to be given a commit that is on the path, which was not documented, which has been corrected. (merge bc1a980759 kk/doc-ancestry-path later to maint).
- "git tag" has been taught to refuse to create refs/tags/HEAD since such a tag will be confusing in the context of the UI provided by the Git Porcelain commands. (merge bbd445d5ef jc/forbid-head-as-tagname later to maint).
- The advice messages now tell the newer ’git config set’ command to set the advice.token configuration variable to squelch a message. (merge 6c397d0104 bf/explicit-config-set-in-advice-messages later to maint).
- The syntax ":/<text>" to name the latest commit with the matching text was broken with a recent change, which has been corrected. (merge 0ff919e87a ps/commit-with-message-syntax-fix later to maint).
- Fix performance regression of a recent "fatten promisor pack with local objects" protection against an unwanted gc.
- "git log -p --remerge-diff --reverse" was completely broken. (merge f94bfa1516 js/log-remerge-keep-ancestry later to maint).
- "git bundle create" with an annotated tag on the positive end of the revision range had a workaround code for older limitation in the revision walker, which has become unnecessary. (merge dd1072dfa8 tc/bundle-with-tag-remove-workaround later to maint).
- GitLab CI updates. (merge c6b43f663e ps/ci-gitlab-update later to maint).
- Code to reuse objects based on bitmap contents have been tightened to avoid race condition even when multiple packs are involved. (merge 62b3ec8a3f tb/bitmap-fix-pack-reuse later to maint).
- An earlier "csum-file checksum does not have to be computed with sha1dc" topic had a few code paths that had initialized an implementation of a hash function to be used by an unmatching hash by mistake, which have been corrected. (merge 599a63409b ps/weak-sha1-for-tail-sum-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 77af53f56f aa/t7300-modernize later to maint). (merge dcd590a39d bf/t-readme-mention-reftable later to maint). (merge 68e3c69efa kh/trailer-in-glossary later to maint). (merge 91f88f76e6 tb/boundary-traversal-fix later to maint). (merge 168ebb7159 jc/doc-error-message-guidelines later to maint). (merge 18693d7d65 kh/doc-bundle-typofix later to maint). (merge e2f5d3b491 kh/doc-update-ref-grammofix later to maint). (merge 8525e92886 mh/doc-windows-home-env later to maint).
2.48.1
Git v2.48.1 Release Notes =========================
This release merges up the fix that appears in v2.40.4, v2.41.3, v2.42.4, v2.43.6, v2.44.3, v2.45.3, v2.46.3, and v2.47.2 to address the security issues CVE-2024-50349 and CVE-2024-52006; see the release notes for these versions for details.
2.48.2
Git v2.48.2 Release Notes =========================
This release merges up the fixes that appears in v2.43.7, v2.44.4, v2.45.4, v2.46.4, and v2.47.3 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
2.49.0
Git v2.49 Release Notes =======================
UI, Workflows & Features ------------------------
- Completion script updates for zsh
- "git pack-objects" and its wrapper "git repack" learned an option to use an alternative path-hash function to improve delta-base selection to produce a packfile with deeper history than window size.
- "git gc" learned the "--expire-to" option and passes it down to underlying "git repack".
- "[help] autocorrect = 1" used to be a way to say "please wait for 0.1 second after suggesting a typofix of the command name before running that command"; now it means "yes, if there is a plausible typofix for the command name, please run it immediately".
- "git clone" learned to make a shallow clone for a single commit that is not necessarily be at the tip of any branch.
- Lazy-loading missing files in a blobless clone on demand is costly as it tends to be one-blob-at-a-time. "git backfill" is introduced to help bulk-download necessary files beforehand.
- "git push --atomic --porcelain" used to ignore failures from the other side, losing the error status from the child process, which has been corrected.
- "git rev-list --missing=" learned to accept "print-info" that gives known details expected of the missing objects, like path and type.
- Comes with an updated "gitk".
- The documentation of "git commit" and "git rebase" now refer to commit titles as such, not "subject".
- The value of "uname -s" is by default sent over the wire as a part of the "version" capability.
- "git refs migrate" can optionally be told not to migrate the reflog.
- The netrc support (via the cURL library) for the HTTP transport has been re-enabled.
- Removal of ".git/branches" and ".git/remotes" support in the BreakingChanges document has been further clarified.
- What happens to submodules during merge has been documented in a bit more detail.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- More -Wsign-compare fixes.
- meson-based build now supports the unsafe-sha1 build knob.
- The meson-based build procedure covers contrib/ and other places as well.
- The code to check LSan results has been simplified and made more robust. (merge 164a2516eb jk/lsan-race-ignore-false-positive later to maint).
- More code paths have a repository passed through the callchain, instead of assuming the primary the_repository object.
- Move a few more unit tests to the clar test framework.
- Introduce a new API to visit objects in batches based on a common path, or by type.
- Following the procedure we established to introduce breaking changes for Git 3.0, allow an early opt-in for removing support of $GIT_DIR/branches/ and $GIT_DIR/remotes/ directories to configure remotes.
- The code paths to interact with zlib has been cleaned up in preparation for building with zlib-ng.
- Foreign language interface for Rust into our code base has been added.
- All the documentation .txt files have been renamed to .adoc to help content aware editors.
- "git difftool" code clean-up.
- Rename processing in the recursive merge backend has seen a micro optimization.
- The path.[ch] API takes an explicit repository parameter passed throughout the callchain, instead of relying on the_repository singleton instance.
- Large-object promisor protocol extension has been introduced.
- The editorconfig file is updated to tell us that bash scripts are similar to general Bourne shell scripts.
- Meson-based build procedure forgot to build some docs, which has been corrected.
Fixes since v2.48 -----------------
- "git submodule" learned various ways to spell the same option, e.g. "--branch=B" can be spelled "--branch B" or "-bB". (merge b86f0f9071 re/submodule-parse-opt later to maint).
- Tweak the help text used for the option value placeholders by parse-options API so that translations can customize the "<>" placeholder signal (e.g. "--option=<value>"). (merge 5b34dd08d0 as/long-option-help-i18n later to maint).
- CI jobs gave sporadic failures, which turns out that that the object finalization code was giving an error when it did not have to. (merge d7fcbe2c56 ps/object-collision-check later to maint).
- The code to compute "unique" name used git_rand() which can fail or get stuck; the callsite does not require cryptographic security. Introduce the "insecure" mode and use it appropriately. (merge 0b4f8afef6 ps/reftable-get-random-fix later to maint).
- A misconfigured "fsck.skiplist" configuration variable was not diagnosed as an error, which has been corrected. (merge ca7158076f jt/fsck-skiplist-parse-fix later to maint).
- Extended SHA-1 expression parser did not work well when a branch with an unusual name (e.g. "foo{bar") is involved. (merge 191f0c8db2 en/object-name-with-funny-refname-fix later to maint).
- The meson build procedure looked for the ’version-def.h’ file in a wrong directory, which has been corrected. (merge 4771501c0a tc/meson-use-our-version-def-h later to maint).
- The meson build procedure for Documentation/technical/ hierarchy was missing necessary dependencies, which has been corrected. (merge 1dca492edd sj/meson-doc-technical-dependency-fix later to maint).
- The "instaweb" bound only to local IP address without "--local" and to all addresses with "--local", which was the other way around, when using Python’s http.server class, which has been corrected. (merge 76baf97fa1 ak/instaweb-python-port-binding-fix later to maint).
- Document that it is insecure to use Personal Access Tokens, which some hosting providers take as username/password, embedded in URLs. (merge a90ff409f0 mh/doc-credential-helpers-with-pat later to maint).
- The help text from "git $cmd -h" appear on the standard output for some $cmd and the standard error for others. The built-in commands have been fixed to show them on the standard output consistently. (merge f66d1423f5 jc/show-usage-help later to maint).
- The meson-driven build is now aware of "git-subtree" housed in contrib/subtree hierarchy. (merge 8454b42f94 ps/build-meson-subtree later to maint).
- It was possible for "git unpack-objects" and "git index-pack" to make an unaligned access, which has been corrected. (merge 98046591b9 jk/pack-header-parse-alignment-fix later to maint).
- The "cache" credential back-end did not handle authtype correctly, which has been corrected. (merge 0b43274850 mh/credential-cache-authtype-request-fix later to maint).
- "git branch --sort=…" and "git for-each-ref --format=… --sort=…" did not work as expected with some atoms, which has been corrected. (merge c5490ce9d1 rs/ref-fitler-used-atoms-value-fix later to maint).
- reflog entries for symbolic ref updates were broken, which has been corrected. (merge 3519492430 kn/reflog-symref-fix later to maint).
- The trace2 code was not prepared to show a configuration variable that is set to true using the valueless true syntax, which has been corrected. (merge 2fd367cf63 am/trace2-with-valueless-true later to maint).
- The "git refs migrate" command did not migrate the reflog for refs/stash, which is the contents of the stashes, which has been corrected. (merge a0bea0978f ps/reflog-migration-with-logall-fix later to maint).
- Doc and short-help text for "show-index" has been clarified to stress that the command reads its data from the standard input. (merge 49edce4ff9 jc/show-index-h-update later to maint).
- The API around choosing to use unsafe variant of SHA-1 implementation has been updated in an attempt to make it harder to abuse. (merge 04292c3796 tb/unsafe-hash-cleanup later to maint).
- Fix bugs in an earlier attempt to fix "git refs migration". (merge f11f0a5a2d kn/reflog-migration-fix-fix later to maint).
- The code path used when "git fetch" fetches from a bundle file closed the same file descriptor twice, which sometimes broke things unexpectedly when the file descriptor was reused, which has been corrected. (merge 9a84794ad8 js/bundle-unbundle-fd-reuse-fix later to maint).
- "git init" to reinitialize a repository that already exists cannot change the hash function and ref backends; such a request is silently ignored now. (merge 7e88640cd1 ps/setup-reinit-fixes later to maint).
- "git apply" internally uses unsigned long for line numbers and uses strtoul() to parse numbers on the hunk headers. It however forgot to check parse errors. (merge a206058fda pw/apply-ulong-overflow-check later to maint).
- Two CI tasks, whitespace check and style check, work on the difference from the base version and the version being checked, but the base was computed incorrectly in GitLab CI in some cases, which has been corrected. (merge acc4fb302b jt/gitlab-ci-base-fix later to maint).
- "git repack --keep-unreachable" to send unreachable objects to the main pack "git repack -ad" produces did not work when there is no existing packs, which has been corrected. (merge 414c82300a ps/repack-keep-unreachable-in-unpacked-repo later to maint).
- Going into a secondary worktree and asking "is the main worktree bare?" did not work correctly when per-worktree configuration option was in use, which has been corrected.
- Fetching into a bare repository incorrectly assumed it always used a mirror layout when deciding to update remote-tracking HEAD, which has been corrected. (merge 93dc16483a bf/fetch-set-head-fix later to maint).
- A thunderbird helper script lost its bashism. (merge 59d26bd961 bc/contrib-thunderbird-patch-inline-fix later to maint).
- The -G/-S options to the "diff" family of commands caused us to hit a BUG() when they get no values; they have been corrected. (merge a620046b29 bc/diff-reject-empty-arg-to-pickaxe later to maint).
- "git merge-tree --stdin" has been improved (including a workaround for a deadlock). (merge 6a9ae81015 pw/merge-tree-stdin-deadlock-fix later to maint).
- Correct the default target in Documentation/Makefile, and future-proof all Makefiles from similar breakages by declaring the default target (which happens to be "all") upfront. (merge 5309c1e9fb ad/set-default-target-in-makefiles later to maint).
- "git check-mailmap" used to segfault when queried without human readable name. (merge bb60c52131 jk/check-mailmap-wo-name-fix later to maint).
- Support for renaming of symbolic links on Windows has been improved.
- "git rebase -i" failed to allow rewording an empty commit that has been fast-forwarded. (merge af8fc7be10 pw/rebase-i-ff-empty-commit later to maint).
- The use of "paste" command for aggregating the test results have been corrected. (merge ce98863204 dk/test-aggregate-results-paste-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge ddb5287894 jk/t7407-use-test-grep later to maint). (merge 21e1b44865 aj/difftool-config-doc-fix later to maint). (merge 6a63995335 mh/gitattr-doc-markup-fix later to maint). (merge 43850dcf9c sk/unit-test-hash later to maint). (merge 4ad47d2de3 jc/cli-doc-option-and-config later to maint). (merge 2d0ff147e5 jp/t8002-printf-fix later to maint). (merge 69666e6746 ja/doc-restore-markup-update later to maint). (merge d11d003ba5 sk/strlen-returns-size_t later to maint). (merge 77b2d29e91 ja/doc-notes-markup-updates later to maint). (merge 6979bf6f8f jk/combine-diff-cleanup later to maint). (merge 8705c9bd13 kn/pack-write-with-reduced-globals later to maint). (merge 087740d65a ps/leakfixes-0129 later to maint). (merge 6bba6f604b jp/doc-trailer-config later to maint). (merge f1cc562b77 lo/t7603-path-is-file-update later to maint). (merge 45761988ac en/doc-renormalize later to maint). (merge 832f56f06a jc/doc-boolean-synonyms later to maint). (merge 3eeed876a9 ac/doc-http-ssl-type-config later to maint). (merge c268e3285d jc/breaking-changes-early-adopter-option later to maint). (merge 0d03fda6a5 pb/doc-follow-remote-head later to maint).
2.49.1
Git v2.49.1 Release Notes =========================
This release merges up the fixes that appear in v2.43.7, v2.44.4, v2.45.4, v2.46.4, v2.47.3, and v2.48.2 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
It also contains some updates to various CI bits to work around and/or to adjust to the deprecation of use of Ubuntu 20.04 GitHub Actions CI, updates to to Fedora base image.
2.5.0
Git 2.5 Release Notes =====================
Updates since v2.4 ------------------
UI, Workflows & Features
- The bash completion script (in contrib/) learned a few options that "git revert" takes.
- Whitespace breakages in deleted and context lines can also be painted in the output of "git diff" and friends with the new --ws-error-highlight option.
- List of commands shown by "git help" are grouped along the workflow elements to help early learners.
- "git p4" now detects the filetype (e.g. binary) correctly even when the files are opened exclusively.
- git p4 attempts to better handle branches in Perforce.
- "git p4" learned "--changes-block-size <n>" to read the changes in chunks from Perforce, instead of making one call to "p4 changes" that may trigger "too many rows scanned" error from Perforce.
- More workaround for Perforce’s row number limit in "git p4".
- Unlike "$EDITOR" and "$GIT_EDITOR" that can hold the path to the command and initial options (e.g. "/path/to/emacs -nw"), ’git p4’ did not let the shell interpolate the contents of the environment variable that name the editor "$P4EDITOR" (and "$EDITOR", too). This release makes it in line with the rest of Git, as well as with Perforce.
- A new short-hand <branch>@{push} denotes the remote-tracking branch that tracks the branch at the remote the <branch> would be pushed to.
- "git show-branch --topics HEAD" (with no other arguments) did not do anything interesting. Instead, contrast the given revision against all the local branches by default.
- A replacement for contrib/workdir/git-new-workdir that does not rely on symbolic links and make sharing of objects and refs safer by making the borrowee and borrowers aware of each other.
Consider this as still an experimental feature; its UI is still
likely to change.
- Tweak the sample "store" backend of the credential helper to honor XDG configuration file locations when specified.
- A heuristic we use to catch mistyped paths on the command line "git <cmd> <revs> <pathspec>" is to make sure that all the non-rev parameters in the later part of the command line are names of the files in the working tree, but that means "git grep $str — *.c" must always be disambiguated with "--", because nobody sane will create a file whose name literally is asterisk-dot-see. Loosen the heuristic to declare that with a wildcard string the user likely meant to give us a pathspec.
- "git merge FETCH_HEAD" learned that the previous "git fetch" could be to create an Octopus merge, i.e. recording multiple branches that are not marked as "not-for-merge"; this allows us to lose an old style invocation "git merge <msg> HEAD $commits…" in the implementation of "git pull" script; the old style syntax can now be deprecated (but not removed yet).
- Filter scripts were run with SIGPIPE disabled on the Git side, expecting that they may not read what Git feeds them to filter. We however treated a filter that does not read its input fully before exiting as an error. We no longer do and ignore EPIPE when writing to feed the filter scripts.
This changes semantics, but arguably in a good way. If a filter
can produce its output without fully consuming its input using
whatever magic, we now let it do so, instead of diagnosing it
as a programming error.
- Instead of dying immediately upon failing to obtain a lock, the locking (of refs etc) retries after a short while with backoff.
- Introduce http.<url>.SSLCipherList configuration variable to tweak the list of cipher suite to be used with libcURL when talking with https:// sites.
- "git subtree" script (in contrib/) used "echo -n" to produce progress messages in a non-portable way.
- "git subtree" script (in contrib/) does not have --squash option when pushing, but the documentation and help text pretended as if it did.
- The Git subcommand completion (in contrib/) no longer lists credential helpers among candidates; they are not something the end user would invoke interactively.
- The index file can be taught with "update-index --untracked-cache" to optionally remember already seen untracked files, in order to speed up "git status" in a working tree with tons of cruft.
- "git mergetool" learned to drive WinMerge as a backend.
- "git upload-pack" that serves "git fetch" can be told to serve commits that are not at the tip of any ref, as long as they are reachable from a ref, with uploadpack.allowReachableSHA1InWant configuration variable.
- "git cat-file --batch(-check)" learned the "--follow-symlinks" option that follows an in-tree symbolic link when asked about an object via extended SHA-1 syntax, e.g. HEAD:RelNotes that points at Documentation/RelNotes/2.5.0.txt. With the new option, the command behaves as if HEAD:Documentation/RelNotes/2.5.0.txt was given as input instead.
Consider this as still an experimental and incomplete feature:
- We may want to do the same for in-index objects, e.g. asking for :RelNotes with this option should give :Documentation/RelNotes/2.5.0.txt, too
- "git cat-file --follow-symlinks blob HEAD:RelNotes" may also be something we want to allow in the future.
- "git send-email" learned the alias file format used by the sendmail program (in a simplified form; we obviously do not feed pipes).
- Traditionally, external low-level 3-way merge drivers are expected to produce their results based solely on the contents of the three variants given in temporary files named by %O, %A and %B on their command line. Additionally allow them to look at the final path (given by %P).
- "git blame" learned blame.showEmail configuration variable.
- "git apply" cannot diagnose a patch corruption when the breakage is to mark the length of the hunk shorter than it really is on the hunk header line "@@ -l,k +m,n @@"; one special case it could is when the hunk becomes no-op (e.g. k == n == 2 for two-line context patch output), and it learned to do so in this special case.
- Add the "--allow-unknown-type" option to "cat-file" to allow inspecting loose objects of an experimental or a broken type.
- Many long-running operations show progress eye-candy, even when they are later backgrounded. Hide the eye-candy when the process is sent to the background instead. (merge a4fb76c lm/squelch-bg-progress later to maint).
Performance, Internal Implementation, Development Support etc.
- "unsigned char [20]" used throughout the code to represent object names are being converted into a semi-opaque "struct object_id". This effort is expected to interfere with other topics in flight, but hopefully will give us one extra level of abstraction in the end, when completed.
- for_each_ref() callback functions were taught to name the objects not with "unsigned char sha1[20]" but with "struct object_id".
- Catch a programmer mistake to feed a pointer not an array to ARRAY_SIZE() macro, by using a couple of GCC extensions.
- Some error messages in "git config" were emitted without calling the usual error() facility.
- When "add—interactive" splits a hunk into two overlapping hunks and then let the user choose only one, it sometimes feeds an incorrect patch text to "git apply". Add tests to demonstrate this.
I have a slight suspicion that this may be
cf. <7vtzf77wjp.fsf@gitster.siamese.dyndns.org> coming back
and biting us (I seem to have said "let's run with this and see
what happens" back then).
- More line-ending tests.
- An earlier rewrite to use strbuf_getwholeline() instead of fgets(3) to read packed-refs file revealed that the former is unacceptably inefficient. It has been optimized by using getdelim(3) when available.
- The refs API uses ref_lock struct which had its own "int fd", even though the same file descriptor was in the lock struct it contains. Clean-up the code to lose this redundant field.
- There was a dead code that used to handle "git pull --tags" and show special-cased error message, which was made irrelevant when the semantics of the option changed back in Git 1.9 days. (merge 19d122b pt/pull-tags-error-diag later to maint).
- Help us to find broken test script that splits the body part of the test by mistaken use of wrong kind of quotes. (merge d93d5d5 jc/test-prereq-validate later to maint).
- Developer support to automatically detect broken &&-chain in the test scripts is now turned on by default. (merge 92b269f jk/test-chain-lint later to maint).
- Error reporting mechanism used in "refs" API has been made more consistent.
- "git pull" has more test coverage now.
- "git pull" has become more aware of the options meant for underlying "git fetch" and then learned to use parse-options parser.
- Clarify in the Makefile a guideline to decide use of USE_NSEC.
Also contains various documentation updates and code clean-ups.
Fixes since v2.4 ----------------
Unless otherwise noted, all the fixes since v2.4 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- Git 2.4 broke setting verbosity and progress levels on "git clone" with native transports. (merge 822f0c4 mh/clone-verbosity-fix later to maint).
- "git add -e" did not allow the user to abort the operation by killing the editor. (merge cb64800 jk/add-e-kill-editor later to maint).
- Memory usage of "git index-pack" has been trimmed by tens of per-cent. (merge f0e7f11 nd/slim-index-pack-memory-usage later to maint).
- "git rev-list --objects $old --not --all" to see if everything that is reachable from $old is already connected to the existing refs was very inefficient. (merge b6e8a3b jk/still-interesting later to maint).
- "hash-object --literally" introduced in v2.2 was not prepared to take a really long object type name. (merge 1427a7f jc/hash-object later to maint).
- "git rebase --quiet" was not quite quiet when there is nothing to do. (merge 22946a9 jk/rebase-quiet-noop later to maint).
- The completion for "log --decorate=" parameter value was incorrect. (merge af16bda sg/complete-decorate-full-not-long later to maint).
- "filter-branch" corrupted commit log message that ends with an incomplete line on platforms with some "sed" implementations that munge such a line. Work it around by avoiding to use "sed". (merge df06201 jk/filter-branch-use-of-sed-on-incomplete-line later to maint).
- "git daemon" fails to build from the source under NO_IPV6 configuration (regression in 2.4). (merge d358f77 jc/daemon-no-ipv6-for-2.4.1 later to maint).
- Some time ago, "git blame" (incorrectly) lost the convert_to_git() call when synthesizing a fake "tip" commit that represents the state in the working tree, which broke folks who record the history with LF line ending to make their project portable across platforms while terminating lines in their working tree files with CRLF for their platform. (merge 4bf256d tb/blame-resurrect-convert-to-git later to maint).
- We avoid setting core.worktree when the repository location is the ".git" directory directly at the top level of the working tree, but the code misdetected the case in which the working tree is at the root level of the filesystem (which arguably is a silly thing to do, but still valid). (merge 84ccad8 jk/init-core-worktree-at-root later to maint).
- "git commit --date=now" or anything that relies on approxidate lost the daylight-saving-time offset. (merge f6e6362 jc/epochtime-wo-tz later to maint).
- Access to objects in repositories that borrow from another one on a slow NFS server unnecessarily got more expensive due to recent code becoming more cautious in a naive way not to lose objects to pruning. (merge ee1c6c3 jk/prune-mtime later to maint).
- The codepaths that read .gitignore and .gitattributes files have been taught that these files encoded in UTF-8 may have UTF-8 BOM marker at the beginning; this makes it in line with what we do for configuration files already. (merge 27547e5 cn/bom-in-gitignore later to maint).
- a few helper scripts in the test suite did not report errors correctly. (merge de248e9 ep/fix-test-lib-functions-report later to maint).
- The default $HOME/.gitconfig file created upon "git config --global" that edits it had incorrectly spelled user.name and user.email entries in it. (merge 7e11052 oh/fix-config-default-user-name-section later to maint).
- "git cat-file bl $blob" failed to barf even though there is no object type that is "bl". (merge b7994af jk/type-from-string-gently later to maint).
- The usual "git diff" when seeing a file turning into a directory showed a patchset to remove the file and create all files in the directory, but "git diff --no-index" simply refused to work. Also, when asked to compare a file and a directory, imitate POSIX "diff" and compare the file with the file with the same name in the directory, instead of refusing to run. (merge 0615173 jc/diff-no-index-d-f later to maint).
- "git rebase -i" moved the "current" command from "todo" to "done" a bit too prematurely, losing a step when a "pick" did not even start. (merge 8cbc57c ph/rebase-i-redo later to maint).
- The connection initiation code for "ssh" transport tried to absorb differences between the stock "ssh" and Putty-supplied "plink" and its derivatives, but the logic to tell that we are using "plink" variants were too loose and falsely triggered when "plink" appeared anywhere in the path (e.g. "/home/me/bin/uplink/ssh"). (merge baaf233 bc/connect-plink later to maint).
- We have prepended $GIT_EXEC_PATH and the path "git" is installed in (typically "/usr/bin") to $PATH when invoking subprograms and hooks for almost eternity, but the original use case the latter tried to support was semi-bogus (i.e. install git to /opt/foo/git and run it without having /opt/foo on $PATH), and more importantly it has become less and less relevant as Git grew more mainstream (i.e. the users would want to have it on their $PATH). Stop prepending the path in which "git" is installed to users’ $PATH, as that would interfere the command search order people depend on (e.g. they may not like versions of programs that are unrelated to Git in /usr/bin and want to override them by having different ones in /usr/local/bin and have the latter directory earlier in their $PATH). (merge a0b4507 jk/git-no-more-argv0-path-munging later to maint).
- core.excludesfile (defaulting to $XDG_HOME/git/ignore) is supposed to be overridden by repository-specific .git/info/exclude file, but the order was swapped from the beginning. This belatedly fixes it. (merge 099d2d8 jc/gitignore-precedence later to maint).
- There was a commented-out (instead of being marked to expect failure) test that documented a breakage that was fixed since the test was written; turn it into a proper test. (merge 66d2e04 sb/t1020-cleanup later to maint).
- The "log --decorate" enhancement in Git 2.4 that shows the commit at the tip of the current branch e.g. "HEAD → master", did not work with --decorate=full. (merge 429ad20 mg/log-decorate-HEAD later to maint).
- The ref API did not handle cases where ’refs/heads/xyzzy/frotz’ is removed at the same time as ’refs/heads/xyzzy’ is added (or vice versa) very well. (merge c628edf mh/ref-directory-file later to maint).
- Multi-ref transaction support we merged a few releases ago unnecessarily kept many file descriptors open, risking to fail with resource exhaustion. This is for 2.4.x track. (merge 185ce3a mh/write-refs-sooner-2.4 later to maint).
- "git bundle verify" did not diagnose extra parameters on the command line. (merge 7886cfa ps/bundle-verify-arg later to maint).
- Various documentation mark-up fixes to make the output more consistent in general and also make AsciiDoctor (an alternative formatter) happier. (merge d0258b9 jk/asciidoc-markup-fix later to maint). (merge ad3967a jk/stripspace-asciidoctor-fix later to maint). (merge 975e382 ja/tutorial-asciidoctor-fix later to maint).
- The code to read pack-bitmap wanted to allocate a few hundred pointers to a structure, but by mistake allocated and leaked memory enough to hold that many actual structures. Correct the allocation size and also have it on stack, as it is small enough. (merge 599dc76 rs/plug-leak-in-pack-bitmaps later to maint).
- The pull.ff configuration was supposed to override the merge.ff configuration, but it didn’t. (merge db9bb28 pt/pull-ff-vs-merge-ff later to maint).
- "git pull --log" and "git pull --no-log" worked as expected, but "git pull --log=20" did not. (merge 5061a44 pt/pull-log-n later to maint).
- "git rerere forget" in a repository without rerere enabled gave a cryptic error message; it should be a silent no-op instead. (merge 0544574 jk/rerere-forget-check-enabled later to maint).
- "git rebase -i" fired post-rewrite hook when it shouldn’t (namely, when it was told to stop sequencing with ’exec’ insn). (merge 141ff8f mm/rebase-i-post-rewrite-exec later to maint).
- Clarify that "log --raw" and "log --format=raw" are unrelated concepts. (merge 92de921 mm/log-format-raw-doc later to maint).
- Make "git stash something --help" error out, so that users can safely say "git stash drop --help". (merge 5ba2831 jk/stash-options later to maint).
- The clean/smudge interface did not work well when filtering an empty contents (failed and then passed the empty input through). It can be argued that a filter that produces anything but empty for an empty input is nonsense, but if the user wants to do strange things, then why not? (merge f6a1e1e jh/filter-empty-contents later to maint).
- Communication between the HTTP server and http_backend process can lead to a dead-lock when relaying a large ref negotiation request. Diagnose the situation better, and mitigate it by reading such a request first into core (to a reasonable limit). (merge 636614f jk/http-backend-deadlock later to maint).
- "git clean pathspec…" tried to lstat(2) and complain even for paths outside the given pathspec. (merge 838d6a9 dt/clean-pathspec-filter-then-lstat later to maint).
- Recent "git prune" traverses young unreachable objects to safekeep old objects in the reachability chain from them, which sometimes caused error messages that are unnecessarily alarming. (merge ce4e7b2 jk/squelch-missing-link-warning-for-unreachable later to maint).
- The configuration reader/writer uses mmap(2) interface to access the files; when we find a directory, it barfed with "Out of memory?". (merge 9ca0aaf jk/diagnose-config-mmap-failure later to maint).
- "color.diff.plain" was a misnomer; give it ’color.diff.context’ as a more logical synonym. (merge 8dbf3eb jk/color-diff-plain-is-context later to maint).
- The setup code used to die when core.bare and core.worktree are set inconsistently, even for commands that do not need working tree. (merge fada767 jk/die-on-bogus-worktree-late later to maint).
- Recent Mac OS X updates breaks the logic to detect that the machine is on the AC power in the sample pre-auto-gc script. (merge c54c7b3 pa/auto-gc-mac-osx later to maint).
- "git commit --cleanup=scissors" was not careful enough to protect against getting fooled by a line that looked like scissors. (merge fbfa097 sg/commit-cleanup-scissors later to maint).
- "Have we lost a race with competing repack?" check was too expensive, especially while receiving a huge object transfer that runs index-pack (e.g. "clone" or "fetch"). (merge 0eeb077 jk/index-pack-reduce-recheck later to maint).
- The tcsh completion writes a bash scriptlet but that would have failed for users with noclobber set. (merge 0b1f688 af/tcsh-completion-noclobber later to maint).
- "git for-each-ref" reported "missing object" for 0{40} when it encounters a broken ref. The lack of object whose name is 0{40} is not the problem; the ref being broken is. (merge 501cf47 mh/reporting-broken-refs-from-for-each-ref later to maint).
- Various fixes around "git am" that applies a patch to a history that is not there yet. (merge 6ea3b67 pt/am-abort-fix later to maint).
- "git fsck" used to ignore missing or invalid objects recorded in reflog. (merge 19bf6c9 mh/fsck-reflog-entries later to maint).
- "git format-patch --ignore-if-upstream A..B" did not like to be fed tags as boundary commits. (merge 9b7a61d jc/do-not-feed-tags-to-clear-commit-marks later to maint).
- "git fetch --depth=<depth>" and "git clone --depth=<depth>" issued a shallow transfer request even to an upload-pack that does not support the capability. (merge eb86a50 me/fetch-into-shallow-safety later to maint).
- "git rebase" did not exit with failure when format-patch it invoked failed for whatever reason. (merge 60d708b cb/rebase-am-exit-code later to maint).
- Fix a small bug in our use of umask() return value. (merge 3096b2e jk/fix-refresh-utime later to maint).
- An ancient test framework enhancement to allow color was not entirely correct; this makes it work even when tput needs to read from the ~/.terminfo under the user’s real HOME directory. (merge d5c1b7c rh/test-color-avoid-terminfo-in-original-home later to maint).
- A minor bugfix when pack bitmap is used with "rev-list --count". (merge c8a70d3 jk/rev-list-no-bitmap-while-pruning later to maint).
- "git config" failed to update the configuration file when the underlying filesystem is incapable of renaming a file that is still open. (merge 7a64592 kb/config-unmap-before-renaming later to maint).
- Avoid possible ssize_t to int truncation. (merge 6c8afe4 mh/strbuf-read-file-returns-ssize-t later to maint).
- When you say "!<ENTER>" while running say "git log", you’d confuse yourself in the resulting shell, that may look as if you took control back to the original shell you spawned "git log" from but that isn’t what is happening. To that new shell, we leaked GIT_PAGER_IN_USE environment variable that was meant as a local communication between the original "Git" and subprocesses that was spawned by it after we launched the pager, which caused many "interesting" things to happen, e.g. "git diff | cat" still paints its output in color by default.
Stop leaking that environment variable to the pager's half of the
fork; we only need it on "Git" side when we spawn the pager.
(merge 124b519 jc/unexport-git-pager-in-use-in-pager later to maint).
- Abandoning an already applied change in "git rebase -i" with "--continue" left CHERRY_PICK_HEAD and confused later steps. (merge 0e0aff4 js/rebase-i-clean-up-upon-continue-to-skip later to maint).
- We used to ask libCURL to use the most secure authentication method available when talking to an HTTP proxy only when we were told to talk to one via configuration variables. We now ask libCURL to always use the most secure authentication method, because the user can tell libCURL to use an HTTP proxy via an environment variable without using configuration variables. (merge 5841520 et/http-proxyauth later to maint).
- A fix to a minor regression to "git fsck" in v2.2 era that started complaining about a body-less tag object when it lacks a separator empty line after its header to separate it with a non-existent body. (merge 84d18c0 jc/fsck-retire-require-eoh later to maint).
- Code cleanups and documentation updates. (merge 0269f96 mm/usage-log-l-can-take-regex later to maint). (merge 64f2589 nd/t1509-chroot-test later to maint). (merge d201a1e sb/test-bitmap-free-at-end later to maint). (merge 05bfc7d sb/line-log-plug-pairdiff-leak later to maint). (merge 846e5df pt/xdg-config-path later to maint). (merge 1154aa4 jc/plug-fmt-merge-msg-leak later to maint). (merge 319b678 jk/sha1-file-reduce-useless-warnings later to maint). (merge 9a35c14 fg/document-commit-message-stripping later to maint). (merge bbf431c ps/doc-packfile-vs-pack-file later to maint). (merge 309a9e3 jk/skip-http-tests-under-no-curl later to maint). (merge ccd593c dl/branch-error-message later to maint). (merge 22570b6 rs/janitorial later to maint). (merge 5c2a581 mc/commit-doc-grammofix later to maint). (merge ce41720 ah/usage-strings later to maint). (merge e6a268c sb/glossary-submodule later to maint). (merge ec48a76 sb/submodule-doc-intro later to maint). (merge 14f8b9b jk/clone-dissociate later to maint). (merge 055c7e9 sb/pack-protocol-mention-smart-http later to maint). (merge 7c37a5d jk/make-fix-dependencies later to maint). (merge fc0aa39 sg/merge-summary-config later to maint). (merge 329af6c pt/t0302-needs-sanity later to maint). (merge d614f07 fk/doc-format-patch-vn later to maint). (merge 72dbb36 sg/completion-commit-cleanup later to maint). (merge e654eb2 es/utf8-stupid-compiler-workaround later to maint). (merge 34b935c es/osx-header-pollutes-mask-macro later to maint). (merge ab7fade jc/prompt-document-ps1-state-separator later to maint). (merge 25f600e mm/describe-doc later to maint). (merge 83fe167 mm/branch-doc-updates later to maint). (merge 75d2e5a ls/hint-rev-list-count later to maint). (merge edc8f71 cb/subtree-tests-update later to maint). (merge 5330e6e sb/p5310-and-chain later to maint). (merge c4ac525 tb/checkout-doc later to maint). (merge e479c5f jk/pretty-encoding-doc later to maint). (merge 7e837c6 ss/clone-guess-dir-name-simplify later to maint).
2.5.1
Git v2.5.1 Release Notes ========================
Fixes since v2.5 ----------------
- Running an aliased command from a subdirectory when the .git thing in the working tree is a gitfile pointing elsewhere did not work.
- Often a fast-import stream builds a new commit on top of the previous commit it built, and it often unconditionally emits a "from" command to specify the first parent, which can be omitted in such a case. This caused fast-import to forget the tree of the previous commit and then re-read it from scratch, which was inefficient. Optimize for this common case.
- The "rev-parse --parseopt" mode parsed the option specification and the argument hint in a strange way to allow ’=’ and other special characters in the option name while forbidding them from the argument hint. This made it impossible to define an option like "--pair <key>=<value>" with "pair=key=value" specification, which instead would have defined a "--pair=key <value>" option.
- A "rebase" replays changes of the local branch on top of something else, as such they are placed in stage #3 and referred to as "theirs", while the changes in the new base, typically a foreign work, are placed in stage #2 and referred to as "ours". Clarify the "checkout --ours/--theirs".
- An experimental "untracked cache" feature used uname(2) in a slightly unportable way.
- "sparse checkout" misbehaved for a path that is excluded from the checkout when switching between branches that differ at the path.
- The low-level "git send-pack" did not honor ’user.signingkey’ configuration variable when sending a signed-push.
- An attempt to delete a ref by pushing into a repository whose HEAD symbolic reference points at an unborn branch that cannot be created due to ref D/F conflict (e.g. refs/heads/a/b exists, HEAD points at refs/heads/a) failed.
- "git subtree" (in contrib/) depended on "git log" output to be stable, which was a no-no. Apply a workaround to force a particular date format.
- "git clone $URL" in recent releases of Git contains a regression in the code that invents a new repository name incorrectly based on the $URL. This has been corrected. (merge db2e220 jk/guess-repo-name-regression-fix later to maint).
- Running tests with the "-x" option to make them verbose had some unpleasant interactions with other features of the test suite. (merge 9b5fe78 jk/test-with-x later to maint).
- "git pull" in recent releases of Git has a regression in the code that allows custom path to the --upload-pack=<program>. This has been corrected.
- pipe() emulation used in Git for Windows looked at a wrong variable when checking for an error from an _open_osfhandle() call.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.5.2
Git v2.5.2 Release Notes ========================
Fixes since v2.5.1 ------------------
- "git init empty && git -C empty log" said "bad default revision ’HEAD’", which was found to be a bit confusing to new users.
- The "interpret-trailers" helper mistook a multi-paragraph title of a commit log message with a colon in it as the end of the trailer block.
- When re-priming the cache-tree opportunistically while committing the in-core index as-is, we mistakenly invalidated the in-core index too aggressively, causing the experimental split-index code to unnecessarily rewrite the on-disk index file(s).
- "git archive" did not use zip64 extension when creating an archive with more than 64k entries, which nobody should need, right ;-)?
- The code in "multiple-worktree" support that attempted to recover from an inconsistent state updated an incorrect file.
- "git rev-list" does not take "--notes" option, but did not complain when one is given.
- Because the configuration system does not allow "alias.0foo" and "pager.0foo" as the configuration key, the user cannot use ’0foo’ as a custom command name anyway, but "git 0foo" tried to look these keys up and emitted useless warnings before saying ’0foo is not a git command’. These warning messages have been squelched.
- We recently rewrote one of the build scripts in Perl, which made it necessary to have Perl to build Git. Reduced Perl dependency by rewriting it again using sed.
- t1509 test that requires a dedicated VM environment had some bitrot, which has been corrected.
- strbuf_read() used to have one extra iteration (and an unnecessary strbuf_grow() of 8kB), which was eliminated.
- The codepath to produce error messages had a hard-coded limit to the size of the message, primarily to avoid memory allocation while calling die().
- When trying to see that an object does not exist, a state errno leaked from our "first try to open a packfile with O_NOATIME and then if it fails retry without it" logic on a system that refuses O_NOATIME. This confused us and caused us to die, saying that the packfile is unreadable, when we should have just reported that the object does not exist in that packfile to the caller.
- An off-by-one error made "git remote" to mishandle a remote with a single letter nickname.
- A handful of codepaths that used to use fixed-sized arrays to hold pathnames have been corrected to use strbuf and other mechanisms to allow longer pathnames without fearing overflows.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.5.3
Git v2.5.3 Release Notes ========================
Fixes since v2.5.2 ------------------
- The experimental untracked-cache feature were buggy when paths with a few levels of subdirectories are involved.
- Recent versions of scripted "git am" has a performance regression in "git am --skip" codepath, which no longer exists in the built-in version on the ’master’ front. Fix the regression in the last scripted version that appear in 2.5.x maintenance track and older.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.5.4
Git v2.5.4 Release Notes ========================
Fixes since v2.5.4 ------------------
- xdiff code we use to generate diffs is not prepared to handle extremely large files. It uses "int" in many places, which can overflow if we have a very large number of lines or even bytes in our input files, for example. Cap the input size to somewhere around 1GB for now.
- Some protocols (like git-remote-ext) can execute arbitrary code found in the URL. The URLs that submodules use may come from arbitrary sources (e.g., .gitmodules files in a remote repository), and can hurt those who blindly enable recursive fetch. Restrict the allowed protocols to well known and safe ones.
2.5.5
Git v2.5.5 Release Notes ========================
Fixes since v2.5.4 ------------------
- Bugfix patches were backported from the ’master’ front to plug heap corruption holes, to catch integer overflow in the computation of pathname lengths, and to get rid of the name_path API. Both of these would have resulted in writing over an under-allocated buffer when formulating pathnames while tree traversal.
2.5.6
Git v2.5.6 Release Notes ========================
Fixes since v2.5.5 ------------------
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
2.50.0
Git v2.50 Release Notes =======================
UI, Workflows & Features ------------------------
- A post-processing filter for "diff --raw" output has been introduced.
- "git repack" learned "--combine-cruft-below-size" option that controls how cruft-packs are combined.
- TCP keepalive behaviour on http transports can now be configured by calling cURL library.
- Incrementally updating multi-pack index files.
- "git reflog" learns "drop" subcommand, that discards the entire reflog data for a ref.
- A new userdiff driver for ".ini" format configuration files has been added.
- The job to coalesce loose objects into packfiles in "git maintenance" now has configurable batch size.
- "git clone" still gave the message about the default branch name; this message has been turned into an advice message that can be turned off.
- "git rev-list" learns machine-parsable output format that delimits each field with NUL.
- "git maintenance" learns a new task to expire reflog entries.
- Updating multiple references have only been possible in an all-or-nothing fashion with transactions, but it can be more efficient to batch multiple updates even when some of them are allowed to fail in a best-effort manner. A new "best effort batches of updates" mode has been introduced.
- "git help --build-options" reports SHA-1 and SHA-256 backends used in the build.
- "git cat-file --batch" and friends learned to allow "--filter=" to omit certain objects, just like the transport layer does.
- "git blame --porcelain" mode now talks about unblamable lines and lines that are blamed to an ignored commit.
- The build procedure installs bash (but not zsh) completion script.
- send-email has been updated to work better with Outlook’s SMTP server.
- "git diff --minimal" used to give non-minimal output when its optimization kicked in, which has been disabled.
- "git index-pack --fix-thin" used to abort to prevent a cycle in delta chains from forming in a corner case even when there is no such cycle.
- Make repository clean-up tasks that "gc" can do available to "git maintenance" front-end.
- Bundle-URI feature did not use refs recorded in the bundle other than normal branches as anchoring points to optimize the follow-up fetch during "git clone"; now it is told to utilize all.
- The
send-emaildocumentation has been updated with OAuth2.0 related examples.
- Two of the "scalar" subcommands that add a repository that hasn’t been under "scalar"’s control are taught an option not to enable the scheduled maintenance on it.
- The userdiff pattern for shell scripts has been updated to cope with more bash-isms.
- "git merge-tree" learned an option to see if it resolves cleanly without actually creating a result.
- The commit title in the "rebase -i" todo file are now prefixed with ’#’, just like a merge commit being replayed.
- "git receive-pack" optionally learns not to care about connectivity check, which can be useful when the repository arranges to ensure connectivity by some other means.
- "git notes --help" documentation updates.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- A handful of built-in command implementations have been rewritten to use the repository instance supplied by git.c:run_builtin(), its caller.
- "git fsck" becomes more careful when checking the refs.
- "git fast-export | git fast-import" learns to deal with commit and tag objects with embedded signatures a bit better. This is highly experimental and the format of the data stream may change in the future without compatibility guarantees.
- The code paths to check whether a refname X is available (by seeing if another ref X/Y exists, etc.) have been optimized.
- First step of deprecating and removing merge-recursive.
- In protocol v2 where the refs advertisement is constrained, we try to tell the server side not to limit the advertisement when there is no specific need to, which has been the source of confusion and recent bugs. Revamp the logic to simplify.
- Update meson based build procedure for breaking changes support.
- Enable -Wunreachable-code for developer builds.
- Ensure what we write in assert() does not have side effects, and introduce ASSERT() macro to mark those that cannot be mechanically checked for lack of side effects.
- Give more meaningful error return values from block writer layer of the reftable ref-API backend.
- Make the code in reftable library less reliant on the service routines it used to borrow from Git proper, to make it easier to use by external users of the library.
- CI update.
- The object layer has been updated to take an explicit repository instance as a parameter in more code paths.
- Some warnings from "-Wsign-compare" for builtin/rm.c have been squelched.
- A few traditional unit tests have been rewritten to use the clar framework.
- Some warnings from "-Wsign-compare" for pathspec.c have been squelched.
- "make test" used to have a hard dependency on (basic) Perl; tests have been rewritten help environment with NO_PERL test the build as much as possible.
- Remove remnants of the recursive merge strategy backend, which was superseded by the ort merge strategy.
- Optimize the code to dedup references recorded in a bundle file.
- Update parse-options API to catch mistakes to pass address of an integral variable of a wrong type/size.
- Since a call to repo_config() can be called with repo set to NULL these days, a command that is marked as RUN_SETUP in the builtin command table does not have to check repo with NULL before making the call.
- Overhaul of the reftable API.
- Reduce requirement for Perl in our documentation build and a few scripts.
- The build procedure based on Meson learned to drive the benchmarking tests.
- Code clean-up for meson-based build infrastructure.
- Add an equivalent to "make hdr-check" target to meson based builds.
- Further code clean-up in the object-store layer.
- Build performance fix.
- Teach "git send-email" to also consult
hostname-ffor mail domain to compute the identity given to SMTP servers.
- The dependency on the_repository variable has been reduced from the code paths in "git replay".
- Support to create a loose object file with unknown object type has been dropped.
- The code path to access the "packed-refs" file while "fsck" is taught to mmap the file, instead of reading the whole file into memory.
- Assorted fixes for issues found with CodeQL.
- Remove the leftover hints to the test framework to mark tests that do not pass the leak checker tests, as they should no longer be needed.
- When a stale .midx file refers to .pack files that no longer exist, we ended up checking for these non-existent files repeatedly, which has been optimized by memoizing the non-existence.
- Build settings have been improved for BSD based systems.
- Newer version of libcURL detected curl_easy_setopt() calls we made with platform-natural "int" when we should have used "long", which all have been corrected.
- Tests that compare $HOME and $(pwd), which should be the same directory unless the tests chdir’s around, would fail when the user enters the test directory via symbolic links, which has been corrected.
Fixes since v2.49 -----------------
- The refname exclusion logic in the packed-ref backend has been broken for some time, which confused upload-pack to advertise different set of refs. This has been corrected. (merge 10e8a9352b tb/refs-exclude-fixes later to maint).
- The merge-recursive and merge-ort machinery crashed in corner cases when certain renames are involved. (merge 3adba40858 en/merge-process-renames-crash-fix later to maint).
- Certain "cruft" objects would have never been refreshed when there are multiple cruft packs in the repository, which has been corrected. (merge 08f612ba70 tb/multi-cruft-pack-refresh-fix later to maint).
- The xdiff code on 32-bit platform misbehaved when an insanely large context size is given, which has been corrected. (merge d39e28e68c rs/xdiff-context-length-fix later to maint).
- GitHub Actions CI switched on a CI/CD variable that does not exist when choosing what packages to install etc., which has been corrected. (merge ee89f7c79d kn/ci-meson-check-build-docs-fix later to maint).
- Using "git name-rev --stdin" as an example, improve the framework to prepare tests to pretend to be in the future where the breaking changes have already happened. (merge de3dec1187 jc/name-rev-stdin later to maint).
- An earlier code refactoring of the hash machinery missed a few required calls to init_fn. (merge d39f04b638 jh/hash-init-fixes later to maint).
- A documentation page was left out from formatting and installation, which has been corrected. (merge ae85116f18 pw/build-breaking-changes-doc later to maint).
- The bash command line completion script (in contrib/) has been updated to cope with remote repository nicknames with slashes in them. (merge 778d2f1760 dm/completion-remote-names-fix later to maint).
- "Dubious ownership" checks on Windows has been tightened up. (merge 5bb88e89ef js/mingw-admins-are-special later to maint).
- Layout configuration in vimdiff backend didn’t work as advertised, which has been corrected. (merge 93bab2d04b fr/vimdiff-layout-fixes later to maint).
- Fix our use of zlib corner cases. (merge 1cb2f293f5 jk/zlib-inflate-fixes later to maint).
- Fix lockfile contention in reftable code on Windows. (merge 0a3dceabf1 ps/mingw-creat-excl-fix later to maint).
- "git-merge-file" documentation source, which has lines that look like conflict markers, lacked custom conflict marker size defined, which has been corrected.. (merge d3b5832381 pw/custom-conflict-marker-size-for-merge-related-docs later to maint).
- Squelch false-positive from sparse. (merge da87b58014 dd/sparse-glibc-workaround later to maint).
- Adjust to the deprecation of use of Ubuntu 20.04 GitHub Actions CI. (merge 832d9f6d0b js/ci-github-update-ubuntu later to maint).
- Work around CI breakage due to fedora base image getting updated. (merge 8a471a663b js/ci-fedora-gawk later to maint).
- A ref transaction corner case fix. (merge b9fadeead7 jt/ref-transaction-abort-fix later to maint).
- Random build fixes. (merge 85e1d6819f ps/misc-build-fixes later to maint).
- "git fetch [<remote>]" with only the configured fetch refspec should be the only thing to update refs/remotes/<remote>/HEAD, but the code was overly eager to do so in other cases.
- Incorrect sorting of refs with bytes with high-bit set on platforms with signed char led to a BUG, which has been corrected.
- "make perf" fixes. (merge 1665f12fa0 pb/perf-test-fixes later to maint).
- Doc mark-up updates. (merge 5a5565ec44 ja/doc-reset-mv-rm-markup-updates later to maint).
- Work around false positive from CodeQL checker. (merge 0f558141ed js/range-check-codeql-workaround later to maint).
- "git log --{left,right}-only A…B", when A and B does not share any common ancestor, now behaves as expected. (merge e7ef4be7c2 mh/left-right-limited later to maint).
- Document the convention to disable hooks altogether by setting the hooksPath configuration variable to /dev/null. (merge 1b2eee94f1 ds/doc-disable-hooks later to maint).
- Make sure outage of third-party sites that supply P4, Git-LFS, and JGit we use for testing would not prevent our CI jobs from running at all.
- Various build tweaks, including CSPRNG selection on some platforms. (merge cdda67de03 rj/build-tweaks later to maint).
- Developer support fix.. (merge 32b74b9809 js/git-perf-env-override later to maint).
- Fix for scheduled maintenance tasks on platforms using launchctl. (merge eb2d7beb0e jh/gc-launchctl-schedule-fix later to maint).
- Update to arm64 Windows port (part of which had been reverted as it broke builds for existing platforms, which may need to be redone in future releases).
- hashmap API clean-up to ensure hashmap_clear() leaves a cleared map in a reusable state. (merge 9481877de3 en/hashmap-clear-fix later to maint).
- "git mv a a/b dst" would ask to move the directory ’a’ itself, as well as its contents, in a single destination directory, which is a contradicting request that is impossible to satisfy. This case is now detected and the command errors out. (merge 974f0d4664 ps/mv-contradiction-fix later to maint).
- Further refinement on CI messages when an optional external software is unavailable (e.g. due to third-party service outage). (merge 956acbefbd jc/ci-skip-unavailable-external-software later to maint).
- Test result aggregation did not work in Meson based CI jobs. (merge bd38ed5be1 ps/ci-test-aggreg-fix-for-meson later to maint).
- Code clean-up around stale CI elements and building with Visual Studio. (merge a7b060f67f js/ci-buildsystems-cleanup later to maint).
- "git add ’f?o’" did not add ’foo’ if ’f?o’, an unusual pathname, also existed on the working tree, which has been corrected. (merge ec727e189c kj/glob-path-with-special-char later to maint).
- The fallback implementation of open_nofollow() depended on open("symlink", O_NOFOLLOW) to set errno to ELOOP, but a few BSD derived systems use different errno, which has been worked around. (merge f47bcc3413 cf/wrapper-bsd-eloop later to maint).
- Use-after-free fix in the sequencer. (merge 5dbaec628d pw/sequencer-reflog-use-after-free later to maint).
- win+Meson CI pipeline, unlike other pipelines for Windows, used to build artifacts in developer mode, which has been changed to build them in release mode for consistency. (merge 184abdcf05 js/ci-build-win-in-release-mode later to maint).
- CI settings at GitLab has been updated to run MSVC based Meson job automatically (as opposed to be done only upon manual request). (merge 6389579b2f ps/ci-gitlab-enable-msvc-meson-job later to maint).
- "git apply" and "git add -i/-p" code paths no longer unnecessarily expand sparse-index while working. (merge ecf9ba20e3 ds/sparse-apply-add-p later to maint).
- Avoid adding directory path to a sparse-index tree entries to the name-hash, since they would bloat the hashtable without anybody querying for them. This was done already for a single threaded part of the code, but now the multi-threaded code also does the same. (merge 2e60aabc75 am/sparse-index-name-hash-fix later to maint).
- Recent versions of Perl started warning against "! A =~ /pattern/" which does not negate the result of the matching. As it turns out that the problematic function is not even called, it was removed. (merge 67cae845d2 op/cvsserver-perl-warning later to maint).
- "git apply --index/--cached" when applying a deletion patch in reverse failed to give the mode bits of the path "removed" by the patch to the file it creates, which has been corrected.
- "git verify-refs" errored out in a repository in which linked worktrees were prepared with Git 2.43 or lower. (merge d5b3c38b8a sj/ref-contents-check-fix later to maint).
- Update total_ram() function on BSD variants.
- Update online_cpus() function on BSD variants.
- Revert a botched bswap.h change that broke ntohll() functions on big-endian systems with __builtin_bswap32/64().
- Fixes for GitHub Actions Coverity job. (merge 3cc4fc1ebd js/github-ci-win-coverity-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 227c4f33a0 ja/doc-block-delimiter-markup-fix later to maint). (merge 2bfd3b3685 ab/decorate-code-cleanup later to maint). (merge 5337daddc7 am/dir-dedup-decl-of-repository later to maint). (merge 554051d691 en/diff-rename-follow-fix later to maint). (merge a18c18b470 en/random-cleanups later to maint). (merge 5af21c9acb hj/doc-rev-list-ancestry-fix later to maint). (merge 26d76ca284 aj/doc-restore-p-update later to maint). (merge 2c0dcb9754 cc/lop-remote later to maint). (merge 7b399322a2 ja/doc-branch-markup later to maint). (merge ee434e1807 pw/doc-pack-refs-markup-fix later to maint). (merge c000918eb7 tb/bitamp-typofix later to maint). (merge fa8cd29676 js/imap-send-peer-cert-verify later to maint). (merge 98b423bc1c rs/clear-commit-marks-simplify later to maint). (merge 133d065dd6 ta/bulk-checkin-signed-compare-false-warning-fix later to maint). (merge d2827dc31e es/meson-build-skip-coccinelle later to maint). (merge ee8edb7156 dk/vimdiff-doc-fix later to maint). (merge 107d889303 md/t1403-path-is-file later to maint). (merge abd4192b07 js/comma-semicolon-confusion later to maint). (merge 27b7264206 ab/environment-clean-header later to maint). (merge ff4a749354 as/typofix-in-env-h-header later to maint). (merge 86eef3541e az/tighten-string-array-constness later to maint). (merge 25292c301d lo/remove-log-reencode-from-rev-info later to maint). (merge 1aa50636fd jk/p5332-testfix later to maint). (merge 42cf4ac552 ps/ci-resurrect-p4-on-github later to maint). (merge 104add8368 js/diff-codeql-false-positive-workaround later to maint). (merge f62977b93c en/get-tree-entry-doc later to maint). (merge e5dd0a05ed ly/am-split-stgit-leakfix later to maint). (merge bac220e154 rc/t1001-test-path-is-file later to maint). (merge 91db6c735d ly/reftable-writer-leakfix later to maint). (merge 20e4e9ad0b jc/doc-synopsis-option-markup later to maint). (merge cddcee7f64 es/meson-configure-build-options-fix later to maint). (merge cea9f55f00 wk/sparse-checkout-doc-fix later to maint).
2.50.1
Git v2.50.1 Release Notes =========================
This release merges up the fixes that appear in v2.43.7, v2.44.4, v2.45.4, v2.46.4, v2.47.3, v2.48.2, and v2.49.1 to address the following CVEs: CVE-2025-27613, CVE-2025-27614, CVE-2025-46334, CVE-2025-46835, CVE-2025-48384, CVE-2025-48385, and CVE-2025-48386. See the release notes for v2.43.7 for details.
2.51.0
Git v2.51 Release Notes =======================
UI, Workflows & Features ------------------------
- Userdiff patterns for the R language have been added.
- Documentation for "git send-email" has been updated with a bit more credential helper and OAuth information.
- "git cat-file --batch" learns to understand %(objectmode) atom to allow the caller to tell missing objects (due to repository corruption) and submodules (whose commit objects are OK to be missing) apart.
- "git diff --no-index dirA dirB" can limit the comparison with pathspec at the end of the command line, just like normal "git diff".
- "git subtree" (in contrib/) learned to grok GPG signing its commits.
- "git whatchanged" that is longer to type than "git log --raw" which is its modern rough equivalent has outlived its usefulness more than 10 years ago. Plan to deprecate and remove it.
- An interchange format for stash entries is defined, and subcommand of "git stash" to import/export has been added.
- "git merge/pull" has been taught the "--compact-summary" option to use the compact-summary format, intead of diffstat, when showing the summary of the incoming changes.
- "git imap-send" has been broken for a long time, which has been resurrected and then taught to talk OAuth2.0 etc.
- Some error messages from "git imap-send" has been updated.
- When "git daemon" sees a signal while attempting to accept() a new client, instead of retrying, it skipped it by mistake, which has been corrected.
- The reftable ref backend has matured enough; Git 3.0 will make it the default format in a newly created repositories by default.
- "netrc" credential helper has been improved to understand textual service names (like smtp) in addition to the numeric port numbers (like 25).
- Lift the limitation to use changed-path filter in "git log" so that it can be used for a pathspec with multiple literal paths.
- Clean up the way how signature on commit objects are exported to and imported from fast-import stream.
- Remove unsupported, unused, and unsupportable old option from "git log".
- Document recently added "git imap-send --list" with an example.
- "git pull" learned to pay attention to pull.autostash configuration variable, which overrides rebase/merge.autostash.
- "git for-each-ref" learns "--start-after" option to help applications that want to page its output.
- "git switch" and "git restore" are declared to be no longer experimental.
- "git -c alias.foo=bar foo -h baz" reported "’foo’ is aliased to ’bar’" and then went on to run "git foo -h baz", which was unexpected. Tighten the rule so that alias expansion is reported only when "-h" is the sole option.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- "git pack-objects" learned to find delta bases from blobs at the same path, using the --path-walk API.
- CodingGuidelines update.
- Add settings for Solaris 10 & 11.
- Meson-based build/test framework now understands TAP output generated by our tests.
- "Do not explicitly initialize to zero" rule has been clarified in the CodingGuidelines document.
- A test helper "test_seq" function learned the "-f <fmt>" option, which allowed us to simplify a lot of test scripts.
- A lot of stale stuff has been removed from the contrib/ hierarchy.
- "git push" and "git fetch" are taught to update refs in batches to gain performance.
- Some code paths in "git prune" used to ignore the passed-in repository object and used the
the_repositorysingleton instance instead, which has been corrected.
- Update ".clang-format" and ".editorconfig" to match our style guide a bit better.
- "make coccicheck" succeeds even when spatch made suggestions, which has been updated to fail in such a case.
- Code clean-up around object access API.
- Define .precision to more canned parse-options type to avoid bugs coming from using a variable with a wrong type to capture the parsed values.
- Flipping the default hash function to SHA-256 at Git 3.0 boundary is planned.
- Declare weather-balloon we raised for "bool" type 18 months ago a success and officially allow using the type in our codebase.
- GIT_TEST_INSTALLED was not honored in the recent topic related to SHA256 hashes, which has been corrected.
- The pop_most_recent_commit() function can have quite expensive worst case performance characteristics, which has been optimized by using prio-queue data structure.
- Move structure definition from unrelated header file to where it belongs.
- To help our developers, document what C99 language features are being considered for adoption, in addition to what past experiments have already decided.
- The reftable unit tests are now ported to the "clar" unit testing framework.
- Redefine where the multi-pack-index sits in the object subsystem, which recently was restructured to allow multiple backends that support a single object source that belongs to one repository. A MIDX does span multiple "object sources".
- Reduce implicit assumption and dependence on the_repository in the object-file subsystem.
Fixes since v2.50 -----------------
Unless otherwise noted, all the changes in 2.50.X maintenance track, including security updates, are included in this release.
- A memory-leak in an error code path has been plugged. (merge 7082da85cb ly/commit-graph-graph-write-leakfix later to maint).
- A memory-leak in an error code path has been plugged. (merge aedebdb6b9 ly/fetch-pack-leakfix later to maint).
- Some leftover references to documentation source files that no longer exist, due to recent ".txt" → ".adoc" renaming, have been corrected. (merge 3717a5775a jw/doc-txt-to-adoc-refs later to maint).
- "git stash -p <pathspec>" improvements. (merge 468817bab2 pw/stash-p-pathspec-fixes later to maint).
- "git send-email" incremented its internal message counter when a message was edited, which made logic that treats the first message specially misbehave, which has been corrected. (merge 2cc27b3501 ag/send-email-edit-threading-fix later to maint).
- "git stash" recorded a wrong branch name when submodules are present in the current checkout, which has been corrected. (merge ffb36c64f2 kj/stash-onbranch-submodule-fix later to maint).
- When asking to apply mailmap to both author and committer field while showing a commit object, the field that appears later was not correctly parsed and replaced, which has been corrected. (merge abf94a283f sa/multi-mailmap-fix later to maint).
- "git maintenance" lacked the care "git gc" had to avoid holding onto the repository lock for too long during packing refs, which has been remedied. (merge 1b5074e614 ps/maintenance-ref-lock later to maint).
- Avoid regexp_constraint and instead use comparison_constraint when listing functions to exclude from application of coccinelle rules, as spatch can be built with different regexp engine X-<. (merge f2ad545813 jc/cocci-avoid-regexp-constraint later to maint).
- Updating submodules from the upstream did not work well when submodule’s HEAD is detached, which has been improved. (merge ca62f524c1 jk/submodule-remote-lookup-cleanup later to maint).
- Remove unnecessary check from "git daemon" code. (merge 0c856224d2 cb/daemon-fd-check-fix later to maint).
- Use of sysctl() system call to learn the total RAM size used on BSDs has been corrected. (merge 781c1cf571 cb/total-ram-bsd-fix later to maint).
- Drop FreeBSD 4 support and declare that we support only FreeBSD 12 or later, which has memmem() supported. (merge 0392f976a7 bs/config-mak-freebsd later to maint).
- A diff-filter with negative-only specification like "git log --diff-filter=d" did not trigger correctly, which has been fixed. (merge 375ac087c5 jk/all-negative-diff-filter-fix later to maint).
- A failure to open the index file for writing due to conflicting access did not state what went wrong, which has been corrected. (merge 9455397a5c hy/read-cache-lock-error-fix later to maint).
- Tempfile removal fix in the codepath to sign commits with SSH keys. (merge 4498127b04 re/ssh-sign-buffer-fix later to maint).
- Code and test clean-up around string-list API. (merge 6e5b26c3ff sj/string-list later to maint).
- "git apply -N" should start from the current index and register only new files, but it instead started from an empty index, which has been corrected. (merge 2b49d97fcb rp/apply-intent-to-add-fix later to maint).
- Leakfix with a new and a bit invasive test on pack-bitmap files. (merge bfd5522e98 ly/load-bitmap-leakfix later to maint).
- "git fetch --prune" used to be O(n^2) expensive when there are many refs, which has been corrected. (merge 87d8d8c5d0 ph/fetch-prune-optim later to maint).
- When a ref creation at refs/heads/foo/bar fails, the files backend now removes refs/heads/foo/ if the directory is otherwise not used. (merge a3a7f20516 ps/refs-files-remove-empty-parent later to maint).
- "pack-objects" has been taught to avoid pointing into objects in cruft packs from midx.
- "git remote" now detects remote names that overlap with each other (e.g., remote nickname "outer" and "outer/inner" are used at the same time), as it will lead to overlapping remote-tracking branches. (merge a5a727c448 jk/remote-avoid-overlapping-names later to maint).
- The gpg.program configuration variable, which names a pathname to the (custom) GPG compatible program, can now be spelled with ~tilde expansion. (merge 7d275cd5c0 jb/gpg-program-variable-is-a-pathname later to maint).
- Our <sane-ctype.h> header file relied on that the system-supplied <ctype.h> header is not later included, which would override our macro definitions, but "amazon linux" broke this assumption. Fix this by preemptively including <ctype.h> near the beginning of <sane-ctype.h> ourselves. (merge 9d3b33125f ps/sane-ctype-workaround later to maint).
- Clean-up compat/bswap.h mess. (merge f4ac32c03a ss/compat-bswap-revamp later to maint).
- Meson-based build did not handle libexecdir setting correctly, which has been corrected. (merge 056dbe8612 rj/meson-libexecdir-fix later to maint).
- Document that we do not require "real" name when signing your patches off. (merge 1f0fed312a bc/contribution-under-non-real-names later to maint).
- "git commit" that concludes a conflicted merge failed to notice and remove existing comment added automatically (like "# Conflicts:") when the core.commentstring is set to ’auto’. (merge 92b7c7c9f5 ac/auto-comment-char-fix later to maint).
- "git rebase -i" with bogus rebase.instructionFormat configuration failed to produce the todo file after recording the state files, leading to confused "git status"; this has been corrected. (merge ade14bffd7 ow/rebase-verify-insn-fmt-before-initializing-state later to maint).
- A few file descriptors left unclosed upon program completion in a few test helper programs are now closed. (merge 0f1b33815b hl/test-helper-fd-close later to maint).
- Interactive prompt code did not correctly strip CRLF from the end of line on Windows. (merge 711a20827b js/prompt-crlf-fix later to maint).
- The config API had a set of convenience wrapper functions that implicitly use the_repository instance; they have been removed and inlined at the calling sites.
- "git add/etc -p" now honor the diff.context configuration variable, and also they learn to honor the -U<n> command-line option. (merge 2b3ae04011 lm/add-p-context later to maint).
- The case where a new submodule takes a path where there used to be a completely different subproject is now dealt with a bit better than before. (merge 5ed8c5b465 kj/renamed-submodule later to maint).
- The deflate codepath in "git archive --format=zip" had a longstanding bug coming from misuse of zlib API, which has been corrected.
- Other code cleanup, docfix, build fix, etc. (merge b257adb571 lo/my-first-ow-doc-update later to maint). (merge 8b34b6a220 ly/sequencer-update-squash-is-fixup-only later to maint). (merge 5dceb8bd05 ly/do-not-localize-bug-messages later to maint). (merge 61372dd613 ly/commit-buffer-reencode-leakfix later to maint). (merge 81cd1eef7d ly/pack-bitmap-root-leakfix later to maint). (merge bfc9f9cc64 ly/submodule-update-failure-leakfix later to maint). (merge 65dff89c6b ma/doc-diff-cc-headers later to maint). (merge efb61591ee jm/bundle-uri-debug-output-to-fp later to maint). (merge a3d278bb64 ly/prepare-show-merge-leakfix later to maint). (merge 1fde1c5daf ac/preload-index-wo-the-repository later to maint). (merge 855cfc65ae rm/t2400-modernize later to maint). (merge 2939494284 ly/run-builtin-use-passed-in-repo later to maint). (merge ff73f375bb jg/mailinfo-leakfix later to maint). (merge 996f14c02b jj/doc-branch-markup-fix later to maint). (merge 1e77de1864 cb/ci-freebsd-update-to-14.3 later to maint). (merge b0e9d25865 jk/fix-leak-send-pack later to maint). (merge f3a9558c8c bs/remote-helpers-doc-markup-fix later to maint). (merge c4e9775c60 kh/doc-config-subcommands later to maint). (merge de404249ab ps/perlless-test-fixes later to maint). (merge 953049eed8 ts/merge-orig-head-doc-fix later to maint). (merge 0c83bbc704 rj/freebsd-sysinfo-build-fix later to maint). (merge ad7780b38f ps/doc-pack-refs-auto-with-files-backend-fix later to maint). (merge f4fa8a3687 rh/doc-glob-pathspec-fix later to maint). (merge b27be108c8 ja/doc-git-log-markup later to maint). (merge 14d7583beb pw/config-kvi-remove-path later to maint). (merge f31abb421d jc/do-not-scan-argv-without-parsing later to maint). (merge 26552cb62a jk/unleak-reflog-expire-entry later to maint). (merge 339d95fda9 jc/ci-print-test-failures-fix later to maint). (merge 8c3add51a8 cb/meson-avoid-broken-macos-pcre2 later to maint). (merge 5247da07b8 ps/meson-clar-decls-fix later to maint). (merge f3ef347bb2 ch/t7450-recursive-clone-test-fix later to maint). (merge 4ac3302a1a jc/doc-release-vs-clear later to maint). (merge 3bdd897413 ms/meson-with-ancient-git-wo-ls-files-dedup later to maint). (merge cca758d324 kh/doc-fast-import-historical later to maint). (merge 9b0781196a jc/test-hashmap-is-still-here later to maint). (merge 1bad05bacc jk/revert-squelch-compiler-warning later to maint). (merge 3a7e783d9c dl/squelch-maybe-uninitialized later to maint).
2.51.1
Git 2.51.1 Release Notes ========================
There shouldn’t be anything exciting to see here. This is primarily to flush the "do you still use it?" improvements that has landed on the master front, together with a handful of low-hanging, low-impact fixes that should be safe.
Fixes since Git 2.51.0 ----------------------
- The "do you still use it?" message given by a command that is deeply deprecated and allow us to suggest alternatives has been updated.
- The compatObjectFormat extension is used to hide an incomplete feature that is not yet usable for any purpose other than developing the feature further. Document it as such to discourage its use by mere mortals.
- Manual page for "gitk" is updated with the current maintainer’s name.
- Update the instructions for using GGG in the MyFirstContribution document to say that a GitHub PR could be made against
git/gitinstead ofgitgitgadget/git.
- Clang-format update to let our control macros be formatted the way we had them traditionally, e.g., "for_each_string_list_item()" without space before the parentheses.
- A few places where a size_t value was cast to curl_off_t without checking has been updated to use the existing helper function.
- The start_delayed_progress() function in the progress eye-candy API did not clear its internal state, making an initial delay value larger than 1 second ineffective, which has been corrected.
- Makefile tried to run multiple "cargo build" which would not work very well; serialize their execution to work around this problem.
- Adjust to the way newer versions of cURL selectively enable tracing options, so that our tests can continue to work.
- During interactive rebase, using ’drop’ on a merge commit led to an error, which has been corrected.
- "git refs migrate" to migrate the reflog entries from a refs backend to another had a handful of bugs squashed.
- "git push" had a code path that led to BUG() but it should have been a die(), as it is a response to a usual but invalid end-user action to attempt pushing an object that does not exist.
- Various bugs about rename handling in "ort" merge strategy have been fixed.
- "git diff --no-index" run inside a subdirectory under control of a Git repository operated at the top of the working tree and stripped the prefix from the output, and oddballs like "-" (stdin) did not work correctly because of it. Correct the set-up by undoing what the set-up sequence did to cwd and prefix.
- Various options to "git diff" that make comparison ignore certain aspects of the differences (like "space changes are ignored", "differences in lines that match these regular expressions are ignored") did not work well with "--name-only" and friends.
- Under a race against another process that is repacking the repository, especially a partially cloned one, "git fetch" may mistakenly think some objects we do have are missing, which has been corrected.
- "git repack --path-walk" lost objects in some corner cases, which has been corrected. cf. <CABPp-BHFxxGrqKc0m==TjQNjDGdO=H5Rf6EFsf2nfE1=TuraOQ@mail.gmail.com>
- Fixes multiple crashes around midx write-out codepaths.
- A broken or malicious "git fetch" can say that it has the same object for many many times, and the upload-pack serving it can exhaust memory storing them redundantly, which has been corrected.
- A corner case bug in "git log -L…" has been corrected.
- Some among "git add -p" and friends ignored color.diff and/or color.ui configuration variables, which is an old regression, which has been corrected.
- "git rebase -i" failed to clean-up the commit log message when the command commits the final one in a chain of "fixup" commands, which has been corrected.
- Deal more gracefully with directory / file conflicts when the files backend is used for ref storage, by failing only the ones that are involved in the conflict while allowing others.
Also contains various documentation updates, code cleanups and minor fixups.
2.51.2
Git 2.51.2 Release Notes ========================
In addition to fixes for an unfortunate regression introduced in Git 2.51.1 that caused "git diff --quiet -w" to be not so quiet when there are additions, deletions and conflicts, this maintenance release merges more fixes/improvements that have landed on the master front, primarily to make the CI part of the system a bit more robust.
Fixes since Git 2.51.1 ----------------------
- Recently we attempted to improve "git diff -w --quiet" and friends to handle cases where patch output would be suppressed, but it introduced a bug that emits unnecessary output, which has been corrected.
- The code to squelch output from "git diff -w --name-status" etc. for paths that "git diff -w -p" would have stayed silent leaked output from dry-run patch generation, which has been corrected.
- Windows "real-time monitoring" interferes with the execution of tests and affects negatively in both correctness and performance, which has been disabled in Gitlab CI.
- An earlier addition to "git diff --no-index A B" to limit the output with pathspec after the two directories misbehaved when these directories were given with a trailing slash, which has been corrected.
- The "--short" option of "git status" that meant output for humans and "-z" option to show NUL delimited output format did not mix well, and colored some but not all things. The command has been updated to color all elements consistently in such a case.
- Unicode width table update.
- Recent OpenSSH creates the Unix domain socket to communicate with ssh-agent under $HOME instead of /tmp, which causes our test to fail doe to overly long pathname in our test environment, which has been worked around by using "ssh-agent -T".
Also contains various documentation updates, code cleanups and minor fixups.
2.52.0
Git v2.52 Release Notes =======================
UI, Workflows & Features ------------------------
- The "list" subcommand of "git refs" acts as a front-end for "git for-each-ref".
- "git cmd --help-all" now works outside repositories.
- "git diff-tree" learned "--max-depth" option.
- A new subcommand "git repo" gives users a way to grab various repository characteristics.
- A new command "git last-modified" has been added to show the closest ancestor commit that touched each path.
- The "git refs exists" command that works like "git show-ref --exists" has been added.
- "git repo info" learns the short-hand option "-z" that is the same as "--format=nul", and learns to report the objects format used in the repository.
- "core.commentChar=auto" that attempts to dynamically pick a suitable comment character is non-workable, as it is too much trouble to support for little benefit, and is marked as deprecated.
- "git send-email" learned to drive "git imap-send" to store already sent e-mails in an IMAP folder.
- The "promisor-remote" capability mechanism has been updated to allow the "partialCloneFilter" settings and the "token" value to be communicated from the server side.
- Declare that "git init" that is not otherwise configured uses ’main’ as the initial branch, not ’master’, starting Git 3.0.
- Keep giving hint about the default initial branch name for users who may be surprised after Git 3.0 switch-over.
- The stash.index configuration variable can be set to make "git stash pop/apply" pretend that it was invoked with "--index".
- "git fast-import" learned that "--signed-commits=<how>" option that corresponds to that of "git fast-export".
- Marking a hunk ’selected’ in "git add -p" and then splitting made all the split pieces ’selected’; this has been changed to make them all ’undecided’, which gives better end-user experience.
- Configuration variables that take a pathname as a value (e.g. blame.ignorerevsfile) can be marked as optional by prefixing ":(optional)" before its value.
- Show ’P’ipe command in "git add -p".
- "git sparse-checkout" subcommand learned a new "clean" action to prune otherwise unused working-tree files that are outside the areas of interest.
- "git fast-import" is taught to handle signed tags, just like it recently learned to handle signed commits, in different ways.
- A new configuration variable commitGraph.changedPaths allows to turn "--changed-paths" on by default for "git commit-graph".
- "Symlink symref" has been added to the list of things that will disappear at Git 3.0 boundary.
- "git maintenance" command learns the "geometric" strategy where it avoids doing maintenance tasks that rebuilds everything from scratch.
- "git repo structure", a new command.
- The help text and manual page of "git bisect" command have been made consistent with each other.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- string_list_split*() family of functions have been extended to simplify common use cases.
- Arrays of strbuf is often a wrong data structure to use, and strbuf_split*() family of functions that create them often have better alternatives. Update several code paths and replace strbuf_split*().
- Revision traversal limited with pathspec, like "git log dir/*", used to ignore changed-paths Bloom filter when the pathspec contained wildcards; now they take advantage of the filter when they can.
- Doc lint updates to encourage the newer and easier-to-use
synopsisformat, with fixes to a handful of existing uses.
- Remove dependency on the_repository and other globals from the commit-graph code, and other changes unrelated to de-globaling.
- Discord has been added to the first contribution documentation as another way to ask for help.
- Inspired by Ezekiel’s recent effort to showcase Rust interface, the hash function implementation used to hash lines have been updated to the one used for ELF symbol lookup by Glibc.
- Instead of scanning for the remaining items to see if there are still commits to be explored in the queue, use khash to remember which items are still on the queue (an unacceptable alternative is to reserve one object flag bits).
- The bulk-checkin code used to depend on a file-scope static singleton variable, which has been updated to pass an instance throughout the callchain.
- The work to build on the bulk-checkin infrastructure to create many objects at once in a transaction and to abstract it into the generic object layer continues.
- CodingGuidelines now spells out how bitfields are to be written.
- Adjust to the way newer versions of cURL selectively enable tracing options, so that our tests can continue to work.
- The clear_alloc_state() API function was not fully clearing the structure for reuse, but since nobody reuses it, replace it with a variant that frees the structure as well, making the callers simpler.
- "git range-diff" learned a way to limit the memory consumed by O(N*N) cost matrix.
- Some places in the code confused a variable that is not a boolean to enable color but is an enum that records what the user requested to do about color. A couple of bugs of this sort have been fixed, while the code has been cleaned up to prevent similar bugs in the future.
- The build procedure based on meson learned a target to only build documentation, similar to "make doc". (merge ff4ec8ded0 ps/meson-build-docs later to maint).
- Dip our toes a bit to (optionally) use Rust implemented helper called from our C code.
- Documentation for "git log --pretty" options has been updated to make it easier to translate.
- Instead of three library archives (one for git, one for reftable, and one for xdiff), roll everything into a single libgit.a archive. This would help later effort to FFI into Rust.
- The beginning of SHA1-SHA256 interoperability work.
- Build procedure for a few credential helpers (in contrib/) have been updated.
- CI improvements to handle the recent Rust integration better.
- The code in "git repack" machinery has been cleaned up to prepare for incremental update of midx files.
- Two slightly different ways to get at "all the packfiles" in API has been cleaned up.
- The code to walk revision graph to compute merge base has been optimized.
- AI guidelines has been added to our documentation set.
- Contributed credential helpers (obviously in contrib/) now have "cd $there && make install" target.
- The "MyFirstContribution" tutorial tells the reader how to send out their patches; the section gained a hint to verify the message reached the mailing list.
- The "debug" ref-backend was missing a method implementation, which has been corrected.
- Build procedure for Wincred credential helper has been updated.
- The build procedure based on meson learned to allow builders to specify the directory to install HTML documents.
- Building "git contacts" script (in contrib/) left the resulting file unexecutable, which has been corrected.
Fixes since v2.51 -----------------
Unless otherwise noted, all the changes in 2.51.X maintenance track, including security updates, are included in this release.
- During interactive rebase, using ’drop’ on a merge commit lead to an error, which was incorrect.
- "git refs migrate" to migrate the reflog entries from a refs backend to another had a handful of bugs squashed.
- "git remote rename origin upstream" failed to move origin/HEAD to upstream/HEAD when origin/HEAD is unborn and performed other renames extremely inefficiently, which has been corrected. (merge 16c4fa26b9 ps/remote-rename-fix later to maint).
- "git describe" has been optimized by using better data structure. (merge 08bb69d70f rs/describe-with-prio-queue later to maint).
- "git push" had a code path that led to BUG() but it should have been a die(), as it is a response to a usual but invalid end-user action to attempt pushing an object that does not exist.
- Various bugs about rename handling in "ort" merge strategy have been fixed.
- "git jump" (in contrib/) fails to parse the diff header correctly when a file has a space in its name, which has been corrected. (merge 621ce9c1c6 gh/git-jump-pathname-with-sp later to maint).
- "git diff --no-index" run inside a subdirectory under control of a Git repository operated at the top of the working tree and stripped the prefix from the output, and oddballs like "-" (stdin) did not work correctly because of it. Correct the set-up by undoing what the set-up sequence did to cwd and prefix.
- Various options to "git diff" that makes comparison ignore certain aspects of the differences (like "space changes are ignored", "differences in lines that match these regular expressions are ignored") did not work well with "--name-only" and friends. (merge b55e6d36eb ly/diff-name-only-with-diff-from-content later to maint).
- The above caused regressions, which has been corrected.
- Documentation for "git rebase" has been updated. (merge 3f7f2b0359 je/doc-rebase later to maint).
- The start_delayed_progress() function in the progress eye-candy API did not clear its internal state, making an initial delay value larger than 1 second ineffective, which has been corrected.
- The compatObjectFormat extension is used to hide an incomplete feature that is not yet usable for any purpose other than developing the feature further. Document it as such to discourage its use by mere mortals.
- "git log -L…" compared trees of multiple parents with the tree of the merge result in an unnecessarily inefficient way. (merge 0a15bb634c sg/line-log-merge-optim later to maint).
- Under a race against another process that is repacking the repository, especially a partially cloned one, "git fetch" may mistakenly think some objects we do have are missing, which has been corrected.
- "git fetch" can clobber a symref that is dangling when the remote-tracking HEAD is set to auto update, which has been corrected.
- "git describe <blob>" misbehaves and/or crashes in some corner cases, which has been taught to exit with failure gracefully. (merge 7c10e48e81 jk/describe-blob later to maint).
- Manual page for "gitk" is updated with the current maintainer’s name.
- Update the instructions for using GGG in the MyFirstContribution document to say that a GitHub PR could be made against
git/gitinstead ofgitgitgadget/git.
- Makefile tried to run multiple "cargo build" which would not work very well; serialize their execution to work around this problem.
- "git repack --path-walk" lost objects in some corner cases, which has been corrected.
- "git ls-files <pathspec>…" should not necessarily have to expand the index fully if a sparsified directory is excluded by the pathspec; the code is taught to expand the index on demand to avoid this. (merge 681f26bccc ds/ls-files-lazy-unsparse later to maint).
- Windows "real-time monitoring" interferes with the execution of tests and affects negatively in both correctness and performance, which has been disabled in Gitlab CI.
- A broken or malicious "git fetch" can say that it has the same object for many many times, and the upload-pack serving it can exhaust memory storing them redundantly, which has been corrected.
- A corner case bug in "git log -L…" has been corrected.
- "git rev-parse --short" and friends failed to disambiguate two objects with object names that share common prefix longer than 32 characters, which has been fixed. (merge 8655908b9e jc/longer-disambiguation-fix later to maint).
- Some among "git add -p" and friends ignored color.diff and/or color.ui configuration variables, which is an old regression, which has been corrected.
- "git subtree" (in contrib/) did not work correctly when splitting squashed subtrees, which has been improved.
- Import a newer version of the clar unit testing framework. (merge 93dbb6b3c5 ps/clar-updates later to maint).
- "git send-email --compose --reply-to=<address>" used to add duplicated Reply-To: header, which made mailservers unhappy. This has been corrected. (merge f448f65719 nb/send-email-no-dup-reply-to later to maint).
- "git rebase -i" failed to clean-up the commit log message when the command commits the final one in a chain of "fixup" commands, which has been corrected.
- There are double frees and leaks around setup_revisions() API used in "git stash show", which has been fixed, and setup_revisions() API gained a wrapper to make it more ergonomic when using it with strvec-manged argc/argv pairs. (merge a04bc71725 jk/setup-revisions-freefix later to maint).
- Deal more gracefully with directory / file conflicts when the files backend is used for ref storage, by failing only the ones that are involved in the conflict while allowing others.
- "git last-modified" operating in non-recursive mode used to trigger a BUG(), which has been corrected.
- The use of "git config get" command to learn how ANSI color sequence is for a particular type, e.g., "git config get --type=color --default=reset no.such.thing", isn’t very ergonomic. (merge e4dabf4fd6 ps/config-get-color-fixes later to maint).
- The "do you still use it?" message given by a command that is deeply deprecated and allow us to suggest alternatives has been updated.
- Clang-format update to let our control macros be formatted the way we had them traditionally, e.g., "for_each_string_list_item()" without space before the parentheses.
- A few places where a size_t value was cast to curl_off_t without checking has been updated to use the existing helper function.
- "git reflog write" did not honor the configured user.name/email which has been corrected.
- Handling of an empty subdirectory of .git/refs/ in the ref-files backend has been corrected.
- Our CI script requires "sudo" that can be told to preserve environment, but Ubuntu replaced with "sudo" with an implementation that lacks the feature. Work this around by reinstalling the original version.
- The reftable backend learned to sanity check its on-disk data more carefully. (merge 466a3a1afd kn/reftable-consistency-checks later to maint).
- A lot of code clean-up of xdiff. Split out of a larger topic. (merge 8b9c5d2e3a en/xdiff-cleanup later to maint).
- "git format-patch --range-diff=… --notes=…" did not drive the underlying range-diff with correct --notes parameter, ending up comparing with different set of notes from its main patch output you would get from "git format-patch --notes=…" for a singleton patch.
- The code in "git add -p" and friends to iterate over hunks was riddled with bugs, which has been corrected.
- A few more things that patch authors can do to help maintainer to keep track of their topics better. (merge 1a41698841 tb/doc-submitting-patches later to maint).
- An earlier addition to "git diff --no-index A B" to limit the output with pathspec after the two directories misbehaved when these directories were given with a trailing slash, which has been corrected.
- The "--short" option of "git status" that meant output for humans and "-z" option to show NUL delimited output format did not mix well, and colored some but not all things. The command has been updated to color all elements consistently in such a case.
- Unicode width table update.
- GPG signing test set-up has been broken for a year, which has been corrected. (merge 516bf45749 jc/t1016-setup-fix later to maint).
- Recent OpenSSH creates the Unix domain socket to communicate with ssh-agent under $HOME instead of /tmp, which causes our test to fail doe to overly long pathname in our test environment, which has been worked around by using "ssh-agent -T".
- strbuf_split*() to split a string into multiple strbufs is often a wrong API to use. A few uses of it have been removed by simplifying the code. (merge 2ab72a16d9 ob/gpg-interface-cleanup later to maint).
- "git shortlog" knows "--committer" and "--author" options, which the command line completion (in contrib/) did not handle well, which has been corrected. (merge c568fa8e1c kf/log-shortlog-completion-fix later to maint).
- "git bisect" command did not react correctly to "git bisect help" and "git bisect unknown", which has been corrected. (merge 2bb3a012f3 rz/bisect-help-unknown later to maint).
- The ’q’(uit) command in "git add -p" has been improved to quit without doing any meaningless work before leaving, and giving EOF (typically control-D) to the prompt is made to behave the same way.
- The wildmatch code had a corner case bug that mistakenly makes "foo**/bar" match with "foobar", which has been corrected. (merge 1940a02dc1 jk/match-pathname-fix later to maint).
- Tests did not set up GNUPGHOME correctly, which is fixed but some flaky tests are exposed in t1016, which needs to be addressed before this topic can move forward. (merge 6cd8369ef3 tz/test-prepare-gnupghome later to maint).
- The patterns used in the .gitignore files use backslash in the way documented for fnmatch(3); document as such to reduce confusion. (merge 8a6d158a1d jk/doc-backslash-in-exclude later to maint).
- The version of macos image used in GitHub CI has been updated to macos-14, as the macos-13 that we have been using got deprecated. Perforce binary used there has been changed to arm64 version to match. (merge 73b9cdb7c4 jc/ci-use-macos-14 later to maint). (merge ffff0bb0da jc/ci-use-arm64-p4-on-macos later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 529a60a885 ua/t1517-short-help-tests later to maint). (merge 22d421fed9 ac/deglobal-fmt-merge-log-config later to maint). (merge a60203a015 dk/t7005-editor-updates later to maint). (merge 16684b6fae ps/reftable-libgit2-cleanup later to maint). (merge e5c27bd3d8 je/doc-add later to maint). (merge 13296ac909 ps/object-store-midx-dedup-info later to maint). (merge f9a6705d9a tc/t0450-harden later to maint). (merge a66fc22bf9 rs/get-oid-with-flags-cleanup later to maint). (merge 15b8abde07 js/mingw-includes-cleanup later to maint). (merge 2cebca0582 tb/cat-file-objectmode-update later to maint). (merge 8f487db07a kh/doc-patch-id-1 later to maint). (merge f711f37b05 eb/t1016-hash-transition-fix later to maint). (merge 85333aa1af jk/test-delete-gpgsig-leakfix later to maint).
2.53.0
Git v2.53 Release Notes =======================
UI, Workflows & Features ------------------------
- "git maintenance" command learned "is-needed" subcommand to tell if it is necessary to perform various maintenance tasks.
- "git replay" (experimental) learned to perform ref updates itself in a transaction by default, instead of emitting where each refs should point at and leaving the actual update to another command.
- "git blame" learns "--diff-algorithm=<algo>" option.
- "git repo info" learned "--all" option.
- Both "git apply" and "git diff" learn a new whitespace error class, "incomplete-line".
- Add a new manual that describes the data model.
- "git fast-import" learns "--signed-commits=strip-if-invalid" option to drop invalid cryptographic signature from objects.
- The use of "revision" (a connected set of commits) has been clarified in the "git replay" documentation.
- A help message from "git branch" now mentions "git help" instead of "man" when suggesting to read some documentation.
- "git repo struct" learned to take "-z" as a synonym to "--format=nul".
- More object database related information are shown in "git repo structure" output.
- Improve the error message when a bad argument is given to the
--ontooption of "git replay". Test coverage of "git replay" has been improved.
- The iconv library on macOS fails to correctly handle stateful ISO/IEC 2022:1994 encoded strings. Work it around instead of replacing it wholesale from homebrew.
- Upstream symbolic link support on Windows from Git-for-Windows.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- The list of packfiles used in a running Git process is moved from the packed_git structure into the packfile store.
- Some ref backend storage can hold not just the object name of an annotated tag, but the object name of the object the tag points at. The code to handle this information has been streamlined.
- As "git diff --quiet" only cares about the existence of any changes, disable rename/copy detection to skip more expensive processing whose result will be discarded anyway.
- A part of code paths that deals with loose objects has been cleaned up.
- "make strip" has been taught to strip "scalar" as well as "git".
- Dockerized jobs at the GitHub Actions CI have been taught to show more details of failed tests.
- Code refactoring around object database sources.
- Halve the memory consumed by artificial filepairs created during "git diff --find-copies-harder", also making the operation run faster.
- The "git_istream" abstraction has been revamped to make it easier to interface with pluggable object database design.
- Rewrite the only use of "mktemp()" that is subject to TOCTOU race and Stop using the insecure "mktemp()" function. (merge 10bba537c4 rs/ban-mktemp later to maint).
- In-code comment update to clarify that single-letter options are outside of the scope of command line completion script. (merge dc8a00fafe jc/completion-no-single-letter-options later to maint).
- MEMZERO_ARRAY() helper is introduced to avoid clearing only the first N bytes of an N-element array whose elements are larger than a byte.
- "git diff-files -R --find-copies-harder" has been taught to use the potential copy sources from the index correctly.
- Require C99 style flexible array member support from all platforms.
- The code path that enumerates promisor objects have been optimized to skip pointlessly parsing blob objects.
- Prepare test suite for Git for Windows that supports symbolic links.
- Import newer version of "clar", unit testing framework. (merge 84071a6dea ps/clar-integers later to maint).
- The packfile_store data structure is moved from object store to odb source.
- The object-info API has been cleaned up.
- Further preparation to upstream symbolic link support on Windows.
- Remove implicit reliance on the_repository global in the APIs around tree objects and make it explicit which repository to work in.
- "git bugreport" and "git version --build-options" learned to include use of ’gettext’ feature, to make it easier to diagnose problems around l10n.
- Dscho observed that SVN tests are taking too much time in CI leak checking tasks, but most time is spent not in our code but in libsvn code (which happen to be written in Perl), whose leaks have little value to discover for us. Skip SVN, P4, and CVS tests in the leak checking tasks. (merge 047bd7dfe3 js/ci-leak-skip-svn later to maint).
Fixes since v2.52 -----------------
- Ever since we added whitespace rules for this project, we misspelt an entry, which has been corrected. (merge 358e94dc70 jc/gitattributes-whitespace-no-indent-fix later to maint).
- The code to expand attribute macros has been rewritten to avoid recursion to avoid running out of stack space in an uncontrolled way. (merge 42ed046866 jk/attr-macroexpand-wo-recursion later to maint).
- Adding a repository that uses a different hash function is a no-no, but "git submodule add" did not prevent it, which has been corrected. (merge 6fe288bfbc bc/submodule-force-same-hash later to maint).
- An earlier check added to osx keychain credential helper to avoid storing the credential itself supplied was overeager and rejected credential material supplied by other helper backends that it would have wanted to store, which has been corrected. (merge 4580bcd235 kn/osxkeychain-idempotent-store-fix later to maint).
- The "git repo structure" subcommand tried to align its output but mixed up byte count and display column width, which has been corrected. (merge 7a03a10a3a jx/repo-struct-utf8width-fix later to maint).
- Yet another corner case fix around renames in the "ort" merge strategy. (merge a562d90a35 en/ort-rename-another-fix later to maint).
- Test leakfix. (merge 14b561e768 jk/test-mktemp-leakfix later to maint).
- Update a version of action used at the GitHub Actions CI. (merge cd99203f86 js/ci-github-setup-go-update later to maint).
- The "return errno = EFOO, -1" construct, which is heavily used in compat/mingw.c and triggers warnings under "-Wcomma", has been rewritten to avoid the warnings. (merge af3919816f js/mingw-assign-comma-fix later to maint).
- Makefile based build have recently been updated to build a libgit.a that also has reftable and xdiff objects; CMake based build procedure has been updated to match. (merge b0d5c88cca js/cmake-libgit-fix later to maint).
- Under-allocation fix. (merge d22a488482 js/wincred-get-credential-alloc-fix later to maint).
- "git worktree list" attempts to show paths to worktrees while aligning them, but miscounted display columns for the paths when non-ASCII characters were involved, which has been corrected. (merge 08dfa59835 pw/worktree-list-display-width-fix later to maint).
- "Windows+meson" job at the GitHub Actions CI was hard to debug, as it did not show and save failed test artifacts, which has been corrected. (merge 17bd1108ea jk/ci-windows-meson-test-fix later to maint).
- Emulation code clean-up. (merge 2367c6bcd6 gf/win32-pthread-cond-wait-err later to maint).
- Various issues detected by Asan have been corrected. (merge a031b6181a jk/asan-bonanza later to maint).
- "git config get --path" segfaulted on an ":(optional)path" that does not exist, which has been corrected. (merge 0bd16856ff jc/optional-path later to maint).
- The "--committer-date-is-author-date" option of "git am/rebase" is a misguided one. The documentation is updated to discourage its use. (merge fbf3d0669f kh/doc-committer-date-is-author-date later to maint).
- The option help text given by "git config unset -h" described the "--all" option to "replace", not "unset", multiple variables, which has been corrected. (merge 18bf67b753 rs/config-unset-opthelp-fix later to maint).
- The error message given by "git config set", when the variable being updated has more than one values defined, used old style "git config" syntax with an incorrect option in its hint, both of which have been corrected. (merge df963f0df4 rs/config-set-multi-error-message-fix later to maint).
- "git replay" forgot to omit the "gpgsig-sha256" extended header from the resulting commit the same way it omits "gpgsig", which has been corrected. (merge 9f3a115087 pw/replay-exclude-gpgsig-fix later to maint).
- A few tests have been updated to work under the shell compatible mode of zsh. (merge a92f243a94 bc/zsh-testsuite later to maint).
- The way patience diff finds LCS has been optimized. (merge c7e3b8085b yc/xdiff-patience-optim later to maint).
- Recent optimization to "last-modified" command introduced use of uninitialized block of memory, which has been corrected. (merge fe4e60759b tc/last-modified-active-paths-optimization later to maint).
- "git last-modified" used to mishandle "--" to mark the beginning of pathspec, which has been corrected. (merge 05491b90ce js/last-modified-with-sparse-checkouts later to maint).
- Emulation code clean-up. (merge 42aa7603aa gf/win32-pthread-cond-init later to maint).
- "git submodule add" to add a submodule under <name> segfaulted, when a submodule.<name>.something is already in .gitmodules file without defining where its submodule.<name>.path is, which has been corrected. (merge dd8e8c786e jc/submodule-add later to maint).
- "git fetch" that involves fetching tags, when a tag being fetched needs to overwrite existing one, failed to fetch other tags, which has been corrected. (merge b7b17ec8a6 kn/fix-fetch-backfill-tag-with-batched-ref-updates later to maint).
- Document "rev-list --filter-provided-objects" better. (merge 6d8dc99478 jt/doc-rev-list-filter-provided-objects later to maint).
- Even when there is no changes in the packfile and no need to recompute bitmaps, "git repack" recomputed and updated the MIDX file, which has been corrected. (merge 6ce9d558ce ps/repack-avoid-noop-midx-rewrite later to maint).
- Update HTTP tests to adjust for changes in curl 8.18.0 (merge 17f4b01da7 jk/test-curl-updates later to maint).
- Workaround the "iconv" shipped as part of macOS, which is broken handling stateful ISO/IEC 2022 encoded strings. (merge cee341e9dd rs/macos-iconv-workaround later to maint).
- Running "git diff" with "--name-only" and other options that allows us not to look at the blob contents, while objects that are lazily fetched from a promisor remote, caused use-after-free, which has been corrected.
- The ort merge machinery hit an assertion failure in a history with criss-cross merges renamed a directory and a non-directory, which has been corrected. (merge 979ee83e8a en/ort-recursive-d-f-conflict-fix later to maint).
- Diagnose invalid bundle-URI that lack the URI entry, instead of crashing. (merge 7796c14a1a sb/bundle-uri-without-uri later to maint).
- Mailmap update for Karsten (merge e97678c4ef js/mailmap-karsten-blees later to maint).
- Perf-test fixes. (merge 79d301c767 jk/t-perf-fixes later to maint).
- Fix for a performance regression in "git cat-file". (merge 9e8b448dd8 jk/cat-file-avoid-bitmap-when-unneeded later to maint).
- Update a FAQ entry on synching two separate repositories using the "git stash export/import" recently introduced. (merge 02fc44a989 bc/doc-stash-import-export later to maint).
- "git fsck" used inconsistent set of refs to show a confused warning, which has been corrected.
- Some error messages from the http transport layer lacked the terminating newline, which has been corrected. (merge a8227ae8d5 kt/http-backend-errors later to maint).
- "git repack --geometric" did not work with promisor packs, which has been corrected.
- The logic that avoids reusing MIDX files with a wrong checksum was broken, which has been corrected.
- Other code cleanup, docfix, build fix, etc. (merge 46207a54cc qj/doc-http-bad-want-response later to maint). (merge df90eccd93 kh/doc-commit-extra-references later to maint). (merge f18aa68861 rs/xmkstemp-simplify later to maint). (merge fddba8f737 ja/doc-synopsis-style later to maint). (merge 22ce0cb639 en/xdiff-cleanup-2 later to maint). (merge 8ef7355a8f je/doc-pull later to maint). (merge 48176f953f jc/capability-leak later to maint). (merge 8cbbdc92f7 kh/doc-pre-commit-fix later to maint). (merge d4bc39a4d9 mh/doc-config-gui-gcwarning later to maint). (merge 41d425008a kh/doc-send-email-paragraph-fix later to maint). (merge d4b732899e jc/macports-darwinports later to maint). (merge bab391761d kj/pull-options-decl-cleanup later to maint). (merge 007b8994d4 rs/t4014-git-version-string-fix later to maint). (merge 4ce170c522 ds/doc-scalar-config later to maint). (merge a0c813951a jc/doc-commit-signoff-config later to maint). (merge 8ee262985a ja/doc-misc-fixes later to maint). (merge 1722c2244b mh/doc-core-attributesfile later to maint). (merge c469ca26c5 dk/ci-rust-fix later to maint). (merge 12f0be0857 gf/clear-path-cache-cleanup later to maint). (merge 949df6ed6b js/test-func-comment-fix later to maint). (merge 93f894c001 bc/checkout-error-message-fix later to maint). (merge abf05d856f rs/show-branch-prio-queue later to maint). (merge 06188ea5f3 rs/parse-config-expiry-simplify later to maint). (merge 861dbb1586 dd/t5403-modernise later to maint). (merge acffc5e9e5 ja/doc-synopsis-style-more later to maint). (merge 6c5c7e7071 ac/t1420-use-more-direct-check later to maint). (merge 2ac93bfcbc ds/builtin-doc-update later to maint). (merge 3f051fc9c9 kh/doc-patch-id later to maint). (merge 555c8464e5 je/doc-reset later to maint). (merge 220f888d7e ps/t1410-cleanup later to maint). (merge 5814b04c02 ps/config-doc-get-urlmatch-fix later to maint). (merge 5ae594f30b sb/doc-update-ref-markup-fix later to maint). (merge bc8556d066 ty/t1005-test-path-is-helpers later to maint).
2.54.0
Git v2.54 Release Notes =======================
UI, Workflows & Features ------------------------
- "git add -p" and friends note what the current status of the hunk being shown is.
- "git history" history rewriting (experimental) command has been added.
- "git replay" is taught to drop commits that become empty (not the ones that are empty in the original).
- The help text and the documentation for the "--expire" option of "git worktree [list|prune]" have been improved.
- When "git show-index" is run outside a repository, it silently defaults to SHA-1; the tool now warns when this happens.
- "git merge-file" can be run outside a repository, but it ignored all configuration, even the per-user ones. The command now uses available configuration files to find its customization.
- "auto filter" logic for large-object promisor remote.
- "git rev-list" and friends learn "--maximal-only" to show only the commits that are not reachable by other commits.
- Command line completion (in contrib/) update for "stash import/export".
- "git repo info" learns "--keys" action to list known keys.
- Extend the alias configuration syntax to allow aliases using characters outside ASCII alphanumeric (plus ’-’).
- A signature on a commit that was GPG signed a long time ago ought to be still valid after the key that was used to sign it has expired, but we showed them in alarming red.
- "git subtree split --prefix=P <commit>" now checks the prefix P against the tree of the (potentially quite different from the current working tree) given commit.
- "git add -p" learned a new mode that allows the user to revisit a file that was already dealt with.
- Allow the directory in which reference backends store their data to be specified.
- "gitweb" has been taught to be mobile friendly.
- "git apply --directory=./un/../normalized/path" now normalizes the given path before using it.
- "git maintenance" starts using the "geometric" strategy by default.
- "git config list" is taught to show the values interpreted for specific type with "--type=<X>" option.
- "git add <submodule>" has been taught to honor submodule.<name>.ignore that is set to "all" (and requires "git add -f" to override it).
- Hook commands are now allowed to be defined (possibly centrally) in the configuration files, and run multiple of them for the same hook event.
- The way end-users can add their own "git <cmd>" subcommand by storing "git-<cmd>" in a directory on their $PATH has not been documented clearly, which has been corrected.
- "git send-email" learns to pass hostname/port to Authen::SASL module.
- "git send-email" learns to support use of client-side certificates.
- "git send-email" has learned to be a bit more careful when it accepts charset to use from the end-user, to avoid ’y’ (mistaken ’yes’ when expecting a charset like ’UTF-8’) and other nonsense.
- "git status" learned to show comparison between the current branch and various other branches listed on status.compareBranches configuration.
- "git repo structure" command learns to report maximum values on various aspects of objects it inspects.
- "git rebase" learns "--trailer" option to drive the interpret-trailers machinery.
- "git fast-import" learned to optionally replace signature on commits whose signatures get invalidated due to replaying by signing afresh.
- "git history" learned the "split" subcommand.
- The reference-transaction hook was taught to be triggered before taking locks on references in the "preparing" phase.
- "git apply" now reports the name of the input file along with the line number when it encounters a corrupt patch, and correctly resets the line counter when processing multiple patch files.
- The HTTP transport learned to react to "429 Too Many Requests".
- "git repo info -h" and "git repo structure -h" limit their help output to the part that is specific to the subcommand.
- "git format-patch --cover-letter" learns to use a simpler format instead of the traditional shortlog format to list its commits with a new --commit-list-format option and format.commitListFormat configuration variable.
gitbackfilllearned to accept revision and pathspec arguments.
- "git replay" (experimental) learns, in addition to "pick" and "replay", a new operating mode "revert".
- "git replay" now supports replaying down to the root commit.
- Handling of signed commits and tags in fast-import has been made more configurable.
- "git config list" is the official way to spell "git config -l" and "git config --list". Use it to update the documentation.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- Avoid local submodule repository directory paths overlapping with each other by encoding submodule names before using them as path components.
- The string_list API gains a new helper, string_list_sort_u(), and new unit tests to extend coverage.
- Improve set-up time of a perf test.
- ISO C23 redefines strchr and friends that traditionally took a const pointer and returned a non-const pointer derived from it to preserve constness (i.e., if you ask for a substring in a const string, you get a const pointer to the substring). Update code paths that used non-const pointer to receive their results that did not have to be non-const to adjust.
- Rename three functions around the commit_list data structure.
- Transaction to create objects (or not) is currently tied to the repository, but in the future a repository can have multiple object sources, which may have different transaction mechanisms. Make the odb transaction API per object source.
- "git merge-ours" is taught to work better in a sparse checkout.
- Allow recording process ID of the process that holds the lock next to a lockfile for diagnosis.
- Reduce dependency on the_repository of xdiff-interface layer.
- Code clean-up to use the commit_stack API.
- "git diff --anchored=<text>" has been optimized.
- A CodingGuidelines update.
- Add process ancestry data to trace2 on macOS to match what we already do on Linux and Windows. Also adjust the way Windows implementation reports this information to match the other two.
- A handful of places used refs_for_each_ref_in() API incorrectly, which has been corrected.
- Some tests assumed "iconv" is available without honoring ICONV prerequisite, which has been corrected.
- Revamp object enumeration API around odb.
- Additional tests were introduced to see the interaction with netrc auth with auth failure on the http transport.
- A couple of bugs in use of flag bits around odb API has been corrected, and the flag bits reordered.
- Plumb gitk/git-gui build and install procedure in meson based builds.
- The code to accept shallow "git push" has been optimized.
- Simplify build procedure for oxskeychain (in contrib/).
- Fix dependency screw-up in meson-based builds.
- Wean the mailmap code off of the_repository dependency.
- API clean-up for the worktree subsystem.
- The last uses of the_repository in "tree-diff.c" have been eradicated.
- Clean-up the code around "git repo info" command.
- Mark the merge-ort codebase to prevent more uses of the_repository from getting added.
- The core.attributesfile is intended to be set per repository, but was kept track of by a single global variable in-core, which has been corrected by moving it to per-repository data structure.
- Use the hook API to replace ad-hoc invocation of hook scripts via the run_command() API.
- Code refactoring around refs-for-each-* API functions.
- The parse-options API learned to notice an options[] array with duplicated long options. (merge 237e520d81 rs/parse-options-duplicated-long-options later to maint).
- The code to maintain mapping between object names in multiple hash functions is being added, written in Rust.
- A bit of OIDmap API enhancement and cleanup.
- Move gitlab CI from macOS 14 images that are being deprecated.
- The object source API is getting restructured to allow plugging new backends.
- Reduce dependence on the global the_hash_algo and the_repository variables of wt-status code path.
- The way combined list-object filter options are parsed has been revamped.
- Editorconfig filename patterns were specified incorrectly, making many source files inside subdirectories unaffected, which has been corrected.
- The run_command() API lost its implicit dependency on the singleton
the_repositoryinstance.
- The unit test helper function was taught to use backslash
mnemonic notation for certain control characters like "t", instead of octal notation like "\011".
- Adjust test-lint to allow "sed -E" to use ERE in the patterns.
- Clar (unit testing framework) update from the upstream.
- Reduce system overhead "git upload-pack" spends on relaying "git pack-objects" output to the "git fetch" running on the other end of the connection.
- Add a coccinelle rule to break the build when "struct strbuf" gets passed by value.
- Further work on incremental repacking using MIDX/bitmap
- The logic to count objects has been cleaned up.
- Tweak the build infrastructure by moving tools around.
- Uses of prio_queue as a LIFO stack of commits have been written with commit_stack.
- The cleanup of remaining bitmaps in "ahead_behind()" has been simplified.
- split-index.c has been updated to not use the global the_repository and the_hash_algo variables.
- The unsigned integer that is used as a bitset to specify the kind of branches interpret_branch_name() function has been changed to use a dedicated enum type.
- Various updates to contrib/diff-highlight, including documentation updates, test improvements, and color configuration handling.
- Code paths that loop over another array to push each element into a strvec have been rewritten to use strvec_pushv() instead.
- In case homebrew breaks REG_ENHANCED again, leave an in-code comment to suggest use of our replacement regex as a workaround.
- MinGW build updates.
- The way dash 0.5.13 handles non-ASCII contents in here-doc is buggy and breaks our existing tests, which unfortunately have been rewritten to avoid triggering the bug.
- Object name handling (disambiguation and abbreviation) has been refactored to be backend-generic, moving logic into the respective object database backends.
- pack-objects’s --stdin-packs=follow mode learns to handle excluded-but-open packs.
- A few code paths that spawned child processes for network connection weren’t wait(2)ing for their children and letting "init" reap them instead; they have been tightened.
- Adjust the codebase for C23 that changes functions like strchr() that discarded constness when they return a pointer into a const string to preserve constness.
- A handful of inappropriate uses of the_repository have been rewritten to use the right repository structure instance in the read-cache.c codepath.
- Internals of "git fsck" have been refactored to not depend on the global
the_repositoryvariable.
- Reduce dependency on
the_repositoryin add-patch.c file.
- The way the "git log -L<range>:<file>" feature is bolted onto the log/diff machinery is being reworked a bit to make the feature compatible with more diff options, like -S/G.
- Further work to adjust the codebase for C23 that changes functions like strchr() that discarded constness when they return a pointer into a const string to preserve constness.
- "git rev-list --maximal-only" has been optimized by borrowing the logic used by "git show-branch --independent", which computes the same kind of information much more efficiently.
Fixes since v2.53 -----------------
- HTTP transport failed to authenticate in some code paths, which has been corrected. (merge ed0f7a62f7 ap/http-probe-rpc-use-auth later to maint).
- The computation of column width made by "git diff --stat" was confused when pathnames contain non-ASCII characters. (merge 04f5d95ef7 lp/diff-stat-utf8-display-width-fix later to maint).
- The "-z" and "--max-depth" documentation (and implementation of "-z") in the "git last-modified" command have been updated. (merge 9dcc09bed1 tc/last-modified-options-cleanup later to maint).
- A handful of code paths that started using batched ref update API (after Git 2.51 or so) lost detailed error output, which have been corrected. (merge eff9299eac kn/ref-batch-output-error-reporting-fix later to maint).
- "git blame --ignore-revs=… --color-lines" did not account for ignored revisions passing blame to the same commit an adjacent line gets blamed for. (merge d519082d4e rs/blame-ignore-colors-fix later to maint).
- Coccinelle rules update. (merge 60614838a4 tc/memzero-array later to maint).
- Giving "git last-modified" a tree (not a commit-ish) died an uncontrolled death, which has been corrected. (merge 525ef52301 tc/last-modified-not-a-tree later to maint).
- Test contrib/ things in CI to catch breakages before they enter the "next" branch. (merge c591c3ceff jc/ci-test-contrib-too later to maint).
- A handful of documentation pages have been modernized to use the "synopsis" style. (merge a34d1d53a6 ja/doc-synopsis-style-even-more later to maint).
- Small clean-up of xdiff library to remove unnecessary data duplication. (merge 5086213bd2 pw/xdiff-cleanups later to maint).
- Update sample commit-msg hook to complain when a log message has material mailinfo considers the end of log message in the middle. (merge 83804c361b pw/commit-msg-sample-hook later to maint).
- "git pack-objects --stdin-packs" with "--exclude-promisor-objects" fetched objects that are promised, which was not wanted. This has been fixed. (merge f4eff7116d ps/pack-concat-wo-backfill later to maint).
- "git switch <name>", in an attempt to create a local branch <name> after a remote tracking branch of the same name gave an advice message to disambiguate using "git checkout", which has been updated to use "git switch". (merge 12fee11f21 jc/checkout-switch-restore later to maint).
- It does not make much sense to apply the "incomplete-line" whitespace rule to symbolic links, whose contents almost always lack the final newline. "git apply" and "git diff" are now taught to exclude them for a change to symbolic links. (merge 6a41481c6d jc/whitespace-incomplete-line later to maint).
- "git format-patch --from=<me>" did not honor the command line option when writing out the cover letter, which has been corrected.
- Update build procedure for mergetool documentation in meson-based builds. (merge 58e4eeeeb5 pw/meson-doc-mergetool later to maint).
- An earlier attempt to optimize "git subtree" discarded too much relevant histories, which has been corrected.
- A prefetch call can be triggered to access a stale diff_queue entry after diffcore-break breaks a filepair into two and freed the original entry that is no longer used, leading to a segfault, which has been corrected. (merge 2d88ab078d hy/diff-lazy-fetch-with-break-fix later to maint).
- "git fetch --deepen" that tries to go beyond merged branch used to get confused where the updated shallow points are, which has been corrected. (merge 3ef68ff40e sp/shallow-deepen-relative-fix later to maint).
- "fsck" iterates over packfiles and its access to pack data caused the list to be permuted, which caused it to loop forever; the code to access pack data by "fsck" has been updated to avoid this. (merge 13eb65d366 ps/fsck-stream-from-the-right-object-instance later to maint).
- "git log --graph --stat" did not count the display width of colored graph part of its own output correctly, which has been corrected. (merge 064b869efc lp/diff-stat-utf8-display-width-fix later to maint).
- The configuration variable format.noprefix did not behave as a proper boolean variable, which has now been fixed and documented. (merge ea3a62c40e kh/format-patch-noprefix-is-boolean later to maint).
- CI fix. (merge eb35167dd4 ps/ci-reduce-gitlab-envsize later to maint).
- "git diff --no-index --find-object=<object-name>" outside a repository of course wouldn’t be able to find the object and died while parsing the command line. The command is made to die in a bit more user-friendly way. (merge b0ddc7947c mm/diff-no-index-find-object later to maint).
- Fix typo-induced breakages in fsmonitor-watchman sample hook. (merge 41366e4677 pt/fsmonitor-watchman-sample-fix later to maint).
- "git for-each-repo" started from a secondary worktree did not work as expected, which has been corrected. (merge e87493b9b4 ds/for-each-repo-w-worktree later to maint).
- The construct ’test "$(command)" = expectation’ loses the exit status from the command, which has been fixed by breaking up the statement into pieces. (merge d3edca979a fp/t3310-unhide-git-failures later to maint).
- While discovering a ".git" directory, the code treats any stat() failure as a sign that a filesystem entity .git does not exist there, and ignores ".git" that is not a "gitdir" file or a directory. The code has been tightened to notice and report filesystem corruption better. (merge 1dd27bfbfd ty/setup-error-tightening later to maint).
- Plug a few leaks where mmap’ed memory regions are not unmapped. (merge a8a69bbb64 jk/unleak-mmap later to maint).
- A test now uses the symbolic constant $ZERO_OID instead of 40 "0" to work better with SHA-256 as well as SHA-1. (merge 30310f3cc4 ss/t3200-test-zero-oid later to maint).
- Instead of hardcoded ’origin’, use the configured default remote when fetching from submodules. (merge 3b5fb32da8 ng/submodule-default-remote later to maint).
- The code in "git help" that shows configuration items in sorted order was awkwardly organized and prone to bugs.
- "imap-send" used to use functions whose use is going to be removed with OpenSSL 4.0; rewrite them using public API that has been available since OpenSSL 1.1 since 2016 or so. (merge 6392a0b75d bb/imap-send-openssl-4.0-prep later to maint).
- Fix an example in the user-manual. (merge 5514f14617 gj/user-manual-fix-grep-example later to maint).
- The final clean-up phase of the diff output could turn the result of histogram diff algorithm suboptimal, which has been corrected. (merge e417277ae9 yc/histogram-hunk-shift-fix later to maint).
- "git diff -U<num>" was too lenient in its command line parsing and took an empty string as a valid <num>. (merge 4f6a803aba ty/doc-diff-u-wo-number later to maint).
- The handling of the incomplete lines at the end by "git diff-highlight" has been fixed.
- merge-file --object-id used to trigger a BUG when run in a linked worktree, which has been fixed. (merge 57246b7c62 mr/merge-file-object-id-worktree-fix later to maint).
- "git apply -p<n>" parses <n> more carefully now. (merge d05d84c5f5 mf/apply-p-no-atoi later to maint).
- A test to run a .bat file with whitespaces in the name with arguments with whitespaces in them was flaky in that sometimes it got killed before it produced expected side effects, which has been rewritten to make it more robust. (merge 3ad4921838 jk/t0061-bat-test-update later to maint).
- "git ls-remote ’+refs/tags/:refs/tags/’ https://…" run outside a repository would dereference a NULL while trying to see if the given refspec is a single-object refspec, which has been corrected. (merge 4e5dc601dd kj/refspec-parsing-outside-repository later to maint).
- Fix a regression in writing the commit-graph where commits with dates exceeding 34 bits (beyond year 2514) could cause an underflow and crash Git during the generation data overflow chunk writing.
- The value of a wrong pointer variable was referenced in an error message that reported that it shouldn’t be NULL. (merge 753ecf4205 yc/path-walk-fix-error-reporting later to maint).
- The check in "receive-pack" to prevent a checked out branch from getting updated via updateInstead mechanism has been corrected.
- "git backfill" is capable of auto-detecting a sparsely checked out working tree, which was broken. (merge 339eba65a7 th/backfill-auto-detect-sparseness-fix later to maint).
- add_files_to_cache() used diff_files() to detect only the paths that are different between the index and the working tree and add them, which does not need rename detection, which interfered with unnecessary conflicts. (merge c0ce43376b ng/add-files-to-cache-wo-rename later to maint).
- Doc mark-up update for entries in the glossary with bulleted lists. (merge a65cbd87ea jk/doc-markup-sub-list-indentation later to maint).
- CI dependency updates. (merge 4bdb17e3a8 jc/ci-github-actions-use-checkout-v5 later to maint).
- Other code cleanup, docfix, build fix, etc. (merge d79fff4a11 jk/remote-tracking-ref-leakfix later to maint). (merge 7a747f972d dd/t5403-modernise later to maint). (merge 81021871ea sp/myfirstcontribution-include-update later to maint). (merge 49223593fd ac/sparse-checkout-string-list-cleanup later to maint). (merge a824421d36 sp/t5500-cleanup later to maint). (merge df1c5d7ed7 kh/doc-shortlog-fix later to maint). (merge 2d45507f15 am/doc-github-contributiong-link-to-submittingpatches later to maint). (merge 68060b9262 hs/t9160-test-paths later to maint). (merge 486386c687 cs/subtree-reftable-testfix later to maint). (merge 0728012c53 jc/diff-highlight-main-master-testfix later to maint). (merge 831989ef38 mc/doc-send-email-signed-off-by-cc later to maint). (merge c44b3f3203 sd/doc-my1c-api-config-reference-fix later to maint). (merge 6c21e53bad rs/version-wo-the-repository later to maint). (merge 10c68d2577 rs/clean-includes later to maint). (merge 168d575719 bk/t2003-modernise later to maint). (merge 6bfef81c9a kh/doc-rerere-options-xref later to maint). (merge aaf3cc3d8d sd/t7003-test-path-is-helpers later to maint). (merge 2668b6bdc4 jc/doc-rerere-update later to maint). (merge 2f99f50f2d jc/doc-cg-c-comment later to maint). (merge a454cdca42 kh/doc-am-format-sendmail later to maint). (merge 8b0061b5c5 jk/ref-filter-lrstrip-optim later to maint). (merge 5133837392 ps/ci-gitlab-msvc-updates later to maint). (merge 143e84958c db/doc-fetch-jobs-auto later to maint). (merge 0678e01f02 ap/use-test-seq-f-more later to maint). (merge 96286f14b0 ty/symlinks-use-unsigned-for-bitset later to maint). (merge b10e0cb1f3 kh/doc-am-xref later to maint). (merge ed84bc1c0d kh/doc-patch-id-4 later to maint). (merge 7451864bfa sc/pack-redundant-leakfix later to maint). (merge f87593ab1a cx/fetch-display-ubfix later to maint). (merge a66c8c7f91 jk/repo-structure-cleanup later to maint). (merge 5ee8782f87 ss/test-that-that-typofix later to maint). (merge f31b322008 fp/t3310-test-path-is-helpers later to maint). (merge b22ed4c4f9 kj/path-micro-code-cleanup later to maint). (merge a56fa1ca05 lp/doc-gitprotocol-pack-fixes later to maint). (merge 0d6bb8b541 ss/t3700-modernize later to maint). (merge 63c00a677b ss/t9123-setup-inside-test-expect-success later to maint). (merge beca0ca4be os/doc-git-custom-commands later to maint). (merge 4c223571be ty/patch-ids-document-lazy-eval later to maint). (merge 476365ac85 jc/doc-wholesale-replace-before-next later to maint). (merge 35f220b639 ss/submodule—helper-use-xmalloc later to maint). (merge 02cbae61df cf/constness-fixes later to maint). (merge 69efd53c81 ms/t7605-test-path-is-helpers later to maint). (merge d39cef3a1a ss/t0410-delete-object-cleanup later to maint). (merge 2f05039717 rj/pack-refs-tests-path-is-helpers later to maint). (merge 2594747ad1 jk/transport-color-leakfix later to maint). (merge 48430e44ac mf/t0008-cleanup later to maint). (merge fc8a4f15e7 gi/doc-boolean-config-typofix later to maint). (merge 37182267a0 kh/doc-interpret-trailers-1 later to maint). (merge f64c50e768 jc/rerere-modern-strbuf-handling later to maint). (merge 699248d89e th/t8003-unhide-git-failures later to maint). (merge d8e34f971b za/t2000-modernise later to maint). (merge 849988bc74 th/t6101-unhide-git-failures later to maint). (merge 0f0ce07625 sp/doc-gitignore-oowt later to maint).
2.54.1
Git v2.54.1 Release Notes =========================
This release is primarily to merge fixes accumulated on the ’master’ front to prepare for 2.55 release that are still relevant to 2.54.x maintenance track.
Fixes since v2.54 -----------------
- Headers from glibc 2.43 when used with clang does not allow disabling C11 language features, causing build failures..
- Revert a recent change that introduced a regression to help mksh users.
- Update various GitHub Actions versions.
- Avoid hitting the pathname limit for socks proxy socket during the test.
- To help Windows 10 installations, avoid removing files whose contents are still mmap()’ed.
- Stop using unmaintained custom allocator in Windows build which was the last user of the code.
- Further update to the i18n alias support to avoid regressions.
Also contains minor documentation updates and code clean-ups.
2.55.0
Git v2.55 Release Notes =======================
UI, Workflows & Features ------------------------
- Hook scripts defined via the configuration system can now be configured to run in parallel.
- The userdiff driver for the Scheme language has been extended to cover other Lisp dialects.
- Terminal control sequences coming over the sideband while talking to a remote repository are mostly disabled by default, except for ANSI color escape sequences.
- "ort" merge backend improvements.
- "git checkout -m another-branch" was invented to deal with local changes to paths that are different between the current and the new branch, but it gave only one chance to resolve conflicts. The command was taught to create a stash to save the local changes.
- A new builtin "git format-rev" is introduced for pretty formatting one revision expression per line or commit object names found in running text.
- "git history" learned "fixup" command.
- The internal URL parsing logic has been made accessible via a new subcommand "git url-parse".
- Misspelt proxy URL (e.g., httt://…) did not trigger any warning or failure, which has been corrected. We had a regression in this update that broke https:// proxies, but that has been caught and corrected.
- Document the fact that .git/info/exclude is shared across worktrees linked to the same repository.
- The command line parser for "git diff" learned a few options take only non-negative integers.
- The graph output from commands like "git log --graph" can now be limited to a specified number of lanes, preventing overly wide output in repositories with many branches.
- The fsmonitor daemon has been implemented for Linux.
- "git cat-file --batch" learns an in-line command "mailmap" that lets the user toggle use of mailmap.
- The "git pack-objects --path-walk" traversal has been integrated with several object filters, including blobless and sparse filters.
- "git push" learned to take a "remote group" name to push to, which causes pushes to multiple places, just like "git fetch" would do.
- The ’git-jump’ command (in contrib/) has been taught to automatically pick a mode (merge, diff, or ws) when invoked without arguments.
- The documentation for
push.default=simplehas been clarified to better explain its behavior, making it clear that it pushes the current branch to a same-named branch on the remote, and detailing the upstream requirements for centralized workflows.
- The documentation for "--word-diff" has been extended with a bit of implementation detail of where these different words come from.
- "git config foo.bar=baz" is not likely to be a request to read the value of such a variable with ’=’ in its name; rather it is plausible that the user meant "git config set foo.bar baz". Give advice when giving an error message.
- "git rev-list" (and "git log" family of commands) learned a new "--max-count-oldest" that picks oldest N commits in the range instead of the usual newest.
- Various AsciiDoc markup fixes in ’git config’ documentation and related files to ensure lists and formatting are rendered correctly.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- Promisor remote handling has been refactored and fixed in preparation for auto-configuration of advertised remotes.
- Rust support is enabled by default (but still allows opting out); in Git version 3.0, Rust will become mandatory.
- Preparation of the xdiff/ codebase to work with Rust.
- Use a larger buffer size in the code paths to ingest pack stream.
- Refactor service routines in the ref subsystem backends.
- Shrink wasted memory in Myers diff that does not account for common prefix and suffix removal.
- Enable expensive tests to catch topics that may cause breakages on integration branches closer to their origin in the contributor PR builds.
- "git merge-base" optimization.
- The limit_list() function that is one of the core part of the revision traversal infrastructure has been optimized by replacing its use of linear list with priority queue.
- In a lazy clone, "git cherry" and "git grep" often fetch necessary blob objects one by one from promisor remotes. It has been corrected to collect necessary object names and fetch them in bulk to gain reasonable performance.
- The logic to determine that branches in an octopus merge are independent has been optimized.
- The consistency checks for the files reference backend have been updated to skip lock files earlier, avoiding unnecessary parsing of intermediate files.
- The negotiation tip options in "git fetch" have been reworked to allow requiring certain refs to be sent as "have" lines, and to restrict negotiation to a specific set of refs.
- The repacking code has been refactored and compaction of MIDX layers have been implemented, and incremental strategy that does not require all-into-one repacking has been introduced.
- ODB transaction interface is being reworked to explicitly handle object writes.
- Add a new odb "in-memory" source that is meant to only hold tentative objects (like the virtual blob object that represents the working tree file used by "git blame").
- Many uses of the_repository has been updated to use a more appropriate struct repository instance in setup.c codepath.
- Revision traversal optimization.
- Build update.
- The logic to lazy-load trees from the commit-graph has been made more robust by falling back to reading the commit object when the commit-graph is no longer available.
- The "name" argument in git_connect() and related functions has been converted to a "service" enum to improve type safety and clarify its purpose.
- ’git restore --staged’ has been optimized to avoid unnecessarily expanding the sparse index when operating on paths within the sparse checkout definition, by handling sparse directory entries at the tree level.
- "git stash -p" has been optimized by reusing cached index entries in its temporary index, avoiding unnecessary lstat() calls on unchanged files.
- The check for non-stale commits in the priority queue used by
paint_down_to_commonandahead_behindhas been optimized by replacing an O(N) scan with an O(1) counter, yielding performance improvements in repositories with wide histories.
- Reachability bitmap generation has been significantly optimized. By reordering tree traversal, caching object positions, and refining how pseudo-merge bitmaps are constructed, the performance of "git repack --write-midx-bitmaps" is improved, especially for large repositories and when using pseudo-merges.
- Adding a decimal integer with strbuf_addf("%u") appears commonly; they have been optimized by using a custom formatter.
- Formatting object name in full hexadecimal form has been optimized by using a new strbuf_add_oid_hex() helper function.
- Encourage original authors to monitor the CI status.
- The
gitlog-Limplementation has been refactored to use the standard diff output pipeline, enabling pickaxe and diff-filter to work as expected. Additionally, metadata-only diff formats like --raw and --name-only are now supported with -L.
- The loose object source has been refactored into a proper
structodb_source.
- Guidelines on how to write a cover letter for a multi-patch series have been added to SubmittingPatches, which also got a new marker to separate the section for typofixes.
- The setup logic to discover and configure repositories has been refactored, and the initialization of the object database has been centralized.
- Many core configuration variables have been migrated from global variables into ’repo_config_values’ to tie them to a specific repository instance, avoiding cross-repository state leakage.
- Streaming revision walks have been optimized by using a priority queue for date-sorting commits, speeding up walks repositories with many merges.
- A recent regression in t7527 that broke TAP output has been fixed, some other test noise that also broke TAP output has been silenced, and ’prove’ is now configured to fail on invalid TAP output to prevent future regressions.
- A handful of inappropriate uses of the_repository have been rewritten to use the right repository structure instance in the unpack-trees.c codepath.
- "git index-pack" has been optimized by retaining child bases in the delta cache instead of immediately freeing them, letting the existing cache limit policy decide eviction.
gitls-files--modifiedandgitls-files--deletedhave been optimized to filter with pathspec before calling lstat() when there is only a single pathspec item, avoiding unnecessary filesystem access for entries that will not be shown.
- The UNUSED macro in ’compat/posix.h’ has been updated to use a newly introduced GIT_CLANG_PREREQ macro for compiler version checks, and the existing GIT_GNUC_PREREQ macro has been modernized to use explicit major/minor comparisons rather than bit-shifting.
- Wean the Windows builds in GitLab CI procedure away from (unfortunately unreliable) Chocolatey to install dependencies. (merge 0e7b51fed2 ps/gitlab-ci-windows later to maint).
- Build-fix for 32-bit Windows.
- Xcode 15 and later has a linker set to complain when the same library archive is listed twice on the command line. Squelch the annoyance.
Fixes since v2.54 -----------------
- Code clean-up to use the right instance of a repository instance in calls inside refs subsystem. (merge 57c590feb9 sp/refs-reduce-the-repository later to maint).
- The check that implements the logic to see if an in-core cache-tree is fully ready to write out a tree object was broken, which has been corrected. (merge 521731213c dl/cache-tree-fully-valid-fix later to maint).
- The test suite harness and many individual test scripts have been updated to work correctly when ’set -e’ is in effect, which helps detect misspelled test commands. (merge ffe8005b9d ps/test-set-e-clean later to maint).
- Revert a recent change that introduced a regression to help mksh users.
- Update various GitHub Actions versions.
- Avoid hitting the pathname limit for socks proxy socket during the test..
- To help Windows 10 installations, avoid removing files whose contents are still mmap()’ed.
- The ’git backfill’ command now rejects revision-limiting options that are incompatible with its operation, uses standard documentation for revision ranges, and includes blobs from boundary commits by default to improve performance of subsequent operations. (merge a1ad4a0fca en/backfill-fixes-and-edges later to maint).
- "git grep" update. (merge 9ff4b5ab1b rs/grep-column-only-match-fix later to maint).
- Headers from glibc 2.43 when used with clang does not allow disabling C11 language features, causing build failures..
- The ’http.emptyAuth=auto’ configuration now correctly attempts Negotiate authentication before falling back to manual credentials. This allows seamless Kerberos ticket-based authentication without requiring users to explicitly set ’http.emptyAuth=true’. (merge 4919938d28 mc/http-emptyauth-negotiate-fix later to maint).
- Ramifications of turning off commit-graph has been documented a bit more clearly. (merge 48c855bb8f kh/doc-commit-graph later to maint).
- "git rebase --update-refs", when used with an rebase.instructionFormat with "%d" (describe) in it, tried to update local branch HEAD by mistake, which has been corrected. (merge 106b6885c7 ag/rebase-update-refs-limit-to-branches later to maint).
- Tweak the way how sideband messages from remote are printed while we talk with a remote repository to avoid tickling terminal emulator glitches. (merge 31e8fcabd8 rs/sideband-clear-line-before-print later to maint).
- The configuration variable submodule.fetchJobs was not read correctly, which has been corrected. (merge aa45a5902f sj/submodule-update-clone-config-fix later to maint).
- Update code paths that assumed "unsigned long" was long enough for "size_t". (merge 7a094d68a2 js/objects-larger-than-4gb-on-windows later to maint).
- Stop using unmaintained custom allocator in Windows build which was the last user of the code.
- The computation to shorten the filenames shown in diffstat measured width of individual UTF-8 characters to add up, but forgot to take into account error cases (e.g., an invalid UTF-8 sequence, or a control character). (merge 09d86a3b98 en/diffstat-utf8-truncation-fix later to maint).
- Some tests assume that bare repository accesses are by default allowed; rewrite some of them to avoid the assumption, rewrite others to explicitly set safe.bareRepository to allow them. (merge 985b38ca6c js/adjust-tests-to-explicitly-access-bare-repo later to maint).
- Signing commit with custom encoding was passing the data to be signed at a wrong stage in the pipeline, which has been corrected. (merge 7735d7eee3 bc/sign-commit-with-custom-encoding later to maint).
- Further update to the i18n alias support to avoid regressions.
- "git fetch --deepen=<n>" in a full clone truncated the history to <n> commits deep, which has been corrected to be a no-op instead. (merge 2431f5e0e5 sp/shallow-deepen-on-non-shallow-repo-fix later to maint).
- "git maintenance" that goes background did not use the lockfile to prevent multiple maintenance processes from running at the same time, which has been corrected. (merge 29364f1624 ps/maintenance-daemonize-lockfix later to maint).
- Remove ineffective strbuf presizing that would have computed an allocation that would not have fit in the available memory anyway, or too small due to integer wraparound to cause immediate automatic growing. (merge a9ce8526dc jk/pretty-no-strbuf-presizing later to maint).
- The HTTP walker misinterpreted the alternates file that gives an absolute path when the server URL does not have the final slash (i.e., "https://example.com" not "https://example.com/"). (merge b92387cd55 jk/dumb-http-alternate-fix later to maint).
- "git bisect" now uses the selected terms (e.g., old/new) more consistently in its output. (merge cb55991825 jr/bisect-custom-terms-in-output later to maint).
- Update GitLab CI jobs that exercise macOS. (merge 62319b49bb ps/gitlab-ci-macOS-improvements later to maint).
- "Friday noon" asked in the morning on Sunday was parsed to be one day before the specified time, which has been corrected. (merge b809304101 ta/approxidate-noon-fix later to maint).
- The GIT_WORK_TREE variable prepared to invoke the push-to-checkout hook was leaking into the environment even when there was no hook used and broke the default push-to-deploy (i.e., let "git checkout" update the working tree only when the working tree is clean). (merge 44d04e4426 ar/receive-pack-worktree-env later to maint).
- A batch of documentation pages has been updated to use the modern synopsis style. (merge 2ef248ae45 ja/doc-synopsis-style-again later to maint).
- The "promisor.quiet" configuration variable was not used from relevant submodules when commands like "grep --recurse-submodules" triggered a lazy fetch, which has been corrected. (merge fa1468a1f7 th/promisor-quiet-per-repo later to maint).
- Correct use of sockaddr API in "git daemon". (merge 422a5bf575 st/daemon-sockaddr-fixes later to maint).
- A memory leak in
fetch_and_setup_pack_index()when verification of the downloaded pack index fails has been plugged. Also an obsoleteunlink()call on parse failure has been cleaned up.
- In t3070-wildmatch, "via ls-files" test variants with patterns containing backslash escapes are now skipped on Windows, avoiding 36 test failures caused by pathspec separator conversion. (merge 8c84e6802c kk/wildmatch-windows-ls-files-prereq later to maint).
- A linker warning on macOS when building with Xcode 16.3 or newer has been avoided by passing -fno-common to the compiler when a sufficiently new linker is detected. (merge 5cd4d0d850 hn/macos-linker-warning later to maint).
- Documentation and tests have been added to clarify that Git’s internal raw timestamp format requires a
@prefix for values less than 100,000,000 to prevent ambiguity with other formats like YYYYMMDD. (merge 4018dc29ee ls/doc-raw-timestamp-prefix later to maint).
- Wording used in "format-patch --subject-prefix" documentation has been improved. (merge 4a1eb9304a lo/doc-format-patch-subject-prefix later to maint).
- Advanced emulation of kill() used on Windows in GfW has been upstreamed to improve the symptoms like left-behind .lock files and that fails to let the child clean-up itself when it gets killed. (merge 363f1d8b3a js/win-kill-child-more-gently later to maint).
- The ’git describe --contains --all’ command has been fixed to properly honor the '--match’ and '--exclude’ options by passing them down to ’git name-rev’ with the appropriate reference prefixes. (merge 1891707d1b jk/describe-contains-all-match-fix later to maint).
- Various typos, grammatical errors, and duplicated words in both documentation and code comments have been corrected. (merge dc6068df67 wy/docs-typofixes later to maint).
- The subprocess handshake during startup has been made gentler by using packet_read_line_gently() instead of packet_read_line() to prevent the parent Git process from dying abruptly when a configured subprocess (e.g., a clean/smudge filter) fails to start. (merge 061a68e443 mm/subprocess-handshake-fix later to maint).
- The TSAN race in transfer_debug() within transport-helper.c has been resolved by initializing the debug flag early in bidirectional_transfer_loop() before spawning worker threads, allowing the removal of a TSAN suppression. (merge 85704eda18 ps/transport-helper-tsan-fix later to maint).
- ’git describe’ has been taught to pass the ’refs/tags/’ prefix down to the ref iterator when '--all’ is not requested, avoiding unnecessary iteration over non-tag refs. (merge 55088ac8a4 td/describe-tag-iteration later to maint).
-
compute_reachable_generation_numbers() in commit-graph used a 32-bit integer to accumulate parent generations, which is OK for generation number v1 (topological levels), but with generation number v2 (adjusted committer timestamps), it truncated timestamps beyond
- Fixed by widening the accumulator to timestamp_t. (merge fbcc5408fc en/commit-graph-timestamp-fix later to maint).
- Other code cleanup, docfix, build fix, etc. (merge 80f4b802e9 ja/doc-difftool-synopsis-style later to maint). (merge b96490241e jc/doc-timestamps-in-stat later to maint). (merge ef85286e51 ss/t7004-unhide-git-failures later to maint). (merge 7584d10bc2 mf/format-patch-cover-letter-format-docfix later to maint). (merge 8547908eb3 pw/rename-to-get-current-worktree later to maint). (merge 890229b3f3 sg/t6112-unwanted-tilde-expansion-fix later to maint). (merge ab9753e7bc kh/doc-restore-double-underscores-fix later to maint). (merge 4a9e097228 za/t2000-modernise-more later to maint). (merge b635fd0725 kh/doc-log-decorate-list later to maint). (merge 65ea197dca jk/commit-sign-overflow-fix later to maint). (merge 3ccb16052a jk/apply-leakfix later to maint). (merge 5e6e8dc786 tb/pseudo-merge-bugfixes later to maint). (merge 6d09e798bc pb/doc-diff-format-updates later to maint). (merge 34a891a2d3 rs/trailer-fold-optim later to maint). (merge 499f9048e0 ps/t3903-cover-stash-include-untracked later to maint). (merge b56ab270aa jk/sq-dequote-cleanup later to maint). (merge 29d9fdcf10 rs/use-builtin-add-overflow-explicitly-on-clang later to maint). (merge d9982e8290 ed/check-connected-close-err-fd-2.53 later to maint). (merge 1740cc35d0 ed/check-connected-close-err-fd later to maint). (merge f4d7eb3d1c sp/doc-range-diff-takes-notes later to maint). (merge 83e7f3bd2b kh/free-commit-list later to maint). (merge d1b72b29e9 am/doc-tech-hash-typofix later to maint). (merge 014c454799 ak/typofixes later to maint). (merge 522ea8ef7d js/osxkeychain-build-wo-rust later to maint). (merge e8f12e0e95 jc/t1400-fifo-cleanup later to maint). (merge 0bf506efd4 kw/gitattributes-typofix later to maint).
2.56.0
Git v2.56 Release Notes =======================
UI, Workflows & Features ------------------------
- Advice shown by "git status" when the local branch is behind or has diverged from its push branch has been updated to suggest "git pull <remote> <branch>".
- The handling of promisor-remote protocol capability has been updated to allow the other side to add to the list of promisor remotes via the ’promisor.acceptFromServerURL’ configuration variable.
- The ’ort’ merge backend has been hardened against corrupt trees by ensuring it aborts under appropriate error conditions.
- The
fetch.followRemoteHEADconfiguration variable has been added to provide a default for the per-remoteremote.<name>.followRemoteHEADsetting.
- "git log --follow" has been updated to better handle non-linear history, in which the path being tracked gets renamed differently in multiple history lines.
- The "git repo info" command has been taught new keys to output both absolute and relative paths for "gitdir" and "commondir", supported by a new path-formatting helper extracted from "git rev-parse".
- When ’git push origin/main’ or ’git branch origin main’ is run, the command is now recognized as a potential typo, and advice has been added to offer a typo fix.
- The ’git refs’ toolbox has been extended with new ’create’, ’delete’, ’update’, and ’rename’ subcommands to create, delete, update, and rename references, respectively.
- The experimental ’git history’ command has been taught a new ’drop’ subcommand to remove a commit, with its descendants replayed onto its parent.
- The alignment of commit object name abbreviations in ’git blame’ output has been optimized to reserve a column for marks (caret, question mark, or asterisk) only when such marks are actually shown.
- Option parsing with ’git rev-parse --parseopt’ and in most ’git’ subcommands has been updated to exit with 0 (instead of 129) when the help option (’-h’ or '--help’) is requested directly by the user, aligning with standard Unix convention.
- The ’[includeIf "condition"]’ conditional inclusion facility for configuration files has been taught to use the location of the worktree in its condition.
- The usage string and SYNOPSIS for ’git fast-export’ have been standardized to make them consistent with each other and with other commands.
- ’git log --graph’ has been modified to visually distinguish parentless ’root’ commits (and commits that become roots due to history simplification) by indenting them, preventing them from appearing falsely related to unrelated commits rendered immediately above them.
- Userdiff patterns for Swift have been added, with support for Swift-specific constructs such as attributes, modifiers, failable initializers, and generics.
- Configuration file locking has been updated to retry for a short period, avoiding failures when multiple processes attempt to update the configuration simultaneously.
- The ’remote-object-info’ command has been added to ’git cat-file --batch-command’, allowing clients to request object metadata (currently size) from a remote server via protocol v2 without downloading the entire object. Format placeholders are dynamically filtered on the client based on server-advertised capabilities, returning empty strings for inapplicable or unsupported fields.
- ’git branch -d’ has been taught to report when a branch cannot be deleted because it is being used in an active bisect run.
- ’git mv’ has been updated to check for a missing destination leading directory during the checking phase, allowing ’git mv -n’ to report the failure. The error message when the rename(2) syscall fails has also been improved to name both the source and the destination.
- ’git add’ has been taught a new '--resolved’ option to stage conflict-resolved paths, while leaving unrelated local changes unstaged. It scans the unmerged paths for leftover conflict markers and aborts if any are found.
- The known limitations of the ref format migration in ’git refs’ have been moved to be displayed as a warning admonition directly under the description of the ’migrate’ subcommand, improving visibility. A reference to ’git-maintenance’ has also been corrected to use the ’linkgit’ macro.
- The ’git bisect’ command has been taught a '--reset-when-found[=<where>]’ option that tells the command to automatically run ’git bisect reset’ to jump back to the original state or to the found culprit.
- The ’git branch’ command has been taught the '--delete-merged’ option to remove local branches that are already merged into their tracked remote-tracking branches.
- The ’remote-object-info’ command for ’git cat-file --batch-command’ has been extended to support the ’%(objecttype)’ placeholder.
- The usage string of ’git fast-import’ has been updated to use the parse_options() API for displaying help, and its SYNOPSIS in the documentation has been standardized to match.
- The error message given by ’git send-email’ when a message file is missing a ’Subject:’ header has been clarified, and the error string is now terminated with a newline so that Perl avoids appending its internal source location data.
- The '--shallow-file’ option of ’git’ command requires a value, but the code did not check the presence of a value and instead segfaulted without one, which has been corrected.
- ’git repack’ has been taught '--drop-filtered’ to delete local promisor blobs exceeding a limit (currently ’blob:limit=’) in partial clones, reclaiming space. Guards prevent running during other operations or if referenced by the index.
- The documentation for ’git format-rev’ has been updated to use the [synopsis] block definition on code blocks to properly highlight placeholders, and a quoting inconsistency in the running text has been fixed.
- The DWIM logic in ’git worktree add’ sometimes tried to infer a remote-tracking branch when an explicit ’-b’ or ’-B’ option was given to create a new branch, causing the explicit branch name to be ignored, which has been corrected.
- The command line completion (in contrib/) has been taught to handle the experimental ’git history’ command.
- ’git checkout’ and ’git worktree add’ makes guesses based on a name of a remote-tracking branch, but does not give an error when such a remote-tracking branch cannot be uniquely identified, which has been corrected.
- The ’git replay’ command has been taught the '--linearize’ option to drop merge commits and linearize the replayed history, mimicking ’git rebase --no-rebase-merges’.
- The documentation for ’git cherry-pick’ has been updated to clarify that the '--no-commit’ option intentionally skips setting the ’CHERRY_PICK_HEAD’ ref. A test has also been added to ensure this behavior holds even when the operation stops for conflicts.
- The ’git imap-send’ command has been taught to take the '--draft’ option to mark uploaded messages as drafts, which helps some email clients render them properly for editing and sending.
- The git rev-list command has been augmented with a '--missing-only’ option that filters the output to only show missing objects, stripping the leading ’?’ character and suppressing present objects, which is useful when used in combination with '--missing=print’ or '--missing=print-info’.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- The refactoring of ’setup.c’ has been continued to drop remaining global state (
git_work_tree_cfg,is_bare_repository_cfg), updatingis_bare_repository()to no longer implicitly rely onthe_repository.
- Project-specific configuration for b4 has been introduced, and the documentation has been updated to recommend using it as a streamlined method for submitting patches.
- The default format path of git cat-file --batch has been optimized to use strbuf_add_oid_hex() and strbuf_add_uint() instead of strbuf_addf(), yielding a noticeable speedup.
- Commands that list branches and tags (like git branch and git tag) have been optimized to pass the namespace prefix when initializing their ref iterator, avoiding a loose-ref scaling regression in repositories with many unrelated loose references.
- The packed object source has been refactored into a proper struct odb_source.
- The global configuration variables protect_hfs and protect_ntfs have been migrated into struct repo_config_values to tie them to per-repository configuration state.
- The trailer sections in SubmittingPatches have been updated to encourage use of standard trailers.
- The documentation in SubmittingPatches has been updated to clarify how patch contributors should respond to design and viability critiques, and how the resolution of such critiques should be recorded in the final commit messages.
- The pack-objects command has been updated to support reachability bitmaps and delta-islands concurrently with the
--path-walkoption, allowing faster packaging by falling back to path-walk when bitmaps cannot fully satisfy the request.
- Documentation on community contribution guidelines has been updated to encourage replying to review comments before rerolling, and to advise a default limit of at most one reroll per day to give reviewers across different time zones enough time to participate.
- The lazy priority queue optimization pattern (deferring actual removal in ’prio_queue_get()’ to allow get+put fusion) has been folded directly into ’prio_queue’ itself, speeding up commit traversal workflows and simplifying callers.
- The ’reprepare()’ callback for object database sources has been generalized into a ’prepare()’ callback with an optional flush cache flag, and a new ’odb_prepare()’ wrapper has been introduced to allow pre-opening object database sources.
- The ’whence’ field in ’struct object_info’ has been removed. The backend-specific object information retrieval has been refactored into an opt-in ’struct object_info_source’ structure.
- A racy build failure under Meson has been corrected by ensuring that the generated header file ’hook-list.h’ is built before compiling files in ’builtin_sources’ that depend on it.
- The repository discovery and repository configuration phases, which were previously intertwined in ’setup.c’, have been split. Repository discovery has been updated to populate a ’struct repo_discovery’ without modifying the repository state, which is then taken by repository configuration to initialize the repository, paving the way for clean unification of repository configuration.
- The ’SubmittingPatches’ document has been updated to explicitly describe the expectation for contributors to retract or abandon their patch series when they are no longer pursuing it.
- The contributor guide has been updated to advise new contributors to trim irrelevant quoted text when replying to review comments, matching the existing advice given to reviewers.
- The build system has been updated to support building universal macOS binaries when ’Rust’ is enabled, by compiling separate static archives for each target triple listed in ’RUST_TARGETS’ and combining them using the macOS ’lipo’ tool. The ’git-credential-osxkeychain’ helper has been updated to link against ’$(RUST_LIB)’ when ’Rust’ is enabled.
- The test suite has been updated to use the ’test_grep’ helper instead of bare ’grep’ for test assertions, allowing file contents to be printed on failure for easier debugging. A new ’greplint’ linter has been introduced to detect and prevent new bare ’grep’ assertions from being added to the test suite.
- The pipelines in ’t1410-reflog.sh’ have been replaced with the ’test_stdout_line_count’ helper to avoid suppressing the exit code of ’git’ commands, ensuring failures are not hidden from the test suite.
- The cache-scanning loop in ’next_cache_entry()’ has been optimized to avoid rescanning already-unpacked index entries, preventing a quadratic performance slow-down when diffing the working tree against a commit with a pathspec matching early index entries.
- The global configuration variable ’ignore_case’ (representing the ’core.ignorecase’ configuration) has been migrated into ’struct repo_config_values’ to tie it to a specific repository instance.
- The performance of ref updates and reads using the ’reftable’ backend in the presence of many deletion tombstone records has been optimized by removing the tombstone suppression flag from the merged iterator and instead skipping tombstones at higher-level call sites where iteration bounds are known.
- Various code paths have been hardened against potential NULL-pointer dereferences and invalid file descriptor accesses flagged by Coverity.
- The in-tree ’b4’ cover letter template has been updated to include the ’change-id’ trailer, ensuring that sent tags generated by ’b4’ contain the required tracking information for subsequent runs.
- ’git receive-pack’ has been refactored to use ODB transaction interfaces instead of directly managing ’tmp_objdir’ for staging incoming objects, bringing it closer to being ODB backend agnostic.
- The test script ’t/t9811-git-p4-label-import.sh’ has been modernized to use ’test_path_is_file’ and ’test_path_is_missing’ instead of raw ’test -f’ and ’! test -f’ calls.
- A redundant strbuf_reset() call in the ’HAVE_GETDELIM’ path of strbuf_getwholeline() has been removed, as getdelim() overwrites the buffer and the length is updated afterward.
- The object database enumeration interface odb_for_each_object() has been taught to accept object filters, allowing the underlying backends to optimize the traversal by using reachability bitmaps when available. ’git cat-file --batch-all-objects’ has been updated to use this generic interface, simplifying its code and avoiding direct access to ODB backend internals.
- The test script ’t/t1100-commit-tree-options.sh’ has been modernized by converting test cases to the modern style (using single quotes and tab indentation) and moving the creation of the expected file inside the setup test so it runs under the protection of the test harness.
- The test script ’t/t7614-merge-signoff.sh’ has been updated to avoid suppressing the exit code of ’git’ commands in a pipe.
- The ’git rev-list --no-walk’ command has been corrected to restore pathspec filtering, which was lost when the streaming walk was refactored.
- The ref subsystem and the worktree API have been refactored to pass a repository pointer down the call chain, allowing them to drop references to the global ’the_repository’ variable. As part of this, the handling of the ’core.packedRefsTimeout’ configuration has been moved into the per-repository ref store structure.
- ’git branch --contains’ and ’git for-each-ref --contains’ have been optimized to use the memoized commit traversal previously used only by ’git tag --contains’, significantly speeding up connectivity checks across many candidate refs with shared history.
- The passing of push destination specifications in the ’remote-curl’ helper has been simplified by removing the explicit ’count’ parameter and relying on the NULL-termination of the array.
- The dependency on the global ’the_repository’ variable in the ’refspec.c’ API has been removed by passing the hash algorithm explicitly to refspec-parsing functions and storing it in ’struct refspec’.
- The enumeration of untracked and ignored files in ’git status’ has been optimized by avoiding quadratic complexity when inserting into string lists, reducing the construction cost from O(n^2) to O(n log n).
- The copy_file() and copy_file_with_time() functions have been refactored to take a repository parameter, allowing the removal of the implicit dependency on the global ’the_repository’ variable in ’copy.c’.
- The tempfile and lockfile APIs have been refactored to stop depending on the ’the_repository’ global variable, and their callers have been updated to use the repository-aware variants.
- The ’trust_executable_bit’ (coming from the ’core.filemode’ configuration) has been migrated into ’struct repo_config_values’ to tie it to a specific repository instance.
- The ’excludes_file’ and various other global configuration variables (including ’editor_program’, ’pager_program’, ’askpass_program’, and ’push_default’) have been migrated into the per-repository structure.
- The ’git stash push’ command has been optimized to avoid unnecessary sparse index expansion when pathspecs are wholly inside the sparse-checkout cone. Also, a potential out-of-bounds read in the sparse-index expansion check helper pathspec_needs_expanded_index() has been fixed by consistently using the parsed, prefixed path.
- The logic to write loose objects has been refactored and moved from ’object-file.c’ to the loose backend source file ’odb/source-loose.c’, making the loose backend more self-contained. This is achieved by first refactoring force_object_loose() to use generic ODB write interfaces instead of loose-backend internals.
- Object database housekeeping in ’git gc’ and ’git maintenance’ has been refactored to be pluggable. The files-backend-specific logic, including incremental and geometric repacking as well as object pruning, has been moved out of the command implementation and into the files object database source, enabling future alternative object database backends to implement their own housekeeping services.
- The image version used by the static-analysis CI job has been bumped to ubuntu-latest (Ubuntu 24.04), which brings in a newer Coccinelle version that resolves a severe performance regression. A false positive warning from the ’CHECK_ASSERTION_SIDE_EFFECTS’ build with GCC 15 in the Bloom filter code has also been silenced to facilitate the image upgrade.
- The alias tests in ’t/t0014-alias.sh’ have been updated to dynamically query the list of deprecated commands using ’git --list-cmds=deprecated’ to avoid test failures when running with ’WITH_BREAKING_CHANGES’ in a build directory that contains stale executables of formerly deprecated commands.
- The code path that deals with relative paths in the diff-lib has been cleaned up.
- The get_commit_action() function has been refactored to be a pure predicate by moving the side-effecting line-level log range folding to simplify_commit(). This ensures that evaluating a commit’s action before the walk reaches it does not prematurely mutate its tracked line ranges, making it safer for potential lookahead evaluations.
- Synopsis and options in the documentation for ’git format-patch’, ’git imap-send’, ’git send-email’, and ’git request-pull’ have been updated to the modern style.
- A new test helper commit_body() has been introduced to print the message body of a commit, and various tests have been updated to use it instead of spelling out the command pipeline manually and losing the exit status of the ’git cat-file’ command on the upstream of the pipe.
- Tests for ’git merge-base --is-ancestor’ have been added to cover exit codes (0 for success, 1 for non-ancestor, 128 for errors) and to ensure it cannot be combined with '--all’.
- The ’TRACE2_ANCESTRY’ prerequisite in the ’t0213’ test script has been refined to avoid failures under user-mode emulation by verifying that the ancestry collector reports the expected process names rather than the emulator binary name.
- Concurrent downloads of packfiles via packfile URIs and dumb HTTP are safer by avoiding concurrent appends to the staging file. Opening in read-write mode with separate file offsets prevents corruption and preserves resumability. ’fetch-pack’ now tolerates pre-existing ’.keep’ files.
- The ’ssh-agent’ tests in ’t7528’ have been fixed to work when the user’s login shell is csh-like, by explicitly passing ’-s’ to ’ssh-agent’ to force Bourne shell syntax.
- A compatibility wrapper for writev(3p) has been reintroduced, including fixes for CMake build and ’MAX_IO_SIZE’ limits on NonStop. Calls to write(3p) in send_sideband() and cat_blob() have been refactored to use writev(3p) wrappers to reduce syscall overhead.
- The creation of the on-disk data structures for the object database has been made pluggable, allowing future backends to customize their setup. As part of this, the initialization of the object database has been deferred, and the loading of the loose-object map has been detangled from repository initialization.
- The ’struct odb_read_stream’ and ’struct odb_write_stream’ structures have been consolidated into a single unified ’struct odb_stream’ structure, simplifying object database streaming APIs and enabling streaming of arbitrary object types.
- The sequencer has been updated to release the object database before spawning ’git commit’. This prevents open file handles from blocking auto-maintenance tasks, such as repacking, on systems like Windows where open files cannot be easily unlinked.
- The merge-base computation has been optimized by stopping the walk early when one side’s exclusive commits in the queue are exhausted, yielding significant speedups for queries with one-sided histories.
- A handful of code paths have been corrected to check return values from functions like curl_easy_duphandle(), deflateInit(), lseek(), dup(), and strbuf_getline_lf(), resolving several Coverity warnings about unchecked returns.
- The setting of a now-unused member ’.pretty_given’ in the sequencer machinery has been removed.
- The performance of adding numerous new packfiles has been improved by introducing a fast path for known-new packfiles to skip an unnecessary traversal in packfile_list_append(), avoiding a quadratic complexity regression on load.
- The unused name parameter in ’struct chdir_notify_entry’ has been removed from chdir_notify_register(), chdir_notify_unregister(), and related callback signatures across several subsystems, simplifying the API now that trace output no longer uses it.
- A heap-use-after-free bug in the object name parsing code when reporting failures with a relative path to a sparse directory has been corrected.
- The object database (odb) API has been refactored to distinguish between missing objects and corrupt ones by returning more descriptive error statuses. Both the packed and loose backends now faithfully propagate error details using a generic strbuf error mechanism, removing backend-specific leakage from central lookup paths.
- The object database layer has been simplified by eagerly loading alternate object directories upon initialization, instead of deferring it to the first object lookup. This eliminates the need for scattered lazy-loading calls throughout the codebase and paves the way for integrating alternates with the pluggable backends.
- The threshold for geometric repacking to trigger based on loose object count has been adjusted to match that of ’git gc --auto’, preventing over-aggressive repacking during concurrent writes.
- The ’git receive-pack’ command has been updated to use a new ODB transaction interface for writing incoming packfiles, making it more backend-agnostic.
- The mechanism to generate a packfile corresponding to the result of a fetch/push has been made pluggable through a set of object database callback functions, removing hardcoded references to ’pack-objects’ and enabling alternative ODBs to serve packfiles themselves.
- The pack-objects command has been updated to record the total bytes written to pack files in trace2 output, allowing performance analysis of different compression settings by comparing the resulting pack sizes.
- The global variable ’fetch_if_missing’ has been moved to a member in ’struct repository’, continuing the libification process and allowing per-repository control (such as for submodules).
- The reftable code has been optimized to avoid an unnecessary stat/reload of the stack when an addition already holds the list_file lock, reducing the number of newfstatat syscalls from linear to constant when writing refs.
- The application of the edited patch in ’git add -e’ has been refactored to use the internal apply API directly, avoiding the need to spawn a ’git apply’ subprocess.
- The memory ownership of argv elements passed to the revision machinery has been made more robust by keeping logically "freed" elements alive until the rev_info struct is released, preventing use-after-free bugs when options store references to them.
- The object lookup machinery has been taught to gracefully recover when a multi-pack-index points to an owning pack that was removed during a concurrent geometric repack, and ’git replay’ has been fixed to not segfault when reading such missing objects.
- A collection of patches from Git for Windows has been upstreamed, mostly focusing on simplifying and robustifying build configurations for MinGW/MSYS2, dropping obsolete compatibility options, and allowing the main ’git.exe’ to be used directly without the extra wrapper process on Windows.
- The process of downloading packfile URIs in protocol v2 has been instrumented with a Trace2 region. This visibility allows tracking the cumulative time spent downloading external packs and the number of advertised URIs without emitting a separate event per pack.
- CGI helper scripts used by HTTP-related test scripts have been updated to use atomic filesystem operations, preventing race conditions when Apache handles concurrent requests.
- "git maintenance" triggered "rerere gc" in unappropriate times and interfered with "git rebase" etc. too much. The conditions "rerere gc" gets triggered have been tweaked.
- Windows build switches from MINGW64 to URCR64 runtime starting Git 2.56.0; switch the cmake based build at the same time.
- The mechanism to register in-memory alternate object sources has been removed, as submodule object databases are now accessed natively via their own repository structures. This simplifies object database management and prepares the codebase for migrating alternate tracking into the files backend.
- The consistency checks for the object database (fsck) have been decoupled from the generic builtin implementation and moved into the backend-specific object source layers, making them pluggable for different object storage formats.
- When cross-compiling with Cargo, the output artifact is placed in a target-specific subdirectory, which causes the build system to fail to locate it. The build system has been updated to respect the ’CARGO_BUILD_TARGET’ environment variable.
Fixes since v2.55 -----------------
- A regression in the error diagnosis code for invalid .git files has been fixed, avoiding a potential NULL-pointer crash when reporting that a .git file does not point to a valid repository. (merge 54a441bcea jk/setup-gitfile-diag-fix later to maint).
- Support for hashing loose or packed objects larger than 4GB on Windows and other LLP64 platforms has been improved by converting object header buffers and data-handling functions from ’unsigned long’ to ’size_t’. (merge d99e13d0be po/hash-object-size-t later to maint).
- The display of the rebase todo list in "git status" has been improved to correctly abbreviate object IDs for more commands and avoid misinterpreting refs as object IDs. (merge 6f34e5f9e3 pw/status-rebase-todo later to maint).
- Reference backend configuration has been updated to load lazily to avoid recursive calls during repository initialization when ’onbranch’ configuration conditions are evaluated. This has also fixed a memory leak and allowed the unused
chdir_notify_reparent()machinery to be dropped. (merge d6522d01df ps/refs-onbranch-fixes later to maint).
- The connectivity check has been refactored to search for promisor objects in a generic way using the object database interface, rather than iterating packfiles directly. This allows connectivity checks to work properly in repositories that do not use packfiles. (merge 66ee9cb930 ps/connected-generic-promisor-checks later to maint).
- A test checking interactions between git rebase --quit and autostash in t3420-rebase-autostash.sh has been corrected to use test_path_is_missing instead of ! grep on a file that shouldn’t exist in the conflicted state. (merge eaad121fef sg/t3420-do-not-grep-in-missing-file later to maint).
- The GPG and SSH signature parsing code has been corrected to strip carriage return characters only when they immediately precede line feeds, instead of unconditionally stripping all carriage returns. (merge 5dea8b690b ad/gpg-strip-cr-before-lf later to maint).
- A memory leak in the ’reftable_writer_new()’ initialization function has been fixed by delaying the allocation of ’struct reftable_writer’ until after input options are validated. (merge c6fb3b9c3e jk/reftable-leakfix later to maint).
- A memory leak in the '--base’ handling of ’git format-patch’ has been plugged, and the leak reporting of the test suite when running under a TAP harness has been improved. (merge 973a0373ff jk/format-patch-leakfix later to maint).
- A write file stream resource leak has been fixed as part of a code cleanup. (merge ebb4d2ffa3 jc/history-message-prep-fix later to maint).
- Various memory leaks in the Bloom-filter code paths that are exposed when running tests with the ’GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=1’ environment variable have been plugged. (merge 459088ec2e jk/bloom-leak-fixes later to maint).
- The wincred credential helper has been updated to avoid memory corruption when erasing credentials and to prevent silent credential loss when storing OAuth tokens, by correcting buffer allocations and arguments passed to safe-CRT APIs. (merge f635ab9ab4 js/wincred-fixes later to maint).
- Various code paths that initialize a cryptographic hash context but bail out or finish without calling ’git_hash_final()’ have been taught to call ’git_hash_discard()’ to release allocated resources, fixing memory leaks when Git is built with non-default backends like ’OpenSSL’ or ’libgcrypt’. (merge 600588d2aa jk/hash-algo-leak-fixes later to maint).
- Various resource leaks, invalid file descriptor closures, and process handle ownership issues flagged by Coverity have been fixed. (merge 9184231173 js/coverity-fixes later to maint).
- Dockerized CI jobs running in private GitHub repositories have been adjusted to use explicit process and file limits, preventing resource exhaustion errors on private runners. (merge bad766fbac js/ci-dockerized-pid-limit later to maint).
- Various test scripts have been updated to clean up large temporary files and repositories, reducing peak disk usage during testing. Also, expensive tests have been disabled on platforms that lack sufficient resources (like 32-bit platforms and Windows CI runners), and the long test suite has been enabled in GitLab CI. (merge 84248444ad ps/t-fixes-for-git-test-long later to maint).
- The UTF-8 precomposition wrapper on macOS has been updated to use a flexible array member to represent the name of a directory entry, preventing fortified libc checks from failing when the name is reallocated to be larger than ’NAME_MAX’ bytes. (merge 1eb281159f ih/precompose-flex-array later to maint).
- The ’git_hash_*()’ wrappers have been updated to be used consistently across the codebase instead of direct calls to members of ’struct git_hash_algo’, and ’git_hash_discard()’ has been made idempotent to simplify cleanups. (merge 9e396aa553 jk/git-hash-cleanups later to maint).
- The sideband demultiplexer has been updated to recognize ANSI SGR escape sequences that use colon-separated subfields (e.g., for 256-color or true-color codes). (merge 3792b2aea4 mm/sideband-ansi-sgr-colon-fix later to maint).
- The ’reftable’ code has been hardened against corrupted tables by fixing out-of-bounds writes, out-of-bounds reads, and abort calls during parsing. (merge ca93c27328 ps/reftable-hardening later to maint).
- A description in the release notes for Git 2.55.0 has been retroactively updated to clarify that Rust support is enabled by default, but still optional, and will become mandatory in Git 3.0. (merge 18b2009d14 jc/relnotes-2.55-rust-fix later to maint).
- The early-exit optimization in ’paint_down_to_common()’ has been gated on the queue being generation-ordered, fixing a bug where ’git merge-base’ (without '--all’) could return incorrect results on repositories with v1 commit graphs and clock skew. (merge ae68032a8d kk/commit-reach-find-all-fix later to maint).
- The client-side parser of the server-advertised bundle-URI list has been updated to drain the remaining response in order to avoid protocol desynchronization when the server sends a misconfigured list. Also, the server-side has been taught to omit empty configuration values instead of sending invalid key-value lines. (merge 50de1169e4 tc/bundle-uri-empty-fix later to maint).
- The ’topo_levels’ slab was propagated only to the topmost layer of a split commit-graph chain, causing topological levels for commits in base layers to be recomputed during incremental writes. This has been corrected.
- The stream-based object signature verification path has been corrected to avoid double-closing the stream on read errors. (merge cfd52a74a0 ps/odb-stream-double-close-fix later to maint).
- The ’-i’ shorthand for the '--init’ option, which was accepted by the ’git submodule update’ command until it was broken in a modernization of the option-parsing code, has been restored. (merge ff1da37f58 dm/submodule-update-i-shorthand later to maint).
- An accidental use of the ’%zu’ format specifier in ’git submodule—helper’ has been corrected to use ’PRIuMAX’ and cast the value to ’uintmax_t’ to avoid portability issues. (merge 3279c13c00 jc/submodule-helper-avoid-zu later to maint).
- The rebase post-rewrite notes-copying logic has been corrected. When a commit is dropped during rebase (e.g., because its changes are already upstream), it is no longer recorded as rewritten, preventing its notes from being copied to an unrelated commit. (merge 42554b78fd pw/rebase-drop-notes-with-commit later to maint).
- A few memory problems in the Rust interface to C hash functions have been corrected. The ’Clone’ implementation of ’CryptoHasher’ now properly initializes the context before cloning, and its ’Drop’ implementation now discards the context to prevent leaks.
- The object ID shortening and linking in the ’commitdiff’ view of ’gitweb’ has been corrected to work even when the index line carries a trailing file mode. (merge fda513d6fe tl/gitweb-shorten-hashes-with-modes later to maint).
- When the push remote is specified as a URL, the fetch refspec of a uniquely matching configured remote is now used to find and update the remote-tracking branch (e.g., ’@{push}’).
- Traversals with '--exclude-first-parent-only’ have been corrected to properly stop after the first parent even when it has already been marked as ’SEEN’. (merge 47382f7398 jc/exclude-first-parent-seen later to maint).
- A segfault when ’git clone --revision’ talks to a server that does not support protocol v2 (falling back to protocol v0) has been corrected. (merge 1034ad383f af/clone-revision-v0-segfault-fix later to maint).
- rewrites_release() in ’remote.c’ has been updated to free ’struct rewrite’ instances, their ’.instead_of’ arrays, and their contents. (merge dcef3bf041 jc/remote-insteadof-leakfix later to maint).
- The remote-matching logic for submodules has been corrected to resolve ’url.*.insteadOf’ aliases before comparing the inventoried URL from ’.gitmodules’ with the URLs of configured remotes.
- ’git diff --relative’ running with '--cached’ has been corrected to avoid a segfault when encountering unmerged paths outside the prefix. (merge 447126ed7d jk/diff-relative-cached-unmerged later to maint).
- Two bugs in how ’git rebase’ handles skipped ’fixup’ and ’squash’ commands have been fixed. One bug caused an incorrect commit count to be shown in the template message when multiple commands were skipped, and another prevented the editor from opening when the final command in a chain containing ’fixup -c’ was skipped.
- Git for Windows has been updated to avoid auto-detecting the symlink type if the target path starts with a slash, preventing NTLM credential leaks when checking out repositories with crafted symbolic links pointing to network shares.
- ’git cat-file --batch-command’ that asked for ’contents’ without ’type’ segfaults, which has been corrected. (merge 2abc7f0304 jk/cat-file-batch-wo-type-fix later to maint).
- A memory leak in ’git merge’ when run without arguments (which triggers the default-to-upstream path) has been fixed. A test has been added to cover this case. (merge 68cce04a02 tc/merge-default-to-upstream-leakfix later to maint).
- A boundary case check in reachability bitmap traversal has been corrected to properly handle the object at position zero, which was previously skipped, leading to redundant bitmap loading. (merge b56b48301e dl/pack-bitmap-position-zero later to maint).
- A crash in the ’sparse-index’ collapse code when encountering an invalidated cache-tree node (due to an intent-to-add path) has been fixed by avoiding collapsing such subtrees. (merge eede1e69fe ds/sparse-index-ita-crash later to maint).
- Documentation for ’git replay’ has been updated to refer to its configuration variables. (merge 48c0549f5c kh/doc-replay-config later to maint).
- Documentation for ’git interpret-trailers’ has been updated to explain the format of trailer keys (alphanumeric characters and hyphens), replace outdated terminology, define key terms upfront, and document how comment lines in the input are treated. (merge 4515c86fd9 kh/doc-trailers later to maint).
- The ’pack-objects’ and delta-encoding code paths have been updated to use ’size_t’ instead of ’unsigned long’ for object sizes and offset limits, avoiding potential truncation issues on 64-bit Windows. (merge d50ac11724 js/pack-objects-delta-size-t later to maint).
- A client requesting the promisor-remote capability without a value caused a null pointer dereference, which has been corrected by rejecting a request without an argument. (merge dd6b35ff71 en/serve-promisor-remote-fix later to maint).
- Various tests in ’t7900-maintenance.sh’ have been updated to use a throwaway repository, and auto-detaching of maintenance tasks is now disabled for these tests to fix flaky races with concurrent background maintenance jobs. (merge 2775d8bcd1 ps/t7900-deflake-maintenance later to maint).
- The help text for the ’-l’ option of ’git diff’ has been updated. (merge 764243bdf4 en/diff-l-opt-help later to maint).
- ’git -C <dir> diff fi<TAB>’ did not complete ’file’, which has been corrected. (merge 354d1bf3a0 jc/complete-diff-tracked-paths later to maint).
- ’git -C <dir> checkout fi<TAB>’ did not complete ’file’, which has been corrected. (merge 05e2ab1f31 jc/complete-checkout later to maint).
- The trailer parsing machinery has been updated to avoid mistaking lines that begin with a URL (e.g., ’https://…’) as trailer lines. This prevents intended textual URLs from being mangled or mistakenly treated as metadata keys.
- The instructions for deprecated commands emitted by you_still_use_that() have been reworded to clarify that the removal decision is final and to provide more assertive guidance on finding a replacement. (merge 8ace32221c jc/you-still-use-that later to maint).
- The zsh completion script (in ’contrib/’) has been updated to correctly locate the Git command after global options like ’-C’ by properly skipping them, similar to how the bash completion does.
- The git worktree repair command failed to rewrite the .git file of a working tree from a relative path to an absolute path when the command was run in the working tree itself. The read_gitfile_gently() function was modified to also return whether the path originally recorded in the file was absolute, and this new capability is used to correctly detect such mismatches.
- GitHub Actions CI workflow runs triggered by pull requests have been configured to cancel older runs when a new push is made to the same pull request. (merge a251b1bd21 hn/ci-cancel-stale-pr-runs later to maint).
- The string extraction logic for the branch name and worktree name from the given path in ’git worktree add’ has been corrected and simplified to avoid out-of-bounds reads and improper handling of trailing slashes. (merge 2e8a9d94b0 rs/worktree-add-basename-fixes later to maint).
- The CI job for Debian 11 has been updated to use Debian 12, as the former is now out of the LTS period. (merge 00fa850235 jk/ci-bump-debian-to-12 later to maint).
- The CI script to install dependencies for the documentation build has been updated to install asciidoctor directly via the system package manager instead of pinning to an older version via gem. Additionally, an obsolete variable used for retired Azure Pipelines environments has been removed.
- The error path in ’git submodule—helper’ has been updated to plug a memory leak when a repository handle could not be obtained, leveraging an updated idempotent repo_clear(). (merge 2c03739705 jk/submodule-error-leak later to maint).
- Two members in "struct pathspec_item" were of type "char ", but nobody updated the string through these pointers. They have been made "const char" instead. (merge 88d06b1c91 jc/pathspec-match-const later to maint).
- The gitdatamodel documentation page has been linked from a handful of key documentaiton pages. (merge ec602484bd kh/doc-datamodel later to maint).
- Running "git history" in a corrupt repository can (unsurprisingly) segfault when a necessary tree object is not found, which has been made to die more gracefully. (merge 76621488e8 jc/history-missing-tree-errorfix later to maint).
- The development helper script to lint gitlink references in the documentation has been updated to avoid a newer Perl regular expression syntax that breaks on older Perl versions. (merge 8a631963a9 ta/lint-gitlink-older-perl-fix later to maint).
- The autostash fallback in ’git checkout -m’ has been refined to only retry when there are local changes. Additionally, a blank line now visually separates autostash conflict advice from the subsequent branch-switch message. (merge 2ba77ea828 hn/checkout-m-autostash-refine later to maint).
- The memory leak caused by not unusing the commit buffer returned by repo_logmsg_reencode() during the rewording operation in ’git history’ has been plugged.
- The pathspec matching logic has been updated to avoid out-of-bounds memory accesses when a negative pathspec is shorter than the common prefix of positive pathspecs.
- Other code cleanup, docfix, build fix, etc. (merge 026636128f ss/submittingpatches-typofix later to maint). (merge d2af22cc21 jc/rerere-doc-typofix later to maint). (merge c486c1df72 hk/typofix later to maint).
2.6.0
Git 2.6 Release Notes =====================
Updates since v2.5 ------------------
UI, Workflows & Features
- An asterisk as a substring (as opposed to the entirety) of a path component for both side of a refspec, e.g. "refs/heads/o*:refs/remotes/heads/i*", is now allowed.
- New userdiff pattern definition for fountain screenwriting markup format has been added.
- "git log" and friends learned a new "--date=format:…" option to format timestamps using system’s strftime(3).
- "git fast-import" learned to respond to the get-mark command via its cat-blob-fd interface.
- "git rebase -i" learned "drop commit-object-name subject" command as another way to skip replaying of a commit.
- A new configuration variable can enable "--follow" automatically when "git log" is run with one pathspec argument.
- "git status" learned to show a more detailed information regarding the "rebase -i" session in progress.
- "git cat-file" learned "--batch-all-objects" option to enumerate all available objects in the repository more quickly than "rev-list --all --objects" (the output includes unreachable objects, though).
- "git fsck" learned to ignore errors on a set of known-to-be-bad objects, and also allows the warning levels of various kinds of non-critical breakages to be tweaked.
- "git rebase -i"’s list of todo is made configurable.
- "git send-email" now performs alias-expansion on names that are given via --cccmd, etc.
- An environment variable GIT_REPLACE_REF_BASE tells Git to look into refs hierarchy other than refs/replace/ for the object replacement data.
- Allow untracked cache (experimental) to be used when sparse checkout (experimental) is also in use.
- "git pull --rebase" has been taught to pay attention to rebase.autostash configuration.
- The command-line completion script (in contrib/) has been updated.
- A negative !ref entry in multi-value transfer.hideRefs configuration can be used to say "don’t hide this one".
- After "git am" without "-3" stops, running "git am -3" pays attention to "-3" only for the patch that caused the original invocation to stop.
- When linked worktree is used, simultaneous "notes merge" instances for the same ref in refs/notes/* are prevented from stomping on each other.
- "git send-email" learned a new option --smtp-auth to limit the SMTP AUTH mechanisms to be used to a subset of what the system library supports.
- A new configuration variable http.sslVersion can be used to specify what specific version of SSL/TLS to use to make a connection.
- "git notes merge" can be told with "--strategy=<how>" option how to automatically handle conflicts; this can now be configured by setting notes.mergeStrategy configuration variable.
- "git log --cc" did not show any patch, even though most of the time the user meant "git log --cc -p -m" to see patch output for commits with a single parent, and combined diff for merge commits. The command is taught to DWIM "--cc" (without "--raw" and other forms of output specification) to "--cc -p -m".
- "git config --list" output was hard to parse when values consist of multiple lines. "--name-only" option is added to help this.
- A handful of usability & cosmetic fixes to gitk and l10n updates.
- A completely empty e-mail address <> is now allowed in the authors file used by git-svn, to match the way it accepts the output from authors-prog.
Performance, Internal Implementation, Development Support etc.
- In preparation for allowing different "backends" to store the refs in a way different from the traditional "one ref per file in $GIT_DIR or in a $GIT_DIR/packed-refs file" filesystem storage, direct filesystem access to ref-like things like CHERRY_PICK_HEAD from scripts and programs has been reduced.
- Computation of untracked status indicator by bash prompt script (in contrib/) has been optimized.
- Memory use reduction when commit-slab facility is used to annotate sparsely (which is not recommended in the first place).
- Clean up refs API and make "git clone" less intimate with the implementation detail.
- "git pull" was reimplemented in C.
- The packet tracing machinery allows to capture an incoming pack data to a file for debugging.
- Move machinery to parse human-readable scaled numbers like 1k, 4M, and 2G as an option parameter’s value from pack-objects to parse-options API, to make it available to other codepaths.
- "git verify-tag" and "git verify-commit" have been taught to share more code, and then learned to optionally show the verification message from the underlying GPG implementation.
- Various enhancements around "git am" reading patches generated by foreign SCM have been made.
- Ref listing by "git branch -l" and "git tag -l" commands has started to be rebuilt, based on the for-each-ref machinery.
- The code to perform multi-tree merges has been taught to repopulate the cache-tree upon a successful merge into the index, so that subsequent "diff-index --cached" (hence "status") and "write-tree" (hence "commit") will go faster.
The same logic in "git checkout" may now be removed, but that is a
separate issue.
- Tests that assume how reflogs are represented on the filesystem too much have been corrected.
- "git am" has been rewritten in "C".
- git_path() and mkpath() are handy helper functions but it is easy to misuse, as the callers need to be careful to keep the number of active results below 4. Their uses have been reduced.
- The "lockfile" API has been rebuilt on top of a new "tempfile" API.
- To prepare for allowing a different "ref" backend to be plugged in to the system, update_ref()/delete_ref() have been taught about ref-like things like MERGE_HEAD that are per-worktree (they will always be written to the filesystem inside $GIT_DIR).
- The gitmodules API that is accessed from the C code learned to cache stuff lazily.
Also contains various documentation updates and code clean-ups.
Fixes since v2.5 ----------------
Unless otherwise noted, all the fixes since v2.5 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git subtree" (in contrib/) depended on "git log" output to be stable, which was a no-no. Apply a workaround to force a particular date format. (merge e7aac44 da/subtree-date-confusion later to maint).
- An attempt to delete a ref by pushing into a repository whose HEAD symbolic reference points at an unborn branch that cannot be created due to ref D/F conflict (e.g. refs/heads/a/b exists, HEAD points at refs/heads/a) failed. (merge b112b14 jx/do-not-crash-receive-pack-wo-head later to maint).
- The low-level "git send-pack" did not honor ’user.signingkey’ configuration variable when sending a signed-push. (merge d830d39 db/send-pack-user-signingkey later to maint).
- "sparse checkout" misbehaved for a path that is excluded from the checkout when switching between branches that differ at the path. (merge 7d78241 as/sparse-checkout-removal later to maint).
- An experimental "untracked cache" feature used uname(2) in a slightly unportable way. (merge 100e433 cb/uname-in-untracked later to maint).
- A "rebase" replays changes of the local branch on top of something else, as such they are placed in stage #3 and referred to as "theirs", while the changes in the new base, typically a foreign work, are placed in stage #2 and referred to as "ours". Clarify the "checkout --ours/--theirs". (merge f303016 se/doc-checkout-ours-theirs later to maint).
- The "rev-parse --parseopt" mode parsed the option specification and the argument hint in a strange way to allow ’=’ and other special characters in the option name while forbidding them from the argument hint. This made it impossible to define an option like "--pair <key>=<value>" with "pair=key=value" specification, which instead would have defined a "--pair=key <value>" option. (merge 2d893df ib/scripted-parse-opt-better-hint-string later to maint).
- Often a fast-import stream builds a new commit on top of the previous commit it built, and it often unconditionally emits a "from" command to specify the first parent, which can be omitted in such a case. This caused fast-import to forget the tree of the previous commit and then re-read it from scratch, which was inefficient. Optimize for this common case. (merge 0df3245 mh/fast-import-optimize-current-from later to maint).
- Running an aliased command from a subdirectory when the .git thing in the working tree is a gitfile pointing elsewhere did not work. (merge d95138e nd/export-worktree later to maint).
- "Is this subdirectory a separate repository that should not be touched?" check "git clean" was inefficient. This was replaced with a more optimized check. (merge fbf2fec ee/clean-remove-dirs later to maint).
- The "new-worktree-mode" hack in "checkout" that was added in nd/multiple-work-trees topic has been removed by updating the implementation of new "worktree add". (merge 65f9b75 es/worktree-add-cleanup later to maint).
- Remove remaining cruft from "git checkout --to", which transitioned to "git worktree add". (merge 114ff88 es/worktree-add later to maint).
- An off-by-one error made "git remote" to mishandle a remote with a single letter nickname. (merge bc598c3 mh/get-remote-group-fix later to maint).
- "git clone $URL", when cloning from a site whose sole purpose is to host a single repository (hence, no path after <scheme>://<site>/), tried to use the site name as the new repository name, but did not remove username or password when <site> part was of the form <user>@<pass>:<host>. The code is taught to redact these. (merge adef956 ps/guess-repo-name-at-root later to maint).
- Running tests with the "-x" option to make them verbose had some unpleasant interactions with other features of the test suite. (merge 9b5fe78 jk/test-with-x later to maint).
- t1509 test that requires a dedicated VM environment had some bitrot, which has been corrected. (merge faacc5a ps/t1509-chroot-test-fixup later to maint).
- "git pull" in recent releases of Git has a regression in the code that allows custom path to the --upload-pack=<program>. This has been corrected.
Note that this is irrelevant for 'master' with "git pull" rewritten
in C.
(merge 13e0e28 mm/pull-upload-pack later to maint).
- When trying to see that an object does not exist, a state errno leaked from our "first try to open a packfile with O_NOATIME and then if it fails retry without it" logic on a system that refuses O_NOATIME. This confused us and caused us to die, saying that the packfile is unreadable, when we should have just reported that the object does not exist in that packfile to the caller. (merge dff6f28 cb/open-noatime-clear-errno later to maint).
- The codepath to produce error messages had a hard-coded limit to the size of the message, primarily to avoid memory allocation while calling die(). (merge f4c3edc jk/long-error-messages later to maint).
- strbuf_read() used to have one extra iteration (and an unnecessary strbuf_grow() of 8kB), which was eliminated. (merge 3ebbd00 jh/strbuf-read-use-read-in-full later to maint).
- We rewrote one of the build scripts in Perl but this reimplements in Bourne shell. (merge 57cee8a sg/help-group later to maint).
- The experimental untracked-cache feature were buggy when paths with a few levels of subdirectories are involved. (merge 73f9145 dt/untracked-subdir later to maint).
- "interpret-trailers" helper mistook a single-liner log message that has a colon as the end of existing trailer.
- The "interpret-trailers" helper mistook a multi-paragraph title of a commit log message with a colon in it as the end of the trailer block. (merge 5c99995 cc/trailers-corner-case-fix later to maint).
- "git describe" without argument defaulted to describe the HEAD commit, but "git describe --contains" didn’t. Arguably, in a repository used for active development, such defaulting would not be very useful as the tip of branch is typically not tagged, but it is better to be consistent. (merge 2bd0706 sg/describe-contains later to maint).
- The client side codepaths in "git push" have been cleaned up and the user can request to perform an optional "signed push", i.e. sign only when the other end accepts signed push. (merge 68c757f db/push-sign-if-asked later to maint).
- Because the configuration system does not allow "alias.0foo" and "pager.0foo" as the configuration key, the user cannot use ’0foo’ as a custom command name anyway, but "git 0foo" tried to look these keys up and emitted useless warnings before saying ’0foo is not a git command’. These warning messages have been squelched. (merge 9e9de18 jk/fix-alias-pager-config-key-warnings later to maint).
- "git rev-list" does not take "--notes" option, but did not complain when one is given. (merge 2aea7a5 jk/rev-list-has-no-notes later to maint).
- When re-priming the cache-tree opportunistically while committing the in-core index as-is, we mistakenly invalidated the in-core index too aggressively, causing the experimental split-index code to unnecessarily rewrite the on-disk index file(s). (merge 475a344 dt/commit-preserve-base-index-upon-opportunistic-cache-tree-update later to maint).
- "git archive" did not use zip64 extension when creating an archive with more than 64k entries, which nobody should need, right ;-)? (merge 88329ca rs/archive-zip-many later to maint).
- The code in "multiple-worktree" support that attempted to recover from an inconsistent state updated an incorrect file. (merge 82fde87 nd/fixup-linked-gitdir later to maint).
- On case insensitive systems, "git p4" did not work well with client specs.
- "git init empty && git -C empty log" said "bad default revision ’HEAD’", which was found to be a bit confusing to new users. (merge ce11360 jk/log-missing-default-HEAD later to maint).
- Recent versions of scripted "git am" has a performance regression in "git am --skip" codepath, which no longer exists in the built-in version on the ’master’ front. Fix the regression in the last scripted version that appear in 2.5.x maintenance track and older. (merge b9d6689 js/maint-am-skip-performance-regression later to maint).
- The branch descriptions that are set with "git branch --edit-description" option were used in many places but they weren’t clearly documented. (merge 561d2b7 po/doc-branch-desc later to maint).
- Code cleanups and documentation updates. (merge 1c601af es/doc-clean-outdated-tools later to maint). (merge 3581304 kn/tag-doc-fix later to maint). (merge 3a59e59 kb/i18n-doc later to maint). (merge 45abdee sb/remove-unused-var-from-builtin-add later to maint). (merge 14691e3 sb/parse-options-codeformat later to maint). (merge 4a6ada3 ad/bisect-cleanup later to maint). (merge da4c5ad ta/docfix-index-format-tech later to maint). (merge ae25fd3 sb/check-return-from-read-ref later to maint). (merge b3325df nd/dwim-wildcards-as-pathspecs later to maint). (merge 7aa9b9b sg/wt-status-header-inclusion later to maint). (merge f04c690 as/docfix-reflog-expire-unreachable later to maint). (merge 1269847 sg/t3020-typofix later to maint). (merge 8b54c23 jc/calloc-pathspec later to maint). (merge a6926b8 po/po-readme later to maint). (merge 54d160e ss/fix-config-fd-leak later to maint). (merge b80fa84 ah/submodule-typofix-in-error later to maint). (merge 99885bc ah/reflog-typofix-in-error later to maint). (merge 9476c2c ah/read-tree-usage-string later to maint). (merge b8c1d27 ah/pack-objects-usage-strings later to maint). (merge 486e1e1 br/svn-doc-include-paths-config later to maint). (merge 1733ed3 ee/clean-test-fixes later to maint). (merge 5fcadc3 gb/apply-comment-typofix later to maint). (merge b894d3e mp/t7060-diff-index-test later to maint). (merge d238710 as/config-doc-markup-fix later to maint).
2.6.1
Git v2.6.1 Release Notes ========================
Fixes since v2.6 ----------------
- xdiff code we use to generate diffs is not prepared to handle extremely large files. It uses "int" in many places, which can overflow if we have a very large number of lines or even bytes in our input files, for example. Cap the input size to somewhere around 1GB for now.
- Some protocols (like git-remote-ext) can execute arbitrary code found in the URL. The URLs that submodules use may come from arbitrary sources (e.g., .gitmodules files in a remote repository), and can hurt those who blindly enable recursive fetch. Restrict the allowed protocols to well known and safe ones.
2.6.2
Git v2.6.2 Release Notes ========================
Fixes since v2.6.1 ------------------
- There were some classes of errors that "git fsck" diagnosed to its standard error that did not cause it to exit with non-zero status.
- A test script for the HTTP service had a timing dependent bug, which was fixed.
- Performance-measurement tests did not work without an installed Git.
- On a case insensitive filesystems, setting GIT_WORK_TREE variable using a random cases that does not agree with what the filesystem thinks confused Git that it wasn’t inside the working tree.
- When "git am" was rewritten as a built-in, it stopped paying attention to user.signingkey, which was fixed.
- After "git checkout --detach", "git status" reported a fairly useless "HEAD detached at HEAD", instead of saying at which exact commit.
- "git rebase -i" had a minor regression recently, which stopped considering a line that begins with an indented ’#’ in its insn sheet not a comment, which is now fixed.
- Description of the "log.follow" configuration variable in "git log" documentation is now also copied to "git config" documentation.
- The way how --ref/--notes to specify the notes tree reference are DWIMmed was not clearly documented.
- Customization to change the behaviour with "make -w" and "make -s" in our Makefile was broken when they were used together.
- The Makefile always runs the library archiver with hardcoded "crs" options, which was inconvenient for exotic platforms on which people want to use programs with totally different set of command line options.
- The ssh transport, just like any other transport over the network, did not clear GIT_* environment variables, but it is possible to use SendEnv and AcceptEnv to leak them to the remote invocation of Git, which is not a good idea at all. Explicitly clear them just like we do for the local transport.
- "git blame --first-parent v1.0..v2.0" was not rejected but did not limit the blame to commits on the first parent chain.
- Very small number of options take a parameter that is optional (which is not a great UI element as they can only appear at the end of the command line). Add notice to documentation of each and every one of them.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.6.3
Git v2.6.3 Release Notes ========================
Fixes since v2.6.2 ------------------
- The error message from "git blame --contents --reverse" incorrectly talked about "--contents --children".
- "git merge-file" tried to signal how many conflicts it found, which obviously would not work well when there are too many of them.
- The name-hash subsystem that is used to cope with case insensitive filesystems keeps track of directories and their on-filesystem cases for all the paths in the index by holding a pointer to a randomly chosen cache entry that is inside the directory (for its ce→ce_name component). This pointer was not updated even when the cache entry was removed from the index, leading to use after free. This was fixed by recording the path for each directory instead of borrowing cache entries and restructuring the API somewhat.
- When the "git am" command was reimplemented in C, "git am -3" had a small regression where it is aborted in its error handling codepath when underlying merge-recursive failed in some ways.
- The synopsis text and the usage string of subcommands that read list of things from the standard input are often shown as if they only take input from a file on a filesystem, which was misleading.
- A couple of commands still showed "[options]" in their usage string to note where options should come on their command line, but we spell that "[<options>]" in most places these days.
- The submodule code has been taught to work better with separate work trees created via "git worktree add".
- When "git gc --auto" is backgrounded, its diagnosis message is lost. It now is saved to a file in $GIT_DIR and is shown next time the "gc --auto" is run.
- Work around "git p4" failing when the P4 depot records the contents in UTF-16 without UTF-16 BOM.
- Recent update to "rebase -i" that tries to sanity check the edited insn sheet before it uses it has become too picky on Windows where CRLF left by the editor is turned into a trailing CR on the line read via the "read" built-in command.
- "git clone --dissociate" runs a big "git repack" process at the end, and it helps to close file descriptors that are open on the packs and their idx files before doing so on filesystems that cannot remove a file that is still open.
- Correct "git p4 --detect-labels" so that it does not fail to create a tag that points at a commit that is also being imported.
- The internal stripspace() function has been moved to where it logically belongs to, i.e. strbuf API, and the command line parser of "git stripspace" has been updated to use the parse_options API.
- Prepare for Git on-disk repository representation to undergo backward incompatible changes by introducing a new repository format version "1", with an extension mechanism.
- "git gc" used to barf when a symbolic ref has gone dangling (e.g. the branch that used to be your upstream’s default when you cloned from it is now gone, and you did "fetch --prune").
- The normalize_ceiling_entry() function does not muck with the end of the path it accepts, and the real world callers do rely on that, but a test insisted that the function drops a trailing slash.
- "git gc" is safe to run anytime only because it has the built-in grace period to protect young objects. In order to run with no grace period, the user must make sure that the repository is quiescent.
- A recent "filter-branch --msg-filter" broke skipping of the commit object header, which is fixed.
- "git --literal-pathspecs add -u/-A" without any command line argument misbehaved ever since Git 2.0.
- Merging a branch that removes a path and another that changes the mode bits on the same path should have conflicted at the path, but it didn’t and silently favoured the removal.
- "git imap-send" did not compile well with older version of cURL library.
- The linkage order of libraries was wrong in places around libcurl.
- It was not possible to use a repository-lookalike created by "git worktree add" as a local source of "git clone".
- When "git send-email" wanted to talk over Net::SMTP::SSL, Net::Cmd::datasend() did not like to be fed too many bytes at the same time and failed to send messages. Send the payload one line at a time to work around the problem.
- We peek objects from submodule’s object store by linking it to the list of alternate object databases, but the code to do so forgot to correctly initialize the list.
- "git status --branch --short" accessed beyond the constant string "HEAD", which has been corrected.
- "git daemon" uses "run_command()" without "finish_command()", so it needs to release resources itself, which it forgot to do.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.6.4
Git v2.6.4 Release Notes ========================
Fixes since v2.6.3 ------------------
- The "configure" script did not test for -lpthread correctly, which upset some linkers.
- Add support for talking http/https over socks proxy.
- Portability fix for Windows, which may rewrite $SHELL variable using non-POSIX paths.
- We now consistently allow all hooks to ignore their standard input, rather than having git complain of SIGPIPE.
- Fix shell quoting in contrib script.
- Test portability fix for a topic in v2.6.1.
- Allow tilde-expansion in some http config variables.
- Give a useful special case "diff/show --word-diff-regex=." as an example in the documentation.
- Fix for a corner case in filter-branch.
- Make git-p4 work on a detached head.
- Documentation clarification for "check-ignore" without "--verbose".
- Just like the working tree is cleaned up when the user cancelled submission in P4Submit.applyCommit(), clean up the mess if "p4 submit" fails.
- Having a leftover .idx file without corresponding .pack file in the repository hurts performance; "git gc" learned to prune them.
- The code to prepare the working tree side of temporary directory for the "dir-diff" feature forgot that symbolic links need not be copied (or symlinked) to the temporary area, as the code already special cases and overwrites them. Besides, it was wrong to try computing the object name of the target of symbolic link, which may not even exist or may be a directory.
- There was no way to defeat a configured rebase.autostash variable from the command line, as "git rebase --no-autostash" was missing.
- Allow "git interpret-trailers" to run outside of a Git repository.
- Produce correct "dirty" marker for shell prompts, even when we are on an orphan or an unborn branch.
- Some corner cases have been fixed in string-matching done in "git status".
- Apple’s common crypto implementation of SHA1_Update() does not take more than 4GB at a time, and we now have a compile-time workaround for it.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.6.5
Git v2.6.5 Release Notes ========================
Fixes since v2.6.4 ------------------
- Because "test_when_finished" in our test framework queues the clean-up tasks to be done in a shell variable, it should not be used inside a subshell. Add a mechanism to allow ’bash’ to catch such uses, and fix the ones that were found.
- Update "git subtree" (in contrib/) so that it can take whitespaces in the pathnames, not only in the in-tree pathname but the name of the directory that the repository is in.
- Cosmetic improvement to lock-file error messages.
- mark_tree_uninteresting() has code to handle the case where it gets passed a NULL pointer in its ’tree’ parameter, but the function had ’object = &tree→object’ assignment before checking if tree is NULL. This gives a compiler an excuse to declare that tree will never be NULL and apply a wrong optimization. Avoid it.
- The helper used to iterate over loose object directories to prune stale objects did not closedir() immediately when it is done with a directory—a callback such as the one used for "git prune" may want to do rmdir(), but it would fail on open directory on platforms such as WinXP.
- "git p4" used to import Perforce CLs that touch only paths outside the client spec as empty commits. It has been corrected to ignore them instead, with a new configuration git-p4.keepEmptyCommits as a backward compatibility knob.
- The exit code of git-fsck did not reflect some types of errors found in packed objects, which has been corrected.
- The completion script (in contrib/) used to list "git column" (which is not an end-user facing command) as one of the choices
- Improve error reporting when SMTP TLS fails.
- When getpwuid() on the system returned NULL (e.g. the user is not in the /etc/passwd file or other uid-to-name mappings), the codepath to find who the user is to record it in the reflog barfed and died. Loosen the check in this codepath, which already accepts questionable ident string (e.g. host part of the e-mail address is obviously bogus), and in general when we operate fmt_ident() function in non-strict mode.
- "git symbolic-ref" forgot to report a failure with its exit status.
- History traversal with "git log --source" that starts with an annotated tag failed to report the tag as "source", due to an old regression in the command line parser back in v2.2 days.
Also contains typofixes, documentation updates and trivial code clean-ups.
2.6.6
Git v2.6.6 Release Notes ========================
Fixes since v2.6.5 ------------------
- Bugfix patches were backported from the ’master’ front to plug heap corruption holes, to catch integer overflow in the computation of pathname lengths, and to get rid of the name_path API. Both of these would have resulted in writing over an under-allocated buffer when formulating pathnames while tree traversal.
2.6.7
Git v2.6.7 Release Notes ========================
Fixes since v2.6.6 ------------------
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
2.7.0
Git 2.7 Release Notes =====================
Updates since v2.6 ------------------
UI, Workflows & Features
- The appearance of "gitk", particularly on high DPI monitors, have been improved. "gitk" also comes with an undated translation for Swedish and Japanese.
- "git remote" learned "get-url" subcommand to show the URL for a given remote name used for fetching and pushing.
- There was no way to defeat a configured rebase.autostash variable from the command line, as "git rebase --no-autostash" was missing.
- "git log --date=local" used to only show the normal (default) format in the local timezone. The command learned to take ’local’ as an instruction to use the local timezone with other formats,
- The refs used during a "git bisect" session is now per-worktree so that independent bisect sessions can be done in different worktrees created with "git worktree add".
- Users who are too busy to type three extra keystrokes to ask for "git stash show -p" can now set stash.showPatch configuration variable to true to always see the actual patch, not just the list of paths affected with feel for the extent of damage via diffstat.
- "quiltimport" allows to specify the series file by honoring the $QUILT_SERIES environment and also --series command line option.
- The use of ’good/bad’ in "git bisect" made it confusing to use when hunting for a state change that is not a regression (e.g. bugfix). The command learned ’old/new’ and then allows the end user to say e.g. "bisect start --term-old=fast --term-new=slow" to find a performance regression.
- "git interpret-trailers" can now run outside of a Git repository.
- "git p4" learned to re-encode the pathname it uses to communicate with the p4 depot with a new option.
- Give progress meter to "git filter-branch".
- Allow a later "!/abc/def" to override an earlier "/abc" that appears in the same .gitignore file to make it easier to express "everything in /abc directory is ignored, except for …".
- Teach "git p4" to send large blobs outside the repository by talking to Git LFS.
- Prepare for Git on-disk repository representation to undergo backward incompatible changes by introducing a new repository format version "1", with an extension mechanism.
- "git worktree" learned a "list" subcommand.
- "git clone --dissociate" learned that it can be used even when "--reference" was not used at the same time.
- "git blame" learnt to take "--first-parent" and "--reverse" at the same time when it makes sense.
- "git checkout" did not follow the usual "--[no-]progress" convention and implemented only "--quiet" that is essentially a superset of "--no-progress". Extend the command to support the usual "--[no-]progress".
- The semantics of transfer.hideRefs configuration variable have been extended to work better with the ref "namespace" feature that lets you throw unrelated bunches of repositories in a single physical repository and virtually serve them as separate ones.
- send-email config variables whose values are pathnames now go through the ~username/ expansion.
- bash completion learnt to TAB-complete recipient addresses given to send-email.
- The credential-cache daemon can be told to ignore SIGHUP to work around issue when running Git from inside emacs.
- "git push" learned new configuration for doing "--recurse-submodules" on each push.
- "format-patch" has learned a new option to zero-out the commit object name on the mbox "From " line.
Performance, Internal Implementation, Development Support etc.
- The infrastructure to rewrite "git submodule" in C is being built incrementally. Let’s polish these early parts well enough and make them graduate to ’next’ and ’master’, so that the more involved follow-up can start cooking on a solid ground.
- Some features from "git tag -l" and "git branch -l" have been made available to "git for-each-ref" so that eventually the unified implementation can be shared across all three. The version merged to the ’master’ branch earlier had a performance regression in "tag --contains", which has since been corrected.
- Because "test_when_finished" in our test framework queues the clean-up tasks to be done in a shell variable, it should not be used inside a subshell. Add a mechanism to allow ’bash’ to catch such uses, and fix the ones that were found.
- The debugging infrastructure for pkt-line based communication has been improved to mark the side-band communication specifically.
- Update "git branch" that list existing branches, using the ref-filter API that is shared with "git tag" and "git for-each-ref".
- The test for various line-ending conversions has been enhanced.
- A few test scripts around "git p4" have been improved for portability.
- Many allocations that is manually counted (correctly) that are followed by strcpy/sprintf have been replaced with a less error prone constructs such as xstrfmt.
- The internal stripspace() function has been moved to where it logically belongs to, i.e. strbuf API, and the command line parser of "git stripspace" has been updated to use the parse_options API.
- "git am" used to spawn "git mailinfo" via run_command() API once per each patch, but learned to make a direct call to mailinfo() instead.
- The implementation of "git mailinfo" was refactored so that a mailinfo() function can be directly called from inside a process.
- With a "debug" helper, debugging of a single "git" invocation in our test scripts has become a lot easier.
- The "configure" script did not test for -lpthread correctly, which upset some linkers.
- Cross completed task off of subtree project’s todo list.
- Test cleanups for the subtree project.
- Clean up style in an ancient test t9300.
- Work around some test flakiness with p4d.
- Fsck did not correctly detect a NUL-truncated header in a tag.
- Use a safer behavior when we hit errors verifying remote certificates.
- Speed up filter-branch for cases where we only care about rewriting commits, not tree data.
- The parse-options API has been updated to make "-h" command line option work more consistently in all commands.
- "git svn rebase/mkdirs" got optimized by keeping track of empty directories better.
- Fix some racy client/server tests by treating SIGPIPE the same as a normal non-zero exit.
- The necessary infrastructure to build topics using the free Travis CI has been added. Developers forking from this topic (and enabling Travis) can do their own builds, and we can turn on auto-builds for git/git (including build-status for pull requests that people open).
- The write(2) emulation for Windows learned to set errno to EPIPE when necessary.
Also contains various documentation updates and code clean-ups.
Fixes since v2.6 ----------------
Unless otherwise noted, all the fixes since v2.6 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- Very small number of options take a parameter that is optional (which is not a great UI element as they can only appear at the end of the command line). Add notice to documentation of each and every one of them.
- "git blame --first-parent v1.0..v2.0" was not rejected but did not limit the blame to commits on the first parent chain.
- "git subtree" (in contrib/) now can take whitespaces in the pathnames, not only in the in-tree pathname but the name of the directory that the repository is in.
- The ssh transport, just like any other transport over the network, did not clear GIT_* environment variables, but it is possible to use SendEnv and AcceptEnv to leak them to the remote invocation of Git, which is not a good idea at all. Explicitly clear them just like we do for the local transport.
- Correct "git p4 --detect-labels" so that it does not fail to create a tag that points at a commit that is also being imported.
- The Makefile always runs the library archiver with hardcoded "crs" options, which was inconvenient for exotic platforms on which people want to use programs with totally different set of command line options.
- Customization to change the behaviour with "make -w" and "make -s" in our Makefile was broken when they were used together.
- The way how --ref/--notes to specify the notes tree reference are DWIMmed was not clearly documented.
- "git gc" used to barf when a symbolic ref has gone dangling (e.g. the branch that used to be your upstream’s default when you cloned from it is now gone, and you did "fetch --prune").
- "git clone --dissociate" runs a big "git repack" process at the end, and it helps to close file descriptors that are open on the packs and their idx files before doing so on filesystems that cannot remove a file that is still open.
- Description of the "log.follow" configuration variable in "git log" documentation is now also copied to "git config" documentation.
- "git rebase -i" had a minor regression recently, which stopped considering a line that begins with an indented ’#’ in its insn sheet not a comment. Further, the code was still too picky on Windows where CRLF left by the editor is turned into a trailing CR on the line read via the "read" built-in command of bash. Both of these issues are now fixed.
- After "git checkout --detach", "git status" reported a fairly useless "HEAD detached at HEAD", instead of saying at which exact commit.
- When "git send-email" wanted to talk over Net::SMTP::SSL, Net::Cmd::datasend() did not like to be fed too many bytes at the same time and failed to send messages. Send the payload one line at a time to work around the problem.
- When "git am" was rewritten as a built-in, it stopped paying attention to user.signingkey, which was fixed.
- It was not possible to use a repository-lookalike created by "git worktree add" as a local source of "git clone".
- On a case insensitive filesystems, setting GIT_WORK_TREE variable using a random cases that does not agree with what the filesystem thinks confused Git that it wasn’t inside the working tree.
- Performance-measurement tests did not work without an installed Git.
- A test script for the HTTP service had a timing dependent bug, which was fixed.
- There were some classes of errors that "git fsck" diagnosed to its standard error that did not cause it to exit with non-zero status.
- Work around "git p4" failing when the P4 depot records the contents in UTF-16 without UTF-16 BOM.
- When "git gc --auto" is backgrounded, its diagnosis message is lost. Save it to a file in $GIT_DIR and show it next time the "gc --auto" is run.
- The submodule code has been taught to work better with separate work trees created via "git worktree add".
- "git gc" is safe to run anytime only because it has the built-in grace period to protect young objects. In order to run with no grace period, the user must make sure that the repository is quiescent.
- A recent "filter-branch --msg-filter" broke skipping of the commit object header, which is fixed.
- The normalize_ceiling_entry() function does not muck with the end of the path it accepts, and the real world callers do rely on that, but a test insisted that the function drops a trailing slash.
- A test for interaction between untracked cache and sparse checkout added in Git 2.5 days were flaky.
- A couple of commands still showed "[options]" in their usage string to note where options should come on their command line, but we spell that "[<options>]" in most places these days.
- The synopsis text and the usage string of subcommands that read list of things from the standard input are often shown as if they only take input from a file on a filesystem, which was misleading.
- "git am -3" had a small regression where it is aborted in its error handling codepath when underlying merge-recursive failed in certain ways, as it assumed that the internal call to merge-recursive will never die, which is not the case (yet).
- The linkage order of libraries was wrong in places around libcurl.
- The name-hash subsystem that is used to cope with case insensitive filesystems keeps track of directories and their on-filesystem cases for all the paths in the index by holding a pointer to a randomly chosen cache entry that is inside the directory (for its ce→ce_name component). This pointer was not updated even when the cache entry was removed from the index, leading to use after free. This was fixed by recording the path for each directory instead of borrowing cache entries and restructuring the API somewhat.
- "git merge-file" tried to signal how many conflicts it found, which obviously would not work well when there are too many of them.
- The error message from "git blame --contents --reverse" incorrectly talked about "--contents --children".
- "git imap-send" did not compile well with older version of cURL library.
- Merging a branch that removes a path and another that changes the mode bits on the same path should have conflicted at the path, but it didn’t and silently favoured the removal.
- "git --literal-pathspecs add -u/-A" without any command line argument misbehaved ever since Git 2.0.
- "git daemon" uses "run_command()" without "finish_command()", so it needs to release resources itself, which it forgot to do.
- "git status --branch --short" accessed beyond the constant string "HEAD", which has been corrected.
- We peek objects from submodule’s object store by linking it to the list of alternate object databases, but the code to do so forgot to correctly initialize the list.
- The code to prepare the working tree side of temporary directory for the "dir-diff" feature forgot that symbolic links need not be copied (or symlinked) to the temporary area, as the code already special cases and overwrites them. Besides, it was wrong to try computing the object name of the target of symbolic link, which may not even exist or may be a directory.
- A Range: request can be responded with a full response and when asked properly libcurl knows how to strip the result down to the requested range. However, we were hand-crafting a range request and it did not kick in.
- Having a leftover .idx file without corresponding .pack file in the repository hurts performance; "git gc" learned to prune them.
- Apple’s common crypto implementation of SHA1_Update() does not take more than 4GB at a time, and we now have a compile-time workaround for it.
- Produce correct "dirty" marker for shell prompts, even when we are on an orphan or an unborn branch.
- A build without NO_IPv6 used to use gethostbyname() when guessing user’s hostname, instead of getaddrinfo() that is used in other codepaths in such a build.
- The exit code of git-fsck did not reflect some types of errors found in packed objects, which has been corrected.
- The helper used to iterate over loose object directories to prune stale objects did not closedir() immediately when it is done with a directory—a callback such as the one used for "git prune" may want to do rmdir(), but it would fail on open directory on platforms such as WinXP.
- "git p4" used to import Perforce CLs that touch only paths outside the client spec as empty commits. It has been corrected to ignore them instead, with a new configuration git-p4.keepEmptyCommits as a backward compatibility knob.
- The completion script (in contrib/) used to list "git column" (which is not an end-user facing command) as one of the choices (merge 160fcdb sg/completion-no-column later to maint).
- The error reporting from "git send-email", when SMTP TLS fails, has been improved. (merge 9d60524 jk/send-email-ssl-errors later to maint).
- When getpwuid() on the system returned NULL (e.g. the user is not in the /etc/passwd file or other uid-to-name mappings), the codepath to find who the user is to record it in the reflog barfed and died. Loosen the check in this codepath, which already accepts questionable ident string (e.g. host part of the e-mail address is obviously bogus), and in general when we operate fmt_ident() function in non-strict mode. (merge 92bcbb9 jk/ident-loosen-getpwuid later to maint).
- "git symbolic-ref" forgot to report a failure with its exit status. (merge f91b273 jk/symbolic-ref-maint later to maint).
- History traversal with "git log --source" that starts with an annotated tag failed to report the tag as "source", due to an old regression in the command line parser back in v2.2 days. (merge 728350b jk/pending-keep-tag-name later to maint).
- "git p4" when interacting with multiple depots at the same time used to incorrectly drop changes.
- Code clean-up, minor fixes etc.
2.7.1
Git v2.7.1 Release Notes ========================
Fixes since v2.7 ----------------
- An earlier change in 2.5.x-era broke users’ hooks and aliases by exporting GIT_WORK_TREE to point at the root of the working tree, interfering when they tried to use a different working tree without setting GIT_WORK_TREE environment themselves.
- The "exclude_list" structure has the usual "alloc, nr" pair of fields to be used by ALLOC_GROW(), but clear_pattern_list() forgot to reset ’alloc’ to 0 when it cleared ’nr’ to discard the managed array.
- "git send-email" was confused by escaped quotes stored in the alias files saved by "mutt", which has been corrected.
- A few unportable C construct have been spotted by clang compiler and have been fixed.
- The documentation has been updated to hint the connection between the '--signoff’ option and DCO.
- "git reflog" incorrectly assumed that all objects that used to be at the tip of a ref must be commits, which caused it to segfault.
- The ignore mechanism saw a few regressions around untracked file listing and sparse checkout selection areas in 2.7.0; the change that is responsible for the regression has been reverted.
- Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR (e.g. COMMIT_EDITMSG) that is meant to be left after the command is done. This however did not work well if the repository is set to be shared with core.sharedRepository and the umask of the previous user is tighter. They have been made to work better by calling unlink(2) and retrying after fopen(3) fails with EPERM.
- Asking gitweb for a nonexistent commit left a warning in the server log.
- "git rebase", unlike all other callers of "gc --auto", did not ignore the exit code from "gc --auto".
- Many codepaths that run "gc --auto" before exiting kept packfiles mapped and left the file descriptors to them open, which was not friendly to systems that cannot remove files that are open. They now close the packs before doing so.
- A recent optimization to filter-branch in v2.7.0 introduced a regression when --prune-empty filter is used, which has been corrected.
- The description for SANITY prerequisite the test suite uses has been clarified both in the comment and in the implementation.
- "git tag" started listing a tag "foo" as "tags/foo" when a branch named "foo" exists in the same repository; remove this unnecessary disambiguation, which is a regression introduced in v2.7.0.
- The way "git svn" uses auth parameter was broken by Subversion 1.9.0 and later.
- The "split" subcommand of "git subtree" (in contrib/) incorrectly skipped merges when it shouldn’t, which was corrected.
- A few options of "git diff" did not work well when the command was run from a subdirectory.
- dirname() emulation has been added, as Msys2 lacks it.
- The underlying machinery used by "ls-files -o" and other commands have been taught not to create empty submodule ref cache for a directory that is not a submodule. This removes a ton of wasted CPU cycles.
- Drop a few old "todo" items by deciding that the change one of them suggests is not such a good idea, and doing the change the other one suggested to do.
- Documentation for "git fetch --depth" has been updated for clarity.
- The command line completion learned a handful of additional options and command specific syntax.
Also includes a handful of documentation and test updates.
2.7.2
Git v2.7.2 Release Notes ========================
Fixes since v2.7.1 ------------------
- The low-level merge machinery has been taught to use CRLF line termination when inserting conflict markers to merged contents that are themselves CRLF line-terminated.
- "git worktree" had a broken code that attempted to auto-fix possible inconsistency that results from end-users moving a worktree to different places without telling Git (the original repository needs to maintain backpointers to its worktrees, but "mv" run by end-users who are not familiar with that fact will obviously not adjust them), which actually made things worse when triggered.
- "git push --force-with-lease" has been taught to report if the push needed to force (or fast-forwarded).
- The emulated "yes" command used in our test scripts has been tweaked not to spend too much time generating unnecessary output that is not used, to help those who test on Windows where it would not stop until it fills the pipe buffer due to lack of SIGPIPE.
- The vimdiff backend for "git mergetool" has been tweaked to arrange and number buffers in the order that would match the expectation of majority of people who read left to right, then top down and assign buffers 1 2 3 4 "mentally" to local base remote merge windows based on that order.
- The documentation for "git clean" has been corrected; it mentioned that .git/modules/* are removed by giving two "-f", which has never been the case.
- Paths that have been told the index about with "add -N" are not quite yet in the index, but a few commands behaved as if they already are in a harmful way.
Also includes tiny documentation and test updates.
2.7.3
Git v2.7.3 Release Notes ========================
Fixes since v2.7.2 ------------------
- Traditionally, the tests that try commands that work on the contents in the working tree were named with "worktree" in their filenames, but with the recent addition of "git worktree" subcommand, whose tests are also named similarly, it has become harder to tell them apart. The traditional tests have been renamed to use "work-tree" instead in an attempt to differentiate them.
- Many codepaths forget to check return value from git_config_set(); the function is made to die() to make sure we do not proceed when setting a configuration variable failed.
- Handling of errors while writing into our internal asynchronous process has been made more robust, which reduces flakiness in our tests.
- "git show ’HEAD:Foo[BAR]Baz’" did not interpret the argument as a rev, i.e. the object named by the pathname with wildcard characters in a tree object.
- "git rev-parse --git-common-dir" used in the worktree feature misbehaved when run from a subdirectory.
- The "v(iew)" subcommand of the interactive "git am -i" command was broken in 2.6.0 timeframe when the command was rewritten in C.
- "git merge-tree" used to mishandle "both sides added" conflict with its own "create a fake ancestor file that has the common parts of what both sides have added and do a 3-way merge" logic; this has been updated to use the usual "3-way merge with an empty blob as the fake common ancestor file" approach used in the rest of the system.
- The memory ownership rule of fill_textconv() API, which was a bit tricky, has been documented a bit better.
- The documentation did not clearly state that the ’simple’ mode is now the default for "git push" when push.default configuration is not set.
- Recent versions of GNU grep are pickier when their input contains arbitrary binary data, which some of our tests uses. Rewrite the tests to sidestep the problem.
- A helper function "git submodule" uses since v2.7.0 to list the modules that match the pathspec argument given to its subcommands (e.g. "submodule add <repo> <path>") has been fixed.
- "git config section.var value" to set a value in per-repository configuration file failed when it was run outside any repository, but didn’t say the reason correctly.
- The code to read the pack data using the offsets stored in the pack idx file has been made more carefully check the validity of the data in the idx.
Also includes documentation and test updates.
2.7.4
Git v2.7.4 Release Notes ========================
Fixes since v2.7.3 ------------------
- Bugfix patches were backported from the ’master’ front to plug heap corruption holes, to catch integer overflow in the computation of pathname lengths, and to get rid of the name_path API. Both of these would have resulted in writing over an under-allocated buffer when formulating pathnames while tree traversal.
2.7.5
Git v2.7.5 Release Notes ========================
Fixes since v2.7.4 ------------------
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
Also contains a few fixes backported from later development tracks.
2.7.6
Git v2.7.6 Release Notes ========================
Fixes since v2.7.5 ------------------
- A "ssh://…" URL can result in a "ssh" command line with a hostname that begins with a dash "-", which would cause the "ssh" command to instead (mis)treat it as an option. This is now prevented by forbidding such a hostname (which will not be necessary in the real world).
- Similarly, when GIT_PROXY_COMMAND is configured, the command is run with host and port that are parsed out from "ssh://…" URL; a poorly written GIT_PROXY_COMMAND could be tricked into treating a string that begins with a dash "-". This is now prevented by forbidding such a hostname and port number (again, which will not be necessary in the real world).
- In the same spirit, a repository name that begins with a dash "-" is also forbidden now.
Credits go to Brian Neel at GitLab, Joern Schneeweisz of Recurity Labs and Jeff King at GitHub.
2.8.0
Git 2.8 Release Notes =====================
Backward compatibility note ---------------------------
The rsync:
Updates since v2.7 ------------------
UI, Workflows & Features
- It turns out "git clone" over rsync transport has been broken when the source repository has packed references for a long time, and nobody noticed nor complained about it.
- "push" learned that its "--delete" option can be shortened to "-d", just like "branch --delete" and "branch -d" are the same thing.
- "git blame" learned to produce the progress eye-candy when it takes too much time before emitting the first line of the result.
- "git grep" can now be configured (or told from the command line) how many threads to use when searching in the working tree files.
- Some "git notes" operations, e.g. "git log --notes=<note>", should be able to read notes from any tree-ish that is shaped like a notes tree, but the notes infrastructure required that the argument must be a ref under refs/notes/. Loosen it to require a valid ref only when the operation would update the notes (in which case we must have a place to store the updated notes tree, iow, a ref).
- "git grep" by default does not fall back to its "--no-index" behavior outside a directory under Git’s control (otherwise the user may by mistake end up running a huge recursive search); with a new configuration (set in $HOME/.gitconfig—by definition this cannot be set in the config file per project), this safety can be disabled.
- "git pull --rebase" has been extended to allow invoking "rebase -i".
- "git p4" learned to cope with the type of a file getting changed.
- "git format-patch" learned to notice format.outputDirectory configuration variable. This allows "-o <dir>" option to be omitted on the command line if you always use the same directory in your workflow.
- "interpret-trailers" has been taught to optionally update a file in place, instead of always writing the result to the standard output.
- Many commands that read files that are expected to contain text that is generated (or can be edited) by the end user to control their behavior (e.g. "git grep -f <filename>") have been updated to be more tolerant to lines that are terminated with CRLF (they used to treat such a line to contain payload that ends with CR, which is usually not what the users expect).
- "git notes merge" used to limit the source of the merged notes tree to somewhere under refs/notes/ hierarchy, which was too limiting when inventing a workflow to exchange notes with remote repositories using remote-tracking notes trees (located in e.g. refs/remote-notes/ or somesuch).
- "git ls-files" learned a new "--eol" option to help diagnose end-of-line problems.
- "ls-remote" learned an option to show which branch the remote repository advertises as its primary by pointing its HEAD at.
- New http.proxyAuthMethod configuration variable can be used to specify what authentication method to use, as a way to work around proxies that do not give error response expected by libcurl when CURLAUTH_ANY is used. Also, the codepath for proxy authentication has been taught to use credential API to store the authentication material in user’s keyrings.
- Update the untracked cache subsystem and change its primary UI from "git update-index" to "git config".
- There were a few "now I am doing this thing" progress messages in the TCP connection code that can be triggered by setting a verbose option internally in the code, but "git fetch -v" and friends never passed the verbose option down to that codepath.
- Clean/smudge filters defined in a configuration file of lower precedence can now be overridden to be a pass-through no-op by setting the variable to an empty string.
- A new "<branch>^{/!-<pattern>}" notation can be used to name a commit that is reachable from <branch> that does not match the given <pattern>.
- The "user.useConfigOnly" configuration variable can be used to force the user to always set user.email & user.name configuration variables, serving as a reminder for those who work on multiple projects and do not want to put these in their $HOME/.gitconfig.
- "git fetch" and friends that make network connections can now be told to only use ipv4 (or ipv6).
- Some authentication methods do not need username or password, but libcurl needs some hint that it needs to perform authentication. Supplying an empty username and password string is a valid way to do so, but you can set the http.[<url>.]emptyAuth configuration variable to achieve the same, if you find it cleaner.
- You can now set http.[<url>.]pinnedpubkey to specify the pinned public key when building with recent enough versions of libcURL.
- The configuration system has been taught to phrase where it found a bad configuration variable in a better way in its error messages. "git config" learnt a new "--show-origin" option to indicate where the values come from.
- The "credential-cache" daemon process used to run in whatever directory it happened to start in, but this made umount(2)ing the filesystem that houses the repository harder; now the process chdir()s to the directory that house its own socket on startup.
- When "git submodule update" did not result in fetching the commit object in the submodule that is referenced by the superproject, the command learned to retry another fetch, specifically asking for that commit that may not be connected to the refs it usually fetches.
- "git merge-recursive" learned "--no-renames" option to disable its rename detection logic.
- Across the transition at around Git version 2.0, the user used to get a pretty loud warning when running "git push" without setting push.default configuration variable. We no longer warn because the transition was completed a long time ago.
- README has been renamed to README.md and its contents got tweaked slightly to make it easier on the eyes.
Performance, Internal Implementation, Development Support etc.
- Add a framework to spawn a group of processes in parallel, and use it to run "git fetch --recurse-submodules" in parallel.
- A slight update to the Makefile to mark ".PHONY" targets as such correctly.
- In-core storage of the reverse index for .pack files (which lets you go from a pack offset to an object name) has been streamlined.
- d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias handling by overwriting GIT_WORK_TREE environment variable to affect subprocesses when set_git_work_tree() gets called, which resulted in a rather unpleasant regression to "clone" and "init". Try to address the same issue by always restoring the environment and respawning the real underlying command when handling alias.
- The low-level code that is used to create symbolic references has been updated to share more code with the code that deals with normal references.
- strbuf_getline() and friends have been redefined to make it easier to identify which callsite of (new) strbuf_getline_lf() should allow and silently ignore carriage-return at the end of the line to help users on DOSsy systems.
- "git shortlog" used to accumulate various pieces of information regardless of what was asked to be shown in the final output. It has been optimized by noticing what need not to be collected (e.g. there is no need to collect the log messages when showing only the number of changes).
- "git checkout $branch" (and other operations that share the same underlying machinery) has been optimized.
- Automated tests in Travis CI environment has been optimized by persisting runtime statistics of previous "prove" run, executing tests that take longer before other ones; this reduces the total wallclock time.
- Test scripts have been updated to remove assumptions that are not portable between Git for POSIX and Git for Windows, or to skip ones with expectations that are not satisfiable on Git for Windows.
- Some calls to strcpy(3) triggers a false warning from static analyzers that are less intelligent than humans, and reducing the number of these false hits helps us notice real issues. A few calls to strcpy(3) in a couple of programs that are already safe has been rewritten to avoid false warnings.
- The "name_path" API was an attempt to reduce the need to construct the full path out of a series of path components while walking a tree hierarchy, but over time made less efficient because the path needs to be flattened, e.g. to be compared with another path that is already flat. The API has been removed and its users have been rewritten to simplify the overall code complexity.
- Help those who debug http(s) part of the system. (merge 0054045 sp/remote-curl-ssl-strerror later to maint).
- The internal API to interact with "remote.*" configuration variables has been streamlined.
- The ref-filter’s format-parsing code has been refactored, in preparation for "branch --format" and friends.
- Traditionally, the tests that try commands that work on the contents in the working tree were named with "worktree" in their filenames, but with the recent addition of "git worktree" subcommand, whose tests are also named similarly, it has become harder to tell them apart. The traditional tests have been renamed to use "work-tree" instead in an attempt to differentiate them. (merge 5549029 mg/work-tree-tests later to maint).
- Many codepaths forget to check return value from git_config_set(); the function is made to die() to make sure we do not proceed when setting a configuration variable failed. (merge 3d18064 ps/config-error later to maint).
- Handling of errors while writing into our internal asynchronous process has been made more robust, which reduces flakiness in our tests. (merge 43f3afc jk/epipe-in-async later to maint).
- There is a new DEVELOPER knob that enables many compiler warning options in the Makefile.
- The way the test scripts configure the Apache web server has been updated to work also for Apache 2.4 running on RedHat derived distros.
- Out of maintenance gcc on OSX 10.6 fails to compile the code in ’master’; work it around by using clang by default on the platform.
- The "name_path" API was an attempt to reduce the need to construct the full path out of a series of path components while walking a tree hierarchy, but over time made less efficient because the path needs to be flattened, e.g. to be compared with another path that is already flat, in many cases. The API has been removed and its users have been rewritten to simplify the overall code complexity. This incidentally also closes some heap-corruption holes.
- Recent versions of GNU grep is pickier than before to decide if a file is "binary" and refuse to give line-oriented hits when we expect it to, unless explicitly told with "-a" option. As our scripted Porcelains use sane_grep wrapper for line-oriented data, even when the line may contain non-ASCII payload we took from end-user data, use "grep -a" to implement sane_grep wrapper when using an implementation of "grep" that takes the "-a" option.
Also contains various documentation updates and code clean-ups.
Fixes since v2.7 ----------------
Unless otherwise noted, all the fixes since v2.7 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- An earlier change in 2.5.x-era broke users’ hooks and aliases by exporting GIT_WORK_TREE to point at the root of the working tree, interfering when they tried to use a different working tree without setting GIT_WORK_TREE environment themselves.
- The "exclude_list" structure has the usual "alloc, nr" pair of fields to be used by ALLOC_GROW(), but clear_pattern_list() forgot to reset ’alloc’ to 0 when it cleared ’nr’ to discard the managed array.
- Paths that have been told the index about with "add -N" are not quite yet in the index, but a few commands behaved as if they already are in a harmful way.
- "git send-email" was confused by escaped quotes stored in the alias files saved by "mutt", which has been corrected.
- A few non-portable C construct have been spotted by clang compiler and have been fixed.
- The documentation has been updated to hint the connection between the '--signoff’ option and DCO.
- "git reflog" incorrectly assumed that all objects that used to be at the tip of a ref must be commits, which caused it to segfault.
- The ignore mechanism saw a few regressions around untracked file listing and sparse checkout selection areas in 2.7.0; the change that is responsible for the regression has been reverted.
- Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR (e.g. COMMIT_EDITMSG) that is meant to be left after the command is done. This however did not work well if the repository is set to be shared with core.sharedRepository and the umask of the previous user is tighter. They have been made to work better by calling unlink(2) and retrying after fopen(3) fails with EPERM.
- Asking gitweb for a nonexistent commit left a warning in the server log.
Somebody may want to follow this up with an additional test, perhaps?
IIRC, we do test that no Perl warnings are given to the server log,
so this should have been caught if our test coverage were good.
- "git rebase", unlike all other callers of "gc --auto", did not ignore the exit code from "gc --auto".
- Many codepaths that run "gc --auto" before exiting kept packfiles mapped and left the file descriptors to them open, which was not friendly to systems that cannot remove files that are open. They now close the packs before doing so.
- A recent optimization to filter-branch in v2.7.0 introduced a regression when --prune-empty filter is used, which has been corrected.
- The description for SANITY prerequisite the test suite uses has been clarified both in the comment and in the implementation.
- "git tag" started listing a tag "foo" as "tags/foo" when a branch named "foo" exists in the same repository; remove this unnecessary disambiguation, which is a regression introduced in v2.7.0.
- The way "git svn" uses auth parameter was broken by Subversion 1.9.0 and later.
- The "split" subcommand of "git subtree" (in contrib/) incorrectly skipped merges when it shouldn’t, which was corrected.
- A few options of "git diff" did not work well when the command was run from a subdirectory.
- The command line completion learned a handful of additional options and command specific syntax.
- dirname() emulation has been added, as Msys2 lacks it.
- The underlying machinery used by "ls-files -o" and other commands has been taught not to create empty submodule ref cache for a directory that is not a submodule. This removes a ton of wasted CPU cycles.
- "git worktree" had a broken code that attempted to auto-fix possible inconsistency that results from end-users moving a worktree to different places without telling Git (the original repository needs to maintain back-pointers to its worktrees, but "mv" run by end-users who are not familiar with that fact will obviously not adjust them), which actually made things worse when triggered.
- The low-level merge machinery has been taught to use CRLF line termination when inserting conflict markers to merged contents that are themselves CRLF line-terminated.
- "git push --force-with-lease" has been taught to report if the push needed to force (or fast-forwarded).
- The emulated "yes" command used in our test scripts has been tweaked not to spend too much time generating unnecessary output that is not used, to help those who test on Windows where it would not stop until it fills the pipe buffer due to lack of SIGPIPE.
- The documentation for "git clean" has been corrected; it mentioned that .git/modules/* are removed by giving two "-f", which has never been the case.
- The vimdiff backend for "git mergetool" has been tweaked to arrange and number buffers in the order that would match the expectation of majority of people who read left to right, then top down and assign buffers 1 2 3 4 "mentally" to local base remote merge windows based on that order.
- "git show ’HEAD:Foo[BAR]Baz’" did not interpret the argument as a rev, i.e. the object named by the pathname with wildcard characters in a tree object. (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint).
- "git rev-parse --git-common-dir" used in the worktree feature misbehaved when run from a subdirectory. (merge 17f1365 nd/git-common-dir-fix later to maint).
- "git worktree add -B <branchname>" did not work.
- The "v(iew)" subcommand of the interactive "git am -i" command was broken in 2.6.0 timeframe when the command was rewritten in C. (merge 708b8cc jc/am-i-v-fix later to maint).
- "git merge-tree" used to mishandle "both sides added" conflict with its own "create a fake ancestor file that has the common parts of what both sides have added and do a 3-way merge" logic; this has been updated to use the usual "3-way merge with an empty blob as the fake common ancestor file" approach used in the rest of the system. (merge 907681e jk/no-diff-emit-common later to maint).
- The memory ownership rule of fill_textconv() API, which was a bit tricky, has been documented a bit better. (merge a64e6a4 jk/more-comments-on-textconv later to maint).
- Update various codepaths to avoid manually-counted malloc(). (merge 08c95df jk/tighten-alloc later to maint).
- The documentation did not clearly state that the ’simple’ mode is now the default for "git push" when push.default configuration is not set. (merge f6b1fb3 mm/push-simple-doc later to maint).
- Recent versions of GNU grep are pickier when their input contains arbitrary binary data, which some of our tests uses. Rewrite the tests to sidestep the problem. (merge 3b1442d jk/grep-binary-workaround-in-test later to maint).
- A helper function "git submodule" uses since v2.7.0 to list the modules that match the pathspec argument given to its subcommands (e.g. "submodule add <repo> <path>") has been fixed. (merge 2b56bb7 sb/submodule-module-list-fix later to maint).
- "git config section.var value" to set a value in per-repository configuration file failed when it was run outside any repository, but didn’t say the reason correctly. (merge 638fa62 js/config-set-in-non-repository later to maint).
- The code to read the pack data using the offsets stored in the pack idx file has been made more carefully check the validity of the data in the idx. (merge 7465feb jk/pack-idx-corruption-safety later to maint).
- Other minor clean-ups and documentation updates (merge f459823 ak/extract-argv0-last-dir-sep later to maint). (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint). (merge 4867f11 ps/plug-xdl-merge-leak later to maint). (merge 4938686 dt/initial-ref-xn-commit-doc later to maint). (merge 9537f21 ma/update-hooks-sample-typofix later to maint).
2.8.1
Git v2.8.1 Release Notes ========================
Fixes since v2.8 ----------------
- "make rpmbuild" target was broken as its input, git.spec.in, was not updated to match a file it describes that has been renamed recently. This has been fixed.
2.8.2
Git v2.8.2 Release Notes ========================
Fixes since v2.8.1 ------------------
- The embedded args argv-array in the child process is used to build the command line to run pack-objects instead of using a separate array of strings.
- Bunch of tests on "git clone" has been renumbered for better organization.
- The tests that involve running httpd leaked the system-wide configuration in /etc/gitconfig to the tested environment.
- "index-pack --keep=<msg>" was broken since v2.1.0 timeframe.
- "git config --get-urlmatch", unlike other variants of the "git config --get" family, did not signal error with its exit status when there was no matching configuration.
- The "--local-env-vars" and "--resolve-git-dir" options of "git rev-parse" failed to work outside a repository when the command’s option parsing was rewritten in 1.8.5 era.
- Fetching of history by naming a commit object name directly didn’t work across remote-curl transport.
- A small memory leak in an error codepath has been plugged in xdiff code.
- strbuf_getwholeline() did not NUL-terminate the buffer on certain corner cases in its error codepath.
- The startup_info data, which records if we are working inside a repository (among other things), are now uniformly available to Git subcommand implementations, and Git avoids attempting to touch references when we are not in a repository.
- "git mergetool" did not work well with conflicts that both sides deleted.
- "git send-email" had trouble parsing alias file in mailrc format when lines in it had trailing whitespaces on them.
- When "git merge --squash" stopped due to conflict, the concluding "git commit" failed to read in the SQUASH_MSG that shows the log messages from all the squashed commits.
- "git merge FETCH_HEAD" dereferenced NULL pointer when merging nothing into an unborn history (which is arguably unusual usage, which perhaps was the reason why nobody noticed it).
- Build updates for MSVC.
- "git diff -M" used to work better when two originally identical files A and B got renamed to X/A and X/B by pairing A to X/A and B to X/B, but this was broken in the 2.0 timeframe.
- "git send-pack --all <there>" was broken when its command line option parsing was written in the 2.6 timeframe.
- When running "git blame $path" with unnormalized data in the index for the path, the data in the working tree was blamed, even though "git add" would not have changed what is already in the index, due to "safe crlf" that disables the line-end conversion. It has been corrected.
Also contains minor documentation updates and code clean-ups.
2.8.3
Git v2.8.3 Release Notes ========================
Fixes since v2.8.2 ------------------
- "git send-email" now uses a more readable timestamps when formulating a message ID.
- The repository set-up sequence has been streamlined (the biggest change is that there is no longer git_config_early()), so that we do not attempt to look into refs/* when we know we do not have a Git repository.
- When "git worktree" feature is in use, "git branch -d" allowed deletion of a branch that is checked out in another worktree
- When "git worktree" feature is in use, "git branch -m" renamed a branch that is checked out in another worktree without adjusting the HEAD symbolic ref for the worktree.
- "git format-patch --help" showed
-sand--no-patchas if these are valid options to the command. We already hide--patchoption from the documentation, because format-patch is about showing the diff, and the documentation now hides these options as well.
- A change back in version 2.7 to "git branch" broke display of a symbolic ref in a non-standard place in the refs/ hierarchy (we expect symbolic refs to appear in refs/remotes/*/HEAD to point at the primary branch the remote has, and as .git/HEAD to point at the branch we locally checked out).
- A partial rewrite of "git submodule" in the 2.7 timeframe changed the way the gitdir: pointer in the submodules point at the real repository location to use absolute paths by accident. This has been corrected.
- "git commit" misbehaved in a few minor ways when an empty message is given via -m ’’, all of which has been corrected.
- Support for CRAM-MD5 authentication method in "git imap-send" did not work well.
- The socks5: that socks5h:
- "git config" had a codepath that tried to pass a NULL to printf("%s"), which nobody seems to have noticed.
- On Cygwin, object creation uses the "create a temporary and then rename it to the final name" pattern, not "create a temporary, hardlink it to the final name and then unlink the temporary" pattern.
This is necessary to use Git on Windows shared directories, and is
already enabled for the MinGW and plain Windows builds. It also
has been used in Cygwin packaged versions of Git for quite a while.
See https://lore.kernel.org/git/20160419091055.GF2345@dinwoodie.org/
and https://lore.kernel.org/git/20150811100527.GW14466@dinwoodie.org/.
- "git replace -e" did not honour "core.editor" configuration.
- Upcoming OpenSSL 1.1.0 will break compilation b updating a few APIs we use in imap-send, which has been adjusted for the change.
- "git submodule" reports the paths of submodules the command recurses into, but this was incorrect when the command was not run from the root level of the superproject.
- The test scripts for "git p4" (but not "git p4" implementation itself) has been updated so that they would work even on a system where the installed version of Python is python 3.
- The "user.useConfigOnly" configuration variable makes it an error if users do not explicitly set user.name and user.email. However, its check was not done early enough and allowed another error to trigger, reporting that the default value we guessed from the system setting was unusable. This was a suboptimal end-user experience as we want the users to set user.name/user.email without relying on the auto-detection at all.
- "git mv old new" did not adjust the path for a submodule that lives as a subdirectory inside old/ directory correctly.
- "git push" from a corrupt repository that attempts to push a large number of refs deadlocked; the thread to relay rejection notices for these ref updates blocked on writing them to the main thread, after the main thread at the receiving end notices that the push failed and decides not to read these notices and return a failure.
- A question by "git send-email" to ask the identity of the sender has been updated.
- Recent update to Git LFS broke "git p4" by changing the output from its "lfs pointer" subcommand.
- Some multi-byte encoding can have a backslash byte as a later part of one letter, which would confuse "highlight" filter used in gitweb.
Also contains minor documentation updates and code clean-ups.
2.8.4
Git v2.8.4 Release Notes ========================
Fixes since v2.8.3 ------------------
- Documentation for "git merge --verify-signatures" has been updated to clarify that the signature of only the commit at the tip is verified. Also the phrasing used for signature and key validity is adjusted to align with that used by OpenPGP.
- On Windows, .git and optionally any files whose name starts with a dot are now marked as hidden, with a core.hideDotFiles knob to customize this behaviour.
- Portability enhancement for "rebase -i" to help platforms whose shell does not like "for i in <empty>" (which is not POSIX-kosher).
- "git fsck" learned to catch NUL byte in a commit object as potential error and warn.
- CI test was taught to build documentation pages.
- Many ’linkgit:<git documentation page>’ references were broken, which are all fixed with this.
- "git describe --contains" often made a hard-to-justify choice of tag to give name to a given commit, because it tried to come up with a name with smallest number of hops from a tag, causing an old commit whose close descendant that is recently tagged were not described with respect to an old tag but with a newer tag. It did not help that its computation of "hop" count was further tweaked to penalize being on a side branch of a merge. The logic has been updated to favor using the tag with the oldest tagger date, which is a lot easier to explain to the end users: "We describe a commit in terms of the (chronologically) oldest tag that contains the commit."
- Running tests with ’-x’ option to trace the individual command executions is a useful way to debug test scripts, but some tests that capture the standard error stream and check what the command said can be broken with the trace output mixed in. When running our tests under "bash", however, we can redirect the trace output to another file descriptor to keep the standard error of programs being tested intact.
- When de-initialising all submodules, "git submodule deinit" gave a faulty recommendation to use "git submodule deinit .", which would result in a strange error message in a pathological corner case. This has been corrected to suggest "submodule deinit --all" instead.
- Many commands normalize command line arguments from NFD to NFC variant of UTF-8 on OSX, but commands in the "diff" family did not, causing "git diff $path" to complain that no such path is known to Git. They have been taught to do the normalization.
- A couple of bugs around core.autocrlf have been fixed.
- "git difftool" learned to handle unmerged paths correctly in dir-diff mode.
- The "are we talking with TTY, doing an interactive session?" detection has been updated to work better for "Git for Windows".
Also contains other minor documentation updates and code clean-ups.
2.8.5
Git v2.8.5 Release Notes ========================
Fixes since v2.8.4 ------------------
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
2.8.6
Git v2.8.6 Release Notes ========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.9.0
Git 2.9 Release Notes =====================
Backward compatibility notes ----------------------------
The end-user facing Porcelain level commands in the "git diff" and "git log" family by default enable the rename detection; you can still use "diff.renames" configuration variable to disable this.
Merging two branches that have no common ancestor with "git merge" is by default forbidden now to prevent creating such an unusual merge by mistake.
The output formats of "git log" that indents the commit log message by 4 spaces now expands HT in the log message by default. You can use the "--no-expand-tabs" option to disable this.
"git commit-tree" plumbing command required the user to always sign its result when the user sets the commit.gpgsign configuration variable, which was an ancient mistake, which this release corrects. A script that drives commit-tree, if it relies on this mistake, now needs to read commit.gpgsign and pass the -S option as necessary.
Updates since v2.8 ------------------
UI, Workflows & Features
- Comes with git-multimail 1.3.1 (in contrib/).
- The end-user facing commands like "git diff" and "git log" now enable the rename detection by default.
- The credential.helper configuration variable is cumulative and there is no good way to override it from the command line. As a special case, giving an empty string as its value now serves as the signal to clear the values specified in various files.
- A new "interactive.diffFilter" configuration can be used to customize the diff shown in "git add -i" sessions.
- "git p4" now allows P4 author names to be mapped to Git author names.
- "git rebase -x" can be used without passing "-i" option.
- "git -c credential.<var>=<value> submodule" can now be used to propagate configuration variables related to credential helper down to the submodules.
- "git tag" can create an annotated tag without explicitly given an "-a" (or "-s") option (i.e. when a tag message is given). A new configuration variable, tag.forceSignAnnotated, can be used to tell the command to create signed tag in such a situation.
- "git merge" used to allow merging two branches that have no common base by default, which led to a brand new history of an existing project created and then get pulled by an unsuspecting maintainer, which allowed an unnecessary parallel history merged into the existing project. The command has been taught not to allow this by default, with an escape hatch "--allow-unrelated-histories" option to be used in a rare event that merges histories of two projects that started their lives independently.
- "git pull" has been taught to pass the "--allow-unrelated-histories" option to underlying "git merge".
- "git apply -v" learned to report paths in the patch that were skipped via --include/--exclude mechanism or being outside the current working directory.
- Shell completion (in contrib/) updates.
- The commit object name reported when "rebase -i" stops has been shortened.
- "git worktree add" can be given "--no-checkout" option to only create an empty worktree without checking out the files.
- "git mergetools" learned to drive ExamDiff.
- "git pull --rebase" learned "--[no-]autostash" option, so that the rebase.autostash configuration variable set to true can be overridden from the command line.
- When "git log" shows the log message indented by 4-spaces, the remainder of a line after a HT does not align in the way the author originally intended. The command now expands tabs by default to help such a case, and allows the users to override it with a new option, "--no-expand-tabs".
- "git send-email" now uses a more readable timestamps when formulating a message ID.
- "git rerere" can encounter two or more files with the same conflict signature that have to be resolved in different ways, but there was no way to record these separate resolutions.
- "git p4" learned to record P4 jobs in Git commit that imports from the history in Perforce.
- "git describe --contains" often made a hard-to-justify choice of tag to name a given commit, because it tried to come up with a name with smallest number of hops from a tag, causing an old commit whose close descendant that is recently tagged were not described with respect to an old tag but with a newer tag. It did not help that its computation of "hop" count was further tweaked to penalize being on a side branch of a merge. The logic has been updated to favor using the tag with the oldest tagger date, which is a lot easier to explain to the end users: "We describe a commit in terms of the (chronologically) oldest tag that contains the commit."
- "git clone" learned the "--shallow-submodules" option.
- HTTP transport clients learned to throw extra HTTP headers at the server, specified via http.extraHeader configuration variable.
- The "--compaction-heuristic" option to "git diff" family of commands enables a heuristic to make the patch output more readable by using a blank line as a strong hint that the contents before and after it belong to logically separate units. It is still experimental.
- A new configuration variable core.hooksPath allows customizing where the hook directory is.
- An earlier addition of "sanitize_submodule_env" with 14111fc4 (git: submodule honor -c credential.* from command line, 2016-02-29) turned out to be a convoluted no-op; implement what it wanted to do correctly, and stop filtering settings given via "git -c var=val".
- "git commit --dry-run" reported "No, no, you cannot commit." in one case where "git commit" would have allowed you to commit, and this improves it a little bit ("git commit --dry-run --short" still does not give you the correct answer, for example). This is a stop-gap measure in that "commit --short --dry-run" still gives an incorrect result.
- The experimental "multiple worktree" feature gains more safety to forbid operations on a branch that is checked out or being actively worked on elsewhere, by noticing that e.g. it is being rebased.
- "git format-patch" learned a new "--base" option to record what (public, well-known) commit the original series was built on in its output.
- "git commit" learned to pay attention to the "commit.verbose" configuration variable and act as if the "--verbose" option was given from the command line.
- Updated documentation gives hints to GMail users with two-factor auth enabled that they need app-specific-password when using "git send-email".
- The manpage output of our documentation did not render well in terminal; typeset literals in bold by default to make them stand out more.
- The mark-up in the top-level README.md file has been updated to typeset CLI command names differently from the body text.
Performance, Internal Implementation, Development Support etc.
- The embedded args argv-array in the child process is used to build the command line to run pack-objects instead of using a separate array of strings.
- The startup_info data, which records if we are working inside a repository (among other things), are now uniformly available to Git subcommand implementations, and Git avoids attempting to touch references when we are not in a repository.
- The command line argument parser for "receive-pack" has been rewritten to use parse-options.
- A major part of "git submodule update" has been ported to C to take advantage of the recently added framework to run download tasks in parallel. Other updates to "git submodule" that move pieces of logic to C continues.
- Rename bunch of tests on "git clone" for better organization.
- The tests that involve running httpd leaked the system-wide configuration in /etc/gitconfig to the tested environment.
- Build updates for MSVC.
- The repository set-up sequence has been streamlined (the biggest change is that there is no longer git_config_early()), so that we do not attempt to look into refs/* when we know we do not have a Git repository.
- Code restructuring around the "refs" API to prepare for pluggable refs backends.
- Sources to many test helper binaries and the generated helpers have been moved to t/helper/ subdirectory to reduce clutter at the top level of the tree.
- Unify internal logic between "git tag -v" and "git verify-tag" commands by making one directly call into the other.
- "merge-recursive" strategy incorrectly checked if a path that is involved in its internal merge exists in the working tree.
- The test scripts for "git p4" (but not "git p4" implementation itself) has been updated so that they would work even on a system where the installed version of Python is python 3.
- As nobody maintains our in-tree git.spec.in and distros use their own spec file, we stopped pretending that we support "make rpm".
- Move from "unsigned char[20]" to "struct object_id" continues.
- The code for warning_errno/die_errno has been refactored and a new error_errno() reporting helper is introduced. (merge 1da045f nd/error-errno later to maint).
- Running tests with ’-x’ option to trace the individual command executions is a useful way to debug test scripts, but some tests that capture the standard error stream and check what the command said can be broken with the trace output mixed in. When running our tests under "bash", however, we can redirect the trace output to another file descriptor to keep the standard error of programs being tested intact.
- t0040 had too many unnecessary repetitions in its test data. Teach test-parse-options program so that a caller can tell what it expects in its output, so that these repetitions can be cleaned up.
- Add perf test for "rebase -i".
- Common mistakes when writing gitlink: in our documentation are found by "make check-docs".
- t9xxx series has been updated primarily for readability, while fixing small bugs in it. A few scripted Porcelain commands have also been updated to fix possible bugs around their use of "test -z" and "test -n".
- CI test was taught to run git-svn tests.
- "git cat-file --batch-all" has been sped up, by taking advantage of the fact that it does not have to read a list of objects, in two ways.
- test updates to make it more readable and maintainable. (merge e6273f4 es/t1500-modernize later to maint).
- "make DEVELOPER=1" worked as expected; setting DEVELOPER=1 in config.mak didn’t. (merge 51dd3e8 mm/makefile-developer-can-be-in-config-mak later to maint).
- The way how "submodule—helper list" signals unmatch error to its callers has been updated.
- A bash-ism "local" has been removed from "git submodule" scripted Porcelain.
Also contains various documentation updates and code clean-ups.
Fixes since v2.8 ----------------
Unless otherwise noted, all the fixes since v2.8 in the maintenance track are contained in this release (see the maintenance releases’ notes for details).
- "git config --get-urlmatch", unlike other variants of the "git config --get" family, did not signal error with its exit status when there was no matching configuration.
- The "--local-env-vars" and "--resolve-git-dir" options of "git rev-parse" failed to work outside a repository when the command’s option parsing was rewritten in 1.8.5 era.
- "git index-pack --keep[=<msg>] pack-$name.pack" simply did not work.
- Fetching of history by naming a commit object name directly didn’t work across remote-curl transport.
- A small memory leak in an error codepath has been plugged in xdiff code.
- strbuf_getwholeline() did not NUL-terminate the buffer on certain corner cases in its error codepath.
- "git mergetool" did not work well with conflicts that both sides deleted.
- "git send-email" had trouble parsing alias file in mailrc format when lines in it had trailing whitespaces on them.
- When "git merge --squash" stopped due to conflict, the concluding "git commit" failed to read in the SQUASH_MSG that shows the log messages from all the squashed commits.
- "git merge FETCH_HEAD" dereferenced NULL pointer when merging nothing into an unborn history (which is arguably unusual usage, which perhaps was the reason why nobody noticed it).
- When "git worktree" feature is in use, "git branch -d" allowed deletion of a branch that is checked out in another worktree, which was wrong.
- When "git worktree" feature is in use, "git branch -m" renamed a branch that is checked out in another worktree without adjusting the HEAD symbolic ref for the worktree.
- "git diff -M" used to work better when two originally identical files A and B got renamed to X/A and X/B by pairing A to X/A and B to X/B, but this was broken in the 2.0 timeframe.
- "git send-pack --all <there>" was broken when its command line option parsing was written in the 2.6 timeframe.
- "git format-patch --help" showed
-sand--no-patchas if these are valid options to the command. We already hide--patchoption from the documentation, because format-patch is about showing the diff, and the documentation now hides these options as well.
- When running "git blame $path" with unnormalized data in the index for the path, the data in the working tree was blamed, even though "git add" would not have changed what is already in the index, due to "safe crlf" that disables the line-end conversion. It has been corrected.
- A change back in version 2.7 to "git branch" broke display of a symbolic ref in a non-standard place in the refs/ hierarchy (we expect symbolic refs to appear in refs/remotes/*/HEAD to point at the primary branch the remote has, and as .git/HEAD to point at the branch we locally checked out).
- A partial rewrite of "git submodule" in the 2.7 timeframe changed the way the gitdir: pointer in the submodules point at the real repository location to use absolute paths by accident. This has been corrected.
- "git commit" misbehaved in a few minor ways when an empty message is given via -m ’’, all of which has been corrected.
- Support for CRAM-MD5 authentication method in "git imap-send" did not work well.
- Upcoming OpenSSL 1.1.0 will break compilation by updating a few API elements we use in imap-send, which has been adjusted for the change.
- The socks5: that socks5h:
- "git config" had a codepath that tried to pass a NULL to printf("%s"), which nobody seems to have noticed.
- On Cygwin, object creation uses the "create a temporary and then rename it to the final name" pattern, not "create a temporary, hardlink it to the final name and then unlink the temporary" pattern.
This is necessary to use Git on Windows shared directories, and is
already enabled for the MinGW and plain Windows builds. It also
has been used in Cygwin packaged versions of Git for quite a while.
See https://lore.kernel.org/git/20160419091055.GF2345@dinwoodie.org/
- "merge-octopus" strategy did not ensure that the index is clean when merge begins.
- When "git merge" notices that the merge can be resolved purely at the tree level (without having to merge blobs) and the resulting tree happens to already exist in the object store, it forgot to update the index, which left an inconsistent state that would break later operations.
- "git submodule" reports the paths of submodules the command recurses into, but these paths were incorrectly reported when the command was not run from the root level of the superproject.
- The "user.useConfigOnly" configuration variable makes it an error if users do not explicitly set user.name and user.email. However, its check was not done early enough and allowed another error to trigger, reporting that the default value we guessed from the system setting was unusable. This was a suboptimal end-user experience as we want the users to set user.name/user.email without relying on the auto-detection at all.
- "git mv old new" did not adjust the path for a submodule that lives as a subdirectory inside old/ directory correctly.
- "git replace -e" did not honour "core.editor" configuration.
- "git push" from a corrupt repository that attempts to push a large number of refs deadlocked; the thread to relay rejection notices for these ref updates blocked on writing them to the main thread, after the main thread at the receiving end notices that the push failed and decides not to read these notices and return a failure.
- mmap emulation on Windows has been optimized and work better without consuming paging store when not needed.
- A question by "git send-email" to ask the identity of the sender has been updated.
- UI consistency improvements for "git mergetool".
- "git rebase -m" could be asked to rebase an entire branch starting from the root, but failed by assuming that there always is a parent commit to the first commit on the branch.
- Fix a broken "p4 lfs" test.
- Recent update to Git LFS broke "git p4" by changing the output from its "lfs pointer" subcommand.
- "git fetch" test t5510 was flaky while running a (forced) automagic garbage collection.
- Documentation updates to help contributors setting up Travis CI test for their patches.
- Some multi-byte encoding can have a backslash byte as a later part of one letter, which would confuse "highlight" filter used in gitweb.
- "git commit-tree" plumbing command required the user to always sign its result when the user sets the commit.gpgsign configuration variable, which was an ancient mistake. Rework "git rebase" that relied on this mistake so that it reads commit.gpgsign and pass (or not pass) the -S option to "git commit-tree" to keep the end-user expectation the same, while teaching "git commit-tree" to ignore the configuration variable. This will stop requiring the users to sign commit objects used internally as an implementation detail of "git stash".
- Consolidate description of tilde-expansion that is done to configuration variables that take pathname to a single place.
- Correct faulty recommendation to use "git submodule deinit ." when de-initialising all submodules, which would result in a strange error message in a pathological corner case.
- Many ’linkgit:<git documentation page>’ references were broken, which are all fixed with this.
- "git rerere" can get confused by conflict markers deliberately left by the inner merge step, because they are indistinguishable from the real conflict markers left by the outermost merge which are what the end user and "rerere" need to look at. This was fixed by making the conflict markers left by the inner merges a bit longer. (merge 0f9fd5c jc/ll-merge-internal later to maint).
- CI test was taught to build documentation pages.
- "git fsck" learned to catch NUL byte in a commit object as potential error and warn.
- Portability enhancement for "rebase -i" to help platforms whose shell does not like "for i in <empty>" (which is not POSIX-kosher).
- On Windows, .git and optionally any files whose name starts with a dot are now marked as hidden, with a core.hideDotFiles knob to customize this behaviour.
- Documentation for "git merge --verify-signatures" has been updated to clarify that the signature of only the commit at the tip is verified. Also the phrasing used for signature and key validity is adjusted to align with that used by OpenPGP.
- A couple of bugs around core.autocrlf have been fixed.
- Many commands normalize command line arguments from NFD to NFC variant of UTF-8 on OSX, but commands in the "diff" family did not, causing "git diff $path" to complain that no such path is known to Git. They have been taught to do the normalization.
- "git difftool" learned to handle unmerged paths correctly in dir-diff mode.
- The "are we talking with TTY, doing an interactive session?" detection has been updated to work better for "Git for Windows".
- We forgot to add "git log --decorate=auto" to documentation when we added the feature back in v2.1.0 timeframe. (merge 462cbb4 rj/log-decorate-auto later to maint).
- "git fast-import --export-marks" would overwrite the existing marks file even when it makes a dump from its custom die routine. Prevent it from doing so when we have an import-marks file but haven’t finished reading it. (merge f4beed6 fc/fast-import-broken-marks-file later to maint).
- "git rebase -i", after it fails to auto-resolve the conflict, had an unnecessary call to "git rerere" from its very early days, which was spotted recently; the call has been removed. (merge 7063693 js/rebase-i-dedup-call-to-rerere later to maint).
- Other minor clean-ups and documentation updates (merge cd82b7a pa/cherry-pick-doc-typo later to maint). (merge 2bb73ae rs/patch-id-use-skip-prefix later to maint). (merge aa20cbc rs/apply-name-terminate later to maint). (merge fe17fc0 jc/t2300-setup later to maint). (merge e256eec jk/shell-portability later to maint).
2.9.1
Git v2.9.1 Release Notes ========================
Fixes since v2.9 ----------------
- When "git daemon" is run without --[init-]timeout specified, a connection from a client that silently goes offline can hang around for a long time, wasting resources. The socket-level KEEPALIVE has been enabled to allow the OS to notice such failed connections.
- The commands in
gitlogfamily take %C(auto) in a custom format string. This unconditionally turned the color on, ignoring --no-color or with --color=auto when the output is not connected to a tty; this was corrected to make the format truly behave as "auto".
- "git rev-list --count" whose walk-length is limited with "-n" option did not work well with the counting optimized to look at the bitmap index.
- "git show -W" (extend hunks to cover the entire function, delimited by lines that match the "funcname" pattern) used to show the entire file when a change added an entire function at the end of the file, which has been fixed.
- The documentation set has been updated so that literal commands, configuration variables and environment variables are consistently typeset in fixed-width font and bold in manpages.
- "git svn propset" subcommand that was added in 2.3 days is documented now.
- The documentation tries to consistently spell "GPG"; when referring to the specific program name, "gpg" is used.
- "git reflog" stopped upon seeing an entry that denotes a branch creation event (aka "unborn"), which made it appear as if the reflog was truncated.
- The git-prompt scriptlet (in contrib/) was not friendly with those who uses "set -u", which has been fixed.
- A codepath that used alloca(3) to place an unbounded amount of data on the stack has been updated to avoid doing so.
- "git update-index --add --chmod=+x file" may be usable as an escape hatch, but not a friendly thing to force for people who do need to use it regularly. "git add --chmod=+x file" can be used instead.
- Build improvements for gnome-keyring (in contrib/)
- "git status" used to say "working directory" when it meant "working tree".
- Comments about misbehaving FreeBSD shells have been clarified with the version number (9.x and before are broken, newer ones are OK).
- "git cherry-pick A" worked on an unborn branch, but "git cherry-pick A..B" didn’t.
- "git add -i/-p" learned to honor diff.compactionHeuristic experimental knob, so that the user can work on the same hunk split as "git diff" output.
- "log --graph --format=" learned that "%>|(N)" specifies the width relative to the terminal’s left edge, not relative to the area to draw text that is to the right of the ancestry-graph section. It also now accepts negative N that means the column limit is relative to the right border.
- The ownership rule for the piece of memory that hold references to be fetched in "git fetch" was screwy, which has been cleaned up.
- "git bisect" makes an internal call to "git diff-tree" when bisection finds the culprit, but this call did not initialize the data structure to pass to the diff-tree API correctly.
- Formats of the various data (and how to validate them) where we use GPG signature have been documented.
- Fix an unintended regression in v2.9 that breaks "clone --depth" that recurses down to submodules by forcing the submodules to also be cloned shallowly, which many server instances that host upstream of the submodules are not prepared for.
- Fix unnecessarily waste in the idiomatic use of ’: ${VAR=default}’ to set the default value, without enclosing it in double quotes.
- Some platform-specific code had non-ANSI strict declarations of C functions that do not take any parameters, which has been corrected.
- The internal code used to show local timezone offset is not prepared to handle timestamps beyond year 2100, and gave a bogus offset value to the caller. Use a more benign looking +0000 instead and let "git log" going in such a case, instead of aborting.
- One among four invocations of readlink(1) in our test suite has been rewritten so that the test can run on systems without the command (others are in valgrind test framework and t9802).
- t/perf needs /usr/bin/time with GNU extension; the invocation of it is updated to "gtime" on Darwin.
- A bug, which caused "git p4" while running under verbose mode to report paths that are omitted due to branch prefix incorrectly, has been fixed; the command said "Ignoring file outside of prefix" for paths that are inside.
- The top level documentation "git help git" still pointed at the documentation set hosted at now-defunct google-code repository. Update it to point to https://git.github.io/htmldocs/git.html instead.
Also contains minor documentation updates and code clean-ups.
2.9.2
Git v2.9.2 Release Notes ========================
Fixes since v2.9.1 ------------------
- A fix merged to v2.9.1 had a few tests that are not meant to be run on platforms without 64-bit long, which caused unnecessary test failures on them because we didn’t detect the platform and skip them. These tests are now skipped on platforms that they are not applicable to.
No other change is included in this update.
2.9.3
Git v2.9.3 Release Notes ========================
Fixes since v2.9.2 ------------------
- A helper function that takes the contents of a commit object and finds its subject line did not ignore leading blank lines, as is commonly done by other codepaths. Make it ignore leading blank lines to match.
- Git does not know what the contents in the index should be for a path added with "git add -N" yet, so "git grep --cached" should not show hits (or show lack of hits, with -L) in such a path, but that logic does not apply to "git grep", i.e. searching in the working tree files. But we did so by mistake, which has been corrected.
- "git rebase -i --autostash" did not restore the auto-stashed change when the operation was aborted.
- "git commit --amend --allow-empty-message -S" for a commit without any message body could have misidentified where the header of the commit object ends.
- More mark-up updates to typeset strings that are expected to literally typed by the end user in fixed-width font.
- For a long time, we carried an in-code comment that said our colored output would work only when we use fprintf/fputs on Windows, which no longer is the case for the past few years.
- "gc.autoPackLimit" when set to 1 should not trigger a repacking when there is only one pack, but the code counted poorly and did so.
- One part of "git am" had an oddball helper function that called stuff from outside "his" as opposed to calling what we have "ours", which was not gender-neutral and also inconsistent with the rest of the system where outside stuff is usually called "theirs" in contrast to "ours".
- The test framework learned a new helper test_match_signal to check an exit code from getting killed by an expected signal.
- "git blame -M" missed a single line that was moved within the file.
- Fix recently introduced codepaths that are involved in parallel submodule operations, which gave up on reading too early, and could have wasted CPU while attempting to write under a corner case condition.
- "git grep -i" has been taught to fold case in non-ascii locales correctly.
- A test that unconditionally used "mktemp" learned that the command is not necessarily available everywhere.
- "git blame file" allowed the lineage of lines in the uncommitted, unadded contents of "file" to be inspected, but it refused when "file" did not appear in the current commit. When "file" was created by renaming an existing file (but the change has not been committed), this restriction was unnecessarily tight.
- "git add -N dir/file && git write-tree" produced an incorrect tree when there are other paths in the same directory that sorts after "file".
- "git fetch http://user:pass@host/repo…" scrubbed the userinfo part, but "git push" didn’t.
- An age old bug that caused "git diff --ignore-space-at-eol" misbehave has been fixed.
- "git notes merge" had a code to see if a path exists (and fails if it does) and then open the path for writing (when it doesn’t). Replace it with open with O_EXCL.
- "git pack-objects" and "git index-pack" mostly operate with off_t when talking about the offset of objects in a packfile, but there were a handful of places that used "unsigned long" to hold that value, leading to an unintended truncation.
- Recent update to "git daemon" tries to enable the socket-level KEEPALIVE, but when it is spawned via inetd, the standard input file descriptor may not necessarily be connected to a socket. Suppress an ENOTSOCK error from setsockopt().
- Recent FreeBSD stopped making perl available at /usr/bin/perl; switch the default the built-in path to /usr/local/bin/perl on not too ancient FreeBSD releases.
- "git status" learned to suggest "merge --abort" during a conflicted merge, just like it already suggests "rebase --abort" during a conflicted rebase.
- The .c/.h sources are marked as such in our .gitattributes file so that "git diff -W" and friends would work better.
- Existing autoconf generated test for the need to link with pthread library did not check all the functions from pthread libraries; recent FreeBSD has some functions in libc but not others, and we mistakenly thought linking with libc is enough when it is not.
- Allow http daemon tests in Travis CI tests.
- Users of the parse_options_concat() API function need to allocate extra slots in advance and fill them with OPT_END() when they want to decide the set of supported options dynamically, which makes the code error-prone and hard to read. This has been corrected by tweaking the API to allocate and return a new copy of "struct option" array.
- The use of strbuf in "git rm" to build filename to remove was a bit suboptimal, which has been fixed.
- "git commit --help" said "--no-verify" is only about skipping the pre-commit hook, and failed to say that it also skipped the commit-msg hook.
- "git merge" in Git v2.9 was taught to forbid merging an unrelated lines of history by default, but that is exactly the kind of thing the "--rejoin" mode of "git subtree" (in contrib/) wants to do. "git subtree" has been taught to use the "--allow-unrelated-histories" option to override the default.
- The build procedure for "git persistent-https" helper (in contrib/) has been updated so that it can be built with more recent versions of Go.
- There is an optimization used in "git diff $treeA $treeB" to borrow an already checked-out copy in the working tree when it is known to be the same as the blob being compared, expecting that open/mmap of such a file is faster than reading it from the object store, which involves inflating and applying delta. This however kicked in even when the checked-out copy needs to go through the convert-to-git conversion (including the clean filter), which defeats the whole point of the optimization. The optimization has been disabled when the conversion is necessary.
- "git -c grep.patternType=extended log --basic-regexp" misbehaved because the internal API to access the grep machinery was not designed well.
- Windows port was failing some tests in t4130, due to the lack of inum in the returned values by its lstat(2) emulation.
- The characters in the label shown for tags/refs for commits in "gitweb" output are now properly escaped for proper HTML output.
- FreeBSD can lie when asked mtime of a directory, which made the untracked cache code to fall back to a slow-path, which in turn caused tests in t7063 to fail because it wanted to verify the behaviour of the fast-path.
- Squelch compiler warnings for netmalloc (in compat/) library.
- The API documentation for hashmap was unclear if hashmap_entry can be safely discarded without any other consideration. State that it is safe to do so.
- Not-so-recent rewrite of "git am" that started making internal calls into the commit machinery had an unintended regression, in that no matter how many seconds it took to apply many patches, the resulting committer timestamp for the resulting commits were all the same.
- "git difftool <paths>…" started in a subdirectory failed to interpret the paths relative to that directory, which has been fixed.
Also contains minor documentation updates and code clean-ups.
2.9.4
Git v2.9.4 Release Notes ========================
Fixes since v2.9.3 ------------------
- There are certain house-keeping tasks that need to be performed at the very beginning of any Git program, and programs that are not built-in commands had to do them exactly the same way as "git" potty does. It was easy to make mistakes in one-off standalone programs (like test helpers). A common "main()" function that calls cmd_main() of individual program has been introduced to make it harder to make mistakes.
- "git merge" with renormalization did not work well with merge-recursive, due to "safer crlf" conversion kicking in when it shouldn’t.
- The reflog output format is documented better, and a new format --date=unix to report the seconds-since-epoch (without timezone) has been added.
- "git push --force-with-lease" already had enough logic to allow ensuring that such a push results in creation of a ref (i.e. the receiving end did not have another push from sideways that would be discarded by our force-pushing), but didn’t expose this possibility to the users. It does so now.
- "import-tars" fast-import script (in contrib/) used to ignore a hardlink target and replaced it with an empty file, which has been corrected to record the same blob as the other file the hardlink is shared with.
- "git mv dir non-existing-dir/" did not work in some environments the same way as existing mainstream platforms. The code now moves "dir" to "non-existing-dir", without relying on rename("A", "B/") that strips the trailing slash of ’/’.
- The "t/" hierarchy is prone to get an unusual pathname; "make test" has been taught to make sure they do not contain paths that cannot be checked out on Windows (and the mechanism can be reusable to catch pathnames that are not portable to other platforms as need arises).
- When "git merge-recursive" works on history with many criss-cross merges in "verbose" mode, the names the command assigns to the virtual merge bases could have overwritten each other by unintended reuse of the same piece of memory.
- "git checkout --detach <branch>" used to give the same advice message as that is issued when "git checkout <tag>" (or anything that is not a branch name) is given, but asking with "--detach" is an explicit enough sign that the user knows what is going on. The advice message has been squelched in this case.
- "git difftool" by default ignores the error exit from the backend commands it spawns, because often they signal that they found differences by exiting with a non-zero status code just like "diff" does; the exit status codes 126 and above however are special in that they are used to signal that the command is not executable, does not exist, or killed by a signal. "git difftool" has been taught to notice these exit status codes.
- On Windows, help.browser configuration variable used to be ignored, which has been corrected.
- The "git -c var[=val] cmd" facility to append a configuration variable definition at the end of the search order was described in git(1) manual page, but not in git-config(1), which was more likely place for people to look for when they ask "can I make a one-shot override, and if so how?"
- The tempfile (hence its user lockfile) API lets the caller to open a file descriptor to a temporary file, write into it and then finalize it by first closing the filehandle and then either removing or renaming the temporary file. When the process spawns a subprocess after obtaining the file descriptor, and if the subprocess has not exited when the attempt to remove or rename is made, the last step fails on Windows, because the subprocess has the file descriptor still open. Open tempfile with O_CLOEXEC flag to avoid this (on Windows, this is mapped to O_NOINHERIT).
- "git-shell" rejects a request to serve a repository whose name begins with a dash, which makes it no longer possible to get it confused into spawning service programs like "git-upload-pack" with an option like "--help", which in turn would spawn an interactive pager, instead of working with the repository user asked to access (i.e. the one whose name is "--help").
Also contains minor documentation updates and code clean-ups.
2.9.5
Git v2.9.5 Release Notes ========================
This release forward-ports the fix for "ssh://…" URL from Git v2.7.6
2.98.0
Git v2.98 Release Notes =======================
This is meant to be the antepenultimate release to prepare for the long anticipated Git 3.0 which has been vaporware for so long.
UI, Workflows & Features ------------------------
- The experimental ’git history’ command has been taught a new ’squash’ subcommand to fold a range of commits into a single commit, with any descendants replayed on top.
- A new hook ’report’ is added to ’git receive-pack’, which runs after reference updates and allows the server to filter or modify the packet-line status report sent back to the client.
- The terminology regarding reference storage formats has been unified across command-line options, environment variables, configuration variables, and source code, standardizing on the phrase "ref storage format" (e.g.,
--ref-storage-format,’GIT_REF_STORAGE_FORMAT’). Additionally, the--ref-storage-formatoption has been updated to accept payloads in the form<format>://<payload>.
- The build-time knob ’USE_NSEC’ for nanosecond stat precision has been converted to a runtime configuration ’core.useNanosec’, allowing distributions to bundle one binary that adapts to filesystem capabilities dynamically.
- The command-line completion script (in ’contrib/’) has been taught to complete the ’repair’ subcommand for ’git worktree’.
- Various documentation files have been updated to use explicit ’TARGET’ AsciiDoc cross-references instead of plain text references. This improves rendering on the web and avoids broken links when manual pages are included into other pages.
- The ’git var’ command has been updated to output individual components of the author and committer identities, take multiple keys on the command-line, and support NUL-delimited output with the ’-z’ option.
- The ’git-contacts’ program (in contrib/) has been taught to read patches from the standard input stream when an explicit dash (’-’) is passed in place of a file.
- The @{upstream} notation had short-hand @{u} from the beginning, and @{push} learned corresponding @{p} to match.
- The ’format-patch’ command has been updated with options to configure notes specifically for range-diff output, allowing them to differ from the notes displayed on the patches themselves.
- Validation of the ’fetch.followRemoteHEAD’ configuration variable has been deferred to when it is actually used, preventing irrelevant warnings during ’git fetch’ invocations that do not consult it.
- "git status" now suggests to use ’git merge --continue’, not ’git commit’, when done with conflicts during a ’git merge’.
- A new ’uploadpack.lazyFetchTrusted’ configuration variable has been introduced to allow ’upload-pack’ to lazily fetch missing objects from configured promisor remotes when serving trusted repositories.
- Unicode character width table has been updated to match Unicode 18 announced on 2026-09-16.
- When recreating a merge conflict using ’git checkout -m’, the original conflict labels (such as branch names) were lost and replaced with generic ones. The merge machinery has been updated to record the original labels in ’.git/MERGE_LABELS’, allowing ’git checkout -m’ to restore them.
- The git history command and its subcommands have been updated to honor the commit.gpgSign configuration variable and accept the --gpg-sign and --no-gpg-sign command-line options, ensuring both rewritten commits and their replayed descendants are cryptographically signed by the committer.
- The progress message emitted by the ’delta-islands’ subsystem has been updated to use the Q_() macro, allowing translators to properly handle plural forms based on the number of islands marked.
- ’git blame’ and ’git annotate’ have been updated to automatically use the ’.git-blame-ignore-revs’ file from the working tree (or ’HEAD:.git-blame-ignore-revs’ in bare repositories) as the default ignore list if it exists, and the parser has been hardened.
- The earliest part of ’man git’ has been rewritten to explain various ways to use ’git help’ to get help.
- The conditional configuration inclusion mechanism via ’includeIf’ has been extended to support matching the machine’s hostname, and the system’s hostname as seen by Git can now be queried using ’git var GIT_HOSTNAME’.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
- The setup of alternates has been deferred to object database creation time during clone, which drops the unused ad-hoc alternate writing API, simplifying the object database backend interface.
- Updates to Coccinelle semantic patches to correctly handle the ’FREE_AND_NULL()’ macro and avoid generating broken transformations for negated pointer checks.
- The ’Makefile’ has been taught to precompile ’git-compat-util.h’ to speed up overall compilation, while excluding sources that do not include the compatibility header.
- The can_all_from_reach() and can_all_from_reach_with_flag() functions have been updated to accept a repository context, preventing bugs where submodule merging incorrectly reads from the superproject’s commit-graph.
- The error reporting machinery in the WinANSI compatibility layer has been simplified to pass the exact Windows error code and correctly format arguments for fatal errors.
- The Debian 12 CI job has been updated to skip a half-auth clone test that occasionally fails due to a bug in the packaged curl version handling early HTTP/2 responses.
- The CI script has been updated to check for one-indexed slice numbers when deciding to run unit tests on Windows, mirroring the behaviour in the modern GitHub and GitLab workflows.
- The Windows GitLab CI job has been updated to provision and use the GCC-targeting Rust toolchain for MinGW builds, fixing job failures caused by incomplete Rust setup and missing linker support.
- The external merge driver in ’git merge’ now uses the tempfile API to create its temporary files. This ensures that these temporaries are reliably cleaned up even when the merge driver or its parent Git process is terminated abruptly.
- The performance test for
gitfetchpack-dir rescans has been updated to use the--no-derefoption when cleaning up remote-tracking branches. This preventsgitupdate-reffrom failing with a multiple updates error when both a symref and its target are deleted in the same transaction.
- The build configurations for Meson have been optimized to avoid recompiling HTTP sources multiple times and to utilize precompiled headers for test-helpers and unit tests, reducing clean build times. Additionally, the shell completion tests and GitLab CI MSVC runner jobs have been fixed.
- The handling of index conflicts in ’git stash apply --index’ has been optimized. Instead of relying on expensive external subprocesses using ’git diff-tree’ and ’git apply’, the index is now merged in-core using the merge-ort machinery, which fixes a concurrent lock file issue with autostash.
- The parse-options API has been updated to support grouping subcommands, and the ’git refs’ command has been updated to use this new feature to categorize its subcommands in its help output.
- Fix definition for the "--all" option to use symbolic constant in the options[] array passed to parse_options API.
- The shell quoting of a lazy prereq script was quoted incorrectly and allowed variables dereferenced at the wrong moment, breaking the curl version detection.
- The requirement for a ’SYNOPSIS’ section in section 7 manual pages has been relaxed by updating the linter script, and dummy ’SYNOPSIS’ sections from existing section 7 documentation have been removed to improve the rendered output
- A test script (t0450) has been updated to use the test_path_is_file and test_path_is_missing helper functions, which provides better diagnostic output on failure.
- The routine that rewrites the packed-refs file has been optimized to directly pass unmodified reference records verbatim to the output via fwrite(3p), instead of redundantly re-formatting them with fprintf(3p).
- The fetch.writeCommitGraph behavior has been optimized to incrementally update the commit graph using only the newly fetched commits as seeds. This avoids a full reachability scan of all references and drastically reduces the post-fetch commit-graph update time for repositories with many references.
- The odb_source API has been refactored to make alternates an implementation detail of the files backend instead of managing them at the core object database layer.
- The test for verifying a signed tag with a missing key has been updated to point GNUPGHOME to an unused directory rather than deleting the active gpghome directory, working around a flaky rm failure caused by the background gpg-agent observed on Alpine.
- CI on GitHub Actions gets a better annotation experience. Leak test scripts are stopped at their first failure with --immediate to prevent flooding the log, and failures are correctly annotated with their file and line number.
- The repository initialization sequence has been refactored to treat the repository object passed to create_repository() purely as an out-parameter.
- The object database "files" backend has been optimized to check packfiles across all alternate object directories before falling back to checking loose objects, significantly reducing the number of ’stat(3p)’ system calls. Additional refactoring drops the generic ’local’ flag from the object database source interface in favor of backend-specific fields, and simplifies the retry loop for missing objects.
- The lazy prerequisite set-up script can be fed as a here-doc, just like test_expect_{success,failure} scripts these days.
- The ’git bundle create’ command has been updated to initialize the revs_copy structure at declaration. This prevents a potential crash caused by reading uninitialized stack memory during cleanup when an unrecognized argument is provided.
- The macOS CI jobs have been updated to use a mixture of ’macos-15’ and ’macos-latest’ images, as the ’macos-14’ hosted runner image is being deprecated by GitHub.
- The test in ’t5301’ has been modernized to use the ’test_path_is_file’ helper instead of the raw ’test -f’ command.
- The Makefile has been updated to explicitly pass '--target-dir target’ to ’cargo’ when building the ’gitcore’ library, fixing a link error that occurs when the user has a custom target directory configured via ’CARGO_TARGET_DIR’ or their Cargo configuration.
- A test script (’t2104’) has been updated to avoid piping the output of a ’git’ command into another command, which would hide its exit code.
Fixes since v2.56 -----------------
- Updates to Coccinelle semantic patches to correctly handle the ’FREE_AND_NULL()’ macro and avoid generating broken transformations for negated pointer checks. (merge 32814b69d0 jc/cocci-free-updates later to maint).
- The files backend has been updated to avoid unconditionally locking the ’packed-refs’ file when deleting a root ref (which are never packed). (merge d8e4585822 ak/refs-files-root-ref-lock later to maint).
- The server-side protocol v2 response order for ’wanted-refs’ and ’shallow-info’ has been swapped to match the client’s expectation, fixing a fetch failure when the server has ’uploadpack.allowRefInWant’ enabled and the client performs a shallow fetch. (merge 191740edaa rr/upload-pack-swap-shallow-wanted-ref later to maint).
- Assorted fixes for code paths that are not careful with boundary and error conditions. (merge c88341b7e1 js/coverity-fixes later to maint).
- A bug in git diff --no-index that mishandled reverse (-R) output when conflicts existed between a file and a directory has been fixed. (merge 9a13b3742b hd/diff-no-index-reverse-fix later to maint).
- ’git pull’ has been taught to fail more gracefully instead of segfaulting when lookup_commit_reference() fails on unparseable objects. (merge 38bdda17dd jk/pull-null-merge-head later to maint).
- The sequencer machinery (used by ’git rebase’, ’git cherry-pick’, and ’git revert’) has been updated to defer automatic maintenance tasks until the end of the operation, preventing nested ’git commit’, ’git merge’, and ’exec’ commands from triggering GC operations that could contend for locks or delete open packs while the sequence is in progress. (merge eba1a1c5dd tb/rerere-lock-grace later to maint).
- When ’core.fsyncMethod’ is set to ’batch’, the ODB transaction failed to properly flush large blob packfiles residing in the temporary directory before migrating the directory’s contents to the main object store. The execution sequence has been corrected by performing the packfile flush before the temporary directory migration, averting failure. (merge ef7faa6350 jt/object-file-batch-fsync-fix later to maint).
- The default expiry periods for both reachable and unreachable reflog entries have been corrected from a past regression that swapped them. (merge 60cf500551 ps/reflog-expiry-fix later to maint).
- The directory traversal logic has been updated to correctly evaluate pathspecs for ignored directories containing nested repositories, and has been fortified to gracefully handle null pathspecs during checkout operations. (merge ebc067f3cc rs/dir-skip-nested-repo-fix later to maint).
- The command-line parsing of revision options has been updated to properly distinguish between malformed and unknown options, and to correctly report the name of unknown options after they have been moved during the option parsing process. (merge da2926c8f5 jk/parse-revision-opt-fixes later to maint).
- The documentation for ’git-name-rev’ has been updated to refer to object IDs instead of SHA-1, to more accurately reflect that the active hash algorithm is used. (merge b2ab8fccc3 jk/name-rev-update-hash-descriptions later to maint).
- The HTTP transport has been updated to handle changes in recent curl versions that strip credentials from the effective URL, preventing unnecessary credential prompts during redirects. (merge 76524c2604 jk/http-curl-strip-creds later to maint).
- The timestamp used for checking the reflog of a remote-tracking branch during ’git push --force-if-includes’ was left uninitialized when the reflog was completely empty, which has been corrected. (merge c84ed3a0ab as/push-force-if-includes-no-reflog later to maint).
- CI resource exhaustion during test runs on GitHub Actions has been mitigated by switching a comparison of a huge output to use a binary comparison, and by capping the parallel jobs on Linux to the number of available CPUs. (merge 4f956cf43a td/ci-large-test-resources later to maint).
- The
t5520test script has been updated to disable reflog expiration. This prevents test flakiness caused by the auto-maintenance reflog-expire task, which would otherwise immediately expire the test’s reflogs due to them carrying hardcoded timestamps from 2005. (merge a68cca9953 tb/t5520-reflog-expire later to maint).
- The internal representation of timezones in the reflog for the reftable format has been fixed to match the specification, which dictates an offset in minutes rather than the parsed "+HHMM" integer representation. (merge e14e2b6cf2 ps/reftable-reflog-timezone later to maint).
- The internal diff and merge machinery has been updated to use standard size_t types rather than signed longs for buffer allocations and offsets, preventing subtle overflow issues on LLP64 architectures, and plugging uninitialized memory leaks along error paths. (merge 5b0456361d jk/xdiff-size_t later to maint).
- The documentation for ’git remote set-head’ has been updated to clarify that it only modifies the local repository’s remote-tracking symbolic reference, and does not alter the target remote repository’s own ’HEAD’. (merge c5f8f60719 mg/doc-remote-set-head later to maint).
- The commit map populated from the state branch in ’git filter-branch’ has been corrected to parse the map using the original-to-rewritten order. (merge 4811dabed7 gm/filter-branch-state-map-fix later to maint).
- The documentation for core.pager has been updated to provide examples of overriding the LESS environment variable for custom pagers by prefixing the pager command in the configuration. (merge c7860da7db tz/doc-override-less-env later to maint).
- Closing a packfile did not evict the entries belonging to it from the delta base cache, which could lead to data corruption when a newly allocated packfile happened to reuse the same memory address. The cache eviction logic has been updated to remove these stale entries upon closing a pack (merge 8d596ea8e7 ps/packfile-stale-delta-base-cache-fix later to maint).
- A boundary check in ’git fsck’ against the big file threshold has been corrected to prevent bogus corruption reports on packed objects whose sizes exactly match the threshold. (merge a9456705f1 ps/pack-check-bigfile-threshold later to maint).
- The ’from’ command in ’git fast-import’ has been updated to correctly resolve references to newly created commits and tags by checking the internal object table, preventing a crash when the objects are not yet available in the object database. (merge c1cdd3151e mb/fast-import-reference-pending later to maint).
- The branch decoration logic in the sequencer has been updated to use an allocated buffer for the HEAD reference name, preventing it from being clobbered when evaluating branches checked out in other worktrees. (merge 56e490a9b5 ak/sequencer-head-refdup later to maint).
- Various CI jobs have been updated to use modern OS images, drop dead code, and remove redundant jobs. Support for Python 2 in CI has been removed, and the linux-TEST-vars job has been renamed to linux-feature-testbed. (merge 3fff230cf5 ps/ci-housekeeping-and-modernizations later to maint).
- Instead of failing to record conflicts to be resolved immediately, wait while "rerere gc" is ongoing. (merge 5f6b6aa3ab tb/rerere-wait-for-merge-rr-lock later to maint).
- The '--dry-run’ option of ’git repack --drop-filtered’ used to actually rebuild packs and delete redundant ones, which has been corrected to only list the candidates without making changes. (merge facedc705c ss/repack-drop-filtered-dry-run later to maint).
- The internal write_index_as_tree() function has been updated to take the index lock gently. This allows it to skip the optional cache-tree write-back when the lock is held by another process, preventing commands like ’git rebase’ from dying due to background tasks holding the lock. (merge 440b7035bb sw/cache-tree-ignore-locked-index later to maint).
- The internal config file parser has been updated to treat the content read from a blob as a sequence of unsigned bytes, preventing bytes with the high bit set from being mistakenly interpreted as ’EOF’. (merge 074aaaf4f0 of/config-buf-fgetc-unsigned later to maint).
- The ZIP archive creation code has been updated to omit the ’UT’ extended timestamp extra field when the commit time exceeds the 32-bit positive signed integer limit, avoiding integer wraparound for dates past the year 2038. (merge 24e00cde86 rs/archive-zip-omit-out-of-range-mtime later to maint).
- The loose refs cache in the files backend has been updated to avoid caching root refs (like ’HEAD’), preventing them from being omitted from subsequent iterators that explicitly request them when a previous iterator populated the cache without them. (merge 7f4e8cd956 ak/refs-files-root-refs-cache later to maint).
- Other code cleanup, docfix, build fix, etc. (merge e638de60bc kz/doc-add-rm-typofix later to maint). (merge 778c73948a kz/doc-user-manual-typo later to maint). (merge 42017ff979 kh/doc-trailers-cmd-examples later to maint). (merge 49e646f1c9 dk/fix-shattered-io-link later to maint).