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.


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.


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

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