Git v1.8.4 Release Notes
========================

Backward compatibility notes (for Git 2.0)
------------------------------------------

When "git push [$there]" does not say what to push, we have used the
traditional "matching" semantics so far (all your branches were sent
to the remote as long as there already are branches of the same name
over there).  In Git 2.0, the default will change to the "simple"
semantics that pushes:

 - only the current branch to the branch with the same name, and only
   when the current branch is set to integrate with that remote
   branch, if you are pushing to the same remote as you fetch from; or

 - only the current branch to the branch with the same name, if you
   are pushing to a remote that is not where you usually fetch from.

Use the user preference configuration variable "push.default" to
change this.  If you are an old-timer who is used to the "matching"
semantics, you can set the variable to "matching" to keep the
traditional behaviour.  If you want to live in the future early, you
can set it to "simple" today without waiting for Git 2.0.

When "git add -u" (and "git add -A") is run inside a subdirectory and
does not specify which paths to add on the command line, it
will operate on the entire tree in Git 2.0 for consistency
with "git commit -a" and other commands.  There will be no
mechanism to make plain "git add -u" behave like "git add -u .".
Current users of "git add -u" (without a pathspec) should start
training their fingers to explicitly say "git add -u ."
before Git 2.0 comes.  A warning is issued when these commands are
run without a pathspec and when you have local changes outside the
current directory, because the behaviour in Git 2.0 will be different
from today's version in such a situation.

In Git 2.0, "git add <path>" will behave as "git add -A <path>", so
that "git add dir/" will notice paths you removed from the directory
and record the removal.  Versions before Git 2.0, including this
release, will keep ignoring removals, but the users who rely on this
behaviour are encouraged to start using "git add --ignore-removal <path>"
now before 2.0 is released.


Updates since v1.8.3
--------------------

Foreign interfaces, subsystems and ports.

 * Cygwin port has been updated for more recent Cygwin 1.7.

 * "git rebase -i" now honors --strategy and -X options.

 * Git-gui has been updated to its 0.18.0 version.

 * MediaWiki remote helper (in contrib/) has been updated to use the
   credential helper interface from Git.pm.

 * Update build for Cygwin 1.[57].  Torsten Bögershausen reports that
   this is fine with Cygwin 1.7 ($gmane/225824) so let's try moving it
   ahead.

 * The credential helper to talk to keychain on OS X (in contrib/) has
   been updated to kick in not just when talking http/https but also
   imap(s) and smtp.

 * Remote transport helper has been updated to report errors and
   maintain ref hierarchy used to keep track of its own state better.

 * With "export" remote-helper protocol, (1) a push that tries to
   update a remote ref whose name is different from the pushing side
   does not work yet, and (2) the helper may not know how to do
   --dry-run; these problematic cases are disabled for now.

 * git-remote-hg/bzr (in contrib/) updates.

 * git-remote-mw (in contrib/) hints users to check the certificate,
   when https:// connection failed.

 * git-remote-mw (in contrib/) adds a command to allow previewing the
   contents locally before pushing it out, when working with a
   MediaWiki remote.


UI, Workflows & Features

 * Sample "post-receive-email" hook script got an enhanced replacement
   "multimail" (in contrib/).

 * Also in contrib/ is a new "contacts" script that runs "git blame"
   to find out the people who may be interested in a set of changes.

 * "git clean" command learned an interactive mode.

 * The "--head" option to "git show-ref" was only to add "HEAD" to the
   list of candidate refs to be filtered by the usual rules
   (e.g. "--heads" that only show refs under refs/heads).  The meaning
   of the option has been changed to always show "HEAD" regardless of
   what filtering will be applied to any other ref.

   This is a backward incompatible change and might cause breakages to
   people's existing scripts.

 * "git show -s" was less discoverable than it should have been.  It
   now has a natural synonym "git show --no-patch".

 * "git check-mailmap" is a new command that lets you map usernames
   and e-mail addresses through the mailmap mechanism, just like many
   built-in commands do.

 * "git name-rev" learned to name an annotated tag object back to its
   tagname; "git name-rev $(git rev-parse v1.0.0)" gives "tags/v1.0.0",
   for example.

 * "git cat-file --batch-check=<format>" is added, primarily to allow
   on-disk footprint of objects in packfiles (often they are a lot
   smaller than their true size, when expressed as deltas) to be
   reported.

 * "git rebase [-i]" used to leave just "rebase" as its reflog messages
   for some operations. They have been reworded to be more informative.

 * In addition to the choice from "rebase, merge, or checkout-detach",
   "submodule update" can allow a custom command to be used in to
   update the working tree of submodules via the "submodule.*.update"
   configuration variable.

 * "git submodule update" can optionally clone the submodule
   repositories shallowly.

 * "git format-patch" learned "--from[=whom]" option, which sets the
   "From: " header to the specified person (or the person who runs the
   command, if "=whom" part is missing) and move the original author
   information to an in-body From: header as necessary.

 * The configuration variable "merge.ff" was cleary a tri-state to
   choose one from "favor fast-forward when possible", "always create
   a merge even when the history could fast-forward" and "do not
   create any merge, only update when the history fast-forwards", but
   the command line parser did not implement the usual convention of
   "last one wins, and command line overrides the configuration"
   correctly.

 * "gitweb" learned to optionally place extra links that point at the
   levels higher than the Gitweb pages themselves in the breadcrumbs,
   so that it can be used as part of a larger installation.

 * "git log --format=" now honors i18n.logoutputencoding configuration
   variable.

 * The "push.default=simple" mode of "git push" has been updated to
   behave like "current" without requiring a remote tracking
   information, when you push to a remote that is different from where
   you fetch from (i.e. a triangular workflow).

 * Having multiple "fixup!" on a line in the rebase instruction sheet
   did not work very well with "git rebase -i --autosquash".

 * "git log" learned the "--author-date-order" option, with which the
   output is topologically sorted and commits in parallel histories
   are shown intermixed together based on the author timestamp.

 * Various subcommands of "git submodule" refused to run from anywhere
   other than the top of the working tree of the superproject, but
   they have been taught to let you run from a subdirectory.

 * "git diff" learned a mode that ignores hunks whose change consists
   only of additions and removals of blank lines, which is the same as
   "diff -B" (ignore blank lines) of GNU diff.

 * "git rm" gives a single message followed by list of paths to report
   multiple paths that cannot be removed.

 * "git rebase" can be told with ":/look for this string" syntax commits
   to replay the changes onto and where the work to be replayed begins.

 * Many tutorials teach users to set "color.ui" to "auto" as the first
   thing after you set "user.name/email" to introduce yourselves to
   Git.  Now the variable defaults to "auto".

 * On Cygwin, "cygstart" is now recognised as a possible way to start
   a web browser (used in "help -w" and "instaweb" among others).

 * "git status" learned status.branch and status.short configuration
   variables to use --branch and --short options by default (override
   with --no-branch and --no-short options from the command line).

 * "git cmd <name>", when <name> happens to be a 40-hex string,
   directly uses the 40-hex string as an object name, even if a ref
   "refs/<some hierarchy>/<name>" exists.  This disambiguation order
   is unlikely to change, but we should warn about the ambiguity just
   like we warn when more than one refs/ hierarchies share the same
   name.

 * "git rebase" learned "--[no-]autostash" option to save local
   changes instead of refusing to run (to which people's normal
   response was to stash them and re-run).  This introduced a corner
   case breakage to "git am --abort" but it has been fixed.

 * "check-ignore" (new feature since 1.8.2) has been updated to work
   more like "check-attr" over bidi-pipes.

 * "git describe" learned "--first-parent" option to limit its closest
   tagged commit search to the first-parent chain.

 * "git merge foo" that might have meant "git merge origin/foo" is
   diagnosed with a more informative error message.

 * "git log -L<line>,<range>:<filename>" has been added.  This may
   still have leaks and rough edges, though.

 * We used the approxidate() parser for "--expire=<timestamp>" options
   of various commands, but it is better to treat --expire=all and
   --expire=now a bit more specially than using the current timestamp.
   "git gc" and "git reflog" have been updated with a new parsing
   function for expiry dates.

 * Updates to completion (both bash and zsh) helpers.

 * The behaviour of the "--chain-reply-to" option of "git send-email"
   have changed at 1.7.0, and we added a warning/advice message to
   help users adjust to the new behaviour back then, but we kept it
   around for too long.  The message has finally been removed.

 * "git fetch origin master" unlike "git fetch origin" or "git fetch"
   did not update "refs/remotes/origin/master"; this was an early
   design decision to keep the update of remote tracking branches
   predictable, but in practice it turns out that people find it more
   convenient to opportunistically update them whenever we have a
   chance, and we have been updating them when we run "git push" which
   already breaks the original "predictability" anyway.

 * The configuration variable core.checkstat was advertised in the
   documentation but the code expected core.statinfo instead.
   For now, we accept both core.checkstat and core.statinfo, but the
   latter will be removed in the longer term.


Performance, Internal Implementation, etc.

 * On Cygwin, we used to use our own lstat(2) emulation that is
   allegedly faster than the platform one in codepaths where some of
   the information it returns did not matter, but it started to bite
   us in a few codepaths where the trick it uses to cheat does show
   breakages. This emulation has been removed and we use the native
   lstat(2) emulation supplied by Cygwin now.

 * The function attributes extensions are used to catch mistakes in
   use of our own variadic functions that use NULL sentinel at the end
   (i.e. like execl(3)) and format strings (i.e. like printf(3)).

 * The code to allow configuration data to be read from in-tree blob
   objects is in.  This may help working in a bare repository and
   submodule updates.

 * Fetching between repositories with many refs employed O(n^2)
   algorithm to match up the common objects, which has been corrected.

 * The original way to specify remote repository using .git/branches/
   used to have a nifty feature.  The code to support the feature was
   still in a function but the caller was changed not to call it 5
   years ago, breaking that feature and leaving the supporting code
   unreachable.  The dead code has been removed.

 * "git pack-refs" that races with new ref creation or deletion have
   been susceptible to lossage of refs under right conditions, which
   has been tightened up.

 * We read loose and packed rerferences in two steps, but after
   deciding to read a loose ref but before actually opening it to read
   it, another process racing with us can unlink it, which would cause
   us to barf.  The codepath has been updated to retry when such a
   race is detected, instead of outright failing.

 * Uses of the platform fnmatch(3) function (many places in the code,
   matching pathspec, .gitignore and .gitattributes to name a few)
   have been replaced with wildmatch, allowing "foo/**/bar" that would
   match foo/bar, foo/a/bar, foo/a/b/bar, etc.

 * Memory ownership and lifetime rules for what for-each-ref feeds to
   its callbacks have been clarified (in short, "you do not own it, so
   make a copy if you want to keep it").

 * The revision traversal logic to improve culling of irrelevant
   parents while traversing a mergy history has been updated.

 * Some leaks in unpack-trees (used in merge, cherry-pick and other
   codepaths) have been plugged.

 * The codepath to read from marks files in fast-import/export did not
   have to accept anything but 40-hex representation of the object
   name.  Further, fast-export did not need full in-core object
   representation to have parsed wen reading from them.  These
   codepaths have been optimized by taking advantage of these access
   patterns.

 * Object lookup logic, when the object hashtable starts to become
   crowded, has been optimized.

 * When TEST_OUTPUT_DIRECTORY setting is used, it was handled somewhat
   inconsistently between the test framework and t/Makefile, and logic
   to summarize the results looked at a wrong place.

 * "git clone" uses a lighter-weight implementation when making sure
   that the history behind refs are complete.

 * Many warnings from sparse source checker in compat/ area has been
   squelched.

 * The code to reading and updating packed-refs file has been updated,
   correcting corner case bugs.


Also contains various documentation updates and code clean-ups.


Fixes since v1.8.3
------------------

Unless otherwise noted, all the fixes since v1.8.3 in the maintenance
track are contained in this release (see release notes to them for
details).

 * Newer Net::SMTP::SSL module does not want the user programs to use
   the default behaviour to let server certificate go without
   verification, so by default enable the verification with a
   mechanism to turn it off if needed.
   (merge 35035bb rr/send-email-ssl-verify later to maint).

 * When "git" is spawned in such a way that any of the low 3 file
   descriptors is closed, our first open() may yield file descriptor 2,
   and writing error message to it would screw things up in a big way.
   (merge a11c396 tr/protect-low-3-fds later to maint).

 * The mailmap mechanism unnecessarily downcased the e-mail addresses
   in the output, and also ignored the human name when it is a single
   character name.
   (merge bd23794 jc/mailmap-case-insensitivity later to maint).

 * In two places we did not check return value (expected to be a file
   descriptor) correctly.
   (merge a77f106 tr/fd-gotcha-fixes later to maint).

 * Logic to auto-detect character encodings in the commit log message
   did not reject overlong and invalid UTF-8 characters.
   (merge 81050ac bc/commit-invalid-utf8 later to maint).

 * Pass port number as a separate argument when "send-email" initializes
   Net::SMTP, instead of as a part of the hostname, i.e. host:port.
   This allows GSSAPI codepath to match with the hostname given.
   (merge 1a741bf bc/send-email-use-port-as-separate-param later to maint).

 * "git diff" refused to even show difference when core.safecrlf is
   set to true (i.e. error out) and there are offending lines in the
   working tree files.
   (merge 5430bb2 jc/maint-diff-core-safecrlf later to maint).

 * A test that should have failed but didn't revealed a bug that needs
   to be corrected.
   (merge 94d75d1 jc/t1512-fix later to maint).

 * An overlong path to a .git directory may have overflown the
   temporary path buffer used to create a name for lockfiles.
   (merge 2fbd4f9 mh/maint-lockfile-overflow later to maint).

 * Invocations of "git checkout" used internally by "git rebase" were
   counted as "checkout", and affected later "git checkout -" to the
   the user to an unexpected place.
   (merge 3bed291 rr/rebase-checkout-reflog later to maint).

 * The configuration variable column.ui was poorly documented.
   (merge 5e62cc1 rr/column-doc later to maint).

 * "git name-rev --refs=tags/v*" were forbidden, which was a bit
   inconvenient (you had to give a pattern to match refs fully, like
   --refs=refs/tags/v*).
   (merge 98c5c4a nk/name-rev-abbreviated-refs later to maint).

 * "git apply" parsed patches that add new files, generated by
   programs other than Git, incorrectly.  This is an old breakage in
   v1.7.11 and will need to be merged down to the maintanance tracks.

 * Older cURL wanted piece of memory we call it with to be stable, but
   we updated the auth material after handing it to a call.

 * "git pull" into nothing trashed "local changes" that were in the
   index, and this avoids it.

 * Many "git submodule" operations do not work on a submodule at a
   path whose name is not in ASCII.

 * "cherry-pick" had a small leak in an error codepath.

 * Logic used by git-send-email to suppress cc mishandled names like
   "A U. Thor" <author@example.xz>, where the human readable part
   needs to be quoted (the user input may not have the double quotes
   around the name, and comparison was done between quoted and
   unquoted strings).  It also mishandled names that need RFC2047
   quoting.

 * Call to discard_cache/discard_index (used when we use different
   contents of the index in-core, in many operations like commit,
   apply, and merge) used to leak memory that held the array of index
   entries, which has been plugged.
   (merge a0fc4db rs/discard-index-discard-array later to maint).

 * "gitweb" forgot to clear a global variable $search_regexp upon each
   request, mistakenly carrying over the previous search to a new one
   when used as a persistent CGI.

 * The wildmatch engine did not honor WM_CASEFOLD option correctly.

 * "git log -c --follow $path" segfaulted upon hitting the commit that
   renamed the $path being followed.

 * When a reflog notation is used for implicit "current branch", we
   did not say which branch and worse said "branch ''".

 * "difftool --dir-diff" did not copy back changes made by the
   end-user in the diff tool backend to the working tree in some
   cases.

 * "git push $there HEAD:branch" did not resolve HEAD early enough, so
   it was easy to flip it around while push is still going on and push
   out a branch that the user did not originally intended when the
   command was started.

 * The bash prompt code (in contrib/) displayed the name of the branch
   being rebased when "rebase -i/-m/-p" modes are in use, but not the
   plain vanilla "rebase".

 * Handling of negative exclude pattern for directories "!dir" was
   broken in the update to v1.8.3.

 * zsh prompt script that borrowed from bash prompt script did not
   work due to slight differences in array variable notation between
   these two shells.

 * An entry for "file://" scheme in the enumeration of URL types Git
   can take in the HTML documentation was made into a clickable link
   by mistake.

 * "git push --[no-]verify" was not documented.

 * Stop installing the git-remote-testpy script that is only used for
   testing.

 * "git commit --allow-empty-message -m ''" should not start an
   editor.

 * "git merge @{-1}~22" was rewritten to "git merge frotz@{1}~22"
   incorrectly when your previous branch was "frotz" (it should be
   rewritten to "git merge frotz~22" instead).

 * "git diff -c -p" was not showing a deleted line from a hunk when
   another hunk immediately begins where the earlier one ends.

 * "git log --ancestry-path A...B" did not work as expected, as it did
   not pay attention to the fact that the merge base between A and B
   was the bottom of the range being specified.

 * Mac OS X does not like to write(2) more than INT_MAX number of
   bytes; work it around by chopping write(2) into smaller pieces.

 * Newer MacOS X encourages the programs to compile and link with
   their CommonCrypto, not with OpenSSL.

 * "git clone foo/bar:baz" cannot be a request to clone from a remote
   over git-over-ssh specified in the scp style.  This case is now
   detected and clones from a local repository at "foo/bar:baz".

 * When $HOME is misconfigured to point at an unreadable directory, we
   used to complain and die. Loosen the check.

 * "git subtree" (in contrib/) had one codepath with loose error
   checks to lose data at the remote side.

 * "git fetch" into a shallow repository from a repository that does
   not know about the shallow boundary commits (e.g. a different fork
   from the repository the current shallow repository was cloned from)
   did not work correctly.

 * "git checkout foo" DWIMs the intended "upstream" and turns it into
   "git checkout -t -b foo remotes/origin/foo". This codepath has been
   updated to correctly take existing remote definitions into account.
