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

Backward compatibility notes.

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

 * The historical argument order "git merge <msg> HEAD <commit>..."
   has been deprecated for quite some time, and is now removed.

 * The default location "~/.git-credential-cache/socket" for the
   socket used to communicate with the credential-cache daemon has
   been moved to "~/.cache/git/credential/socket".

 * Git now avoids blindly falling back to ".git" when the setup
   sequence said we are _not_ in Git repository.  A corner case that
   happens to work right now may be broken by a call to die("BUG").
   We've tried hard to locate such cases and fixed them, but there
   might still be cases that need to be addressed--bug reports are
   greatly appreciated.


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

UI, Workflows & Features

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

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

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

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

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

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

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

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

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

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

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

 * When "git submodule init" decides that the submodule in the working
   tree is its upstream, it now gives a warning as it is not a very
   common setup.

 * "git stash push" takes a pathspec so that the local changes can be
   stashed away only partially.

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

 * The experimental "split index" feature has gained a few
   configuration variables to make it easier to use.

 * From a working tree of a repository, a new option of "rev-parse"
   lets you ask if the repository is used as a submodule of another
   project, and where the root level of the working tree of that
   project (i.e. your superproject) is.

 * The pathspec mechanism learned to further limit the paths that
   match the pattern to those that have specified attributes attached
   via the gitattributes mechanism.

 * Our source code has used the SHA1_HEADER cpp macro after "#include"
   in the C code to switch among the SHA-1 implementations. Instead,
   list the exact header file names and switch among implementations
   using "#ifdef BLK_SHA1/#include "block-sha1/sha1.h"/.../#endif";
   this helps some IDE tools.

 * The start-up sequence of "git" needs to figure out some configured
   settings before it finds and set itself up in the location of the
   repository and was quite messy due to its "chicken-and-egg" nature.
   The code has been restructured.

 * The command line prompt (in contrib/) learned a new 'tag' style
   that can be specified with GIT_PS1_DESCRIBE_STYLE, to describe a
   detached HEAD with "git describe --tags".

 * The configuration file learned a new "includeIf.<condition>.path"
   that includes the contents of the given path only when the
   condition holds.  This allows you to say "include this work-related
   bit only in the repositories under my ~/work/ directory".

 * Recent update to "rebase -i" started showing a message that is not
   a warning with "warning:" prefix by mistake.  This has been fixed.

 * Recently we started passing the "--push-options" through the
   external remote helper interface; now the "smart HTTP" remote
   helper understands what to do with the passed information.

 * "git describe --dirty" dies when it cannot be determined if the
   state in the working tree matches that of HEAD (e.g. broken
   repository or broken submodule).  The command learned a new option
   "git describe --broken" to give "$name-broken" (where $name is the
   description of HEAD) in such a case.

 * "git checkout" is taught the "--recurse-submodules" option.

 * Recent enhancement to "git stash push" command to support pathspec
   to allow only a subset of working tree changes to be stashed away
   was found to be too chatty and exposed the internal implementation
   detail (e.g. when it uses reset to match the index to HEAD before
   doing other things, output from reset seeped out).  These, and
   other chattyness has been fixed.

 * "git merge <message> HEAD <commit>" syntax that has been deprecated
   since October 2007 has been removed.

 * The refs completion for large number of refs has been sped up,
   partly by giving up disambiguating ambiguous refs and partly by
   eliminating most of the shell processing between 'git for-each-ref'
   and 'ls-remote' and Bash's completion facility.

 * On many keyboards, typing "@{" involves holding down SHIFT key and
   one can easily end up with "@{Up..." when typing "@{upstream}".  As
   the upstream/push keywords do not appear anywhere else in the syntax,
   we can safely accept them case insensitively without introducing
   ambiguity or confusion to solve this.

 * "git tag/branch/for-each-ref" family of commands long allowed to
   filter the refs by "--contains X" (show only the refs that are
   descendants of X), "--merged X" (show only the refs that are
   ancestors of X), "--no-merged X" (show only the refs that are not
   ancestors of X).  One curious omission, "--no-contains X" (show
   only the refs that are not descendants of X) has been added to
   them.

 * The default behaviour of "git log" in an interactive session has
   been changed to enable "--decorate".

 * The output from "git status --short" has been extended to show
   various kinds of dirtyness in submodules differently; instead of to
   "M" for modified, 'm' and '?' can be shown to signal changes only
   to the working tree of the submodule but not the commit that is
   checked out.

 * Allow the http.postbuffer configuration variable to be set to a
   size that can be expressed in size_t, which can be larger than
   ulong on some platforms.


Performance, Internal Implementation, Development Support etc.

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

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

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

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

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

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

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

 * The "parse_config_key()" API function has been cleaned up.

 * A test that creates a confusing branch whose name is HEAD has been
   corrected not to do so.

 * The code that parses header fields in the commit object has been
   updated for (micro)performance and code hygiene.

 * An helper function to make it easier to append the result from
   real_path() to a strbuf has been added.

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

 * Windows port wants to use OpenSSL's implementation of SHA-1
   routines, so let them.

 * The t/perf performance test suite was not prepared to test not so
   old versions of Git, but now it covers versions of Git that are not
   so ancient.

 * Add 32-bit Linux variant to the set of platforms to be tested with
   Travis CI.

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

 * Picking two versions of Git and running tests to make sure the
   older one and the newer one interoperate happily has now become
   possible.

 * "git tag --contains" used to (ab)use the object bits to keep track
   of the state of object reachability without clearing them after
   use; this has been cleaned up and made to use the newer commit-slab
   facility.

 * The "debug" helper used in the test framework learned to run
   a command under "gdb" interactively.

 * The "detect attempt to create collisions" variant of SHA-1
   implementation by Marc Stevens (CWI) and Dan Shumow (Microsoft)
   has been integrated and made the default.

 * The test framework learned to detect unterminated here documents.

 * The name-hash used for detecting paths that are different only in
   cases (which matter on case insensitive filesystems) has been
   optimized to take advantage of multi-threading when it makes sense.

 * An earlier version of sha1dc/sha1.c that was merged to 'master'
   compiled incorrectly on Windows, which has been fixed.

 * "what URL do we want to update this submodule?" and "are we
   interested in this submodule?" are split into two distinct
   concepts, and then the way used to express the latter got extended,
   paving a way to make it easier to manage a project with many
   submodules and make it possible to later extend use of multiple
   worktrees for a project with submodules.

 * Some debugging output from "git describe" were marked for l10n,
   but some weren't.  Mark missing ones for l10n.

 * Define a new task in .travis.yml that triggers a test session on
   Windows run elsewhere.

 * Conversion from uchar[20] to struct object_id continues.

 * The "submodule" specific field in the ref_store structure is
   replaced with a more generic "gitdir" that can later be used also
   when dealing with ref_store that represents the set of refs visible
   from the other worktrees.

 * The string-list API used a custom reallocation strategy that was
   very inefficient, instead of using the usual ALLOC_GROW() macro,
   which has been fixed.
   (merge 950a234cbd jh/string-list-micro-optim later to maint).

 * In a 2- and 3-way merge of trees, more than one source trees often
   end up sharing an identical subtree; optimize by not reading the
   same tree multiple times in such a case.
   (merge d12a8cf0af jh/unpack-trees-micro-optim later to maint).

 * The index file has a trailing SHA-1 checksum to detect file
   corruption, and historically we checked it every time the index
   file is used.  Omit the validation during normal use, and instead
   verify only in "git fsck".

Also contains various documentation updates and code clean-ups.


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

Unless otherwise noted, all the fixes since v2.12 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * "git repack --depth=<n>" for a long time busted the specified depth
   when reusing delta from existing packs.  This has been corrected.

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

 * "git ls-remote" and "git archive --remote" are designed to work
   without being in a directory under Git's control.  However, recent
   updates revealed that we randomly look into a directory called
   .git/ without actually doing necessary set-up when working in a
   repository.  Stop doing so.

 * "git show-branch" expected there were only very short branch names
   in the repository and used a fixed-length buffer to hold them
   without checking for overflow.

 * A caller of tempfile API that uses stdio interface to write to
   files may ignore errors while writing, which is detected when
   tempfile is closed (with a call to ferror()).  By that time, the
   original errno that may have told us what went wrong is likely to
   be long gone and was overwritten by an irrelevant value.
   close_tempfile() now resets errno to EIO to make errno at least
   predictable.

 * "git remote rm X", when a branch has remote X configured as the
   value of its branch.*.remote, tried to remove branch.*.remote and
   branch.*.merge and failed if either is unset.

 * A "gc.log" file left by a backgrounded "gc --auto" disables further
   automatic gc; it has been taught to run at least once a day (by
   default) by ignoring a stale "gc.log" file that is too old.

 * The code to parse "git -c VAR=VAL cmd" and set configuration
   variable for the duration of cmd had two small bugs, which have
   been fixed.

 * user.email that consists of only cruft chars should consistently
   error out, but didn't.

 * "git upload-pack", which is a counter-part of "git fetch", did not
   report a request for a ref that was not advertised as invalid.
   This is generally not a problem (because "git fetch" will stop
   before making such a request), but is the right thing to do.

 * A leak in a codepath to read from a packed object in (rare) cases
   has been plugged.

 * When a redirected http transport gets an error during the
   redirected request, we ignored the error we got from the server,
   and ended up giving a not-so-useful error message.

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

 * Git v2.12 was shipped with an embarrassing breakage where various
   operations that verify paths given from the user stopped dying when
   seeing an issue, and instead later triggering segfault.

 * There is no need for Python only to give a few messages to the
   standard error stream, but we somehow did.

 * The code to parse "git log -L..." command line was buggy when there
   are many ranges specified with -L; overrun of the allocated buffer
   has been fixed.

 * The command-line parsing of "git log -L" copied internal data
   structures using incorrect size on ILP32 systems.

 * "git diff --quiet" relies on the size field in diff_filespec to be
   correctly populated, but diff_populate_filespec() helper function
   made an incorrect short-cut when asked only to populate the size
   field for paths that need to go through convert_to_git() (e.g. CRLF
   conversion).

 * A few tests were run conditionally under (rare) conditions where
   they cannot be run (like running cvs tests under 'root' account).

 * "git branch @" created refs/heads/@ as a branch, and in general the
   code that handled @{-1} and @{upstream} was a bit too loose in
   disambiguating.

 * "git fetch" that requests a commit by object name, when the other
   side does not allow such an request, failed without much
   explanation.

 * "git filter-branch --prune-empty" drops a single-parent commit that
   becomes a no-op, but did not drop a root commit whose tree is empty.

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

 * "git push" had a handful of codepaths that could lead to a deadlock
   when unexpected error happened, which has been fixed.

 * "Dumb http" transport used to misparse a nonsense http-alternates
   response, which has been fixed.

 * "git add -p <pathspec>" unnecessarily expanded the pathspec to a
   list of individual files that matches the pathspec by running "git
   ls-files <pathspec>", before feeding it to "git diff-index" to see
   which paths have changes, because historically the pathspec
   language supported by "diff-index" was weaker.  These days they are
   equivalent and there is no reason to internally expand it.  This
   helps both performance and avoids command line argument limit on
   some platforms.
   (merge 7288e12cce jk/add-i-use-pathspecs later to maint).

 * "git status --porcelain" is supposed to give a stable output, but a
   few strings were left as translatable by mistake.

 * "git revert -m 0 $merge_commit" complained that reverting a merge
   needs to say relative to which parent the reversion needs to
   happen, as if "-m 0" weren't given.  The correct diagnosis is that
   "-m 0" does not refer to the first parent ("-m 1" does).  This has
   been fixed.

 * Code to read submodule.<name>.ignore config did not state the
   variable name correctly when giving an error message diagnosing
   misconfiguration.

 * Fix for NO_PTHREADS build.

 * Fix for potential segv introduced in v2.11.0 and later (also
   v2.10.2) to "git log --pickaxe-regex -S".

 * A few unterminated here documents in tests were fixed, which in
   turn revealed incorrect expectations the tests make. These tests
   have been updated.

 * Fix for NO_PTHREADS option.
   (merge 2225e1ea20 bw/grep-recurse-submodules later to maint).

 * Git now avoids blindly falling back to ".git" when the setup
   sequence said we are _not_ in Git repository.  A corner case that
   happens to work right now may be broken by a call to die("BUG").
   (merge b1ef400eec jk/no-looking-at-dotgit-outside-repo-final later to maint).

 * A few commands that recently learned the "--recurse-submodule"
   option misbehaved when started from a subdirectory of the
   superproject.
   (merge b2dfeb7c00 bw/recurse-submodules-relative-fix later to maint).

 * FreeBSD implementation of getcwd(3) behaved differently when an
   intermediate directory is unreadable/unsearchable depending on the
   length of the buffer provided, which our strbuf_getcwd() was not
   aware of.  strbuf_getcwd() has been taught to cope with it better.
   (merge a54e938e5b rs/freebsd-getcwd-workaround later to maint).

 * A recent update to "rebase -i" stopped running hooks for the "git
   commit" command during "reword" action, which has been fixed.

 * Removing an entry from a notes tree and then looking another note
   entry from the resulting tree using the internal notes API
   functions did not work as expected.  No in-tree users of the API
   has such access pattern, but it still is worth fixing.

 * "git receive-pack" could have been forced to die by attempting
   allocate an unreasonably large amount of memory with a crafted push
   certificate; this has been fixed.
   (merge f2214dede9 bc/push-cert-receive-fix later to maint).

 * Update error handling for codepath that deals with corrupt loose
   objects.
   (merge 51054177b3 jk/loose-object-info-report-error later to maint).

 * "git diff --submodule=diff" learned to work better in a project
   with a submodule that in turn has its own submodules.
   (merge 17b254cda6 sb/show-diff-for-submodule-in-diff-fix later to maint).

 * Update the build dependency so that an update to /usr/bin/perl
   etc. result in recomputation of perl.mak file.
   (merge c59c4939c2 ab/regen-perl-mak-with-different-perl later to maint).

 * "git push --recurse-submodules --push-option=<string>" learned to
   propagate the push option recursively down to pushes in submodules.

 * If a patch e-mail had its first paragraph after an in-body header
   indented (even after a blank line after the in-body header line),
   the indented line was mistook as a continuation of the in-body
   header.  This has been fixed.
   (merge fd1062e52e lt/mailinfo-in-body-header-continuation later to maint).

 * Clean up fallouts from recent tightening of the set-up sequence,
   where Git barfs when repository information is accessed without
   first ensuring that it was started in a repository.
   (merge bccb22cbb1 jk/no-looking-at-dotgit-outside-repo later to maint).

 * "git p4" used "name-rev HEAD" when it wants to learn what branch is
   checked out; it should use "symbolic-ref HEAD".
   (merge eff451101d ld/p4-current-branch-fix later to maint).

 * "http.proxy" set to an empty string is used to disable the usage of
   proxy.  We broke this early last year.
   (merge ae51d91105 sr/http-proxy-configuration-fix later to maint).

 * $GIT_DIR may in some cases be normalized with all symlinks resolved
   while "gitdir" path expansion in the pattern does not receive the
   same treatment, leading to incorrect mismatch.  This has been fixed.

 * "git submodule" script does not work well with strange pathnames.
   Protect it from a path with slashes in them, at least.

 * "git fetch-pack" was not prepared to accept ERR packet that the
   upload-pack can send with a human-readable error message.  It
   showed the packet contents with ERR prefix, so there was no data
   loss, but it was redundant to say "ERR" in an error message.
   (merge 8e2c7bef03 jt/fetch-pack-error-reporting later to maint).

 * "ls-files --recurse-submodules" did not quite work well in a
   project with nested submodules.

 * gethostname(2) may not NUL terminate the buffer if hostname does
   not fit; unfortunately there is no easy way to see if our buffer
   was too small, but at least this will make sure we will not end up
   using garbage past the end of the buffer.
   (merge 5781a9a270 dt/xgethostname-nul-termination later to maint).

 * Other minor doc, test and build updates and code cleanups.
   (merge df2a6e38b7 jk/pager-in-use later to maint).
   (merge 75ec4a6cb0 ab/branch-list-doc later to maint).
   (merge 3e5b36c637 sg/skip-prefix-in-prettify-refname later to maint).
   (merge 2c5e2865cc jk/fast-import-cleanup later to maint).
   (merge 4473060bc2 ab/test-readme-updates later to maint).
   (merge 48a96972fd ab/doc-submitting later to maint).
   (merge f5c2bc2b96 jk/make-coccicheck-detect-errors later to maint).
   (merge c105f563d1 cc/untracked later to maint).
   (merge 8668976b53 jc/unused-symbols later to maint).
   (merge fba275dc93 jc/bs-t-is-not-a-tab-for-sed later to maint).
   (merge be6ed145de mm/ls-files-s-doc later to maint).
   (merge 60b091c679 qp/bisect-docfix later to maint).
   (merge 47242cd103 ah/diff-files-ours-theirs-doc later to maint).
   (merge 35ad44cbd8 sb/submodule-rm-absorb later to maint).
   (merge 0301f1fd92 va/i18n-perl-scripts later to maint).
   (merge 733e064d98 vn/revision-shorthand-for-side-branch-log later to maint).
   (merge 85999743e7 tb/doc-eol-normalization later to maint).
   (merge 0747fb49fd jk/loose-object-fsck later to maint).
   (merge d8f4481c4f jk/quarantine-received-objects later to maint).
   (merge 7ba1ceef95 xy/format-patch-base later to maint).
   (merge fa1912c89a rs/misc-cppcheck-fixes later to maint).
