Git v2.2 Release Notes
======================

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<num>" 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=<path>" 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 <upstream> the rebase is to be done when telling it
   to first check out <branch>.
   (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).
