Git 2.13 Release Notes
======================

Backward compatibility notes.

 * Use of an empty string as a pathspec element that is used for
   'everything matches' is still warned and Git asks users to use a
   more explicit '.' for that instead.  The hope is that existing
   users will not mind this change, and eventually the warning can be
   turned into a hard error, upgrading the deprecation into removal of
   this (mis)feature.  That is not scheduled to happen in the upcoming
   release (yet).

 * The historical argument order "git merge <msg> HEAD <commit>..."
   has been deprecated for quite some time, and will be removed in a
   future release.


Updates since v2.12
-------------------

UI, Workflows & Features

 * "git describe" and "git name-rev" have been taught to take more
   than one refname patterns to restrict the set of refs to base their
   naming output on, and also learned to take negative patterns to
   name refs not to be used for naming via their "--exclude" option.

 * Deletion of a branch "foo/bar" could remove .git/refs/heads/foo
   once there no longer is any other branch whose name begins with
   "foo/", but we didn't do so so far.  Now we do.

 * When "git merge" detects a path that is renamed in one history
   while the other history deleted (or modified) it, it now reports
   both paths to help the user understand what is going on in the two
   histories being merged.

 * The <url> part in "http.<url>.<variable>" configuration variable
   can now be spelled with '*' that serves as wildcard.
   E.g. "http.https://*.example.com.proxy" can be used to specify the
   proxy used for https://a.example.com, https://b.example.com, etc.,
   i.e. any host in the example.com domain.

 * "git tag" did not leave useful message when adding a new entry to
   reflog; this was left unnoticed for a long time because refs/tags/*
   doesn't keep reflog by default.

 * The "negative" pathspec feature was somewhat more cumbersome to use
   than necessary in that its short-hand used "!" which needed to be
   escaped from shells, and it required "exclude from what?" specified.

 * The command line options for ssh invocation needs to be tweaked for
   some implementations of SSH (e.g. PuTTY plink wants "-P <port>"
   while OpenSSH wants "-p <port>" to specify port to connect to), and
   the variant was guessed when GIT_SSH environment variable is used
   to specify it.  The logic to guess now applies to the command
   specified by the newer GIT_SSH_COMMAND and also core.sshcommand
   configuration variable, and comes with an escape hatch for users to
   deal with misdetected cases.

 * The "--git-path", "--git-common-dir", and "--shared-index-path"
   options of "git rev-parse" did not produce usable output.  They are
   now updated to show the path to the correct file, relative to where
   the caller is.

 * "git diff -W" has been taught to handle the case where a new
   function is added at the end of the file better.

 * "git update-ref -d" and other operations to delete references did
   not leave any entry in HEAD's reflog when the reference being
   deleted was the current branch.  This is not a problem in practice
   because you do not want to delete the branch you are currently on,
   but caused renaming of the current branch to something else not to
   be logged in a useful way.

 * "Cc:" on the trailer part does not have to conform to RFC strictly,
   unlike in the e-mail header.  "git send-email" has been updated to
   ignore anything after '>' when picking addresses, to allow non-address
   cruft like " # stable 4.4" after the address.
   (merge 9d3343961b jh/send-email-one-cc later to maint).

 * When "git submodule init" decides that the submodule in the working
   tree is its upstream, it now gives a warning as it is not a very
   common setup.
   (merge d1b3b81aab sb/submodule-init-url-selection later to maint).

 * "git stash save" takes a pathspec so that the local changes can be
   stashed away only partially.
   (merge 9e140909f6 tg/stash-push later to maint).

 * Documentation for "git ls-files" did not refer to core.quotePath.


Performance, Internal Implementation, Development Support etc.

 * The code to list branches in "git branch" has been consolidated
   with the more generic ref-filter API.

 * Resource usage while enumerating refs from alternate object store
   has been optimized to help receiving end of "push" that hosts a
   repository with many "forks".

 * The gitattributes machinery is being taught to work better in a
   multi-threaded environment.

 * "git rebase -i" starts using the recently updated "sequencer" code.

 * Code and design clean-up for the refs API.

 * The preload-index code has been taught not to bother with the index
   entries that are paths that are not checked out by "sparse checkout".

 * Some warning() messages from "git clean" were updated to show the
   errno from failed system calls.

 * The "parse_config_key()" API function has been cleaned up.
   (merge ad8c7cdadd jk/parse-config-key-cleanup later to maint).

 * A test that creates a confusing branch whose name is HEAD has been
   corrected not to do so.
   (merge f0252ca23c jk/t6300-cleanup later to maint).

 * The code that parses header fields in the commit object has been
   updated for (micro)performance and code hygiene.
   (merge b072504ce1 rs/commit-parsing-optim later to maint).

 * An helper function to make it easier to append the result from
   real_path() to a strbuf has been added.
   (merge 33ad9ddd0b rs/strbuf-add-real-path later to maint).

 * Reduce authentication round-trip over HTTP when the server supports
   just a single authentication method.  This also improves the
   behaviour when Git is misconfigured to enable http.emptyAuth
   against a server that does not authenticate without a username
   (i.e. not using Kerberos etc., which makes http.emptyAuth
   pointless).
   (merge 40a18fc77c jk/http-auth later to maint).

 * Windows port wants to use OpenSSL's implementation of SHA-1
   routines, so let them.
   (merge 2cfc70f0de jh/mingw-openssl-sha1 later to maint).

 * The t/perf performance test suite was not prepared to test not so
   old versions of Git, but now it covers versions of Git that are not
   so ancient.
   (merge 28e1fb5466 jt/perf-updates later to maint).

 * Add 32-bit Linux variant to the set of platforms to be tested with
   Travis CI.
   (merge 88dedd5e72 js/travis-32bit-linux later to maint).

 * "git branch --list" takes the "--abbrev" and "--no-abbrev" options
   to control the output of the object name in its "-v"(erbose)
   output, but a recent update started ignoring them; fix it before
   the breakage reaches to any released version.


Also contains various documentation updates and code clean-ups.


Fixes since v2.12
-----------------

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

 * "git repack --depth=<n>" for a long time busted the specified depth
   when reusing delta from existing packs.  This has been corrected.
   (merge 42b766d765 jk/delta-chain-limit later to maint).

 * The code to parse the command line "git grep <patterns>... <rev>
   [[--] <pathspec>...]" has been cleaned up, and a handful of bugs
   have been fixed (e.g. we used to check "--" if it is a rev).
   (merge 131f3c96d2 jk/grep-no-index-fix later to maint).

 * "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.
   (merge 4b0c3c7735 jn/remote-helpers-with-git-dir later to maint).

 * "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.
   (merge d3cc5f4c44 jk/show-branch-lift-name-len-limit later to maint).

 * 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.
   (merge 7e8c9355b7 jk/tempfile-ferror-fclose-confusion later to maint).

 * "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.
   (merge 20690b2139 rl/remote-allow-missing-branch-name-merge later to maint).

 * 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.
   (merge a831c06a2b dt/gc-ignore-old-gc-logs later to maint).

 * 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.
   (merge 1274a155af jc/config-case-cmdline-take-2 later to maint).

 * user.email that consists of only cruft chars should consistently
   error out, but didn't.
   (merge 94425552f3 jk/ident-empty later to maint).

 * "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.
   (merge bdb31eada7 jt/upload-pack-error-report later to maint).

 * A leak in a codepath to read from a packed object in (rare) cases
   has been plugged.
   (merge 886ddf4777 rs/sha1-file-plug-fallback-base-leak later to maint).

 * When a redirected http transport gets an error during the
   redirected request, we ignored the error we got from the server,
   and ended up giving a not-so-useful error message.
   (merge 8e27391a5f jt/http-base-url-update-upon-redirect later to maint).

 * The patch subcommand of "git add -i" was meant to have paths
   selection prompt just like other subcommand, unlike "git add -p"
   directly jumps to hunk selection.  Recently, this was broken and
   "add -i" lost the paths selection dialog, but it now has been
   fixed.
   (merge c852bd54bd jk/add-i-patch-do-prompt later to maint).

 * Git v2.12 was shipped with an embarrassing breakage where various
   operations that verify paths given from the user stopped dying when
   seeing an issue, and instead later triggering segfault.
   (merge ce83eadd9a js/realpath-pathdup-fix later to maint).

 * There is no need for Python only to give a few messages to the
   standard error stream, but we somehow did.
   (merge b8686c661d ss/remote-bzr-hg-placeholder-wo-python later to maint).

 * The code to parse "git log -L..." command line was buggy when there
   are many ranges specified with -L; overrun of the allocated buffer
   has been fixed.
   (merge aaae0bf787 ax/line-log-range-merge-fix later to maint).

 * The command-line parsing of "git log -L" copied internal data
   structures using incorrect size on ILP32 systems.
   (merge 07f546cda5 vn/line-log-memcpy-size-fix later to maint).

 * "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).
   (merge 12426e114b jc/diff-populate-filespec-size-only-fix later to maint).

 * A few tests were run conditionally under (rare) conditions where
   they cannot be run (like running cvs tests under 'root' account).
   (merge c6507484a2 ab/cond-skip-tests later to maint).

 * "git branch @" created refs/heads/@ as a branch, and in general the
   code that handled @{-1} and @{upstream} was a bit too loose in
   disambiguating.
   (merge fd4692ff70 jk/interpret-branch-name later to maint).

 * "git fetch" that requests a commit by object name, when the other
   side does not allow such an request, failed without much
   explanation.
   (merge d56583ded6 mm/fetch-show-error-message-on-unadvertised-object later to maint).

 * "git filter-branch --prune-empty" drops a single-parent commit that
   becomes a no-op, but did not drop a root commit whose tree is empty.
   (merge 32da7467eb dp/filter-branch-prune-empty later to maint).

 * Recent versions of Git treats http alternates (used in dumb http
   transport) just like HTTP redirects and requires the client to
   enable following it, due to security concerns.  But we forgot to
   give a warning when we decide not to honor the alternates.
   (merge 5cae73d5d2 ew/http-alternates-as-redirects-warning later to maint).

 * "git push" had a handful of codepaths that could lead to a deadlock
   when unexpected error happened, which has been fixed.
   (merge d1a13d3fcb jk/push-deadlock-regression-fix later to maint).

 * Other minor doc, test and build updates and code cleanups.
   (merge 2cfa83574c mm/two-more-xstrfmt later to maint).
   (merge b803ae4427 ps/docs-diffcore later to maint).
   (merge bcd886d897 ew/markdown-url-in-readme later to maint).
   (merge b2d593a779 rj/remove-unused-mktemp later to maint).
   (merge 3255e512a8 jk/ewah-use-right-type-in-sizeof later to maint).
