Git v1.8.3 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.  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.2
--------------------

Foreign interface

 * remote-hg and remote-bzr helpers (in contrib/ since v1.8.2) have
   been updated; especially, the latter has been accelerated to help
   Emacs folks, whose primary SCM seems to be stagnating.


UI, Workflows & Features

 * A handful of updates applied to gitk, including an addition of
   "revert" action, showing dates in tags in a nicer way, making
   colors configurable, and support for -G'pickaxe' search.

 * The prompt string generator (in contrib/completion/) learned to
   show how many changes there are in total and how many have been
   replayed during a "git rebase" session.

 * "git branch --vv" learned to paint the name of the branch it
   integrates with in a different color (color.branch.upstream,
   which defaults to blue).

 * In a sparsely populated working tree, "git checkout <pathspec>" no
   longer unmarks paths that match the given pathspec that were
   originally ignored with "--sparse" (use --ignore-skip-worktree-bits
   option to resurrect these paths out of the index if you really want
   to).

 * "git log --format" specifier learned %C(auto) token that tells Git
   to use color when interpolating %d (decoration), %h (short commit
   object name), etc. for terminal output.

 * "git bisect" leaves the final outcome as a comment in its bisect
   log file.

 * "git clone --reference" can now refer to a gitfile "textual symlink"
   that points at the real location of the repository.

 * "git count-objects" learned "--human-readable" aka "-H" option to
   show various large numbers in Ki/Mi/GiB scaled as necessary.

 * "git cherry-pick $blob" and "git cherry-pick $tree" are nonsense,
   and a more readable error message e.g. "can't cherry-pick a tree"
   is given (we used to say "expected exactly one commit").

 * The "--annotate" option to "git send-email" can be turned on (or
   off) by default with sendemail.annotate configuration variable (you
   can use --no-annotate from the command line to override it).

 * The "--cover-letter" option to "git format-patch" can be turned on
   (or off) by default with format.coverLetter configuration
   variable. By setting it to 'auto', you can turn it on only for a
   series with two or more patches.

 * The bash completion support (in contrib/) learned that cherry-pick
   takes a few more options than it already knew about.

 * "git help" learned "-g" option to show the list of guides just like
   list of commands are given with "-a".

 * A triangular "pull from one place, push to another place" workflow
   is supported better by new remote.pushdefault (overrides the
   "origin" thing) and branch.*.pushremote (overrides the
   branch.*.remote) configuration variables.

 * "git status" learned to report that you are in the middle of a
   revert session, just like it does for a cherry-pick and a bisect
   session.

 * The handling by "git branch --set-upstream-to" against various forms
   of erroneous inputs was suboptimal and has been improved.

 * When the interactive access to git-shell is not enabled, it issues
   a message meant to help the system administrator to enable it.
   An explicit way to help the end users who connect to the service by
   issuing custom messages to refuse such an access has been added.

 * In addition to the case where the user edits the log message with
   the "e)dit" option of "am -i", replace the "Applying: this patch"
   message with the final log message contents after applymsg hook
   munges it.

 * "git status" suggests users to look into using --untracked=no option
   when it takes too long.

 * "git status" shows a bit more information during a
   rebase/bisect session.

 * "git fetch" learned to fetch a commit at the tip of an unadvertised
   ref by specifying a raw object name from the command line when the
   server side supports this feature.

 * Output from "git log --graph" works better with submodule log
   output now.

 * "git count-objects -v" learned to report leftover temporary
   packfiles and other garbage in the object store.

 * A new read-only credential helper (in contrib/) to interact with
   the .netrc/.authinfo files has been added.

 * "git send-email" can be used with the credential helper system.

 * There was no Porcelain way to say "I no longer am interested in
   this submodule", once you express your interest in a submodule with
   "submodule init".  "submodule deinit" is the way to do so.

 * "git pull --rebase" learned to pass "-v/-q" options to underlying
   "git rebase".

 * The new "--follow-tags" option tells "git push" to push relevant
   annotated tags when pushing branches out.

 * "git merge" and "git pull" can optionally be told to inspect and
   reject when merging a commit that does not carry a trusted GPG
   signature.

 * "git mergetool" now feeds files to the "p4merge" backend in the
   order that matches the p4 convention, where "theirs" is usually
   shown on the left side, which is the opposite from what other backends
   expect.

 * "show/log" now honors gpg.program configuration just like other
   parts of the code that use GnuPG.

 * "git log" that shows the difference between the parent and the
   child has been optimized somewhat.

 * "git difftool" allows the user to write into the temporary files
   being shown; if the user makes changes to the working tree at the
   same time, it now refrains from overwriting the copy in the working
   tree and leaves the temporary file so that changes can be merged
   manually.

 * There was no good way to ask "I have a random string that came from
   outside world. I want to turn it into a 40-hex object name while
   making sure such an object exists".  A new peeling suffix ^{object}
   can be used for that purpose, together with "rev-parse --verify".


Performance, Internal Implementation, etc.

 * Updates for building under msvc.

 * A handful of issues in the code that traverses the working tree to find
   untracked and/or ignored files have been fixed, and the general
   codepath involved in "status -u" and "clean" have been cleaned up
   and optimized.

 * The stack footprint of some codepaths that access an object from a
   pack has been shrunk.

 * The logic to coalesce the same lines removed from the parents in
   the output from "diff -c/--cc" has been updated, but with O(n^2)
   complexity, so this might turn out to be undesirable.

 * The code to enforce permission bits on files in $GIT_DIR/ for
   shared repositories has been simplified.

 * A few codepaths know how much data they need to put in the
   hashtables they use when they start, but still began with small tables
   and repeatedly grew and rehashed them.

 * The API to walk reflog entries from the latest to older, which was
   necessary for operations such as "git checkout -", was cumbersome
   to use correctly and also inefficient.

 * Codepaths that inspect log-message-to-be and decide when to add a
   new Signed-off-by line in various commands have been consolidated.

 * The pkt-line API, implementation and its callers have been cleaned
   up to make them more robust.

 * The Cygwin port has a faster-but-lying lstat(2) emulation whose
   incorrectness does not matter in practice except for a few
   codepaths, and setting permission bits on directories is a codepath
   that needs to use a more correct one.

 * "git checkout" had repeated pathspec matches on the same paths,
   which have been consolidated.  Also a bug in "git checkout dir/"
   that is started from an unmerged index has been fixed.

 * A few bugfixes to "git rerere" working on corner case merge
   conflicts have been applied.


Also contains various documentation updates and code clean-ups.


Fixes since v1.8.2
------------------

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

 * Recent versions of File::Temp (used by "git svn") started blowing
   up when its tempfile sub is called as a class method; updated the
   callsite to call it as a plain vanilla function to fix it.
   (merge eafc2dd hb/git-pm-tempfile later to maint).

 * Various subcommands of "git remote" simply ignored extraneous
   command line arguments instead of diagnosing them as errors.
   (merge b17dd3f tr/remote-tighten-commandline-parsing later to maint).

 * When receive-pack detects an error in the pack header it received in
   order to decide which of unpack-objects or index-pack to run, it
   returned without closing the error stream, which led to a hung
   sideband thread.

 * Zsh completion forgot that the '%' character used to signal untracked
   files needs to be escaped with another '%'.

 * A commit object whose author or committer ident are malformed
   crashed some code that trusted that a name, an email and a
   timestamp can always be found in it.

 * When "upload-pack" fails while generating a pack in response to
   "git fetch" (or "git clone"), the receiving side had
   a programming error that triggered the die handler
   recursively.

 * "rev-list --stdin" and friends kept bogus pointers into the input
   buffer around as human readable object names.  This was not a huge
   problem but was exposed by a new change that uses these names in
   error output.
   (merge 70d26c6 tr/copy-revisions-from-stdin later to maint).

 * Smart-capable HTTP servers were not restricted via the
   GIT_NAMESPACE mechanism when talking with commit-walking clients,
   like they are when talking with smart HTTP clients.
   (merge 6130f86 jk/http-dumb-namespaces later to maint).

 * "git merge-tree" did not omit a merge result that is identical to
   the "our" side in certain cases.
   (merge aacecc3 jk/merge-tree-added-identically later to maint).

 * Perl scripts like "git-svn" closed (instead of redirecting to /dev/null)
   the standard error stream, which is not a very smart thing to do.
   A later open may return file descriptor #2 for an unrelated purpose, and
   error reporting code may write into it.

 * "git show-branch" was not prepared to show a very long run of
   ancestor operators e.g. foobar^2~2^2^2^2...^2~4 correctly.

 * "git diff --diff-algorithm algo" is also understood as "git diff
   --diff-algorithm=algo".

 * The new core.commentchar configuration was not applied in a few
   places.

 * "git bundle" erroneously bailed out when parsing a valid bundle
   containing a prerequisite commit without a commit message.

 * "git log -S/-G" started paying attention to textconv filter, but
   there was no way to disable this.  Make it honor the --no-textconv
   option.

 * When used with the "-d temporary-directory" option, "git filter-branch"
   failed to come back to the original working tree to perform the
   final clean-up procedure.

 * "git merge $(git rev-parse v1.8.2)" behaved quite differently from
   "git merge v1.8.2", as if v1.8.2 were written as v1.8.2^0 and did
   not pay much attention to the annotated tag payload.  Make the code
   notice the type of the tag object, in addition to the dwim_ref()
   based classification the current code uses (i.e. the name appears
   in refs/tags/) to decide when to special-case tag merging.

 * Fix a 1.8.1.x regression that stopped matching "dir" (without a
   trailing slash) to a directory "dir".
   (merge efa5f82 jc/directory-attrs-regression-fix later to maint-1.8.1).

 * "git apply --whitespace=fix" was not prepared to see a line getting
   longer after fixing whitespaces (e.g. tab-in-indent aka Python).
   (merge 329b26e jc/apply-ws-fix-tab-in-indent later to maint-1.8.1).

 * The prompt string generator (in contrib/completion/) did not notice
   when we are in a middle of a "git revert" session.

 * "submodule summary --summary-limit" option did not support the
   "--option=value" form.

 * "index-pack --fix-thin" used an uninitialized value to compute
   the delta depths of objects it appends to the resulting pack.

 * "index-pack --verify-stat" used a few counters outside the protection
   of a mutex, possibly showing incorrect numbers.

 * The code to keep track of what directory names are known to Git on
   platforms with case insensitive filesystems could get confused upon a
   hash collision between these pathnames and would loop forever.

 * Annotated tags outside the refs/tags/ hierarchy were not advertised
   correctly to ls-remote and fetch with recent versions of Git.

 * Recent optimizations broke shallow clones.

 * "git cmd -- ':(top'" was not diagnosed as an invalid syntax, and
   instead the parser kept reading beyond the end of the string.

 * "git tag -f <tag>" always said "Updated tag '<tag>'" even when
   creating a new tag (i.e. neither overwriting nor updating).

 * "git p4" did not behave well when the path to the root of the P4
   client was not its real path.
   (merge bbd8486 pw/p4-symlinked-root later to maint).

 * "git archive" reported a failure when asked to create an archive out
   of an empty tree.  It is more intuitive to give an empty
   archive back in such a case.

 * When "format-patch" quoted a non-ascii string in header files,
   it incorrectly applied rfc2047 and chopped a single character in
   the middle of the string.

 * An aliased command spawned from a bare repository that does not say
   it is bare with "core.bare = yes" was treated as non-bare by mistake.

 * In "git reflog expire", the REACHABLE bit was not cleared from the
   correct objects.

 * The logic used by "git diff -M --stat" to shorten the names of
   files before and after a rename did not work correctly when the
   common prefix and suffix between the two filenames overlapped.

 * The "--match=<pattern>" option of "git describe", when used with
   "--all" to allow refs that are not annotated tags to be a
   base of description, did not restrict the output from the command
   to those refs that match the given pattern.

 * Clarify in the documentation "what" gets pushed to "where" when the
   command line to "git push" does not say these explicitly.

 * The "--color=<when>" argument to the commands in the diff family
   was described poorly.

 * The arguments given to the pre-rebase hook were not documented.

 * The v4 index format was not documented.

 * The "--match=<pattern>" argument "git describe" takes uses glob
   pattern but it wasn't obvious from the documentation.

 * Some sources failed to compile on systems that lack NI_MAXHOST in
   their system header (e.g. z/OS).

 * Add an example use of "--env-filter" in "filter-branch"
   documentation.

 * "git bundle verify" did not say "records a complete history" for a
   bundle that does not have any prerequisites.

 * In the v1.8.0 era, we changed symbols that do not have to be global
   to file scope static, but a few functions in graph.c were used by
   CGit sideways, bypassing the entry points of the API the
   in-tree users use.

 * "git update-index -h" did not do the usual "-h(elp)" thing.

 * "git index-pack" had a buffer-overflow while preparing an
   informational message when the translated version of it was too
   long.

 * 'git commit -m "$msg"' used to add an extra newline even when
   $msg already ended with one.

 * The SSL peer verification done by "git imap-send" did not ask for
   Server Name Indication (RFC 4366), failing to connect to SSL/TLS
   sites that serve multiple hostnames on a single IP.

 * perl/Git.pm::cat_blob slurped everything in core only to write it
   out to a file descriptor, which was not a very smart thing to do.

 * "git branch" did not bother to check nonsense command line
   parameters.  It now issues errors in many cases.

 * Verification of signed tags was not done correctly when not in C
   or en/US locale.

 * Some platforms and users spell UTF-8 differently; retry with the
   most official "UTF-8" when the system does not understand the
   user-supplied encoding name that is a common alternative
   spelling of UTF-8.

 * When export-subst is used, "zip" output recorded an incorrect
   size of the file.

 * "git am $maildir/" applied messages in an unexpected order; sort
   filenames read from the maildir/ in a way that is more likely to
   sort the messages in the order the writing MUA meant to, by sorting
   numeric segments in numeric order and non-numeric segments in
   alphabetical order.

 * "git submodule update", when recursed into sub-submodules, did not
   accumulate the prefix paths.
