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 (cf. <51A606A0.5060101@web.de>) 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 references 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 maintenance 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.
