Git 2.10 Release Notes
======================

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

Updates since v2.9
------------------

UI, Workflows & Features

 * "git pull --rebase --verify-signature" learned to warn the user
   that "--verify-signature" is a no-op when rebasing.

 * An upstream project can make a recommendation to shallowly clone
   some submodules in the .gitmodules file it ships.

 * "git worktree add" learned that '-' can be used as a short-hand for
   "@{-1}", the previous branch.

 * Update the funcname definition to support css files.

 * The completion script (in contrib/) learned to complete "git
   status" options.

 * Messages that are generated by auto gc during "git push" on the
   receiving end are now passed back to the sending end in such a way
   that they are shown with "remote: " prefix to avoid confusing the
   users.

 * "git add -i/-p" learned to honor diff.compactionHeuristic
   experimental knob, so that the user can work on the same hunk split
   as "git diff" output.

 * "upload-pack" allows a custom "git pack-objects" replacement when
   responding to "fetch/clone" via the uploadpack.packObjectsHook.
   (merge b738396 jk/upload-pack-hook later to maint).

 * Teach format-patch and mailsplit (hence "am") how a line that
   happens to begin with "From " in the e-mail message is quoted with
   ">", so that these lines can be restored to their original shape.
   (merge d9925d1 ew/mboxrd-format-am later to maint).

 * "git repack" learned the "--keep-unreachable" option, which sends
   loose unreachable objects to a pack instead of leaving them loose.
   This helps heuristics based on the number of loose objects
   (e.g. "gc --auto").
   (merge e26a8c4 jk/repack-keep-unreachable later to maint).

 * "log --graph --format=" learned that "%>|(N)" specifies the width
   relative to the terminal's left edge, not relative to the area to
   draw text that is to the right of the ancestry-graph section.  It
   also now accepts negative N that means the column limit is relative
   to the right border.

 * A careless invocation of "git send-email directory/" after editing
   0001-change.patch with an editor often ends up sending both
   0001-change.patch and its backup file, 0001-change.patch~, causing
   embarrassment and a minor confusion.  Detect such an input and
   offer to skip the backup files when sending the patches out.
   (merge 531220b jc/send-email-skip-backup later to maint).

 * "git submodule update" that drives many "git clone" could
   eventually hit flaky servers/network conditions on one of the
   submodules; the command learned to retry the attempt.

 * The output coloring scheme learned two new attributes, italic and
   strike, in addition to existing bold, reverse, etc.

 * "git log" learns log.showSignature configuration variable, and a
   command line option "--no-show-signature" to countermand it.
   (merge fce04c3 mj/log-show-signature-conf later to maint).

 * A couple of "git svn" updates.

 * More markings of messages for i18n, with updates to various tests
   to pass GETTEXT_POISON tests.

 * "git archive" learned to handle files that are larger than 8GB and
   commits far in the future than expressible by the traditional US-TAR
   format.
   (merge 5caeeb8 jk/big-and-future-archive-tar later to maint).

 * A new configuration variable core.sshCommand has been added to
   specify what value for GIT_SSH_COMMAND to use per repository.

 * "git worktree prune" protected worktrees that are marked as
   "locked" by creating a file in a known location.  "git worktree"
   command learned a dedicated command pair to create and remove such
   a file, so that the users do not have to do this with editor.

 * A handful of "git svn" updates.

 * "git push" learned to accept and pass extra options to the
   receiving end so that hooks can read and react to them.

 * "git status" learned to suggest "merge --abort" during a conflicted
   merge, just like it already suggests "rebase --abort" during a
   conflicted rebase.
   (merge b0a61ab mm/status-suggest-merge-abort later to maint).

 * "git jump" script (in contrib/) has been updated a bit.
   (merge a91e692 jk/git-jump later to maint).

 * "git push" and "git clone" learned to give better progress meters
   to the end user who is waiting on the terminal.


Performance, Internal Implementation, Development Support etc.

 * "git fast-import" learned the same performance trick to avoid
   creating too small a packfile as "git fetch" and "git push" have,
   using *.unpackLimit configuration.

 * When "git daemon" is run without --[init-]timeout specified, a
   connection from a client that silently goes offline can hang around
   for a long time, wasting resources.  The socket-level KEEPALIVE has
   been enabled to allow the OS to notice such failed connections.

 * "git upload-pack" command has been updated to use the parse-options
   API.

 * The "git apply" standalone program is being libified; this is the
   first step to move many state variables into a structure that can
   be explicitly (re)initialized to make the machinery callable more
   than once.

 * HTTP transport gained an option to produce more detailed debugging
   trace.
   (merge 73e57aa ep/http-curl-trace later to maint).

 * Instead of taking advantage of a struct string_list that is
   allocated with all NULs happens to be STRING_LIST_INIT_NODUP kind,
   initialize them explicitly as such, to document their behaviour
   better.
   (merge 2721ce2 jk/string-list-static-init later to maint).

 * HTTPd tests learned to show the server error log to help diagnosing
   a failing tests.
   (merge 44f243d nd/test-lib-httpd-show-error-log-in-verbose later to maint).

 * The ownership rule for the piece of memory that hold references to
   be fetched in "git fetch" was screwy, which has been cleaned up.

 * "git bisect" makes an internal call to "git diff-tree" when
   bisection finds the culprit, but this call did not initialize the
   data structure to pass to the diff-tree API correctly.

 * Further preparatory clean-up for "worktree" feature continues.
   (merge 0409e0b nd/worktree-cleanup-post-head-protection later to maint).

 * Formats of the various data (and how to validate them) where we use
   GPG signature have been documented.

 * A new run-command API function pipe_command() is introduced to
   sanely feed data to the standard input while capturing data from
   the standard output and the standard error of an external process,
   which is cumbersome to hand-roll correctly without deadlocking.

   The codepath to sign data in a prepared buffer with GPG has been
   updated to use this API to read from the status-fd to check for
   errors (instead of relying on GPG's exit status).
   (merge efee955 jk/gpg-interface-cleanup later to maint).

 * Allow t/perf framework to use the features from the most recent
   version of Git even when testing an older installed version.

 * The commands in the "log/diff" family have had an FILE* pointer in the
   data structure they pass around for a long time, but some codepaths
   used to always write to the standard output.  As a preparatory step
   to make "git format-patch" available to the internal callers, these
   codepaths have been updated to consistently write into that FILE*
   instead.

 * Conversion from unsigned char sha1[20] to struct object_id
   continues.

 * Improve the look of the way "git fetch" reports what happened to
   each ref that was fetched.

 * The .c/.h sources are marked as such in our .gitattributes file so
   that "git diff -W" and friends would work better.
   (merge e82675a rs/help-c-source-with-gitattributes later to maint).

 * Code clean-up to avoid using a variable string that compilers may
   feel untrustable as printf-style format given to write_file()
   helper function.

 * "git p4" used a location outside $GIT_DIR/refs/ to place its
   temporary branches, which has been moved to refs/git-p4-tmp/.

 * Existing autoconf generated test for the need to link with pthread
   library did not check all the functions from pthread libraries;
   recent FreeBSD has some functions in libc but not others, and we
   mistakenly thought linking with libc is enough when it is not.
   (merge a9b02de ew/autoconf-pthread later to maint).

 * When "git fsck" reports a broken link (e.g. a tree object contains
   a blob that does not exist), both containing object and the object
   that is referred to were reported with their 40-hex object names.
   The command learned the "--name-objects" option to show the path to
   the containing object from existing refs (e.g. "HEAD~24^2:file.txt").

 * Allow http daemon tests in Travis CI tests.
   (merge d9d1426 ls/travis-enable-httpd-tests later to maint).

 * Makefile assumed that -lrt is always available on platforms that
   want to use clock_gettime() and CLOCK_MONOTONIC, which is not a
   case for recent Mac OS X.  The necessary symbols are often found in
   libc on many modern systems and having -lrt on the command line, as
   long as the library exists, had no effect, but when the platform
   removes librt.a that is a different matter--having -lrt will break
   the linkage.

   This change could be seen as a regression for those who do need to
   specify -lrt, as they now specifically ask for NEEDS_LIBRT when
   building. Hopefully they are in the minority these days.

 * Further preparatory work on the refs API before the pluggable
   backend series can land.

 * Error handling in the codepaths that updates refs has been
   improved.

 * The API to iterate over all the refs (i.e. for_each_ref(), etc.)
   has been revamped.

 * A few tests that specifically target "git rebase -i" have been
   added.

 * Dumb http transport on the client side has been optimized.
   (merge ecba195 ew/http-walker later to maint).

 * Users of the parse_options_concat() API function need to allocate
   extra slots in advance and fill them with OPT_END() when they want
   to decide the set of supported options dynamically, which makes the
   code error-prone and hard to read.  This has been corrected by tweaking
   the API to allocate and return a new copy of "struct option" array.
   (merge 023ff39 jk/parse-options-concat later to maint).

 * "git fetch" exchanges batched have/ack messages between the sender
   and the receiver, initially doubling every time and then falling
   back to enlarge the window size linearly.  The "smart http"
   transport, being an half-duplex protocol, outgrows the preset limit
   too quickly and becomes inefficient when interacting with a large
   repository.  The internal mechanism learned to grow the window size
   more aggressively when working with the "smart http" transport.


Also contains various documentation updates and code clean-ups.


Fixes since v2.9
----------------

Unless otherwise noted, all the fixes since v2.8 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * The commands in `git log` family take %C(auto) in a custom format
   string.  This unconditionally turned the color on, ignoring
   --no-color or with --color=auto when the output is not connected to
   a tty; this was corrected to make the format truly behave as
   "auto".

 * "git rev-list --count" whose walk-length is limited with "-n"
   option did not work well with the counting optimized to look at the
   bitmap index.

 * "git show -W" (extend hunks to cover the entire function, delimited
   by lines that match the "funcname" pattern) used to show the entire
   file when a change added an entire function at the end of the file,
   which has been fixed.

 * The documentation set has been updated so that literal commands,
   configuration variables and environment variables are consistently
   typeset in fixed-width font and bold in manpages.

 * "git svn propset" subcommand that was added in 2.3 days is
   documented now.

 * The documentation tries to consistently spell "GPG"; when
   referring to the specific program name, "gpg" is used.

 * "git reflog" stopped upon seeing an entry that denotes a branch
   creation event (aka "unborn"), which made it appear as if the
   reflog was truncated.

 * The git-prompt scriptlet (in contrib/) was not friendly with those
   who uses "set -u", which has been fixed.

 * compat/regex code did not cleanly compile.

 * A codepath that used alloca(3) to place an unbounded amount of data
   on the stack has been updated to avoid doing so.

 * "git update-index --add --chmod=+x file" may be usable as an escape
   hatch, but not a friendly thing to force for people who do need to
   use it regularly.  "git add --chmod=+x file" can be used instead.

 * Build improvements for gnome-keyring (in contrib/)

 * "git status" used to say "working directory" when it meant "working
   tree".

 * Comments about misbehaving FreeBSD shells have been clarified with
   the version number (9.x and before are broken, newer ones are OK).

 * "git cherry-pick A" worked on an unborn branch, but "git
   cherry-pick A..B" didn't.

 * Fix an unintended regression in v2.9 that breaks "clone --depth"
   that recurses down to submodules by forcing the submodules to also
   be cloned shallowly, which many server instances that host upstream
   of the submodules are not prepared for.

 * Fix unnecessarily waste in the idiomatic use of ': ${VAR=default}'
   to set the default value, without enclosing it in double quotes.

 * Some platform-specific code had non-ANSI strict declarations of C
   functions that do not take any parameters, which has been
   corrected.

 * The internal code used to show local timezone offset is not
   prepared to handle timestamps beyond year 2100, and gave a
   bogus offset value to the caller.  Use a more benign looking
   +0000 instead and let "git log" going in such a case, instead
   of aborting.

 * One among four invocations of readlink(1) in our test suite has
   been rewritten so that the test can run on systems without the
   command (others are in valgrind test framework and t9802).

 * t/perf needs /usr/bin/time with GNU extension; the invocation of it
   is updated to "gtime" on Darwin.

 * A bug, which caused "git p4" while running under verbose mode to
   report paths that are omitted due to branch prefix incorrectly, has
   been fixed; the command said "Ignoring file outside of prefix" for
   paths that are _inside_.

 * The top level documentation "git help git" still pointed at the
   documentation set hosted at now-defunct google-code repository.
   Update it to point to https://git.github.io/htmldocs/git.html
   instead.

 * A helper function that takes the contents of a commit object and
   finds its subject line did not ignore leading blank lines, as is
   commonly done by other codepaths.  Make it ignore leading blank
   lines to match.

 * For a long time, we carried an in-code comment that said our
   colored output would work only when we use fprintf/fputs on
   Windows, which no longer is the case for the past few years.

 * "gc.autoPackLimit" when set to 1 should not trigger a repacking
   when there is only one pack, but the code counted poorly and did
   so.

 * Add a test to specify the desired behaviour that currently is not
   available in "git rebase -Xsubtree=...".

 * More mark-up updates to typeset strings that are expected to
   literally typed by the end user in fixed-width font.

 * "git commit --amend --allow-empty-message -S" for a commit without
   any message body could have misidentified where the header of the
   commit object ends.

 * "git rebase -i --autostash" did not restore the auto-stashed change
   when the operation was aborted.

 * Git does not know what the contents in the index should be for a
   path added with "git add -N" yet, so "git grep --cached" should not
   show hits (or show lack of hits, with -L) in such a path, but that
   logic does not apply to "git grep", i.e. searching in the working
   tree files.  But we did so by mistake, which has been corrected.

 * "git blame -M" missed a single line that was moved within the file.

 * Fix recently introduced codepaths that are involved in parallel
   submodule operations, which gave up on reading too early, and
   could have wasted CPU while attempting to write under a corner
   case condition.

 * "git grep -i" has been taught to fold case in non-ascii locales
   correctly.

 * A test that unconditionally used "mktemp" learned that the command
   is not necessarily available everywhere.

 * There are certain house-keeping tasks that need to be performed at
   the very beginning of any Git program, and programs that are not
   built-in commands had to do them exactly the same way as "git"
   potty does.  It was easy to make mistakes in one-off standalone
   programs (like test helpers).  A common "main()" function that
   calls cmd_main() of individual program has been introduced to
   make it harder to make mistakes.
   (merge de61ceb jk/common-main later to maint).

 * The test framework learned a new helper test_match_signal to
   check an exit code from getting killed by an expected signal.

 * General code clean-up around a helper function to write a
   single-liner to a file.
   (merge 7eb6e10 jk/write-file later to maint).

 * One part of "git am" had an oddball helper function that called
   stuff from outside "his" as opposed to calling what we have "ours",
   which was not gender-neutral and also inconsistent with the rest of
   the system where outside stuff is usuall called "theirs" in
   contrast to "ours".

 * "git blame file" allowed the lineage of lines in the uncommitted,
   unadded contents of "file" to be inspected, but it refused when
   "file" did not appear in the current commit.  When "file" was
   created by renaming an existing file (but the change has not been
   committed), this restriction was unnecessarily tight.
   (merge c66b470 mh/blame-worktree later to maint).

 * "git add -N dir/file && git write-tree" produced an incorrect tree
   when there are other paths in the same directory that sorts after
   "file".
   (merge 6d6a782 nd/cache-tree-ita later to maint).

 * "git fetch http://user:pass@host/repo..." scrubbed the userinfo
   part, but "git push" didn't.
   (merge 68f3c07 jk/push-scrub-url later to maint).

 * "git merge" with renormalization did not work well with
   merge-recursive, due to "safer crlf" conversion kicking in when it
   shouldn't.
   (merge 1335d76 jc/renormalize-merge-kill-safer-crlf later to maint).

 * The use of strbuf in "git rm" to build filename to remove was a bit
   suboptimal, which has been fixed.
   (merge deb8e15 rs/rm-strbuf-optim later to maint).

 * An age old bug that caused "git diff --ignore-space-at-eol"
   misbehave has been fixed.
   (merge 044fb19 js/ignore-space-at-eol later to maint).

 * "git notes merge" had a code to see if a path exists (and fails if
   it does) and then open the path for writing (when it doesn't).
   Replace it with open with O_EXCL.
   (merge deb9c15 rs/notes-merge-no-toctou later to maint).

 * "git pack-objects" and "git index-pack" mostly operate with off_t
   when talking about the offset of objects in a packfile, but there
   were a handful of places that used "unsigned long" to hold that
   value, leading to an unintended truncation.
   (merge ec9d224 nd/pack-ofs-4gb-limit later to maint).

 * Recent update to "git daemon" tries to enable the socket-level
   KEEPALIVE, but when it is spawned via inetd, the standard input
   file descriptor may not necessarily be connected to a socket.
   Suppress an ENOTSOCK error from setsockopt().
   (merge fab6027 ew/daemon-socket-keepalive later to maint).

 * Recent FreeBSD stopped making perl available at /usr/bin/perl;
   switch the default the built-in path to /usr/local/bin/perl on not
   too ancient FreeBSD releases.
   (merge 259f22a ew/find-perl-on-freebsd-in-local later to maint).

 * "git commit --help" said "--no-verify" is only about skipping the
   pre-commit hook, and failed to say that it also skipped the
   commit-msg hook.
   (merge def480f os/no-verify-skips-commit-msg-too later to maint).

 * "git merge" in Git v2.9 was taught to forbid merging an unrelated
   lines of history by default, but that is exactly the kind of thing
   the "--rejoin" mode of "git subtree" (in contrib/) wants to do.
   "git subtree" has been taught to use the "--allow-unrelated-histories"
   option to override the default.
   (merge 0f12c7d da/subtree-2.9-regression later to maint).

 * The build procedure for "git persistent-https" helper (in contrib/)
   has been updated so that it can be built with more recent versions
   of Go.
   (merge accb613 pm/build-persistent-https-with-recent-go later to maint).

 * There is an optimization used in "git diff $treeA $treeB" to borrow
   an already checked-out copy in the working tree when it is known to
   be the same as the blob being compared, expecting that open/mmap of
   such a file is faster than reading it from the object store, which
   involves inflating and applying delta.  This however kicked in even
   when the checked-out copy needs to go through the convert-to-git
   conversion (including the clean filter), which defeats the whole
   point of the optimization.  The optimization has been disabled when
   the conversion is necessary.
   (merge 06dec43 jk/diff-do-not-reuse-wtf-needs-cleaning later to maint).

 * "git -c grep.patternType=extended log --basic-regexp" misbehaved
   because the internal API to access the grep machinery was not
   designed well.
   (merge 8465541 jc/grep-commandline-vs-configuration later to maint).

 * Other minor clean-ups and documentation updates
   (merge e51b0df pb/commit-editmsg-path later to maint).
   (merge b333d0d jk/send-pack-stdio later to maint).
   (merge fcf0fe9 lf/sideband-returns-void later to maint).
   (merge c2691e2 ah/unpack-trees-advice-messages later to maint).
   (merge c61b2af lf/recv-sideband-cleanup later to maint).
   (merge 31471ba rs/use-strbuf-addbuf later to maint).
   (merge 503e224 nd/test-helpers later to maint).
   (merge 16726cf jc/doc-diff-filter-exclude later to maint).
   (merge fd2e7da rs/worktree-use-strbuf-absolute-path later to maint).
   (merge 406621f sb/submodule-deinit-all later to maint).
   (merge 55cbe18 rs/submodule-config-code-cleanup later to maint).
   (merge 280abfd sb/pack-protocol-doc-nak later to maint).
