| Git 2.16 Release Notes | 
 | ====================== | 
 |  | 
 | Backward compatibility notes and other notable changes. | 
 |  | 
 |  * Use of an empty string as a pathspec element that is used for | 
 |    'everything matches' is now an error. | 
 |  | 
 |  | 
 | Updates since v2.15 | 
 | ------------------- | 
 |  | 
 | UI, Workflows & Features | 
 |  | 
 |  * An empty string as a pathspec element that means "everything" | 
 |    i.e. 'git add ""', is now illegal.  We started this by first | 
 |    deprecating and warning a pathspec that has such an element in | 
 |    2.11 (Nov 2016). | 
 |  | 
 |  * A hook script that is set unexecutable is simply ignored.  Git | 
 |    notifies when such a file is ignored, unless the message is | 
 |    squelched via advice.ignoredHook configuration. | 
 |  | 
 |  * "git pull" has been taught to accept "--[no-]signoff" option and | 
 |    pass it down to "git merge". | 
 |  | 
 |  * The "--push-option=<string>" option to "git push" now defaults to a | 
 |    list of strings configured via push.pushOption variable. | 
 |  | 
 |  * "gitweb" checks if a directory is searchable with Perl's "-x" | 
 |    operator, which can be enhanced by using "filetest 'access'" | 
 |    pragma, which now we do. | 
 |  | 
 |  * "git stash save" has been deprecated in favour of "git stash push". | 
 |  | 
 |  * The set of paths output from "git status --ignored" was tied | 
 |    closely with its "--untracked=<mode>" option, but now it can be | 
 |    controlled more flexibly.  Most notably, a directory that is | 
 |    ignored because it is listed to be ignored in the ignore/exclude | 
 |    mechanism can be handled differently from a directory that ends up | 
 |    to be ignored only because all files in it are ignored. | 
 |  | 
 |  * The remote-helper for talking to MediaWiki has been updated to | 
 |    truncate an overlong pagename so that ".mw" suffix can still be | 
 |    added. | 
 |  | 
 |  * The remote-helper for talking to MediaWiki has been updated to | 
 |    work with mediawiki namespaces. | 
 |  | 
 |  * The "--format=..." option "git for-each-ref" takes learned to show | 
 |    the name of the 'remote' repository and the ref at the remote side | 
 |    that is affected for 'upstream' and 'push' via "%(push:remotename)" | 
 |    and friends. | 
 |  | 
 |  * Doc and message updates to teach users "bisect view" is a synonym | 
 |    for "bisect visualize". | 
 |  | 
 |  * "git bisect run" that did not specify any command to run used to go | 
 |    ahead and treated all commits to be tested as 'good'.  This has | 
 |    been corrected by making the command error out. | 
 |  | 
 |  * The SubmittingPatches document has been converted to produce an | 
 |    HTML version via AsciiDoc/Asciidoctor. | 
 |  | 
 |  * We learned to optionally talk to a file system monitor via new | 
 |    fsmonitor extension to speed up "git status" and other operations | 
 |    that need to see which paths have been modified.  Currently we only | 
 |    support "watchman".  See File System Monitor section of | 
 |    git-update-index(1) for more detail. | 
 |  | 
 |  * The "diff" family of commands learned to ignore differences in | 
 |    carriage return at the end of line. | 
 |  | 
 |  * Places that know about "sendemail.to", like documentation and shell | 
 |    completion (in contrib/) have been taught about "sendemail.tocmd", | 
 |    too. | 
 |  | 
 |  * "git add --renormalize ." is a new and safer way to record the fact | 
 |    that you are correcting the end-of-line convention and other | 
 |    "convert_to_git()" glitches in the in-repository data. | 
 |  | 
 |  * "git branch" and "git checkout -b" are now forbidden from creating | 
 |    a branch whose name is "HEAD". | 
 |  | 
 |  * "git branch --list" learned to show its output through the pager by | 
 |    default when the output is going to a terminal, which is controlled | 
 |    by the pager.branch configuration variable.  This is similar to a | 
 |    recent change to "git tag --list". | 
 |  | 
 |  * "git grep -W", "git diff -W" and their friends learned a heuristic | 
 |    to extend a pre-context beyond the line that matches the "function | 
 |    pattern" (aka "diff.*.xfuncname") to include a comment block, if | 
 |    exists, that immediately precedes it. | 
 |  | 
 |  * "git config --expiry-date gc.reflogexpire" can read "2.weeks" from | 
 |    the configuration and report it as a timestamp, just like "--int" | 
 |    would read "1k" and report 1024, to help consumption by scripts. | 
 |  | 
 |  * The shell completion (in contrib/) learned that "git pull" can take | 
 |    the "--autostash" option. | 
 |  | 
 |  * The tagnames "git log --decorate" uses to annotate the commits can | 
 |    now be limited to subset of available refs with the two additional | 
 |    options, --decorate-refs[-exclude]=<pattern>. | 
 |  | 
 |  * "git grep" compiled with libpcre2 sometimes triggered a segfault, | 
 |    which is being fixed. | 
 |  | 
 |  * "git send-email" tries to see if the sendmail program is available | 
 |    in /usr/lib and /usr/sbin; extend the list of locations to be | 
 |    checked to also include directories on $PATH. | 
 |  | 
 |  * "git diff" learned, "--anchored", a variant of the "--patience" | 
 |    algorithm, to which the user can specify which 'unique' line to be | 
 |    used as anchoring points. | 
 |  | 
 |  * The way "git worktree add" determines what branch to create from | 
 |    where and checkout in the new worktree has been updated a bit. | 
 |  | 
 |  * Ancient part of codebase still shows dots after an abbreviated | 
 |    object name just to show that it is not a full object name, but | 
 |    these ellipses are confusing to people who newly discovered Git | 
 |    who are used to seeing abbreviated object names and find them | 
 |    confusing with the range syntax. | 
 |  | 
 |  * With a configuration variable rebase.abbreviateCommands set, | 
 |    "git rebase -i" produces the todo list with a single-letter | 
 |    command names. | 
 |  | 
 |  * "git worktree add" learned to run the post-checkout hook, just like | 
 |    "git checkout" does, after the initial checkout. | 
 |  | 
 |  * "git svn" has been updated to strip CRs in the commit messages, as | 
 |    recent versions of Subversion rejects them. | 
 |  | 
 |  * "git imap-send" did not correctly quote the folder name when | 
 |    making a request to the server, which has been corrected. | 
 |  | 
 |  * Error messages from "git rebase" have been somewhat cleaned up. | 
 |  | 
 |  * Git has been taught to support an https:// URL used for http.proxy | 
 |    when using recent versions of libcurl. | 
 |  | 
 |  * "git merge" learned to pay attention to merge.verifySignatures | 
 |    configuration variable and pretend as if '--verify-signatures' | 
 |    option was given from the command line. | 
 |  | 
 |  * "git describe" was taught to dig trees deeper to find a | 
 |    <commit-ish>:<path> that refers to a given blob object. | 
 |  | 
 |  | 
 | Performance, Internal Implementation, Development Support etc. | 
 |  | 
 |  * An earlier update made it possible to use an on-stack in-core | 
 |    lockfile structure (as opposed to having to deliberately leak an | 
 |    on-heap one).  Many codepaths have been updated to take advantage | 
 |    of this new facility. | 
 |  | 
 |  * Calling cmd_foo() as if it is a general purpose helper function is | 
 |    a no-no.  Correct two instances of such to set an example. | 
 |  | 
 |  * We try to see if somebody runs our test suite with a shell that | 
 |    does not support "local" like bash/dash does. | 
 |  | 
 |  * An early part of piece-by-piece rewrite of "git bisect" in C. | 
 |  | 
 |  * GSoC to piece-by-piece rewrite "git submodule" in C. | 
 |  | 
 |  * Optimize the code to find shortest unique prefix of object names. | 
 |  | 
 |  * Pathspec-limited revision traversal was taught not to keep finding | 
 |    unneeded differences once it knows two trees are different inside | 
 |    given pathspec. | 
 |  | 
 |  * Conversion from uchar[20] to struct object_id continues. | 
 |  | 
 |  * Code cleanup. | 
 |  | 
 |  * A single-word "unsigned flags" in the diff options is being split | 
 |    into a structure with many bitfields. | 
 |  | 
 |  * TravisCI build updates. | 
 |  | 
 |  * Parts of a test to drive the long-running content filter interface | 
 |    has been split into its own module, hopefully to eventually become | 
 |    reusable. | 
 |  | 
 |  * Drop (perhaps overly cautious) sanity check before using the index | 
 |    read from the filesystem at runtime. | 
 |  | 
 |  * The build procedure has been taught to avoid some unnecessary | 
 |    instability in the build products. | 
 |  | 
 |  * A new mechanism to upgrade the wire protocol in place is proposed | 
 |    and demonstrated that it works with the older versions of Git | 
 |    without harming them. | 
 |  | 
 |  * An infrastructure to define what hash function is used in Git is | 
 |    introduced, and an effort to plumb that throughout various | 
 |    codepaths has been started. | 
 |  | 
 |  * The code to iterate over loose object files got optimized. | 
 |  | 
 |  * An internal function that was left for backward compatibility has | 
 |    been removed, as there is no remaining callers. | 
 |  | 
 |  * Historically, the diff machinery for rename detection had a | 
 |    hardcoded limit of 32k paths; this is being lifted to allow users | 
 |    trade cycles with a (possibly) easier to read result. | 
 |  | 
 |  * The tracing infrastructure has been optimized for cases where no | 
 |    tracing is requested. | 
 |  | 
 |  * In preparation for implementing narrow/partial clone, the object | 
 |    walking machinery has been taught a way to tell it to "filter" some | 
 |    objects from enumeration. | 
 |  | 
 |  * A few structures and variables that are implementation details of | 
 |    the decorate API have been renamed and then the API got documented | 
 |    better. | 
 |  | 
 |  * Assorted updates for TravisCI integration. | 
 |    (merge 4f26366679 sg/travis-fixes later to maint). | 
 |  | 
 |  * Introduce a helper to simplify code to parse a common pattern that | 
 |    expects either "--key" or "--key=<something>". | 
 |  | 
 |  * "git version --build-options" learned to report the host CPU and | 
 |    the exact commit object name the binary was built from. | 
 |  | 
 | Also contains various documentation updates and code clean-ups. | 
 |  | 
 |  | 
 | Fixes since v2.15 | 
 | ----------------- | 
 |  | 
 |  * "auto" as a value for the columnar output configuration ought to | 
 |    judge "is the output consumed by humans?" with the same criteria as | 
 |    "auto" for coloured output configuration, i.e. either the standard | 
 |    output stream is going to tty, or a pager is in use.  We forgot the | 
 |    latter, which has been fixed. | 
 |  | 
 |  * The experimental "color moved lines differently in diff output" | 
 |    feature was buggy around "ignore whitespace changes" edges, which | 
 |    has been corrected. | 
 |  | 
 |  * Instead of using custom line comparison and hashing functions to | 
 |    implement "moved lines" coloring in the diff output, use the pair | 
 |    of these functions from lower-layer xdiff/ code. | 
 |  | 
 |  * Some codepaths did not check for errors when asking what branch the | 
 |    HEAD points at, which have been fixed. | 
 |  | 
 |  * "git commit", after making a commit, did not check for errors when | 
 |    asking on what branch it made the commit, which has been corrected. | 
 |  | 
 |  * "git status --ignored -u" did not stop at a working tree of a | 
 |    separate project that is embedded in an ignored directory and | 
 |    listed files in that other project, instead of just showing the | 
 |    directory itself as ignored. | 
 |  | 
 |  * A broken access to object databases in recent update to "git grep | 
 |    --recurse-submodules" has been fixed. | 
 |  | 
 |  * A recent regression in "git rebase -i" that broke execution of git | 
 |    commands from subdirectories via "exec" instruction has been fixed. | 
 |  | 
 |  * A (possibly flakey) test fix. | 
 |  | 
 |  * "git check-ref-format --branch @{-1}" bit a "BUG()" when run | 
 |    outside a repository for obvious reasons; clarify the documentation | 
 |    and make sure we do not even try to expand the at-mark magic in | 
 |    such a case, but still call the validation logic for branch names. | 
 |  | 
 |  * "git fetch --recurse-submodules" now knows that submodules can be | 
 |    moved around in the superproject in addition to getting updated, | 
 |    and finds the ones that need to be fetched accordingly. | 
 |  | 
 |  * Command line completion (in contrib/) update. | 
 |  | 
 |  * Description of blame.{showroot,blankboundary,showemail,date} | 
 |    configuration variables have been added to "git config --help". | 
 |  | 
 |  * After an error from lstat(), diff_populate_filespec() function | 
 |    sometimes still went ahead and used invalid data in struct stat, | 
 |    which has been fixed. | 
 |  | 
 |  * UNC paths are also relevant in Cygwin builds and they are now | 
 |    tested just like Mingw builds. | 
 |  | 
 |  * Correct start-up sequence so that a repository could be placed | 
 |    immediately under the root directory again (which was broken at | 
 |    around Git 2.13). | 
 |  | 
 |  * The credential helper for libsecret (in contrib/) has been improved | 
 |    to allow possibly prompting the end user to unlock secrets that are | 
 |    currently locked (otherwise the secrets may not be loaded). | 
 |  | 
 |  * MinGW updates. | 
 |  | 
 |  * Error checking in "git imap-send" for empty response has been | 
 |    improved. | 
 |  | 
 |  * Recent update to the refs infrastructure implementation started | 
 |    rewriting packed-refs file more often than before; this has been | 
 |    optimized again for most trivial cases. | 
 |  | 
 |  * Some error messages did not quote filenames shown in it, which have | 
 |    been fixed. | 
 |  | 
 |  * "git rebase -i" recently started misbehaving when a submodule that | 
 |    is configured with 'submodule.<name>.ignore' is dirty; this has | 
 |    been corrected. | 
 |  | 
 |  * Building with NO_LIBPCRE1_JIT did not disable it, which has been fixed. | 
 |  | 
 |  * We used to add an empty alternate object database to the system | 
 |    that does not help anything; it has been corrected. | 
 |  | 
 |  * Doc update around use of "format-patch --subject-prefix" etc. | 
 |  | 
 |  * A fix for an ancient bug in "git apply --ignore-space-change" codepath. | 
 |  | 
 |  * Clarify and enhance documentation for "merge-base --fork-point", as | 
 |    it was clear what it computed but not why/what for. | 
 |  | 
 |  * A few scripts (both in production and tests) incorrectly redirected | 
 |    their error output.  These have been corrected. | 
 |  | 
 |  * "git notes" sent its error message to its standard output stream, | 
 |    which was corrected. | 
 |  | 
 |  * The three-way merge performed by "git cherry-pick" was confused | 
 |    when a new submodule was added in the meantime, which has been | 
 |    fixed (or "papered over"). | 
 |  | 
 |  * The sequencer machinery (used by "git cherry-pick A..B", and "git | 
 |    rebase -i", among other things) would have lost a commit if stopped | 
 |    due to an unlockable index file, which has been fixed. | 
 |  | 
 |  * "git apply --inaccurate-eof" when used with "--ignore-space-change" | 
 |    triggered an internal sanity check, which has been fixed. | 
 |  | 
 |  * Command line completion (in contrib/) has been taught about the | 
 |    "--copy" option of "git branch". | 
 |  | 
 |  * When "git rebase" prepared a mailbox of changes and fed it to "git | 
 |    am" to replay them, it was confused when a stray "From " happened | 
 |    to be in the log message of one of the replayed changes.  This has | 
 |    been corrected. | 
 |  | 
 |  * There was a recent semantic mismerge in the codepath to write out a | 
 |    section of a configuration section, which has been corrected. | 
 |  | 
 |  * Mentions of "git-rebase" and "git-am" (dashed form) still remained | 
 |    in end-user visible strings emitted by the "git rebase" command; | 
 |    they have been corrected. | 
 |  | 
 |  * Contrary to the documentation, "git pull -4/-6 other-args" did not | 
 |    ask the underlying "git fetch" to go over IPv4/IPv6, which has been | 
 |    corrected. | 
 |  | 
 |  * "git checkout --recursive" may overwrite and rewind the history of | 
 |    the branch that happens to be checked out in submodule | 
 |    repositories, which might not be desirable.  Detach the HEAD but | 
 |    still allow the recursive checkout to succeed in such a case. | 
 |    (merge 57f22bf997 sb/submodule-recursive-checkout-detach-head later to maint). | 
 |  | 
 |  * "git branch --set-upstream" has been deprecated and (sort of) | 
 |    removed, as "--set-upstream-to" is the preferred one these days. | 
 |    The documentation still had "--set-upstream" listed on its | 
 |    synopsis section, which has been corrected. | 
 |    (merge a060f3d3d8 tz/branch-doc-remove-set-upstream later to maint). | 
 |  | 
 |  * Internally we use 0{40} as a placeholder object name to signal the | 
 |    codepath that there is no such object (e.g. the fast-forward check | 
 |    while "git fetch" stores a new remote-tracking ref says "we know | 
 |    there is no 'old' thing pointed at by the ref, as we are creating | 
 |    it anew" by passing 0{40} for the 'old' side), and expect that a | 
 |    codepath to locate an in-core object to return NULL as a sign that | 
 |    the object does not exist.  A look-up for an object that does not | 
 |    exist however is quite costly with a repository with large number | 
 |    of packfiles.  This access pattern has been optimized. | 
 |    (merge 87b5e236a1 jk/fewer-pack-rescan later to maint). | 
 |  | 
 |  * In addition to "git stash -m message", the command learned to | 
 |    accept "git stash -mmessage" form. | 
 |    (merge 5675473fcb ph/stash-save-m-option-fix later to maint). | 
 |  | 
 |  * @{-N} in "git checkout @{-N}" may refer to a detached HEAD state, | 
 |    but the documentation was not clear about it, which has been fixed. | 
 |    (merge 75ce149575 ks/doc-checkout-previous later to maint). | 
 |  | 
 |  * A regression in the progress eye-candy was fixed. | 
 |    (merge 9c5951cacf jk/progress-delay-fix later to maint). | 
 |  | 
 |  * The code internal to the recursive merge strategy was not fully | 
 |    prepared to see a path that is renamed to try overwriting another | 
 |    path that is only different in case on case insensitive systems. | 
 |    This does not matter in the current code, but will start to matter | 
 |    once the rename detection logic starts taking hints from nearby | 
 |    paths moving to some directory and moves a new path along with them. | 
 |    (merge 4cba2b0108 en/merge-recursive-icase-removal later to maint). | 
 |  | 
 |  * An v2.12-era regression in pathspec match logic, which made it look | 
 |    into submodule tree even when it is not desired, has been fixed. | 
 |    (merge eef3df5a93 bw/pathspec-match-submodule-boundary later to maint). | 
 |  | 
 |  * Amending commits in git-gui broke the author name that is non-ascii | 
 |    due to incorrect enconding conversion. | 
 |  | 
 |  * Recent update to the submodule configuration code broke "diff-tree" | 
 |    by accidentally stopping to read from the index upfront. | 
 |    (merge fd66bcc31f bw/submodule-config-cleanup later to maint). | 
 |  | 
 |  * Git shows a message to tell the user that it is waiting for the | 
 |    user to finish editing when spawning an editor, in case the editor | 
 |    opens to a hidden window or somewhere obscure and the user gets | 
 |    lost. | 
 |    (merge abfb04d0c7 ls/editor-waiting-message later to maint). | 
 |  | 
 |  * The "safe crlf" check incorrectly triggered for contents that does | 
 |    not use CRLF as line endings, which has been corrected. | 
 |    (merge 649f1f0948 tb/check-crlf-for-safe-crlf later to maint). | 
 |  | 
 |  * "git clone --shared" to borrow from a (secondary) worktree did not | 
 |    work, even though "git clone --local" did.  Both are now accepted. | 
 |    (merge b3b05971c1 es/clone-shared-worktree later to maint). | 
 |  | 
 |  * The build procedure now allows not just the repositories but also | 
 |    the refs to be used to take pre-formatted manpages and html | 
 |    documents to install. | 
 |    (merge 65289e9dcd rb/quick-install-doc later to maint). | 
 |  | 
 |  * Update the shell prompt script (in contrib/) to strip trailing CR | 
 |    from strings read from various "state" files. | 
 |    (merge 041fe8fc83 ra/prompt-eread-fix later to maint). | 
 |  | 
 |  * "git merge -s recursive" did not correctly abort when the index is | 
 |    dirty, if the merged tree happened to be the same as the current | 
 |    HEAD, which has been fixed. | 
 |  | 
 |  * Bytes with high-bit set were encoded incorrectly and made | 
 |    credential helper fail. | 
 |    (merge 4c267f2ae3 jd/fix-strbuf-add-urlencode-bytes later to maint). | 
 |  | 
 |  * "git rebase -p -X<option>" did not propagate the option properly | 
 |    down to underlying merge strategy backend. | 
 |    (merge dd6fb0053c js/fix-merge-arg-quoting-in-rebase-p later to maint). | 
 |  | 
 |  * "git merge -s recursive" did not correctly abort when the index is | 
 |    dirty, if the merged tree happened to be the same as the current | 
 |    HEAD, which has been fixed. | 
 |    (merge f309e8e768 ew/empty-merge-with-dirty-index-maint later to maint). | 
 |  | 
 |  * Other minor doc, test and build updates and code cleanups. | 
 |    (merge 1a1fc2d5b5 rd/man-prune-progress later to maint). | 
 |    (merge 0ba014035a rd/man-reflog-add-n later to maint). | 
 |    (merge e54b63359f rd/doc-notes-prune-fix later to maint). | 
 |    (merge ff4c9b413a sp/doc-info-attributes later to maint). | 
 |    (merge 7db2cbf4f1 jc/receive-pack-hook-doc later to maint). | 
 |    (merge 5a0526264b tg/t-readme-updates later to maint). | 
 |    (merge 5e83cca0b8 jk/no-optional-locks later to maint). | 
 |    (merge 826c778f7c js/hashmap-update-sample later to maint). | 
 |    (merge 176b2d328c sg/setup-doc-update later to maint). | 
 |    (merge 1b09073514 rs/am-builtin-leakfix later to maint). | 
 |    (merge addcf6cfde rs/fmt-merge-msg-string-leak-fix later to maint). | 
 |    (merge c3ff8f6c14 rs/strbuf-read-once-reset-length later to maint). | 
 |    (merge 6b0eb884f9 db/doc-workflows-neuter-the-maintainer later to maint). | 
 |    (merge 8c87bdfb21 jk/cvsimport-quoting later to maint). | 
 |    (merge 176cb979fe rs/fmt-merge-msg-leakfix later to maint). | 
 |    (merge 5a03360e73 tb/delimit-pretty-trailers-args-with-comma later to maint). | 
 |    (merge d0e6326026 ot/pretty later to maint). | 
 |    (merge 44103f4197 sb/test-helper-excludes later to maint). | 
 |    (merge 170078693f jt/transport-no-more-rsync later to maint). | 
 |    (merge c07b3adff1 bw/path-doc later to maint). | 
 |    (merge bf9d7df950 tz/lib-git-svn-svnserve-tests later to maint). | 
 |    (merge dec366c9a8 sr/http-sslverify-config-doc later to maint). | 
 |    (merge 3f824e91c8 jk/test-suite-tracing later to maint). | 
 |    (merge 1feb061701 db/doc-config-section-names-with-bs later to maint). | 
 |    (merge 74dea0e13c jh/memihash-opt later to maint). | 
 |    (merge 2e9fdc795c ma/bisect-leakfix later to maint). |