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
* 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.
* 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 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
+ like we warn when more than one refs/ hierarchies share the same
name.
* "git rebase" learned "--[no-]autostash" option to save local
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.
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 references 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
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).
+
+ * 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.
- (merge 212eb96 tr/maint-apply-non-git-patch-parsefix later to maint).
+ v1.7.11 and will need to be merged down to the maintenance 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.
- (merge bed9470 fg/submodule-non-ascii-path later to maint).
* "cherry-pick" had a small leak in an error codepath.
- (merge 706728a fc/sequencer-plug-leak later to maint).
* 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).
- (merge 1495266 mt/send-email-cc-match-fix later to maint).
+ 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,
* "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.
- (merge ca7a5dc cm/gitweb-project-list-persistent-cgi-fix later to maint).
* The wildmatch engine did not honor WM_CASEFOLD option correctly.
- (merge b79c0c3 ar/wildmatch-foldcase later to maint).
* "git log -c --follow $path" segfaulted upon hitting the commit that
renamed the $path being followed.
- (merge 46ec510 cb/log-follow-with-combined later to maint).
* When a reflog notation is used for implicit "current branch", we
did not say which branch and worse said "branch ''".
- (merge 305ebea rr/die-on-missing-upstream later to maint).
* "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.
- (merge 32eaf1d ks/difftool-dir-diff-copy-fix later to maint).
* "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.
- (merge 0f075b2 rr/push-head later to maint).
* 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".
- (merge 1306321 fc/show-branch-in-rebase-am later to maint).
* Handling of negative exclude pattern for directories "!dir" was
broken in the update to v1.8.3.
- (merge c3c327d kb/status-ignored-optim-2 later to maint).
* zsh prompt script that borrowed from bash prompt script did not
work due to slight differences in array variable notation between
these two shells.
- (merge d0583da tg/maint-zsh-svn-remote-prompt later to maint).
* 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.
- (merge 4c32e36 nd/urls-doc-no-file-hyperlink-fix later to maint).
* "git push --[no-]verify" was not documented.
- (merge 90d32d1 tr/push-no-verify-doc later to maint).
* Stop installing the git-remote-testpy script that is only used for
testing.
- (merge 416fda6 fc/makefile later to maint).
* "git commit --allow-empty-message -m ''" should not start an
editor.
- (merge 2520677 rs/commit-m-no-edit later to maint).
* "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).
- (merge 84cf246 jc/strbuf-branchname-fix later to maint).
* "git diff -c -p" was not showing a deleted line from a hunk when
another hunk immediately begins where the earlier one ends.
- (merge aac3857 mk/combine-diff-context-horizon-fix later to maint).
* "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.
- (merge a765499 kb/ancestry-path-threedots later to maint).
* 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.
- (merge 6c642a8 fc/macos-x-clipped-write later to maint).
* Newer MacOS X encourages the programs to compile and link with
their CommonCrypto, not with OpenSSL.
- (merge be4c828 da/darwin later to maint).
* "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".
- (merge 6000334 nd/clone-local-with-colon later to maint).
* When $HOME is misconfigured to point at an unreadable directory, we
used to complain and die. Loosen the check.
- (merge 4698c8f jn/config-ignore-inaccessible later to maint).
* "git subtree" (in contrib/) had one codepath with loose error
checks to lose data at the remote side.
- (merge 3212d56 jk/subtree-do-not-push-if-split-fails later to maint).
* "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.
- (merge 71d5f93 mh/fetch-into-shallow later to maint).
* "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.
- (merge 229177a jh/checkout-auto-tracking later to maint).