GIT Changelog

What's new in GIT 2.20.1

Dec 17, 2018
  • 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 un_command API failed to run a missing command, which has been corrected.

New in GIT 2.17.1 (May 29, 2018)

  • 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.
  • 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.

New in GIT 2.17.0 (Apr 13, 2018)

  • UI, Workflows & Features
  • * "diff" family of commands learned "--find-object=" 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=" 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 }"; 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:// URL with a username@ (typically used for pushing) refers
  • 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" 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 -- " 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 sharable.
  • (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" (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 promissor 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).

New in GIT 2.16.3 (Mar 23, 2018)

  • "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" 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 sharable.
  • 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" (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).

New in GIT 2.16.2 (Feb 19, 2018)

  • 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:// URL with a username@ (typically used for pushing) refers 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 -- " 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.

New in GIT 2.14.3 (Oct 25, 2017)

  • 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: # cruft", "cc: [email protected] # cruft" was taught to "git send-email" as a valid way to tell it that it needs to also send a carbon copy to 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 .. 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' 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 :" allows an object name on the 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.

New in GIT 2.14.1 (Aug 12, 2017)

  • This release forward-ports the fix for "ssh://..." URL from Git v2.7.6

New in GIT 2.13.3 (Jul 13, 2017)

  • 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 unnecessarilyl 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 ahs 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.

New in GIT 2.13.0 (May 10, 2017)

  • SHA-1 collision detection:
  • Did I say fun? Oops, we're not there yet.
  • You may have heard that researchers recently found the first collision in SHA-1, the hash function Git uses to identify objects. Their techniques may eventually be used to conduct collision-based attacks against Git users. Fortunately those same researchers also provided a way to detect content that is trying to exploit this technique to create collisions. In March, GitHub.com began using that implementation to prevent it being used as a potential platform for conducting collision attacks.
  • Git 2.13 ships with similar changes, and will detect and reject any objects that show signs of being part of a collision attack. The collision-detecting SHA-1 implementation is now the default. The code is included with Git, so there's no need to install any additional dependencies. Note that this implementation is slower than the alternatives, but in practice this has a negligible effect on the overall time of most Git operations (because Git spends only a small portion of its time computing SHA-1 hashes in the first place).
  • In other collision detection news, efforts have continued to develop a transition plan and to prepare the code base for handling new hash functions, which will eventually allow the use of stronger hash algorithms in Git.
  • [collision detection, SHA-1 transition 1, SHA-1 transition 2]
  • More convenient pathspecs
  • You've probably passed path arguments to Git before, like...
  • $ git log foo.c
  • $ git grep my_pattern program.rb
  • But you may not have known that to Git, the foo.c and program.rb arguments are actually pathspecs, a Git-specific pattern for matching paths. Pathspecs can be literal paths, prefixes, or wildcards:
  • $ git log Documentation/ # Everything under the Documentation/ directory
  • $ git log '*.c' # C files anywhere in the tree
  • But they also have a powerful extension syntax. Pathspecs starting with :(magic) enable special matching features. The complete list can be found in the pathspec section of git help glossary, but let's look at a few here.
  • For instance, you may want to exclude some files from a grep, which you can do with the :(exclude) directive:
  • $ git grep this.is.a src
  • src/foo.c:this is a C file
  • src/foo.rb:this is a ruby file
  • $ git grep this.is.a -- src ':(exclude)*.c'
  • src/foo.rb:this is a ruby file
  • There are a few things to note in that example. The first is that we had to put our pathspec after a -- (double-dash) separator. This is necessary because most Git commands actually take a combination of revisions and pathspecs. The full syntax is [< revisions >] -- [< pathspecs >]. If you omit the double-dash, Git will check each argument to see if it's either a valid object name or a file in the filesystem. But since our exclude pattern is neither, without the double-dash Git would give up and complain (this may change in a future version of Git; wildcards like *.c used to have the same problem, but the rules were recently loosened to resolve them as pathspecs). More information is available via git help cli.
  • The second thing to note is that typing :(exclude) is a pain, and we have to quote it from the shell. But there's a solution for that: short form pathspec magic. The short form for exclude is ! (exclamation point). This is easy to remember, since it matches the syntax in other parts of Git, like .gitignore files.
  • $ git grep this.is.a -- src ':!*.c'
  • src/foo.rb:this is a ruby file
  • That's shorter than exclude, but we still have to quote, since the exclamation point triggers history expansion in most shells. Git 2.13 adds ^ (caret) as a synonym for the exclamation point, letting you do the same thing without any shell quoting:
  • $ git grep this.is.a -- src :^*.c
  • src/foo.rb:this is a ruby file
  • Ah, much better. Technically we would need to also quote the *.c wildcard from the shell, but in practice it works out. Unless you have a file that starts with :^ and ends in .c, the shell will realize that the wildcard matches nothing and pass it through to Git verbatim.
  • But wait, there's more! Git 2.13 also adds the attr token, which lets you select files based on their gitattributes values. For instance, if you use Git LFS, you may want to get a list of files which have been configured to use it:
  • $ git ls-files
  • .gitattributes
  • README
  • video.mp4
  • $ git ls-files ':(attr:filter=lfs)'
  • video.mp4
  • You can even define your own attributes in order to group files. Let's say you frequently want to grep a certain set of files. You can define an attribute, and then select those files using that attribute:
  • $ echo 'libfoo/ vendored' >>.gitattributes
  • $ echo 'imported-tool/ vendored' >>.gitattributes
  • $ git grep -i license -- ':(attr:vendored)'
  • And if you want to get really fancy, you can combine the attr and exclude tokens:
  • $ git grep foobar -- ':(exclude,attr:vendored)'
  • Note that the attr token is not yet supported in all parts of the code. Some commands may report that it cannot be used with them, but this is likely to be expanded in future versions of Git.
  • Conditional configuration:
  • Git's configuration system has several levels of priority: you can specify options at the system level, the user level, the repository level, or for an individual command invocation (using git -c). In general, an option found in a more specific location overrides the same option found in a less specific one. Setting user.email in a repository's .git/config file will override the user-level version you may have set in ~/.gitconfig.
  • But what if you need to set an option to one value for a group of repositories, and to another value for a different group? For example, you may use one name and email address when making commits for your day job and another when working on open source. You can set the open source identity in the user-level config in your home directory and then override it in the work repositories. But that's tedious to keep up to date, and if you ever forget to configure a new work repository, you'll accidentally make commits with the wrong identity!
  • Git 2.13 introduces conditional configuration includes. For now, the only supported condition is matching the filesystem path of the repository, but that's exactly what we need in this case. You can configure two conditional includes in your home directory's ~/.gitconfig file:
  • [includeIf "gitdir:~/work/"]
  • path = .gitconfig-work
  • [includeIf "gitdir:~/play/"]
  • path = .gitconfig-play
  • Now you can put whatever options you want into those files:
  • $ cat ~/.gitconfig-work
  • [user]
  • name = Serious Q. Programmer
  • email = [email protected]
  • $ cat ~/.gitconfig-play
  • [user]
  • name = Random J. Hacker
  • email = [email protected]
  • The appropriate config options will be applied automatically whenever you're in a repository that's inside your work or play directories.
  • Bits and bobs:
  • --decorate=auto is now the default for git log. When output is sent to the user's terminal, commits that are pointed to directly by a branch or tag will be "decorated" with the name of the branch.
  • git branch's output routines have been ported to the ref-filter system shared by git for-each-ref and git tag. This means you can now use git branch --format= to get custom output. See git help for-each-ref for the list of substitutions. As a side note, these patches are from Karthik Nayak, Git's Google Summer of Code student from 2015. Though his GSoC project to introduce ref-filter was completed almost two years ago, he's continued contributing to the project. Great work!
  • git branch, git tag, and git for-each-ref all learned the --no-contains option to match their existing --contains option. This can let you ask which tags or branches don't have a particular bug (or bugfix).
  • git stash now accepts pathspecs. You can use this to create a stash of part of your working tree, which is handy when picking apart changes to turn into clean commits.
  • The special branch names @{upstream}, @{u}, and @{push} are now case-insensitive. This is especially convenient as both @ and { require holding down the shift key on most keyboards, making it easy to accidentally type a capital U. Now you can hold that shift key AS LONG AS YOU WANT.
  • More commands have learned to recurse into submodules in the past few versions of Git, including checkout, grep, and ls-files. git status --short also now reports more information about submodules. [source, source, source, source]
  • The last few versions of Git have cleaned up many corner cases around repository discovery and initialization. As a final step in that work, Git 2.13 introduced a new assertion to catch any cases that were missed. After being tested for months in development versions, this shouldn't trigger. But it's possible that you may see BUG: setup_git_env called without repository. If you do, please consider making a bug report.

New in GIT 2.12.2 (Mar 30, 2017)

  • "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..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 ... [[--] ...]" 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.

New in GIT 2.12.0 (Feb 25, 2017)

  • 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 simultanously 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 multile 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).

New in GIT 2.11.1 (Feb 6, 2017)

  • 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..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 multile 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" 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 @{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.

New in GIT 2.10.2 (Nov 1, 2016)

  • 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.
  • An author name, that spelled a backslash-quoted double quote in the human readable part "My "double quoted" name", was not unquoted correctly while applying a patch from a piece of e-mail.
  • The original command line syntax for "git merge", which was "git merge HEAD ...", 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):// before the destination. To some folks, that didn't work 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 " 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..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..url next to each other as if both belong to .git/config. This has been fixed.
  • Recent git allows submodule..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 reopsitory, 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.

New in GIT 2.10.0 (Sep 5, 2016)

  • 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/" 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 `git log` family 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 usuall 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 ..." 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 " used to give the same advice message as that is issued when "git checkout " (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).

New in GIT 2.9.3 (Aug 16, 2016)

  • * 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 usuall 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 ..." started in a subdirectory failed to interpret the paths relative to that directory, which has been fixed.

New in GIT 2.9.2 (Jul 21, 2016)

  • 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.

New in GIT 2.9.1 (Jul 12, 2016)

  • 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 `git log` family 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.

New in GIT 2.9.0 (Jun 14, 2016)

  • 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.= 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.
  • A test for tags has been restructured so that more parts of it can easily be run on a platform without a working GnuPG.
  • 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[=] 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 " was broken when its command line option parsing was written in the 2.6 timeframe.
  • "git format-patch --help" showed `-s` and `--no-patch` as if these are valid options to the command. We already hide `--patch` option 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:// proxy support added back in 2.6.4 days was not aware that socks5h:// proxies behave differently from socks5:// proxies.
  • "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 http://thread.gmane.org/gmane.comp.version-control.git/291853
  • "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".
  • "http.cookieFile" configuration variable clearly wants a pathname, but we forgot to treat it as such by e.g. applying tilde expansion.
  • 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:' 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 " (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).

New in GIT 2.8.4 (Jun 8, 2016)

  • 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 " (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:' 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.
  • "http.cookieFile" configuration variable clearly wants a pathname, but we forgot to treat it as such by e.g. applying tilde expansion.
  • 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".

New in GIT 2.8.3 (May 20, 2016)

  • "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 `-s` and `--no-patch` as if these are valid options to the command. We already hide `--patch` option 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:// proxy support added back in 2.6.4 days was not aware that socks5h:// proxies behave differently.
  • "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 http://thread.gmane.org/gmane.comp.version-control.git/291853 and http://thread.gmane.org/gmane.comp.version-control.git/275680.
  • "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.

New in GIT 2.8.2 (May 1, 2016)

  • 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=" 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 " 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.

New in GIT 2.8.1 (Apr 5, 2016)

  • "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.

New in GIT 2.8.0 (Mar 29, 2016)

  • 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=", 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 " 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 ") 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 "^{/!-}" notation can be used to name a commit that is reachable from that does not match the given .
  • 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.[.]emptyAuth configuration variable to achieve the same, if you find it cleaner.
  • You can now set http.[.]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 protrams 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.

New in GIT 2.7.4 (Mar 18, 2016)

  • 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.

New in GIT 2.7.3 (Mar 11, 2016)

  • 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 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 ") 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.

New in GIT 2.7.2 (Feb 24, 2016)

  • 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.

New in GIT 2.7.1 (Feb 8, 2016)

  • 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_exclude_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.

New in GIT 2.7.0 (Jan 5, 2016)

  • 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 reencode 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. * Allocation related functions and stdio are unsafe things to call inside a signal handler, and indeed killing the pager can cause glibc to deadlock waiting on allocation mutex as our signal handler tries to free() some data structures in wait_for_pager(). Reduce these unsafe calls. * 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 "[]" 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.

New in GIT 2.6.4 (Dec 9, 2015)

  • 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.

New in GIT 2.6.3 (Nov 8, 2015)

  • 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 "[]" 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.

New in GIT 2.6.2 (Oct 17, 2015)

  • 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.
  • Allocation related functions and stdio are unsafe things to call inside a signal handler, and indeed killing the pager can cause glibc to deadlock waiting on allocation mutex as our signal handler tries to free() some data structures in wait_for_pager(). Reduce these unsafe calls.
  • 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.

New in GIT 2.6.1 (Oct 6, 2015)

  • 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 soemwhere 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.

New in GIT 2.6.0 (Sep 29, 2015)

  • 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=" 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 =" with "pair=key=value" specification, which instead would have defined a "--pair=key " 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 :///), tried to use the site name as the new repository name, but did not remove username or password when part was of the form @:. 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=. 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).

New in GIT 2.5.3 (Sep 18, 2015)

  • 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.

New in GIT 2.5.2 (Sep 11, 2015)

  • "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.

New in GIT 2.5.1 (Aug 29, 2015)

  • 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 =" with "pair=key=value" specification, which instead would have defined a "--pair=key " 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=. 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.

New in GIT 2.5.0 (Jul 27, 2015)

  • 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 " 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 @{push} denotes the remote-tracking branch that tracks the branch at the remote the 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 " 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 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..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 $gmane/87202 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=" and "git clone --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 "!" 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).

New in GIT 2.4.6 (Jul 16, 2015)

  • "git fetch --depth=" and "git clone --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.

New in GIT 2.4.5 (Jun 26, 2015)

  • 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).

New in GIT 2.4.4 (Jun 17, 2015)

  • 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.

New in GIT 2.4.3 (Jun 6, 2015)

  • 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 portabile across platforms while terminating lines in their working tree files with CRLF for their platform.
  • Code clean-up for xdg configuration path support.

New in GIT 2.4.2 (May 27, 2015)

  • "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.

New in GIT 2.4.1 (May 14, 2015)

  • 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).

New in GIT 2.4.0 (May 4, 2015)

  • 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=" 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..pushURL" and "remote..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).

New in GIT 2.3.7 (Apr 28, 2015)

  • An earlier update to the parser that disects 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.

New in GIT 2.3.6 (Apr 22, 2015)

  • "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).

New in GIT 2.3.5 (Apr 2, 2015)

  • 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.

New in GIT 2.3.4 (Mar 24, 2015)

  • 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.

New in GIT 2.3.3 (Mar 14, 2015)

  • 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.
  • Documentaton 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.

New in GIT 2.3.1 (Feb 26, 2015)

  • 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=" 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".

New in GIT 2.3.0 (Feb 6, 2015)

  • 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=" 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= 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).

New in GIT 2.2.2 (Jan 13, 2015)

  • "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= 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.

New in GIT 2.2.1 (Dec 18, 2014)

  • 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" 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=" 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 the rebase is to be done when telling it to first check out . (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 `--output` option. (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).

New in GIT 2.2.0 (Nov 27, 2014)

  • 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" 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=" 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 the rebase is to be done when telling it to first check out . (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 `--output` option. (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).

New in GIT 2.2.0 RC1 (Nov 8, 2014)

  • Updates since v2.1:
  • Ports:
  • Building on older MacOS X systems automatically sets the necessary NO_APPLE_COMMON_CRYPTO build-time option.
  • The support to build with NO_PTHREADS has been resurrected.
  • Compilation options has been updated a bit to support z/OS port better.
  • UI, Workflows & Features:
  • "git archive" learned to filter what gets archived with 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. This immediately reduces the need for a later "Have you forgotten setting 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 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 and 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" allows to paint (or not paint) partial matches on context lines when showing "grep -C" output in color.
  • "log --date=iso" uses a slight variant of ISO 8601 format that is made more human readable. A new "--date=iso-strict" option gives datetime output that is more strictly conformant.
  • 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 higher stage entries, or if it wanted to unresolve and forgot to remove the stage#0 entry).
  • The temporary files "git mergetool" uses are named 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").
  • The temporary files "git mergetools" 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".
  • 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 expanded 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.
  • "git help everyday" shows the "Everyday Git in 20 commands or so" document, whose contents have been updated to more modern Git practice.
  • On the "git svn" front, work to reduce memory consumption and to improve handling of mergeinfo progresses.
  • Performance, Internal Implementation, 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 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.
  • Looking up remotes configuration in a repository with very many remotes defined has been optimized.
  • There are cases where you lock and open to write a file, close it to show the updated contents to external processes, and then have to update the file again while still holding the lock, but the lockfile API lacked 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 number of 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 "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 too large a 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 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 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 "-x" option to show a shell-trace of each command run in them.
  • The "run-command" API learned to manage the argv and environment array 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, as AsciiDoctor is pickier than AsciiDoc in 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 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 the whitespace breakage using the attributes for incorrect paths. Also whitespace checks were performed even for paths excluded via "git apply --exclude=" mechanism.
  • "git bundle create" with date-range specification were meant to exclude tags outside the range, but it didn't.
  • "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.
  • 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 overflown 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 the rebase is to be done when telling it to first check out . (merge 95c6826 so/rebase-doc later to maint).
  • "git push" over HTTP transport had an artificial limit on 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" used to lose existing section.var whose value was an empty string. (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 "--verbose" option used to break "git branch --merged". (merge 12994dd jk/maint-branch-verbose-merged later to maint).
  • 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. (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).
  • t7004 test, which tried to run Git with small stack space, has been updated to give 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' breaks the auto-detection we use to see if they are new enough to support the `--output` option. (merge b12d045 da/mergetool-meld later to maint).
  • "git pack-objects" forgot to disable the codepath to generate object reachability bitmap when it needs to split the resulting pack. (merge 2113471 jk/pack-objects-no-bitmap-when-splitting later to maint).

New in GIT 2.1.3 (Oct 30, 2014)

  • 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 `--output` option.
  • "git pack-objects" forgot to disable the codepath to generate object recheability 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.

New in GIT 2.1.2 (Oct 1, 2014)

  • "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.

New in GIT 2.1.1 (Sep 20, 2014)

  • 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=" 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.

New in GIT 2.1.0 (Aug 16, 2014)

  • 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=" option learned more timestamp formats, including "--date=now".
  • The `core.commentChar` configuration variable is used to specify a custom comment character (other than the default "#") for the commit message editor. This can be set to `auto` to 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= 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= 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.deltabasecachelimit` used 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:
  • 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 "%

New in GIT 2.0.4 (Aug 1, 2014)

  • An earlier update to v2.0.2 broken output from "git diff-tree", which is fixed in this release.

New in GIT 2.0.2 (Jul 17, 2014)

  • 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.

New in GIT 2.0.1 (Jun 26, 2014)

  • 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 "%

New in GIT 2.0.0 (May 29, 2014)

  • 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 " is the same as "git add -A " 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 " used to ignore removals. You can say "git add --ignore-removal " to add only added or modified paths in , 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=").
  • 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=" 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 " is the same as "git add -A " 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 " 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" 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).

New in GIT 1.9.3 (May 10, 2014)

  • "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.

New in GIT 1.9.2 (Apr 10, 2014)

  • 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.
  • "it 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).

New in GIT 1.9.1 (Mar 19, 2014)

  • "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).

New in GIT 1.9.0 (Feb 15, 2014)

  • 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 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=" configuration variable can be used to pretend as if the "-O" 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=" 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.
  • The "--tags" option to "git fetch" no longer tells the command to fetch _only_ the tags. It instead fetches tags _in addition to_ what are fetched by the same command line without the option.
  • 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.

New in GIT 1.8.5.5 (Feb 14, 2014)

  • 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.

New in GIT 1.8.5.4 (Feb 6, 2014)

  • "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.
  • SSL-related options were not passed correctly to underlying socket layer in "git send-email".
  • "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".

New in GIT 1.9 RC1 (Jan 28, 2014)

  • git-gui i18n: Initial glossary in Bulgarian
  • git-gui l10n: Add 29 more terms to glossary
  • git-gui i18n: Added Bulgarian translation
  • gitk: Add Bulgarian translation (304t)
  • tree_entry_interesting: match against all pathspecs
  • subtree: fix argument validation in add/pull/push
  • gitk: Comply with XDG base directory specification
  • prefer xwrite instead of write
  • mingw: remove mingw_write
  • fetch-pack: do not filter out one-level refs
  • interpret_branch_name: factor out upstream handling
  • interpret_branch_name: rename "cp" variable to "at"
  • interpret_branch_name: always respect "namelen" parameter
  • interpret_branch_name: avoid @{upstream} past colon
  • interpret_branch_name: find all possible @-marks
  • diff_filespec: reorder dirty_submodule macro definitions
  • diff_filespec: drop funcname_pattern_ident field
  • diff_filespec: drop xfrm_flags field
  • diff_filespec: reorder is_binary field
  • diff_filespec: use only 2 bits for is_binary flag
  • t/perf: time rev-list with UNINTERESTING commits
  • list-objects: only look at cmdline trees with edge_hint
  • repack: fix typo in max-pack-size option
  • repack: make parsed string options const-correct
  • repack: propagate pack-objects options as strings
  • t7501: fix "empty commit" test with NO_PERL
  • t7700: do not use "touch" unnecessarily
  • Makefile: Fix compilation of Windows resource file
  • completion: complete merge-base options
  • completion: handle --[no-]fork-point options to git-rebase
  • Makefile: remove redundant object in git-http{fetch,push}
  • Jonathan Nieder (3):
  • gitignore doc: add global gitignore to synopsis
  • git-gui: chmod +x po2msg, windows/git-gui.sh
  • gitk: chmod +x po2msg.sh
  • Documentation: exclude irrelevant options from "git pull"
  • Documentation: "git pull" does not have the "-m" option
  • revision: mark contents of an uninteresting tree uninteresting
  • revision: propagate flag bits from tags to pointees
  • Documentation: make it easier to maintain enumerated documents
  • gitk: Replace "next" and "prev" buttons with down and up arrows
  • git-gui: fallback right pane to packed widgets with Tk 8.4
  • gitk: Fix mistype
  • safe_create_leading_directories(): fix format of "if" chaining
  • safe_create_leading_directories(): reduce scope of local variable
  • safe_create_leading_directories(): add explicit "slash" pointer
  • safe_create_leading_directories(): rename local variable
  • safe_create_leading_directories(): split on first of multiple slashes
  • safe_create_leading_directories(): always restore slash at end of loop
  • safe_create_leading_directories(): introduce enum for return values
  • cmd_init_db(): when creating directories, handle errors conservatively
  • safe_create_leading_directories(): add new error value SCLD_VANISHED
  • gitattributes: document more clearly where macros are allowed
  • refname_match(): always use the rules in ref_rev_parse_rules
  • lock_ref_sha1_basic(): on SCLD_VANISHED, retry
  • lock_ref_sha1_basic(): if locking fails with ENOENT, retry
  • remove_dir_recurse(): tighten condition for removing unreadable dir
  • remove_dir_recurse(): handle disappearing files and directories
  • rename_ref(): extract function rename_tmp_log()
  • rename_tmp_log(): handle a possible mkdir/rmdir race
  • rename_tmp_log(): limit the number of remote_empty_directories() attempts
  • rename_tmp_log(): on SCLD_VANISHED, retry
  • safe_create_leading_directories(): on Windows, \ can separate path components
  • Add cross-references between docs for for-each-ref and show-ref
  • doc: remote author/documentation sections from more pages
  • tree-walk.c: ignore trailing slash on submodule in tree_entry_interesting()
  • git-gui 0.19
  • gitk: Update copyright dates
  • gitk: Indent word-wrapped lines in commit display header
  • git p4 test: wildcards are supported
  • git p4 test: ensure p4 symlink parsing works
  • git p4: work around p4 bug that causes empty symlinks
  • git p4 test: explicitly check p4 wildcard delete
  • git p4 test: is_cli_file_writeable succeeds
  • git p4 test: run as user "author"
  • git p4 test: do not pollute /tmp
  • git p4: handle files with wildcards when doing RCS scrubbing
  • git p4: fix an error message when "p4 where" fails
  • git p4 test: examine behavior with locked (+l) files
  • git p4 doc: use two-line style for options with multiple spellings
  • send-email: /etc/ssl/certs/ directory may not be usable as ca_path
  • create HTML for http-protocol.txt
  • http-protocol.txt: don't use uppercase for variable names in "The Negotiation Algorithm"
  • Documentation/gitk: document -L option
  • Documentation: @{-N} can refer to a commit
  • git-svn: memoize _rev_list and rebuild

New in GIT 1.9 RC (Jan 20, 2014)

  • 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.
  • 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 become 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 in bash and zsh completions.
  • Fetching 'frotz' branch with "git fetch", while '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 to fetch and store 'frotz' remote-tracking branch.
  • "diff.orderfile=" configuration variable can be used to pretend as if the "-O" 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=" 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.
  • The "--tags" option to "git fetch" no longer tells the command to fetch _only_ the tags. It instead fetches tags _in addition to_ what are fetched by the same command line without the option.
  • 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.

New in GIT 1.8.5.3 (Jan 14, 2014)

  • 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 -- " 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.

New in GIT 1.8.5.2 (Dec 18, 2013)

  • "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.

New in GIT 1.8.5.1 (Dec 4, 2013)

  • "git submodule init" copied "submodule.$name.update" settings from .gitmodules to .git/config without making sure if the suggested value was sensible.

New in GIT 1.8.5 (Nov 29, 2013)

  • 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 ", "git -C ..." 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=:" option.
  • "git diff --diff-filter=" 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=" forgot to omit an unnecessary in-body from line, i.e. when 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 commit --author=$name", when $name is not in the canonical "A. U. Thor " format, looks for a matching name from existing history, but did not consult mailmap to grab the preferred author name. (merge ea16794 ap/commit-author-mailmap 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 -- " showed a huge diff for paths outside the given 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).

New in GIT 1.8.4.4 (Nov 26, 2013)

  • 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.

New in GIT 1.8.4.3 (Nov 9, 2013)

  • 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.

New in GIT 1.8.4.2 (Oct 29, 2013)

  • "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=" forgot to omit unnecessary in-body from line, i.e. when 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().
  • "git commit --author=$name", when $name is not in the canonical "A. U. Thor " format, looks for a matching name from existing history, but did not consult mailmap to grab the preferred author name.
  • 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.

New in GIT 1.8.4.1 (Oct 16, 2013)

  • 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 dependant error message to 'echo' and expecting it to come out literally.
  • Setting the "submodule..path" variable to the empty "true" caused the configuration parser to segfault.
  • Output from "git log --full-diff -- " looked strange because comparison was done with the previous ancestor that touched the specified , 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.

New in GIT 1.8.4 (Aug 24, 2013)

  • 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 " will behave as "git add -A ", 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 " now before 2.0 is released.

New in GIT 1.8.4 RC0 (Jul 26, 2013)

  • 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 ($gmane/225824) 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=" 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 ", when happens to be a 40-hex string, directly uses the 40-hex string as an object name, even if a ref "refs//" 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.
  • Instead of typing four capital letters "HEAD", you can say "@" now, e.g. "git log @".
  • "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,:" has been added. This may still have leaks and rough edges, though. We used the approxidate() parser for "--expire=" 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.:
  • 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 rerferences 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 -" to the user to an unexpected place. (merge 3bed291 rr/rebase-checkout-reflog later to maint).
  • "git stash save", when your local change turns a tracked file into a directory, has to remove files in that directory in order to revert your working tree to a pristine state. This will lose untracked files in such a directory, and the command now requires you to "--force" it.
  • 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 maintanance 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" , 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 frotz~22" 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.

New in GIT 1.8.3.2 (Jun 29, 2013)

  • 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 frotz~22" 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.

New in GIT 1.8.3.1 (Jun 11, 2013)

  • 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.

New in GIT 1.8.3 (May 27, 2013)

  • 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 " 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.

New in GIT 1.8.2.3 (May 10, 2013)

  • "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.

New in GIT 1.8.2.2 (Apr 29, 2013)

  • 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 prerequistes.

New in GIT 1.8.2 (Mar 21, 2013)

  • 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=" 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 .
  • 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).

New in GIT 1.8.2 RC0 (Feb 18, 2013)

  • 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 messsages.
  • "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=" 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.

New in GIT 1.8.1.3 (Feb 9, 2013)

  • 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.

New in GIT 1.8.1.2 (Jan 29, 2013)

  • 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 .
  • "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.

New in GIT 1.8.1 (Jan 2, 2013)

  • 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.ubuntu1210installationSome 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=" option to give notes for the commit after the three-dash lines in its output.
  • "git log -p -S" now looks for the after applying the textconv filter (if defined); earlier it inspected the contents of the blobs without filtering.
  • "git log --grep=" learned to honor the "grep.patterntype" configuration set to "perl".
  • "git replace -d " now interprets 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 # 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=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally.
  • "git grep -e pattern " asked the attribute system to read ":.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" 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.

New in GIT 1.8.0.1 (Nov 26, 2012)

  • 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=''" failed to use the given pattern as extended regular expression, and instead looked for the string literally.
  • "git grep -e pattern " asked the attribute system to read
  • ":.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" 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.