Git v1.8.2 Release Notes
========================

Backward compatibility notes (this release)
-------------------------------------------

"git push $there tag v1.2.3" used to allow replacing a tag v1.2.3
that already exists in the repository $there, if the rewritten tag
you are pushing points at a commit that is a descendant of a commit
that the old tag v1.2.3 points at.  This was found to be error prone
and starting with this release, any attempt to update an existing
ref under refs/tags/ hierarchy will fail, without "--force".

When "git add -u" and "git add -A" that does not specify what paths
to add on the command line is run from inside a subdirectory, the
scope of the operation has always been limited to the subdirectory.
Many users found this counter-intuitive, given that "git commit -a"
and other commands operate on the entire tree regardless of where you
are.  In this release, these commands give a warning message that
suggests the users to use "git add -u/-A ." when they want to limit
the scope to the current directory; doing so will squelch the message,
while training their fingers.


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 the current branch to the branch with the same
name, only when the current branch is set to integrate with that
remote branch.  There is a 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 it 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", that does not specify what paths
to add on the command line is run from inside a subdirectory, these
commands will operate on the entire tree in Git 2.0 for consistency
with "git commit -a" and other commands. Because there will be no
mechanism to make "git add -u" behave as if "git add -u .", it is
important for those who are used to "git add -u" (without pathspec)
updating the index only for paths in the current subdirectory to start
training their fingers to explicitly say "git add -u ." when they mean
it before Git 2.0 comes.


Updates since v1.8.1
--------------------

UI, Workflows & Features

 * Initial ports to QNX and z/OS UNIX System Services have started.

 * Output from the tests is coloured using "green is okay, yellow is
   questionable, red is bad and blue is informative" scheme.

 * Mention of "GIT/Git/git" in the documentation have been updated to
   be more uniform and consistent.  The name of the system and the
   concept it embodies is "Git"; the command the users type is "git".
   All-caps "GIT" was merely a way to imitate "Git" typeset in small
   caps in our ASCII text only documentation and to be avoided.

 * The completion script (in contrib/completion) used to let the
   default completer to suggest pathnames, which gave too many
   irrelevant choices (e.g. "git add" would not want to add an
   unmodified path).  It learnt to use a more git-aware logic to
   enumerate only relevant ones.

 * In bare repositories, "git shortlog" and other commands now read
   mailmap files from the tip of the history, to help running these
   tools in server settings.

 * Color specifiers, e.g. "%C(blue)Hello%C(reset)", used in the
   "--format=" option of "git log" and friends can be disabled when
   the output is not sent to a terminal by prefixing them with
   "auto,", e.g. "%C(auto,blue)Hello%C(auto,reset)".

 * Scripts can ask Git that wildcard patterns in pathspecs they give do
   not have any significance, i.e. take them as literal strings.

 * The patterns in .gitignore and .gitattributes files can have **/,
   as a pattern that matches 0 or more levels of subdirectory.
   E.g. "foo/**/bar" matches "bar" in "foo" itself or in a
   subdirectory of "foo".

 * When giving arguments without "--" disambiguation, object names
   that come earlier on the command line must not be interpretable as
   pathspecs and pathspecs that come later on the command line must
   not be interpretable as object names.  This disambiguation rule has
   been tweaked so that ":/" (no other string before or after) is
   always interpreted as a pathspec; "git cmd -- :/" is no longer
   needed, you can just say "git cmd :/".

 * Various "hint" lines Git gives when it asks the user to edit
   messages in the editor are commented out with '#' by default. The
   core.commentchar configuration variable can be used to customize
   this '#' to a different character.

 * "git add -u" and "git add -A" without pathspec issues warning to
   make users aware that they are only operating on paths inside the
   subdirectory they are in.  Use ":/" (everything from the top) or
   "." (everything from the $cwd) to disambiguate.

 * "git blame" (and "git diff") learned the "--no-follow" option.

 * "git branch" now rejects some nonsense combinations of command line
   arguments (e.g. giving more than one branch name to rename) with
   more case-specific error messages.

 * "git check-ignore" command to help debugging .gitignore files has
   been added.

 * "git cherry-pick" can be used to replay a root commit to an unborn
   branch.

 * "git commit" can be told to use --cleanup=whitespace by setting the
   configuration variable commit.cleanup to 'whitespace'.

 * "git diff" and other Porcelain commands can be told to use a
   non-standard algorithm by setting diff.algorithm configuration
   variable.

 * "git fetch --mirror" and fetch that uses other forms of refspec
   with wildcard used to attempt to update a symbolic ref that match
   the wildcard on the receiving end, which made little sense (the
   real ref that is pointed at by the symbolic ref would be updated
   anyway).  Symbolic refs no longer are affected by such a fetch.

 * "git format-patch" now detects more cases in which a whole branch
   is being exported, and uses the description for the branch, when
   asked to write a cover letter for the series.

 * "git format-patch" learned "-v $count" option, and prepends a
   string "v$count-" to the names of its output files, and also
   automatically sets the subject prefix to "PATCH v$count". This
   allows patches from rerolled series to be stored under different
   names and makes it easier to reuse cover letter messages.

 * "git log" and friends can be told with --use-mailmap option to
   rewrite the names and email addresses of people using the mailmap
   mechanism.

 * "git log --cc --graph" now shows the combined diff output with the
   ancestry graph.

 * "git log --grep=<pattern>" honors i18n.logoutputencoding to look
   for the pattern after fixing the log message to the specified
   encoding.

 * "git mergetool" and "git difftool" learned to list the available
   tool backends in a more consistent manner.

 * "git mergetool" is aware of TortoiseGitMerge now and uses it over
   TortoiseMerge when available.

 * "git push" now requires "-f" to update a tag, even if it is a
   fast-forward, as tags are meant to be fixed points.

 * Error messages from "git push" when it stops to prevent remote refs
   from getting overwritten by mistake have been improved to explain
   various situations separately.

 * "git push" will stop without doing anything if the new "pre-push"
   hook exists and exits with a failure.

 * When "git rebase" fails to generate patches to be applied (e.g. due
   to oom), it failed to detect the failure and instead behaved as if
   there were nothing to do.  A workaround to use a temporary file has
   been applied, but we probably would want to revisit this later, as
   it hurts the common case of not failing at all.

 * Input and preconditions to "git reset" has been loosened where
   appropriate.  "git reset $fromtree Makefile" requires $fromtree to
   be any tree (it used to require it to be a commit), for example.
   "git reset" (without options or parameters) used to error out when
   you do not have any commits in your history, but it now gives you
   an empty index (to match non-existent commit you are not even on).

 * "git status" says what branch is being bisected or rebased when
   able, not just "bisecting" or "rebasing".

 * "git submodule" started learning a new mode to integrate with the
   tip of the remote branch (as opposed to integrating with the commit
   recorded in the superproject's gitlink).

 * "git upload-pack" which implements the service "ls-remote" and
   "fetch" talk to can be told to hide ref hierarchies the server
   side internally uses (and that clients have no business learning
   about) with transfer.hiderefs configuration.


Foreign Interface

 * "git fast-export" has been updated for its use in the context of
   the remote helper interface.

 * A new remote helper to interact with bzr has been added to contrib/.

 * "git p4" got various bugfixes around its branch handling.  It is
   also made usable with Python 2.4/2.5.  In addition, its various
   portability issues for Cygwin have been addressed.

 * The remote helper to interact with Hg in contrib/ has seen a few
   fixes.


Performance, Internal Implementation, etc.

 * "git fsck" has been taught to be pickier about entries in tree
   objects that should not be there, e.g. ".", ".git", and "..".

 * Matching paths with common forms of pathspecs that contain wildcard
   characters has been optimized further.

 * We stopped paying attention to $GIT_CONFIG environment that points
   at a single configuration file from any command other than "git config"
   quite a while ago, but "git clone" internally set, exported, and
   then unexported the variable during its operation unnecessarily.

 * "git reset" internals has been reworked and should be faster in
   general. We tried to be careful not to break any behaviour but
   there could be corner cases, especially when running the command
   from a conflicted state, that we may have missed.

 * The implementation of "imap-send" has been updated to reuse xml
   quoting code from http-push codepath, and lost a lot of unused
   code.

 * There is a simple-minded checker for the test scripts in t/
   directory to catch most common mistakes (it is not enabled by
   default).

 * You can build with USE_WILDMATCH=YesPlease to use a replacement
   implementation of pattern matching logic used for pathname-like
   things, e.g. refnames and paths in the repository.  This new
   implementation is not expected change the existing behaviour of Git
   in this release, except for "git for-each-ref" where you can now
   say "refs/**/master" and match with both refs/heads/master and
   refs/remotes/origin/master.  We plan to use this new implementation
   in wider places (e.g. "git ls-files '**/Makefile' may find Makefile
   at the top-level, and "git log '**/t*.sh'" may find commits that
   touch a shell script whose name begins with "t" at any level) in
   future versions of Git, but we are not there yet.  By building with
   USE_WILDMATCH, using the resulting Git daily and reporting when you
   find breakages, you can help us get closer to that goal.

 * Some reimplementations of Git do not write all the stat info back
   to the index due to their implementation limitations (e.g. jgit).
   A configuration option can tell Git to ignore changes to most of
   the stat fields and only pay attention to mtime and size, which
   these implementations can reliably update.  This can be used to
   avoid excessive revalidation of contents.

 * Some platforms ship with old version of expat where xmlparse.h
   needs to be included instead of expat.h; the build procedure has
   been taught about this.

 * "make clean" on platforms that cannot compute header dependencies
   on the fly did not work with implementations of "rm" that do not
   like an empty argument list.

Also contains minor documentation updates and code clean-ups.


Fixes since v1.8.1
------------------

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

 * An element on GIT_CEILING_DIRECTORIES list that does not name the
   real path to a directory (i.e. a symbolic link) could have caused
   the GIT_DIR discovery logic to escape the ceiling.

 * When attempting to read the XDG-style $HOME/.config/git/config and
   finding that $HOME/.config/git is a file, we gave a wrong error
   message, instead of treating the case as "a custom config file does
   not exist there" and moving on.

 * The behaviour visible to the end users was confusing, when they
   attempt to kill a process spawned in the editor that was in turn
   launched by Git with SIGINT (or SIGQUIT), as Git would catch that
   signal and die.  We ignore these signals now.
   (merge 0398fc34 pf/editor-ignore-sigint later to maint).

 * A child process that was killed by a signal (e.g. SIGINT) was
   reported in an inconsistent way depending on how the process was
   spawned by us, with or without a shell in between.

 * After failing to create a temporary file using mkstemp(), failing
   pathname was not reported correctly on some platforms.

 * We used to stuff "user@" and then append what we read from
   /etc/mailname to come up with a default e-mail ident, but a bug
   lost the "user@" part.

 * The attribute mechanism didn't allow limiting attributes to be
   applied to only a single directory itself with "path/" like the
   exclude mechanism does.  The initial implementation of this that
   was merged to 'maint' and 1.8.1.2 was with a severe performance
   degradations and needs to merge a fix-up topic.

 * The smart HTTP clients forgot to verify the content-type that comes
   back from the server side to make sure that the request is being
   handled properly.

 * "git am" did not parse datestamp correctly from Hg generated patch,
   when it is run in a locale outside C (or en).

 * "git apply" misbehaved when fixing whitespace breakages by removing
   excess trailing blank lines.

 * "git apply --summary" has been taught to make sure the similarity
   value shown in its output is sensible, even when the input had a
   bogus value.

 * A tar archive created by "git archive" recorded a directory in a
   way that made NetBSD's implementation of "tar" sometimes unhappy.

 * "git archive" did not record uncompressed size in the header when
   streaming a zip archive, which confused some implementations of unzip.

 * "git archive" did not parse configuration values in tar.* namespace
   correctly.
   (merge b3873c3 jk/config-parsing-cleanup later to maint).

 * Attempt to "branch --edit-description" an existing branch, while
   being on a detached HEAD, errored out.

 * "git clean" showed what it was going to do, but sometimes end up
   finding that it was not allowed to do so, which resulted in a
   confusing output (e.g. after saying that it will remove an
   untracked directory, it found an embedded git repository there
   which it is not allowed to remove).  It now performs the actions
   and then reports the outcome more faithfully.

 * When "git clone --separate-git-dir=$over_there" is interrupted, it
   failed to remove the real location of the $GIT_DIR it created.
   This was most visible when interrupting a submodule update.

 * "git cvsimport" mishandled timestamps at DST boundary.

 * We used to have an arbitrary 32 limit for combined diff input,
   resulting in incorrect number of leading colons shown when showing
   the "--raw --cc" output.

 * "git fetch --depth" was broken in at least three ways.  The
   resulting history was deeper than specified by one commit, it was
   unclear how to wipe the shallowness of the repository with the
   command, and documentation was misleading.
   (merge cfb70e1 nd/fetch-depth-is-broken later to maint).

 * "git log --all -p" that walked refs/notes/textconv/ ref can later
   try to use the textconv data incorrectly after it gets freed.

 * We forgot to close the file descriptor reading from "gpg" output,
   killing "git log --show-signature" on a long history.

 * The way "git svn" asked for password using SSH_ASKPASS and
   GIT_ASKPASS was not in line with the rest of the system.

 * The --graph code fell into infinite loop when asked to do what the
   code did not expect.

 * http transport was wrong to ask for the username when the
   authentication is done by certificate identity.

 * "git pack-refs" that ran in parallel to another process that
   created new refs had a nasty race.

 * Rebasing the history of superproject with change in the submodule
   has been broken since v1.7.12.

 * After "git add -N" and then writing a tree object out of the
   index, the cache-tree data structure got corrupted.

 * "git clone" used to allow --bare and --separate-git-dir=$there
   options at the same time, which was nonsensical.

 * "git rebase --preserve-merges" lost empty merges in recent versions
   of Git.

 * "git merge --no-edit" computed who were involved in the work done
   on the side branch, even though that information is to be discarded
   without getting seen in the editor.

 * "git merge" started calling prepare-commit-msg hook like "git
   commit" does some time ago, but forgot to pay attention to the exit
   status of the hook.

 * A failure to push due to non-ff while on an unborn branch
   dereferenced a NULL pointer when showing an error message.

 * When users spell "cc:" in lowercase in the fake "header" in the
   trailer part, "git send-email" failed to pick up the addresses from
   there. As e-mail headers field names are case insensitive, this
   script should follow suit and treat "cc:" and "Cc:" the same way.

 * Output from "git status --ignored" showed an unexpected interaction
   with "--untracked".

 * "gitweb", when sorting by age to show repositories with new
   activities first, used to sort repositories with absolutely
   nothing in it early, which was not very useful.

 * "gitweb"'s code to sanitize control characters before passing it to
   "highlight" filter lost known-to-be-safe control characters by
   mistake.

 * "gitweb" pages served over HTTPS, when configured to show picon or
   gravatar, referred to these external resources to be fetched via
   HTTP, resulting in mixed contents warning in browsers.

 * When a line to be wrapped has a solid run of non space characters
   whose length exactly is the wrap width, "git shortlog -w" failed
   to add a newline after such a line.

 * Command line completion leaked an unnecessary error message while
   looking for possible matches with paths in <tree-ish>.

 * Command line completion for "tcsh" emitted an unwanted space
   after completing a single directory name.

 * Command line completion code was inadvertently made incompatible with
   older versions of bash by using a newer array notation.

 * "git push" was taught to refuse updating the branch that is
   currently checked out long time ago, but the user manual was left
   stale.
   (merge 50995ed wk/man-deny-current-branch-is-default-these-days later to maint).

 * Some shells do not behave correctly when IFS is unset; work it
   around by explicitly setting it to the default value.

 * Some scripted programs written in Python did not get updated when
   PYTHON_PATH changed.
   (cherry-pick 96a4647fca54031974cd6ad1 later to maint).

 * When autoconf is used, any build on a different commit always ran
   "config.status --recheck" even when unnecessary.

 * A fix was added to the build procedure to work around buggy
   versions of ccache broke the auto-generation of dependencies, which
   unfortunately is still relevant because some people use ancient
   distros.

 * The autoconf subsystem passed --mandir down to generated
   config.mak.autogen but forgot to do the same for --htmldir.
   (merge 55d9bf0 ct/autoconf-htmldir later to maint).

 * A change made on v1.8.1.x maintenance track had a nasty regression
   to break the build when autoconf is used.
   (merge 7f1b697 jn/less-reconfigure later to maint).

 * We have been carrying a translated and long-unmaintained copy of an
   old version of the tutorial; removed.

 * t0050 had tests expecting failures from a bug that was fixed some
   time ago.

 * t4014, t9502 and t0200 tests had various portability issues that
   broke on OpenBSD.

 * t9020 and t3600 tests had various portability issues.

 * t9200 runs "cvs init" on a directory that already exists, but a
   platform can configure this fail for the current user (e.g. you
   need to be in the cvsadmin group on NetBSD 6.0).

 * t9020 and t9810 had a few non-portable shell script construct.

 * Scripts to test bash completion was inherently flaky as it was
   affected by whatever random things the user may have on $PATH.

 * An element on GIT_CEILING_DIRECTORIES could be a "logical" pathname
   that uses a symbolic link to point at somewhere else (e.g. /home/me
   that points at /net/host/export/home/me, and the latter directory
   is automounted). Earlier when Git saw such a pathname e.g. /home/me
   on this environment variable, the "ceiling" mechanism did not take
   effect. With this release (the fix has also been merged to the
   v1.8.1.x maintenance series), elements on GIT_CEILING_DIRECTORIES
   are by default checked for such aliasing coming from symbolic
   links. As this needs to actually resolve symbolic links for each
   element on the GIT_CEILING_DIRECTORIES, you can disable this
   mechanism for some elements by listing them after an empty element
   on the GIT_CEILING_DIRECTORIES. e.g. Setting /home/me::/home/him to
   GIT_CEILING_DIRECTORIES makes Git resolve symbolic links in
   /home/me when checking if the current directory is under /home/me,
   but does not do so for /home/him.
   (merge 7ec30aa mh/maint-ceil-absolute later to maint).
