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.

 * Instead of typing four capital letters "HEAD", you can say "@" now,
   e.g. "git log @".

 * "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).

 * "git stash save", when your local change turns a tracked file into
   a directory, has to remove files in that directory in order to
   revert your working tree to a pristine state.  This will lose
   untracked files in such a directory, and the command now requires
   you to "--force" it.

 * 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.
