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.

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

 * "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/ hierachies 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.

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