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

Backward compatibility notes
----------------------------

In the next major release Git 2.0 (not *this* one), we will change the
behavior of the "git push" command.

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).  We will use 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.

"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 warning in such a case and
encourage the user to say "git add -u/-A ." instead when restricting
the scope to the current directory.

At Git 2.0 (not *this* one), we plan to change these commands without
pathspec to operate on the entire tree.  Forming a habit to type "."
when you mean to limit the command to the current working directory
will protect you against the planned future change, and that is the
whole point of the new message (there will be no configuration
variable to squelch this warning---it goes against the "habit forming"
objective).


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