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

 * 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 560b0e8 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.

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

 * An entry "git log --decorate" for the tip of the current branch is
   shown as "HEAD -> name" (where "name" is the name of the branch);
   the arrow is now painted in the same color as "HEAD", not in the
   color for commits.

 * "git format-patch" learned format.from configuration variable to
   specify the default settings for its "--from" option.

 * "git am -3" calls "git merge-recursive" when it needs to fall back
   to a three-way merge; this call has been turned into an internal
   subroutine call instead of spawning a separate subprocess.

 * The command line completion scripts (in contrib/) now knows about
   "git branch --delete/--move [--remote]".
   (merge 2703c22 vs/completion-branch-fully-spelled-d-m-r later to maint).

 * "git rev-parse --git-path hooks/<hook>" learned to take
   core.hooksPath configuration variable (introduced during 2.9 cycle)
   into account.
   (merge 9445b49 ab/hooks later to maint).

 * "git log --show-signature" and other commands that display the
   verification status of PGP signature now shows the longer key-id,
   as 32-bit key-id is so last century.


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; 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 has been merged.

 * 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 the fact that a struct string_list
   that is allocated with all NULs happens to be the INIT_NODUP kind,
   the users of string_list structures are taught to 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.

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

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

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

 * The handling of the "text=auto" attribute has been corrected.
   $ echo "* text=auto eol=crlf" >.gitattributes
   used to have the same effect as
   $ echo "* text eol=crlf" >.gitattributes
   i.e. declaring all files are text (ignoring "auto").  The
   combination has been fixed to be equivalent to doing
   $ git config core.autocrlf true

 * Documentation has been updated to show better example usage
   of the updated "text=auto" attribute.

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

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

 * Tests for "git svn" have been taught to reuse the lib-httpd test
   infrastructure when testing the subversion integration that
   interacts with subversion repositories served over the http://
   protocol.
   (merge a8a5d25 ew/git-svn-http-tests later to maint).

 * "git pack-objects" has a few options that tell it not to pack
   objects found in certain packfiles, which require it to scan .idx
   files of all available packs.  The codepaths involved in these
   operations have been optimized for a common case of not having any
   non-local pack and/or any .kept pack.

 * The t3700 test about "add --chmod=-x" have been made a bit more
   robust and generally cleaned up.
   (merge 766cdc4 ib/t3700-add-chmod-x-updates later to maint).

 * The build procedure learned PAGER_ENV knob that lists what default
   environment variable settings to export for popular pagers.  This
   mechanism is used to tweak the default settings to MORE on FreeBSD.
   (merge 995bc22 ew/build-time-pager-tweaks later to maint).

 * The http-backend (the server-side component of smart-http
   transport) used to trickle the HTTP header one at a time.  Now
   these write(2)s are batched.
   (merge b36045c ew/http-backend-batch-headers later to maint).

 * When "git rebase" tries to compare set of changes on the updated
   upstream and our own branch, it computes patch-id for all of these
   changes and attempts to find matches. This has been optimized by
   lazily computing the full patch-id (which is expensive) to be
   compared only for changes that touch the same set of paths.
   (merge ba67504 kw/patch-ids-optim later to maint).

 * A handful of tests that were broken under gettext-poison build have
   been fixed.

 * The recent i18n patch we added during this cycle did a bit too much
   refactoring of the messages to avoid word-legos; the repetition has
   been reduced to help translators.


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

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

 * "git fetch http://user:pass@host/repo..." scrubbed the userinfo
   part, but "git push" didn't.

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

 * An age old bug that caused "git diff --ignore-space-at-eol"
   misbehave has been fixed.

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

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

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

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

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

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

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

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

 * "git -c grep.patternType=extended log --basic-regexp" misbehaved
   because the internal API to access the grep machinery was not
   designed well.

 * Windows port was failing some tests in t4130, due to the lack of
   inum in the returned values by its lstat(2) emulation.

 * The reflog output format is documented better, and a new format
   --date=unix to report the seconds-since-epoch (without timezone)
   has been added.
   (merge 442f6fd jk/reflog-date later to maint).

 * "git difftool <paths>..." started in a subdirectory failed to
   interpret the paths relative to that directory, which has been
   fixed.

 * The characters in the label shown for tags/refs for commits in
   "gitweb" output are now properly escaped for proper HTML output.

 * FreeBSD can lie when asked mtime of a directory, which made the
   untracked cache code to fall back to a slow-path, which in turn
   caused tests in t7063 to fail because it wanted to verify the
   behaviour of the fast-path.

 * Squelch compiler warnings for nedmalloc (in compat/) library.

 * A small memory leak in the command line parsing of "git blame"
   has been plugged.

 * The API documentation for hashmap was unclear if hashmap_entry
   can be safely discarded without any other consideration.  State
   that it is safe to do so.

 * Not-so-recent rewrite of "git am" that started making internal
   calls into the commit machinery had an unintended regression, in
   that no matter how many seconds it took to apply many patches, the
   resulting committer timestamp for the resulting commits were all
   the same.

 * "git push --force-with-lease" already had enough logic to allow
   ensuring that such a push results in creation of a ref (i.e. the
   receiving end did not have another push from sideways that would be
   discarded by our force-pushing), but didn't expose this possibility
   to the users.  It does so now.
   (merge 9eed4f3 jk/push-force-with-lease-creation later to maint).

 * The mechanism to limit the pack window memory size, when packing is
   done using multiple threads (which is the default), is per-thread,
   but this was not documented clearly.
   (merge 954176c ms/document-pack-window-memory-is-per-thread later to maint).

 * "import-tars" fast-import script (in contrib/) used to ignore a
   hardlink target and replaced it with an empty file, which has been
   corrected to record the same blob as the other file the hardlink is
   shared with.
   (merge 04e0869 js/import-tars-hardlinks later to maint).

 * "git mv dir non-existing-dir/" did not work in some environments
   the same way as existing mainstream platforms.  The code now moves
   "dir" to "non-existing-dir", without relying on rename("A", "B/")
   that strips the trailing slash of '/'.
   (merge 189d035 js/mv-dir-to-new-directory later to maint).

 * The "t/" hierarchy is prone to get an unusual pathname; "make test"
   has been taught to make sure they do not contain paths that cannot
   be checked out on Windows (and the mechanism can be reusable to
   catch pathnames that are not portable to other platforms as need
   arises).
   (merge c2cafd3 js/test-lint-pathname later to maint).

 * When "git merge-recursive" works on history with many criss-cross
   merges in "verbose" mode, the names the command assigns to the
   virtual merge bases could have overwritten each other by unintended
   reuse of the same piece of memory.
   (merge 5447a76 rs/pull-signed-tag later to maint).

 * "git checkout --detach <branch>" used to give the same advice
   message as that is issued when "git checkout <tag>" (or anything
   that is not a branch name) is given, but asking with "--detach" is
   an explicit enough sign that the user knows what is going on.  The
   advice message has been squelched in this case.
   (merge 779b88a sb/checkout-explit-detach-no-advice later to maint).

 * "git difftool" by default ignores the error exit from the backend
   commands it spawns, because often they signal that they found
   differences by exiting with a non-zero status code just like "diff"
   does; the exit status codes 126 and above however are special in
   that they are used to signal that the command is not executable,
   does not exist, or killed by a signal.  "git difftool" has been
   taught to notice these exit status codes.
   (merge 45a4f5d jk/difftool-command-not-found later to maint).

 * On Windows, help.browser configuration variable used to be ignored,
   which has been corrected.
   (merge 6db5967 js/no-html-bypass-on-windows later to maint).

 * The "git -c var[=val] cmd" facility to append a configuration
   variable definition at the end of the search order was described in
   git(1) manual page, but not in git-config(1), which was more likely
   place for people to look for when they ask "can I make a one-shot
   override, and if so how?"
   (merge ae1f709 dg/document-git-c-in-git-config-doc later to maint).

 * The tempfile (hence its user lockfile) API lets the caller to open
   a file descriptor to a temporary file, write into it and then
   finalize it by first closing the filehandle and then either
   removing or renaming the temporary file.  When the process spawns a
   subprocess after obtaining the file descriptor, and if the
   subprocess has not exited when the attempt to remove or rename is
   made, the last step fails on Windows, because the subprocess has
   the file descriptor still open.  Open tempfile with O_CLOEXEC flag
   to avoid this (on Windows, this is mapped to O_NOINHERIT).
   (merge 05d1ed6 bw/mingw-avoid-inheriting-fd-to-lockfile later to maint).

 * Correct an age-old calco (is that a typo-like word for calc)
   in the documentation.
   (merge 7841c48 ls/packet-line-protocol-doc-fix later to maint).

 * Other minor clean-ups and documentation updates
   (merge 02a8cfa rs/merge-add-strategies-simplification later to maint).
   (merge af4941d rs/merge-recursive-string-list-init later to maint).
   (merge 1eb47f1 rs/use-strbuf-add-unique-abbrev later to maint).
   (merge ddd0bfa jk/tighten-alloc later to maint).
   (merge ecf30b2 rs/mailinfo-lib later to maint).
   (merge 0eb75ce sg/reflog-past-root later to maint).
   (merge 4369523 hv/doc-commit-reference-style later to maint).
