Git 2.16 Release Notes
======================

Backward compatibility notes and other notable changes.

 * Use of an empty string as a pathspec element that is used for
   'everything matches' is now an error.


Updates since v2.15
-------------------

UI, Workflows & Features

 * An empty string as a pathspec element that means "everything"
   i.e. 'git add ""', is now illegal.  We started this by first
   deprecating and warning a pathspec that has such an element in
   2.11 (Nov 2016).

 * A hook script that is set unexecutable is simply ignored.  Git
   notifies when such a file is ignored, unless the message is
   squelched via advice.ignoredHook configuration.

 * "git pull" has been taught to accept "--[no-]signoff" option and
   pass it down to "git merge".

 * The "--push-option=<string>" option to "git push" now defaults to a
   list of strings configured via push.pushOption variable.

 * "gitweb" checks if a directory is searchable with Perl's "-x"
   operator, which can be enhanced by using "filetest 'access'"
   pragma, which now we do.

 * "git stash save" has been deprecated in favour of "git stash push".

 * The set of paths output from "git status --ignored" was tied
   closely with its "--untracked=<mode>" option, but now it can be
   controlled more flexibly.  Most notably, a directory that is
   ignored because it is listed to be ignored in the ignore/exclude
   mechanism can be handled differently from a directory that ends up
   to be ignored only because all files in it are ignored.

 * The remote-helper for talking to MediaWiki has been updated to
   truncate an overlong pagename so that ".mw" suffix can still be
   added.

 * The remote-helper for talking to MediaWiki has been updated to
   work with mediawiki namespaces.

 * The "--format=..." option "git for-each-ref" takes learned to show
   the name of the 'remote' repository and the ref at the remote side
   that is affected for 'upstream' and 'push' via "%(push:remotename)"
   and friends.

 * Doc and message updates to teach users "bisect view" is a synonym
   for "bisect visualize".

 * "git bisect run" that did not specify any command to run used to go
   ahead and treated all commits to be tested as 'good'.  This has
   been corrected by making the command error out.

 * The SubmittingPatches document has been converted to produce an
   HTML version via AsciiDoc/Asciidoctor.
   (merge 049e64aa50 bc/submitting-patches-in-asciidoc later to maint).

 * We learned to talk to watchman to speed up "git status" and other
   operations that need to see which paths have been modified.

 * The "diff" family of commands learned to ignore differences in
   carriage return at the end of line.

 * Places that know about "sendemail.to", like documentation and shell
   completion (in contrib/) have been taught about "sendemail.tocmd",
   too.

 * "git add --renormalize ." is a new and safer way to record the fact
   that you are correcting the end-of-line convention and other
   "convert_to_git()" glitches in the in-repository data.

 * "git branch" and "git checkout -b" are now forbidden from creating
   a branch whose name is "HEAD".

 * "git branch --list" learned to show its output through the pager by
   default when the output is going to a terminal, which is controlled
   by the pager.branch configuration variable.  This is similar to a
   recent change to "git tag --list".

 * "git grep -W", "git diff -W" and their friends learned a heuristic
   to extend a pre-context beyond the line that matches the "function
   pattern" (aka "diff.*.xfuncname") to include a comment block, if
   exists, that immediately precedes it.


Performance, Internal Implementation, Development Support etc.

 * An earlier update made it possible to use an on-stack in-core
   lockfile structure (as opposed to having to deliberately leak an
   on-heap one).  Many codepaths have been updated to take advantage
   of this new facility.

 * Calling cmd_foo() as if it is a general purpose helper function is
   a no-no.  Correct two instances of such to set an example.

 * We try to see if somebody runs our test suite with a shell that
   does not support "local" like bash/dash does.

 * An early part of piece-by-piece rewrite of "git bisect" in C.

 * GSoC to piece-by-piece rewrite "git submodule" in C.

 * Optimize the code to find shortest unique prefix of object names.

 * Pathspec-limited revision traversal was taught not to keep finding
   unneeded differences once it knows two trees are different inside
   given pathspec.

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

 * Code cleanup.

 * A single-word "unsigned flags" in the diff options is being split
   into a structure with many bitfields.

 * TravisCI build updates.

 * Parts of a test to drive the long-running content filter interface
   has been split into its own module, hopefully to eventually become
   reusable.

 * Drop (perhaps overly cautious) sanity check before using the index
   read from the filesystem at runtime.

Also contains various documentation updates and code clean-ups.


Fixes since v2.15
-----------------

 * "auto" as a value for the columnar output configuration ought to
   judge "is the output consumed by humans?" with the same criteria as
   "auto" for coloured output configuration, i.e. either the standard
   output stream is going to tty, or a pager is in use.  We forgot the
   latter, which has been fixed.

 * The experimental "color moved lines differently in diff output"
   feature was buggy around "ignore whitespace changes" edges, which
   has been corrected.

 * Instead of using custom line comparison and hashing functions to
   implement "moved lines" coloring in the diff output, use the pair
   of these functions from lower-layer xdiff/ code.

 * Some codepaths did not check for errors when asking what branch the
   HEAD points at, which have been fixed.

 * "git commit", after making a commit, did not check for errors when
   asking on what branch it made the commit, which has been corrected.

 * "git status --ignored -u" did not stop at a working tree of a
   separate project that is embedded in an ignored directory and
   listed files in that other project, instead of just showing the
   directory itself as ignored.

 * A broken access to object databases in recent update to "git grep
   --recurse-submodules" has been fixed.

 * A recent regression in "git rebase -i" that broke execution of git
   commands from subdirectories via "exec" instruction has been fixed.

 * A (possibly flakey) test fix.

 * "git check-ref-format --branch @{-1}" bit a "BUG()" when run
   outside a repository for obvious reasons; clarify the documentation
   and make sure we do not even try to expand the at-mark magic in
   such a case, but still call the validation logic for branch names.

 * "git fetch --recurse-submodules" now knows that submodules can be
   moved around in the superproject in addition to getting updated,
   and finds the ones that need to be fetched accordingly.

 * Command line completion (in contrib/) update.

 * Description of blame.{showroot,blankboundary,showemail,date}
   configuration variables have been added to "git config --help".

 * After an error from lstat(), diff_populate_filespec() function
   sometimes still went ahead and used invalid data in struct stat,
   which has been fixed.

 * UNC paths are also relevant in Cygwin builds and they are now
   tested just like Mingw builds.

 * Correct start-up sequence so that a repository could be placed
   immediately under the root directory again (which was broken at
   around Git 2.13).

 * The credential helper for libsecret (in contrib/) has been improved
   to allow possibly prompting the end user to unlock secrets that are
   currently locked (otherwise the secrets may not be loaded).

 * MinGW updates.

 * Error checking in "git imap-send" for empty response has been
   improved.

 * Recent update to the refs infrastructure implementation started
   rewriting packed-refs file more often than before; this has been
   optimized again for most trivial cases.
   (merge 7c6bd25c7d mh/avoid-rewriting-packed-refs later to maint).

 * Some error messages did not quote filenames shown in it, which have
   been fixed.

 * "git rebase -i" recently started misbehaving when a submodule that
   is configured with 'submodule.<name>.ignore' is dirty; this has
   been corrected.

 * Building with NO_LIBPCRE1_JIT did not disable it, which has been fixed.

 * We used to add an empty alternate object database to the system
   that does not help anything; it has been corrected.

 * Doc update around use of "format-patch --subject-prefix" etc.

 * A fix for an ancient bug in "git apply --ignore-space-change" codepath.

 * Clarify and enhance documentation for "merge-base --fork-point", as
   it was clear what it computed but not why/what for.
   (merge 6d1700b8af jc/merge-base-fork-point-doc later to maint).

 * A few scripts (both in production and tests) incorrectly redirected
   their error output.  These have been corrected.
   (merge eadf1c8f45 tz/redirect-fix later to maint).

 * "git notes" sent its error message to its standard output stream,
   which was corrected.
   (merge 89b9e31dd5 tz/notes-error-to-stderr later to maint).

 * The three-way merge performed by "git cherry-pick" was confused
   when a new submodule was added in the meantime, which has been
   fixed (or "papered over").
   (merge c641ca6707 sb/test-cherry-pick-submodule-getting-in-a-way later to maint).

 * The sequencer machinery (used by "git cherry-pick A..B", and "git
   rebase -i", among other things) would have lost a commit if stopped
   due to an unlockable index file, which has been fixed.
   (merge bd58886775 pw/sequencer-recover-from-unlockable-index later to maint).

 * "git apply --inaccurate-eof" when used with "--ignore-space-change"
   triggered an internal sanity check, which has been fixed.
   (merge 4855de1233 rs/apply-inaccurate-eof-with-incomplete-line later to maint).

 * Command line completion (in contrib/) has been taught about the
   "--copy" option of "git branch".
   (merge 41ca0f773e tz/complete-branch-copy later to maint).

 * When "git rebase" prepared an mailbox of changes and fed it to "git
   am" to replay them, it was confused when a stray "From " happened
   to be in the log message of one of the replayed changes.  This has
   been corrected.
   (merge ae3b2b04bb ew/rebase-mboxrd later to maint).

 * There was a recent semantic mismerge in the codepath to write out a
   section of a configuration section, which has been corrected.

 * Mentions of "git-rebase" and "git-am" (dashed form) still remained
   in end-user visible strings emitted by the "git rebase" command;
   they have been corrected.
   (merge 82cb775c06 ks/rebase-no-git-foo later to maint).

 * Contrary to the documentation, "git pull -4/-6 other-args" did not
   ask the underlying "git fetch" to go over IPv4/IPv6, which has been
   corrected.
   (merge ffb4568afe sw/pull-ipv46-passthru later to maint).

 * Other minor doc, test and build updates and code cleanups.
   (merge c5e3bc6ec4 sd/branch-copy later to maint).
