Merge branch 'jn/gc-auto'
authorJunio C Hamano <gitster@pobox.com>
Tue, 16 Oct 2018 07:16:02 +0000 (16:16 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 16 Oct 2018 07:16:02 +0000 (16:16 +0900)
"gc --auto" ended up calling exit(-1) upon error, which has been
corrected to use exit(1). Also the error reporting behaviour when
daemonized has been updated to exit with zero status when stopping
due to a previously discovered error (which implies there is no
point running gc to improve the situation); we used to exit with
failure in such a case.

* jn/gc-auto:
gc: do not return error for prior errors in daemonized mode

1  2 
Documentation/config.txt
builtin/gc.c
t/t6500-gc.sh
diff --combined Documentation/config.txt
index c9f8b72df7a59ab01dc800e96c2e26bf9ca33e96,5b72684999fafe224ed5c4185b36a90edc4ac31c..7d58253368ce5eed36d6ccf2d757c87a1343fc5b
@@@ -225,7 -225,7 +225,7 @@@ boolean:
        false;; Boolean false literals are `no`, `off`, `false`,
                `0` and the empty string.
  +
 -When converting value to the canonical form using `--bool` type
 +When converting a value to its canonical form using the `--type=bool` type
  specifier, 'git config' will ensure that the output is "true" or
  "false" (spelled in lowercase).
  
@@@ -344,16 -344,6 +344,16 @@@ advice.*:
                Advice shown when you used linkgit:git-checkout[1] to
                move to the detach HEAD state, to instruct how to create
                a local branch after the fact.
 +      checkoutAmbiguousRemoteBranchName::
 +              Advice shown when the argument to
 +              linkgit:git-checkout[1] ambiguously resolves to a
 +              remote tracking branch on more than one remote in
 +              situations where an unambiguous argument would have
 +              otherwise caused a remote-tracking branch to be
 +              checked out. See the `checkout.defaultRemote`
 +              configuration variable for how to set a given remote
 +              to used by default in some situations where this
 +              advice would be printed.
        amWorkDir::
                Advice that shows the location of the patch file when
                linkgit:git-am[1] fails to apply it.
                Advice on what to do when you've accidentally added one
                git repo inside of another.
        ignoredHook::
 -              Advice shown if an hook is ignored because the hook is not
 +              Advice shown if a hook is ignored because the hook is not
                set as executable.
        waitingForEditor::
                Print a message to the terminal whenever Git is waiting for
@@@ -400,19 -390,16 +400,19 @@@ core.hideDotFiles:
        default mode is 'dotGitOnly'.
  
  core.ignoreCase::
 -      If true, this option enables various workarounds to enable
 +      Internal variable which enables various workarounds to enable
        Git to work better on filesystems that are not case sensitive,
 -      like FAT. For example, if a directory listing finds
 -      "makefile" when Git expects "Makefile", Git will assume
 +      like APFS, HFS+, FAT, NTFS, etc. For example, if a directory listing
 +      finds "makefile" when Git expects "Makefile", Git will assume
        it is really the same file, and continue to remember it as
        "Makefile".
  +
  The default is false, except linkgit:git-clone[1] or linkgit:git-init[1]
  will probe and set core.ignoreCase true if appropriate when the repository
  is created.
 ++
 +Git relies on the proper configuration of this variable for your operating
 +and file system. Modifying this value may result in unexpected behavior.
  
  core.precomposeUnicode::
        This option is only used by Mac OS implementation of Git.
@@@ -462,20 -449,10 +462,20 @@@ core.untrackedCache:
        See linkgit:git-update-index[1]. `keep` by default.
  
  core.checkStat::
 -      Determines which stat fields to match between the index
 -      and work tree. The user can set this to 'default' or
 -      'minimal'. Default (or explicitly 'default'), is to check
 -      all fields, including the sub-second part of mtime and ctime.
 +      When missing or is set to `default`, many fields in the stat
 +      structure are checked to detect if a file has been modified
 +      since Git looked at it.  When this configuration variable is
 +      set to `minimal`, sub-second part of mtime and ctime, the
 +      uid and gid of the owner of the file, the inode number (and
 +      the device number, if Git was compiled to use it), are
 +      excluded from the check among these fields, leaving only the
 +      whole-second part of mtime (and ctime, if `core.trustCtime`
 +      is set) and the filesize to be checked.
 ++
 +There are implementations of Git that do not leave usable values in
 +some fields (e.g. JGit); by excluding these fields from the
 +comparison, the `minimal` mode may help interoperability when the
 +same repository is used by these other systems at the same time.
  
  core.quotePath::
        Commands that output paths (e.g. 'ls-files', 'diff'), will
@@@ -832,6 -809,12 +832,6 @@@ core.packedRefsTimeout:
        all; -1 means to try indefinitely. Default is 1000 (i.e.,
        retry for 1 second).
  
 -sequence.editor::
 -      Text editor used by `git rebase -i` for editing the rebase instruction file.
 -      The value is meant to be interpreted by the shell when it is used.
 -      It can be overridden by the `GIT_SEQUENCE_EDITOR` environment variable.
 -      When not configured the default commit message editor is used instead.
 -
  core.pager::
        Text viewer for use by Git commands (e.g., 'less').  The value
        is meant to be interpreted by the shell.  The order of preference
@@@ -922,19 -905,8 +922,19 @@@ This setting defaults to "refs/notes/co
  the `GIT_NOTES_REF` environment variable.  See linkgit:git-notes[1].
  
  core.commitGraph::
 -      Enable git commit graph feature. Allows reading from the
 -      commit-graph file.
 +      If true, then git will read the commit-graph file (if it exists)
 +      to parse the graph structure of commits. Defaults to false. See
 +      linkgit:git-commit-graph[1] for more information.
 +
 +core.useReplaceRefs::
 +      If set to `false`, behave as if the `--no-replace-objects`
 +      option was given on the command line. See linkgit:git[1] and
 +      linkgit:git-replace[1] for more information.
 +
 +core.multiPackIndex::
 +      Use the multi-pack-index file to track multiple packfiles using a
 +      single index. See link:technical/multi-pack-index.html[the
 +      multi-pack-index design document].
  
  core.sparseCheckout::
        Enable "sparse checkout" feature. See section "Sparse checkout" in
@@@ -1002,28 -974,23 +1002,28 @@@ apply.whitespace:
        Tells 'git apply' how to handle whitespaces, in the same way
        as the `--whitespace` option. See linkgit:git-apply[1].
  
 -blame.showRoot::
 -      Do not treat root commits as boundaries in linkgit:git-blame[1].
 -      This option defaults to false.
 -
  blame.blankBoundary::
        Show blank commit object name for boundary commits in
        linkgit:git-blame[1]. This option defaults to false.
  
 -blame.showEmail::
 -      Show the author email instead of author name in linkgit:git-blame[1].
 -      This option defaults to false.
 +blame.coloring::
 +      This determines the coloring scheme to be applied to blame
 +      output. It can be 'repeatedLines', 'highlightRecent',
 +      or 'none' which is the default.
  
  blame.date::
        Specifies the format used to output dates in linkgit:git-blame[1].
        If unset the iso format is used. For supported values,
        see the discussion of the `--date` option at linkgit:git-log[1].
  
 +blame.showEmail::
 +      Show the author email instead of author name in linkgit:git-blame[1].
 +      This option defaults to false.
 +
 +blame.showRoot::
 +      Do not treat root commits as boundaries in linkgit:git-blame[1].
 +      This option defaults to false.
 +
  branch.autoSetupMerge::
        Tells 'git branch' and 'git checkout' to set up new branches
        so that linkgit:git-pull[1] will appropriately merge from the
@@@ -1051,12 -1018,6 +1051,12 @@@ branch.autoSetupRebase:
        branch to track another branch.
        This option defaults to never.
  
 +branch.sort::
 +      This variable controls the sort ordering of branches when displayed by
 +      linkgit:git-branch[1]. Without the "--sort=<value>" option provided, the
 +      value of this variable will be used as the default.
 +      See linkgit:git-for-each-ref[1] field names for valid values.
 +
  branch.<name>.remote::
        When on branch <name>, it tells 'git fetch' and 'git push'
        which remote to fetch from/push to.  The remote to push to
@@@ -1137,30 -1098,6 +1137,30 @@@ browser.<tool>.path:
        browse HTML help (see `-w` option in linkgit:git-help[1]) or a
        working repository in gitweb (see linkgit:git-instaweb[1]).
  
 +checkout.defaultRemote::
 +      When you run 'git checkout <something>' and only have one
 +      remote, it may implicitly fall back on checking out and
 +      tracking e.g. 'origin/<something>'. This stops working as soon
 +      as you have more than one remote with a '<something>'
 +      reference. This setting allows for setting the name of a
 +      preferred remote that should always win when it comes to
 +      disambiguation. The typical use-case is to set this to
 +      `origin`.
 ++
 +Currently this is used by linkgit:git-checkout[1] when 'git checkout
 +<something>' will checkout the '<something>' branch on another remote,
 +and by linkgit:git-worktree[1] when 'git worktree add' refers to a
 +remote branch. This setting might be used for other checkout-like
 +commands or functionality in the future.
 +
 +checkout.optimizeNewBranch::
 +      Optimizes the performance of "git checkout -b <new_branch>" when
 +      using sparse-checkout.  When set to true, git will not update the
 +      repo based on the current sparse-checkout settings.  This means it
 +      will not update the skip-worktree bit in the index nor add/remove
 +      files in the working directory to reflect the current sparse checkout
 +      settings nor will it show the local changes.
 +
  clean.requireForce::
        A boolean to make git-clean do nothing unless given -f,
        -i or -n.   Defaults to true.
@@@ -1175,28 -1112,6 +1175,28 @@@ color.advice:
  color.advice.hint::
        Use customized color for hints.
  
 +color.blame.highlightRecent::
 +      This can be used to color the metadata of a blame line depending
 +      on age of the line.
 ++
 +This setting should be set to a comma-separated list of color and date settings,
 +starting and ending with a color, the dates should be set from oldest to newest.
 +The metadata will be colored given the colors if the the line was introduced
 +before the given timestamp, overwriting older timestamped colors.
 ++
 +Instead of an absolute timestamp relative timestamps work as well, e.g.
 +2.weeks.ago is valid to address anything older than 2 weeks.
 ++
 +It defaults to 'blue,12 month ago,white,1 month ago,red', which colors
 +everything older than one year blue, recent changes between one month and
 +one year old are kept white, and lines introduced within the last month are
 +colored red.
 +
 +color.blame.repeatedLines::
 +      Use the customized color for the part of git-blame output that
 +      is repeated meta information per line (such as commit id,
 +      author name, date and timezone). Defaults to cyan.
 +
  color.branch::
        A boolean to enable/disable color in the output of
        linkgit:git-branch[1]. May be set to `always`,
@@@ -1224,6 -1139,13 +1224,6 @@@ This does not affect linkgit:git-format
  'git-diff-{asterisk}' plumbing commands.  Can be overridden on the
  command line with the `--color[=<when>]` option.
  
 -diff.colorMoved::
 -      If set to either a valid `<mode>` or a true value, moved lines
 -      in a diff are colored differently, for details of valid modes
 -      see '--color-moved' in linkgit:git-diff[1]. If simply set to
 -      true the default color mode will be used. When set to false,
 -      moved lines are not colored.
 -
  color.diff.<slot>::
        Use customized color for diff colorization.  `<slot>` specifies
        which part of the patch to use the specified color, and is one
        (highlighting whitespace errors), `oldMoved` (deleted lines),
        `newMoved` (added lines), `oldMovedDimmed`, `oldMovedAlternative`,
        `oldMovedAlternativeDimmed`, `newMovedDimmed`, `newMovedAlternative`
 -      and `newMovedAlternativeDimmed` (See the '<mode>'
 -      setting of '--color-moved' in linkgit:git-diff[1] for details).
 +      `newMovedAlternativeDimmed` (See the '<mode>'
 +      setting of '--color-moved' in linkgit:git-diff[1] for details),
 +      `contextDimmed`, `oldDimmed`, `newDimmed`, `contextBold`,
 +      `oldBold`, and `newBold` (see linkgit:git-range-diff[1] for details).
  
  color.decorate.<slot>::
        Use customized color for 'git log --decorate' output.  `<slot>` is one
        of `branch`, `remoteBranch`, `tag`, `stash` or `HEAD` for local
 -      branches, remote-tracking branches, tags, stash and HEAD, respectively.
 +      branches, remote-tracking branches, tags, stash and HEAD, respectively
 +      and `grafted` for grafted commits.
  
  color.grep::
        When set to `always`, always highlight matches.  When `false` (or
@@@ -1262,10 -1181,8 +1262,10 @@@ color.grep.<slot>:
        filename prefix (when not using `-h`)
  `function`;;
        function name lines (when using `-p`)
 -`linenumber`;;
 +`lineNumber`;;
        line number prefix (when using `-n`)
 +`column`;;
 +      column number prefix (when using `--column`)
  `match`;;
        matching text (same as setting `matchContext` and `matchSelected`)
  `matchContext`;;
@@@ -1306,18 -1223,6 +1306,18 @@@ color.push:
  color.push.error::
        Use customized color for push errors.
  
 +color.remote::
 +      If set, keywords at the start of the line are highlighted. The
 +      keywords are "error", "warning", "hint" and "success", and are
 +      matched case-insensitively. May be set to `always`, `false` (or
 +      `never`) or `auto` (or `true`). If unset, then the value of
 +      `color.ui` is used (`auto` by default).
 +
 +color.remote.<slot>::
 +      Use customized color for each remote keyword. `<slot>` may be
 +      `hint`, `warning`, `success` or `error` which match the
 +      corresponding keyword.
 +
  color.showBranch::
        A boolean to enable/disable color in the output of
        linkgit:git-show-branch[1]. May be set to `always`,
@@@ -1346,6 -1251,33 +1346,6 @@@ color.status.<slot>:
        status short-format), or
        `unmerged` (files which have unmerged changes).
  
 -color.blame.repeatedLines::
 -      Use the customized color for the part of git-blame output that
 -      is repeated meta information per line (such as commit id,
 -      author name, date and timezone). Defaults to cyan.
 -
 -color.blame.highlightRecent::
 -      This can be used to color the metadata of a blame line depending
 -      on age of the line.
 -+
 -This setting should be set to a comma-separated list of color and date settings,
 -starting and ending with a color, the dates should be set from oldest to newest.
 -The metadata will be colored given the colors if the the line was introduced
 -before the given timestamp, overwriting older timestamped colors.
 -+
 -Instead of an absolute timestamp relative timestamps work as well, e.g.
 -2.weeks.ago is valid to address anything older than 2 weeks.
 -+
 -It defaults to 'blue,12 month ago,white,1 month ago,red', which colors
 -everything older than one year blue, recent changes between one month and
 -one year old are kept white, and lines introduced within the last month are
 -colored red.
 -
 -blame.coloring::
 -      This determines the coloring scheme to be applied to blame
 -      output. It can be 'repeatedLines', 'highlightRecent',
 -      or 'none' which is the default.
 -
  color.transport::
        A boolean to enable/disable color when pushes are rejected. May be
        set to `always`, `false` (or `never`) or `auto` (or `true`), in which
@@@ -1514,9 -1446,138 +1514,9 @@@ fastimport.unpackLimit:
        operation complete faster, especially on slow filesystems.  If
        not set, the value of `transfer.unpackLimit` is used instead.
  
 -fetch.recurseSubmodules::
 -      This option can be either set to a boolean value or to 'on-demand'.
 -      Setting it to a boolean changes the behavior of fetch and pull to
 -      unconditionally recurse into submodules when set to true or to not
 -      recurse at all when set to false. When set to 'on-demand' (the default
 -      value), fetch and pull will only recurse into a populated submodule
 -      when its superproject retrieves a commit that updates the submodule's
 -      reference.
 -
 -fetch.fsckObjects::
 -      If it is set to true, git-fetch-pack will check all fetched
 -      objects. It will abort in the case of a malformed object or a
 -      broken link. The result of an abort are only dangling objects.
 -      Defaults to false. If not set, the value of `transfer.fsckObjects`
 -      is used instead.
 -
 -fetch.unpackLimit::
 -      If the number of objects fetched over the Git native
 -      transfer is below this
 -      limit, then the objects will be unpacked into loose object
 -      files. However if the number of received objects equals or
 -      exceeds this limit then the received pack will be stored as
 -      a pack, after adding any missing delta bases.  Storing the
 -      pack from a push can make the push operation complete faster,
 -      especially on slow filesystems.  If not set, the value of
 -      `transfer.unpackLimit` is used instead.
 -
 -fetch.prune::
 -      If true, fetch will automatically behave as if the `--prune`
 -      option was given on the command line.  See also `remote.<name>.prune`
 -      and the PRUNING section of linkgit:git-fetch[1].
 -
 -fetch.pruneTags::
 -      If true, fetch will automatically behave as if the
 -      `refs/tags/*:refs/tags/*` refspec was provided when pruning,
 -      if not set already. This allows for setting both this option
 -      and `fetch.prune` to maintain a 1=1 mapping to upstream
 -      refs. See also `remote.<name>.pruneTags` and the PRUNING
 -      section of linkgit:git-fetch[1].
 -
 -fetch.output::
 -      Control how ref update status is printed. Valid values are
 -      `full` and `compact`. Default value is `full`. See section
 -      OUTPUT in linkgit:git-fetch[1] for detail.
 -
 -format.attach::
 -      Enable multipart/mixed attachments as the default for
 -      'format-patch'.  The value can also be a double quoted string
 -      which will enable attachments as the default and set the
 -      value as the boundary.  See the --attach option in
 -      linkgit:git-format-patch[1].
 -
 -format.from::
 -      Provides the default value for the `--from` option to format-patch.
 -      Accepts a boolean value, or a name and email address.  If false,
 -      format-patch defaults to `--no-from`, using commit authors directly in
 -      the "From:" field of patch mails.  If true, format-patch defaults to
 -      `--from`, using your committer identity in the "From:" field of patch
 -      mails and including a "From:" field in the body of the patch mail if
 -      different.  If set to a non-boolean value, format-patch uses that
 -      value instead of your committer identity.  Defaults to false.
 -
 -format.numbered::
 -      A boolean which can enable or disable sequence numbers in patch
 -      subjects.  It defaults to "auto" which enables it only if there
 -      is more than one patch.  It can be enabled or disabled for all
 -      messages by setting it to "true" or "false".  See --numbered
 -      option in linkgit:git-format-patch[1].
 -
 -format.headers::
 -      Additional email headers to include in a patch to be submitted
 -      by mail.  See linkgit:git-format-patch[1].
 -
 -format.to::
 -format.cc::
 -      Additional recipients to include in a patch to be submitted
 -      by mail.  See the --to and --cc options in
 -      linkgit:git-format-patch[1].
 -
 -format.subjectPrefix::
 -      The default for format-patch is to output files with the '[PATCH]'
 -      subject prefix. Use this variable to change that prefix.
 -
 -format.signature::
 -      The default for format-patch is to output a signature containing
 -      the Git version number. Use this variable to change that default.
 -      Set this variable to the empty string ("") to suppress
 -      signature generation.
 -
 -format.signatureFile::
 -      Works just like format.signature except the contents of the
 -      file specified by this variable will be used as the signature.
 -
 -format.suffix::
 -      The default for format-patch is to output files with the suffix
 -      `.patch`. Use this variable to change that suffix (make sure to
 -      include the dot if you want it).
 -
 -format.pretty::
 -      The default pretty format for log/show/whatchanged command,
 -      See linkgit:git-log[1], linkgit:git-show[1],
 -      linkgit:git-whatchanged[1].
 -
 -format.thread::
 -      The default threading style for 'git format-patch'.  Can be
 -      a boolean value, or `shallow` or `deep`.  `shallow` threading
 -      makes every mail a reply to the head of the series,
 -      where the head is chosen from the cover letter, the
 -      `--in-reply-to`, and the first patch mail, in this order.
 -      `deep` threading makes every mail a reply to the previous one.
 -      A true boolean value is the same as `shallow`, and a false
 -      value disables threading.
 -
 -format.signOff::
 -      A boolean value which lets you enable the `-s/--signoff` option of
 -      format-patch by default. *Note:* Adding the Signed-off-by: line to a
 -      patch should be a conscious act and means that you certify you have
 -      the rights to submit this work under the same open source license.
 -      Please see the 'SubmittingPatches' document for further discussion.
 -
 -format.coverLetter::
 -      A boolean that controls whether to generate a cover-letter when
 -      format-patch is invoked, but in addition can be set to "auto", to
 -      generate a cover-letter only when there's more than one patch.
 -
 -format.outputDirectory::
 -      Set a custom directory to store the resulting files instead of the
 -      current working directory.
 -
 -format.useAutoBase::
 -      A boolean value which lets you enable the `--base=auto` option of
 -      format-patch by default.
 +include::fetch-config.txt[]
 +
 +include::format-config.txt[]
  
  filter.<driver>.clean::
        The command which is used to convert the content of a worktree
@@@ -1529,72 -1590,23 +1529,72 @@@ filter.<driver>.smudge:
        linkgit:gitattributes[5] for details.
  
  fsck.<msg-id>::
 -      Allows overriding the message type (error, warn or ignore) of a
 -      specific message ID such as `missingEmail`.
 -+
 -For convenience, fsck prefixes the error/warning with the message ID,
 -e.g.  "missingEmail: invalid author/committer line - missing email" means
 -that setting `fsck.missingEmail = ignore` will hide that issue.
 -+
 -This feature is intended to support working with legacy repositories
 -which cannot be repaired without disruptive changes.
 +      During fsck git may find issues with legacy data which
 +      wouldn't be generated by current versions of git, and which
 +      wouldn't be sent over the wire if `transfer.fsckObjects` was
 +      set. This feature is intended to support working with legacy
 +      repositories containing such data.
 ++
 +Setting `fsck.<msg-id>` will be picked up by linkgit:git-fsck[1], but
 +to accept pushes of such data set `receive.fsck.<msg-id>` instead, or
 +to clone or fetch it set `fetch.fsck.<msg-id>`.
 ++
 +The rest of the documentation discusses `fsck.*` for brevity, but the
 +same applies for the corresponding `receive.fsck.*` and
 +`fetch.<msg-id>.*`. variables.
 ++
 +Unlike variables like `color.ui` and `core.editor` the
 +`receive.fsck.<msg-id>` and `fetch.fsck.<msg-id>` variables will not
 +fall back on the `fsck.<msg-id>` configuration if they aren't set. To
 +uniformly configure the same fsck settings in different circumstances
 +all three of them they must all set to the same values.
 ++
 +When `fsck.<msg-id>` is set, errors can be switched to warnings and
 +vice versa by configuring the `fsck.<msg-id>` setting where the
 +`<msg-id>` is the fsck message ID and the value is one of `error`,
 +`warn` or `ignore`. For convenience, fsck prefixes the error/warning
 +with the message ID, e.g. "missingEmail: invalid author/committer line
 +- missing email" means that setting `fsck.missingEmail = ignore` will
 +hide that issue.
 ++
 +In general, it is better to enumerate existing objects with problems
 +with `fsck.skipList`, instead of listing the kind of breakages these
 +problematic objects share to be ignored, as doing the latter will
 +allow new instances of the same breakages go unnoticed.
 ++
 +Setting an unknown `fsck.<msg-id>` value will cause fsck to die, but
 +doing the same for `receive.fsck.<msg-id>` and `fetch.fsck.<msg-id>`
 +will only cause git to warn.
  
  fsck.skipList::
 -      The path to a sorted list of object names (i.e. one SHA-1 per
 +      The path to a list of object names (i.e. one unabbreviated SHA-1 per
        line) that are known to be broken in a non-fatal way and should
 -      be ignored. This feature is useful when an established project
 -      should be accepted despite early commits containing errors that
 -      can be safely ignored such as invalid committer email addresses.
 -      Note: corrupt objects cannot be skipped with this setting.
 +      be ignored. On versions of Git 2.20 and later comments ('#'), empty
 +      lines, and any leading and trailing whitespace is ignored. Everything
 +      but a SHA-1 per line will error out on older versions.
 ++
 +This feature is useful when an established project should be accepted
 +despite early commits containing errors that can be safely ignored
 +such as invalid committer email addresses.  Note: corrupt objects
 +cannot be skipped with this setting.
 ++
 +Like `fsck.<msg-id>` this variable has corresponding
 +`receive.fsck.skipList` and `fetch.fsck.skipList` variants.
 ++
 +Unlike variables like `color.ui` and `core.editor` the
 +`receive.fsck.skipList` and `fetch.fsck.skipList` variables will not
 +fall back on the `fsck.skipList` configuration if they aren't set. To
 +uniformly configure the same fsck settings in different circumstances
 +all three of them they must all set to the same values.
 ++
 +Older versions of Git (before 2.20) documented that the object names
 +list should be sorted. This was never a requirement, the object names
 +could appear in any order, but when reading the list we tracked whether
 +the list was sorted for the purposes of an internal binary search
 +implementation, which could save itself some work with an already sorted
 +list. Unless you had a humongous list there was no reason to go out of
 +your way to pre-sort the list. After Git version 2.20 a hash implementation
 +is used instead, so there's now no reason to pre-sort the list.
  
  gc.aggressiveDepth::
        The depth parameter used in the delta compression
@@@ -1635,15 -1647,9 +1635,16 @@@ this configuration variable is ignored
  will be repacked. After this the number of packs should go below
  gc.autoPackLimit and gc.bigPackThreshold should be respected again.
  
 +gc.writeCommitGraph::
 +      If true, then gc will rewrite the commit-graph file when
 +      linkgit:git-gc[1] is run. When using linkgit:git-gc[1]
 +      '--auto' the commit-graph will be updated if housekeeping is
 +      required. Default is false. See linkgit:git-commit-graph[1]
 +      for details.
 +
  gc.logExpiry::
-       If the file gc.log exists, then `git gc --auto` won't run
+       If the file gc.log exists, then `git gc --auto` will print
+       its content and exit with status zero instead of running
        unless that file is more than 'gc.logExpiry' old.  Default is
        "1.day".  See `gc.pruneExpire` for more ways to specify its
        value.
@@@ -1704,7 -1710,73 +1705,7 @@@ gc.rerereUnresolved:
        You can also use more human-readable "1.month.ago", etc.
        The default is 15 days.  See linkgit:git-rerere[1].
  
 -gitcvs.commitMsgAnnotation::
 -      Append this string to each commit message. Set to empty string
 -      to disable this feature. Defaults to "via git-CVS emulator".
 -
 -gitcvs.enabled::
 -      Whether the CVS server interface is enabled for this repository.
 -      See linkgit:git-cvsserver[1].
 -
 -gitcvs.logFile::
 -      Path to a log file where the CVS server interface well... logs
 -      various stuff. See linkgit:git-cvsserver[1].
 -
 -gitcvs.usecrlfattr::
 -      If true, the server will look up the end-of-line conversion
 -      attributes for files to determine the `-k` modes to use. If
 -      the attributes force Git to treat a file as text,
 -      the `-k` mode will be left blank so CVS clients will
 -      treat it as text. If they suppress text conversion, the file
 -      will be set with '-kb' mode, which suppresses any newline munging
 -      the client might otherwise do. If the attributes do not allow
 -      the file type to be determined, then `gitcvs.allBinary` is
 -      used. See linkgit:gitattributes[5].
 -
 -gitcvs.allBinary::
 -      This is used if `gitcvs.usecrlfattr` does not resolve
 -      the correct '-kb' mode to use. If true, all
 -      unresolved files are sent to the client in
 -      mode '-kb'. This causes the client to treat them
 -      as binary files, which suppresses any newline munging it
 -      otherwise might do. Alternatively, if it is set to "guess",
 -      then the contents of the file are examined to decide if
 -      it is binary, similar to `core.autocrlf`.
 -
 -gitcvs.dbName::
 -      Database used by git-cvsserver to cache revision information
 -      derived from the Git repository. The exact meaning depends on the
 -      used database driver, for SQLite (which is the default driver) this
 -      is a filename. Supports variable substitution (see
 -      linkgit:git-cvsserver[1] for details). May not contain semicolons (`;`).
 -      Default: '%Ggitcvs.%m.sqlite'
 -
 -gitcvs.dbDriver::
 -      Used Perl DBI driver. You can specify any available driver
 -      for this here, but it might not work. git-cvsserver is tested
 -      with 'DBD::SQLite', reported to work with 'DBD::Pg', and
 -      reported *not* to work with 'DBD::mysql'. Experimental feature.
 -      May not contain double colons (`:`). Default: 'SQLite'.
 -      See linkgit:git-cvsserver[1].
 -
 -gitcvs.dbUser, gitcvs.dbPass::
 -      Database user and password. Only useful if setting `gitcvs.dbDriver`,
 -      since SQLite has no concept of database users and/or passwords.
 -      'gitcvs.dbUser' supports variable substitution (see
 -      linkgit:git-cvsserver[1] for details).
 -
 -gitcvs.dbTableNamePrefix::
 -      Database table name prefix.  Prepended to the names of any
 -      database tables used, allowing a single database to be used
 -      for several repositories.  Supports variable substitution (see
 -      linkgit:git-cvsserver[1] for details).  Any non-alphabetic
 -      characters will be replaced with underscores.
 -
 -All gitcvs variables except for `gitcvs.usecrlfattr` and
 -`gitcvs.allBinary` can also be specified as
 -'gitcvs.<access_method>.<varname>' (where 'access_method'
 -is one of "ext" and "pserver") to make them apply only for the given
 -access method.
 +include::gitcvs-config.txt[]
  
  gitweb.category::
  gitweb.description::
@@@ -1726,9 -1798,6 +1727,9 @@@ gitweb.snapshot:
  grep.lineNumber::
        If set to true, enable `-n` option by default.
  
 +grep.column::
 +      If set to true, enable the `--column` option by default.
 +
  grep.patternType::
        Set the default matching behavior. Using a value of 'basic', 'extended',
        'fixed', or 'perl' will enable the `--basic-regexp`, `--extended-regexp`,
@@@ -1759,17 -1828,63 +1760,17 @@@ gpg.program:
        signed, and the program is expected to send the result to its
        standard output.
  
 -gui.commitMsgWidth::
 -      Defines how wide the commit message window is in the
 -      linkgit:git-gui[1]. "75" is the default.
 -
 -gui.diffContext::
 -      Specifies how many context lines should be used in calls to diff
 -      made by the linkgit:git-gui[1]. The default is "5".
 -
 -gui.displayUntracked::
 -      Determines if linkgit:git-gui[1] shows untracked files
 -      in the file list. The default is "true".
 -
 -gui.encoding::
 -      Specifies the default encoding to use for displaying of
 -      file contents in linkgit:git-gui[1] and linkgit:gitk[1].
 -      It can be overridden by setting the 'encoding' attribute
 -      for relevant files (see linkgit:gitattributes[5]).
 -      If this option is not set, the tools default to the
 -      locale encoding.
 -
 -gui.matchTrackingBranch::
 -      Determines if new branches created with linkgit:git-gui[1] should
 -      default to tracking remote branches with matching names or
 -      not. Default: "false".
 -
 -gui.newBranchTemplate::
 -      Is used as suggested name when creating new branches using the
 -      linkgit:git-gui[1].
 -
 -gui.pruneDuringFetch::
 -      "true" if linkgit:git-gui[1] should prune remote-tracking branches when
 -      performing a fetch. The default value is "false".
 -
 -gui.trustmtime::
 -      Determines if linkgit:git-gui[1] should trust the file modification
 -      timestamp or not. By default the timestamps are not trusted.
 -
 -gui.spellingDictionary::
 -      Specifies the dictionary used for spell checking commit messages in
 -      the linkgit:git-gui[1]. When set to "none" spell checking is turned
 -      off.
 -
 -gui.fastCopyBlame::
 -      If true, 'git gui blame' uses `-C` instead of `-C -C` for original
 -      location detection. It makes blame significantly faster on huge
 -      repositories at the expense of less thorough copy detection.
 -
 -gui.copyBlameThreshold::
 -      Specifies the threshold to use in 'git gui blame' original location
 -      detection, measured in alphanumeric characters. See the
 -      linkgit:git-blame[1] manual for more information on copy detection.
 -
 -gui.blamehistoryctx::
 -      Specifies the radius of history context in days to show in
 -      linkgit:gitk[1] for the selected commit, when the `Show History
 -      Context` menu item is invoked from 'git gui blame'. If this
 -      variable is set to zero, the whole history is shown.
 +gpg.format::
 +      Specifies which key format to use when signing with `--gpg-sign`.
 +      Default is "openpgp" and another possible value is "x509".
 +
 +gpg.<format>.program::
 +      Use this to customize the program used for the signing format you
 +      chose. (see `gpg.program` and `gpg.format`) `gpg.program` can still
 +      be used as a legacy synonym for `gpg.openpgp.program`. The default
 +      value for `gpg.x509.program` is "gpgsm".
 +
 +include::gui-config.txt[]
  
  guitool.<name>.cmd::
        Specifies the shell command line to execute when the corresponding item
@@@ -2419,21 -2534,6 +2420,21 @@@ Note that changing the compression leve
  all existing objects. You can force recompression by passing the -F option
  to linkgit:git-repack[1].
  
 +pack.island::
 +      An extended regular expression configuring a set of delta
 +      islands. See "DELTA ISLANDS" in linkgit:git-pack-objects[1]
 +      for details.
 +
 +pack.islandCore::
 +      Specify an island name which gets to have its objects be
 +      packed first. This creates a kind of pseudo-pack at the front
 +      of one pack, so that the objects from the specified island are
 +      hopefully faster to copy into any pack that should be served
 +      to a user requesting these objects. In practice this means
 +      that the island specified should likely correspond to what is
 +      the most commonly cloned in the repo. See also "DELTA ISLANDS"
 +      in linkgit:git-pack-objects[1].
 +
  pack.deltaCacheSize::
        The maximum memory in bytes used for caching deltas in
        linkgit:git-pack-objects[1] before writing them out to a pack.
@@@ -2591,17 -2691,295 +2592,17 @@@ protocol.version:
  * `1` - the original wire protocol with the addition of a version string
    in the initial response from the server.
  
 ---
 -
 -pull.ff::
 -      By default, Git does not create an extra merge commit when merging
 -      a commit that is a descendant of the current commit. Instead, the
 -      tip of the current branch is fast-forwarded. When set to `false`,
 -      this variable tells Git to create an extra merge commit in such
 -      a case (equivalent to giving the `--no-ff` option from the command
 -      line). When set to `only`, only such fast-forward merges are
 -      allowed (equivalent to giving the `--ff-only` option from the
 -      command line). This setting overrides `merge.ff` when pulling.
 -
 -pull.rebase::
 -      When true, rebase branches on top of the fetched branch, instead
 -      of merging the default branch from the default remote when "git
 -      pull" is run. See "branch.<name>.rebase" for setting this on a
 -      per-branch basis.
 -+
 -When `merges`, pass the `--rebase-merges` option to 'git rebase'
 -so that the local merge commits are included in the rebase (see
 -linkgit:git-rebase[1] for details).
 -+
 -When preserve, also pass `--preserve-merges` along to 'git rebase'
 -so that locally committed merge commits will not be flattened
 -by running 'git pull'.
 -+
 -When the value is `interactive`, the rebase is run in interactive mode.
 -+
 -*NOTE*: this is a possibly dangerous operation; do *not* use
 -it unless you understand the implications (see linkgit:git-rebase[1]
 -for details).
 -
 -pull.octopus::
 -      The default merge strategy to use when pulling multiple branches
 -      at once.
 -
 -pull.twohead::
 -      The default merge strategy to use when pulling a single branch.
 -
 -push.default::
 -      Defines the action `git push` should take if no refspec is
 -      explicitly given.  Different values are well-suited for
 -      specific workflows; for instance, in a purely central workflow
 -      (i.e. the fetch source is equal to the push destination),
 -      `upstream` is probably what you want.  Possible values are:
 -+
 ---
 -
 -* `nothing` - do not push anything (error out) unless a refspec is
 -  explicitly given. This is primarily meant for people who want to
 -  avoid mistakes by always being explicit.
 -
 -* `current` - push the current branch to update a branch with the same
 -  name on the receiving end.  Works in both central and non-central
 -  workflows.
 -
 -* `upstream` - push the current branch back to the branch whose
 -  changes are usually integrated into the current branch (which is
 -  called `@{upstream}`).  This mode only makes sense if you are
 -  pushing to the same repository you would normally pull from
 -  (i.e. central workflow).
 -
 -* `tracking` - This is a deprecated synonym for `upstream`.
 -
 -* `simple` - in centralized workflow, work like `upstream` with an
 -  added safety to refuse to push if the upstream branch's name is
 -  different from the local one.
 -+
 -When pushing to a remote that is different from the remote you normally
 -pull from, work as `current`.  This is the safest option and is suited
 -for beginners.
 -+
 -This mode has become the default in Git 2.0.
 -
 -* `matching` - push all branches having the same name on both ends.
 -  This makes the repository you are pushing to remember the set of
 -  branches that will be pushed out (e.g. if you always push 'maint'
 -  and 'master' there and no other branches, the repository you push
 -  to will have these two branches, and your local 'maint' and
 -  'master' will be pushed there).
 -+
 -To use this mode effectively, you have to make sure _all_ the
 -branches you would push out are ready to be pushed out before
 -running 'git push', as the whole point of this mode is to allow you
 -to push all of the branches in one go.  If you usually finish work
 -on only one branch and push out the result, while other branches are
 -unfinished, this mode is not for you.  Also this mode is not
 -suitable for pushing into a shared central repository, as other
 -people may add new branches there, or update the tip of existing
 -branches outside your control.
 -+
 -This used to be the default, but not since Git 2.0 (`simple` is the
 -new default).
 +* `2` - link:technical/protocol-v2.html[wire protocol version 2].
  
  --
  
 -push.followTags::
 -      If set to true enable `--follow-tags` option by default.  You
 -      may override this configuration at time of push by specifying
 -      `--no-follow-tags`.
 -
 -push.gpgSign::
 -      May be set to a boolean value, or the string 'if-asked'. A true
 -      value causes all pushes to be GPG signed, as if `--signed` is
 -      passed to linkgit:git-push[1]. The string 'if-asked' causes
 -      pushes to be signed if the server supports it, as if
 -      `--signed=if-asked` is passed to 'git push'. A false value may
 -      override a value from a lower-priority config file. An explicit
 -      command-line flag always overrides this config option.
 -
 -push.pushOption::
 -      When no `--push-option=<option>` argument is given from the
 -      command line, `git push` behaves as if each <value> of
 -      this variable is given as `--push-option=<value>`.
 -+
 -This is a multi-valued variable, and an empty value can be used in a
 -higher priority configuration file (e.g. `.git/config` in a
 -repository) to clear the values inherited from a lower priority
 -configuration files (e.g. `$HOME/.gitconfig`).
 -+
 ---
 -
 -Example:
 -
 -/etc/gitconfig
 -  push.pushoption = a
 -  push.pushoption = b
 -
 -~/.gitconfig
 -  push.pushoption = c
 -
 -repo/.git/config
 -  push.pushoption =
 -  push.pushoption = b
 -
 -This will result in only b (a and c are cleared).
 -
 ---
 +include::pull-config.txt[]
  
 -push.recurseSubmodules::
 -      Make sure all submodule commits used by the revisions to be pushed
 -      are available on a remote-tracking branch. If the value is 'check'
 -      then Git will verify that all submodule commits that changed in the
 -      revisions to be pushed are available on at least one remote of the
 -      submodule. If any commits are missing, the push will be aborted and
 -      exit with non-zero status. If the value is 'on-demand' then all
 -      submodules that changed in the revisions to be pushed will be
 -      pushed. If on-demand was not able to push all necessary revisions
 -      it will also be aborted and exit with non-zero status. If the value
 -      is 'no' then default behavior of ignoring submodules when pushing
 -      is retained. You may override this configuration at time of push by
 -      specifying '--recurse-submodules=check|on-demand|no'.
 +include::push-config.txt[]
  
  include::rebase-config.txt[]
  
 -receive.advertiseAtomic::
 -      By default, git-receive-pack will advertise the atomic push
 -      capability to its clients. If you don't want to advertise this
 -      capability, set this variable to false.
 -
 -receive.advertisePushOptions::
 -      When set to true, git-receive-pack will advertise the push options
 -      capability to its clients. False by default.
 -
 -receive.autogc::
 -      By default, git-receive-pack will run "git-gc --auto" after
 -      receiving data from git-push and updating refs.  You can stop
 -      it by setting this variable to false.
 -
 -receive.certNonceSeed::
 -      By setting this variable to a string, `git receive-pack`
 -      will accept a `git push --signed` and verifies it by using
 -      a "nonce" protected by HMAC using this string as a secret
 -      key.
 -
 -receive.certNonceSlop::
 -      When a `git push --signed` sent a push certificate with a
 -      "nonce" that was issued by a receive-pack serving the same
 -      repository within this many seconds, export the "nonce"
 -      found in the certificate to `GIT_PUSH_CERT_NONCE` to the
 -      hooks (instead of what the receive-pack asked the sending
 -      side to include).  This may allow writing checks in
 -      `pre-receive` and `post-receive` a bit easier.  Instead of
 -      checking `GIT_PUSH_CERT_NONCE_SLOP` environment variable
 -      that records by how many seconds the nonce is stale to
 -      decide if they want to accept the certificate, they only
 -      can check `GIT_PUSH_CERT_NONCE_STATUS` is `OK`.
 -
 -receive.fsckObjects::
 -      If it is set to true, git-receive-pack will check all received
 -      objects. It will abort in the case of a malformed object or a
 -      broken link. The result of an abort are only dangling objects.
 -      Defaults to false. If not set, the value of `transfer.fsckObjects`
 -      is used instead.
 -
 -receive.fsck.<msg-id>::
 -      When `receive.fsckObjects` is set to true, errors can be switched
 -      to warnings and vice versa by configuring the `receive.fsck.<msg-id>`
 -      setting where the `<msg-id>` is the fsck message ID and the value
 -      is one of `error`, `warn` or `ignore`. For convenience, fsck prefixes
 -      the error/warning with the message ID, e.g. "missingEmail: invalid
 -      author/committer line - missing email" means that setting
 -      `receive.fsck.missingEmail = ignore` will hide that issue.
 -+
 -This feature is intended to support working with legacy repositories
 -which would not pass pushing when `receive.fsckObjects = true`, allowing
 -the host to accept repositories with certain known issues but still catch
 -other issues.
 -
 -receive.fsck.skipList::
 -      The path to a sorted list of object names (i.e. one SHA-1 per
 -      line) that are known to be broken in a non-fatal way and should
 -      be ignored. This feature is useful when an established project
 -      should be accepted despite early commits containing errors that
 -      can be safely ignored such as invalid committer email addresses.
 -      Note: corrupt objects cannot be skipped with this setting.
 -
 -receive.keepAlive::
 -      After receiving the pack from the client, `receive-pack` may
 -      produce no output (if `--quiet` was specified) while processing
 -      the pack, causing some networks to drop the TCP connection.
 -      With this option set, if `receive-pack` does not transmit
 -      any data in this phase for `receive.keepAlive` seconds, it will
 -      send a short keepalive packet.  The default is 5 seconds; set
 -      to 0 to disable keepalives entirely.
 -
 -receive.unpackLimit::
 -      If the number of objects received in a push is below this
 -      limit then the objects will be unpacked into loose object
 -      files. However if the number of received objects equals or
 -      exceeds this limit then the received pack will be stored as
 -      a pack, after adding any missing delta bases.  Storing the
 -      pack from a push can make the push operation complete faster,
 -      especially on slow filesystems.  If not set, the value of
 -      `transfer.unpackLimit` is used instead.
 -
 -receive.maxInputSize::
 -      If the size of the incoming pack stream is larger than this
 -      limit, then git-receive-pack will error out, instead of
 -      accepting the pack file. If not set or set to 0, then the size
 -      is unlimited.
 -
 -receive.denyDeletes::
 -      If set to true, git-receive-pack will deny a ref update that deletes
 -      the ref. Use this to prevent such a ref deletion via a push.
 -
 -receive.denyDeleteCurrent::
 -      If set to true, git-receive-pack will deny a ref update that
 -      deletes the currently checked out branch of a non-bare repository.
 -
 -receive.denyCurrentBranch::
 -      If set to true or "refuse", git-receive-pack will deny a ref update
 -      to the currently checked out branch of a non-bare repository.
 -      Such a push is potentially dangerous because it brings the HEAD
 -      out of sync with the index and working tree. If set to "warn",
 -      print a warning of such a push to stderr, but allow the push to
 -      proceed. If set to false or "ignore", allow such pushes with no
 -      message. Defaults to "refuse".
 -+
 -Another option is "updateInstead" which will update the working
 -tree if pushing into the current branch.  This option is
 -intended for synchronizing working directories when one side is not easily
 -accessible via interactive ssh (e.g. a live web site, hence the requirement
 -that the working directory be clean). This mode also comes in handy when
 -developing inside a VM to test and fix code on different Operating Systems.
 -+
 -By default, "updateInstead" will refuse the push if the working tree or
 -the index have any difference from the HEAD, but the `push-to-checkout`
 -hook can be used to customize this.  See linkgit:githooks[5].
 -
 -receive.denyNonFastForwards::
 -      If set to true, git-receive-pack will deny a ref update which is
 -      not a fast-forward. Use this to prevent such an update via a push,
 -      even if that push is forced. This configuration variable is
 -      set when initializing a shared repository.
 -
 -receive.hideRefs::
 -      This variable is the same as `transfer.hideRefs`, but applies
 -      only to `receive-pack` (and so affects pushes, but not fetches).
 -      An attempt to update or delete a hidden ref by `git push` is
 -      rejected.
 -
 -receive.updateServerInfo::
 -      If set to true, git-receive-pack will run git-update-server-info
 -      after receiving data from git-push and updating refs.
 -
 -receive.shallowUpdate::
 -      If set to true, .git/shallow can be updated when new refs
 -      require new shallow roots. Otherwise those refs are rejected.
 +include::receive-config.txt[]
  
  remote.pushDefault::
        The remote to push to by default.  Overrides
@@@ -2701,10 -3079,6 +2702,10 @@@ repack.packKeptObjects:
        index is being written (either via `--write-bitmap-index` or
        `repack.writeBitmaps`).
  
 +repack.useDeltaIslands::
 +      If set to true, makes `git repack` act as if `--delta-islands`
 +      was passed. Defaults to `false`.
 +
  repack.writeBitmaps::
        When true, git will write a bitmap index when packing all
        objects to disk (e.g., when `git repack -a` is run).  This
@@@ -2727,15 -3101,71 +2728,15 @@@ rerere.enabled:
        `$GIT_DIR`, e.g. if "rerere" was previously used in the
        repository.
  
 -sendemail.identity::
 -      A configuration identity. When given, causes values in the
 -      'sendemail.<identity>' subsection to take precedence over
 -      values in the 'sendemail' section. The default identity is
 -      the value of `sendemail.identity`.
 -
 -sendemail.smtpEncryption::
 -      See linkgit:git-send-email[1] for description.  Note that this
 -      setting is not subject to the 'identity' mechanism.
 -
 -sendemail.smtpssl (deprecated)::
 -      Deprecated alias for 'sendemail.smtpEncryption = ssl'.
 -
 -sendemail.smtpsslcertpath::
 -      Path to ca-certificates (either a directory or a single file).
 -      Set it to an empty string to disable certificate verification.
 -
 -sendemail.<identity>.*::
 -      Identity-specific versions of the 'sendemail.*' parameters
 -      found below, taking precedence over those when this
 -      identity is selected, through either the command-line or
 -      `sendemail.identity`.
 -
 -sendemail.aliasesFile::
 -sendemail.aliasFileType::
 -sendemail.annotate::
 -sendemail.bcc::
 -sendemail.cc::
 -sendemail.ccCmd::
 -sendemail.chainReplyTo::
 -sendemail.confirm::
 -sendemail.envelopeSender::
 -sendemail.from::
 -sendemail.multiEdit::
 -sendemail.signedoffbycc::
 -sendemail.smtpPass::
 -sendemail.suppresscc::
 -sendemail.suppressFrom::
 -sendemail.to::
 -sendemail.tocmd::
 -sendemail.smtpDomain::
 -sendemail.smtpServer::
 -sendemail.smtpServerPort::
 -sendemail.smtpServerOption::
 -sendemail.smtpUser::
 -sendemail.thread::
 -sendemail.transferEncoding::
 -sendemail.validate::
 -sendemail.xmailer::
 -      See linkgit:git-send-email[1] for description.
 -
 -sendemail.signedoffcc (deprecated)::
 -      Deprecated alias for `sendemail.signedoffbycc`.
 -
 -sendemail.smtpBatchSize::
 -      Number of messages to be sent per connection, after that a relogin
 -      will happen.  If the value is 0 or undefined, send all messages in
 -      one connection.
 -      See also the `--batch-size` option of linkgit:git-send-email[1].
 -
 -sendemail.smtpReloginDelay::
 -      Seconds wait before reconnecting to smtp server.
 -      See also the `--relogin-delay` option of linkgit:git-send-email[1].
 -
 -showbranch.default::
 +include::sendemail-config.txt[]
 +
 +sequence.editor::
 +      Text editor used by `git rebase -i` for editing the rebase instruction file.
 +      The value is meant to be interpreted by the shell when it is used.
 +      It can be overridden by the `GIT_SEQUENCE_EDITOR` environment variable.
 +      When not configured the default commit message editor is used instead.
 +
 +showBranch.default::
        The default set of branches for linkgit:git-show-branch[1].
        See linkgit:git-show-branch[1].
  
@@@ -2847,7 -3277,87 +2848,7 @@@ stash.showStat:
        option will show diffstat of the stash entry.  Defaults to true.
        See description of 'show' command in linkgit:git-stash[1].
  
 -submodule.<name>.url::
 -      The URL for a submodule. This variable is copied from the .gitmodules
 -      file to the git config via 'git submodule init'. The user can change
 -      the configured URL before obtaining the submodule via 'git submodule
 -      update'. If neither submodule.<name>.active or submodule.active are
 -      set, the presence of this variable is used as a fallback to indicate
 -      whether the submodule is of interest to git commands.
 -      See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
 -
 -submodule.<name>.update::
 -      The method by which a submodule is updated by 'git submodule update',
 -      which is the only affected command, others such as
 -      'git checkout --recurse-submodules' are unaffected. It exists for
 -      historical reasons, when 'git submodule' was the only command to
 -      interact with submodules; settings like `submodule.active`
 -      and `pull.rebase` are more specific. It is populated by
 -      `git submodule init` from the linkgit:gitmodules[5] file.
 -      See description of 'update' command in linkgit:git-submodule[1].
 -
 -submodule.<name>.branch::
 -      The remote branch name for a submodule, used by `git submodule
 -      update --remote`.  Set this option to override the value found in
 -      the `.gitmodules` file.  See linkgit:git-submodule[1] and
 -      linkgit:gitmodules[5] for details.
 -
 -submodule.<name>.fetchRecurseSubmodules::
 -      This option can be used to control recursive fetching of this
 -      submodule. It can be overridden by using the --[no-]recurse-submodules
 -      command-line option to "git fetch" and "git pull".
 -      This setting will override that from in the linkgit:gitmodules[5]
 -      file.
 -
 -submodule.<name>.ignore::
 -      Defines under what circumstances "git status" and the diff family show
 -      a submodule as modified. When set to "all", it will never be considered
 -      modified (but it will nonetheless show up in the output of status and
 -      commit when it has been staged), "dirty" will ignore all changes
 -      to the submodules work tree and
 -      takes only differences between the HEAD of the submodule and the commit
 -      recorded in the superproject into account. "untracked" will additionally
 -      let submodules with modified tracked files in their work tree show up.
 -      Using "none" (the default when this option is not set) also shows
 -      submodules that have untracked files in their work tree as changed.
 -      This setting overrides any setting made in .gitmodules for this submodule,
 -      both settings can be overridden on the command line by using the
 -      "--ignore-submodules" option. The 'git submodule' commands are not
 -      affected by this setting.
 -
 -submodule.<name>.active::
 -      Boolean value indicating if the submodule is of interest to git
 -      commands.  This config option takes precedence over the
 -      submodule.active config option.
 -
 -submodule.active::
 -      A repeated field which contains a pathspec used to match against a
 -      submodule's path to determine if the submodule is of interest to git
 -      commands.
 -
 -submodule.recurse::
 -      Specifies if commands recurse into submodules by default. This
 -      applies to all commands that have a `--recurse-submodules` option,
 -      except `clone`.
 -      Defaults to false.
 -
 -submodule.fetchJobs::
 -      Specifies how many submodules are fetched/cloned at the same time.
 -      A positive integer allows up to that number of submodules fetched
 -      in parallel. A value of 0 will give some reasonable default.
 -      If unset, it defaults to 1.
 -
 -submodule.alternateLocation::
 -      Specifies how the submodules obtain alternates when submodules are
 -      cloned. Possible values are `no`, `superproject`.
 -      By default `no` is assumed, which doesn't add references. When the
 -      value is set to `superproject` the submodule to be cloned computes
 -      its alternates location relative to the superprojects alternate.
 -
 -submodule.alternateErrorStrategy::
 -      Specifies how to treat errors with the alternates for a submodule
 -      as computed via `submodule.alternateLocation`. Possible values are
 -      `ignore`, `info`, `die`. Default is `die`.
 +include::submodule-config.txt[]
  
  tag.forceSignAnnotated::
        A boolean to specify whether annotated tags created should be GPG signed.
@@@ -2870,40 -3380,6 +2871,40 @@@ transfer.fsckObjects:
        When `fetch.fsckObjects` or `receive.fsckObjects` are
        not set, the value of this variable is used instead.
        Defaults to false.
 ++
 +When set, the fetch or receive will abort in the case of a malformed
 +object or a link to a nonexistent object. In addition, various other
 +issues are checked for, including legacy issues (see `fsck.<msg-id>`),
 +and potential security issues like the existence of a `.GIT` directory
 +or a malicious `.gitmodules` file (see the release notes for v2.2.1
 +and v2.17.1 for details). Other sanity and security checks may be
 +added in future releases.
 ++
 +On the receiving side, failing fsckObjects will make those objects
 +unreachable, see "QUARANTINE ENVIRONMENT" in
 +linkgit:git-receive-pack[1]. On the fetch side, malformed objects will
 +instead be left unreferenced in the repository.
 ++
 +Due to the non-quarantine nature of the `fetch.fsckObjects`
 +implementation it can not be relied upon to leave the object store
 +clean like `receive.fsckObjects` can.
 ++
 +As objects are unpacked they're written to the object store, so there
 +can be cases where malicious objects get introduced even though the
 +"fetch" failed, only to have a subsequent "fetch" succeed because only
 +new incoming objects are checked, not those that have already been
 +written to the object store. That difference in behavior should not be
 +relied upon. In the future, such objects may be quarantined for
 +"fetch" as well.
 ++
 +For now, the paranoid need to find some way to emulate the quarantine
 +environment if they'd like the same protection as "push". E.g. in the
 +case of an internal mirror do the mirroring in two steps, one to fetch
 +the untrusted objects, and then do a second "push" (which will use the
 +quarantine) to another internal repo, and have internal clients
 +consume this pushed-to repository, or embargo internal fetches and
 +only allow them once a full "fsck" has run (and no new fetches have
 +happened in the meantime).
  
  transfer.hideRefs::
        String(s) `receive-pack` and `upload-pack` use to decide which
@@@ -3004,13 -3480,6 +3005,13 @@@ Note that this configuration variable i
  repository-level config (this is a safety measure against fetching from
  untrusted repositories).
  
 +uploadpack.allowRefInWant::
 +      If this option is set, `upload-pack` will support the `ref-in-want`
 +      feature of the protocol version 2 `fetch` command.  This feature
 +      is intended for the benefit of load-balanced servers which may
 +      not have the same view of what OIDs their refs point to due to
 +      replication delay.
 +
  url.<base>.insteadOf::
        Any URL that starts with this value will be rewritten to
        start, instead, with <base>. In cases where some site serves a
diff --combined builtin/gc.c
index 705c3d3851c7ba708a2c3a13426d48ad90fd23ab,ce8a663a0104a1de1718296d13497228e23d4edf..871a56f1c5a5804db9363b117ae3891ea832bc5f
@@@ -20,7 -20,6 +20,7 @@@
  #include "sigchain.h"
  #include "argv-array.h"
  #include "commit.h"
 +#include "commit-graph.h"
  #include "packfile.h"
  #include "object-store.h"
  #include "pack.h"
@@@ -41,7 -40,6 +41,7 @@@ static int aggressive_depth = 50
  static int aggressive_window = 250;
  static int gc_auto_threshold = 6700;
  static int gc_auto_pack_limit = 50;
 +static int gc_write_commit_graph;
  static int detach_auto = 1;
  static timestamp_t gc_log_expire_time;
  static const char *gc_log_expire = "1.day.ago";
@@@ -131,7 -129,6 +131,7 @@@ static void gc_config(void
        git_config_get_int("gc.aggressivedepth", &aggressive_depth);
        git_config_get_int("gc.auto", &gc_auto_threshold);
        git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit);
 +      git_config_get_bool("gc.writecommitgraph", &gc_write_commit_graph);
        git_config_get_bool("gc.autodetach", &detach_auto);
        git_config_get_expiry("gc.pruneexpire", &prune_expire);
        git_config_get_expiry("gc.worktreepruneexpire", &prune_worktrees_expire);
@@@ -183,7 -180,7 +183,7 @@@ static struct packed_git *find_base_pac
  {
        struct packed_git *p, *base = NULL;
  
 -      for (p = get_packed_git(the_repository); p; p = p->next) {
 +      for (p = get_all_packs(the_repository); p; p = p->next) {
                if (!p->pack_local)
                        continue;
                if (limit) {
@@@ -208,7 -205,7 +208,7 @@@ static int too_many_packs(void
        if (gc_auto_pack_limit <= 0)
                return 0;
  
 -      for (cnt = 0, p = get_packed_git(the_repository); p; p = p->next) {
 +      for (cnt = 0, p = get_all_packs(the_repository); p; p = p->next) {
                if (!p->pack_local)
                        continue;
                if (p->pack_keep)
@@@ -441,9 -438,15 +441,15 @@@ static const char *lock_repo_for_gc(in
        return NULL;
  }
  
- static void report_last_gc_error(void)
+ /*
+  * Returns 0 if there was no previous error and gc can proceed, 1 if
+  * gc should not proceed due to an error in the last run. Prints a
+  * message and returns -1 if an error occured while reading gc.log
+  */
+ static int report_last_gc_error(void)
  {
        struct strbuf sb = STRBUF_INIT;
+       int ret = 0;
        ssize_t len;
        struct stat st;
        char *gc_log_path = git_pathdup("gc.log");
                if (errno == ENOENT)
                        goto done;
  
-               die_errno(_("cannot stat '%s'"), gc_log_path);
+               ret = error_errno(_("cannot stat '%s'"), gc_log_path);
+               goto done;
        }
  
        if (st.st_mtime < gc_log_expire_time)
  
        len = strbuf_read_file(&sb, gc_log_path, 0);
        if (len < 0)
-               die_errno(_("cannot read '%s'"), gc_log_path);
-       else if (len > 0)
-               die(_("The last gc run reported the following. "
+               ret = error_errno(_("cannot read '%s'"), gc_log_path);
+       else if (len > 0) {
+               /*
+                * A previous gc failed.  Report the error, and don't
+                * bother with an automatic gc run since it is likely
+                * to fail in the same way.
+                */
+               warning(_("The last gc run reported the following. "
                               "Please correct the root cause\n"
                               "and remove %s.\n"
                               "Automatic cleanup will not be performed "
                               "until the file is removed.\n\n"
                               "%s"),
                            gc_log_path, sb.buf);
+               ret = 1;
+       }
        strbuf_release(&sb);
  done:
        free(gc_log_path);
+       return ret;
  }
  
  static void gc_before_repack(void)
@@@ -564,7 -576,13 +579,13 @@@ int cmd_gc(int argc, const char **argv
                        fprintf(stderr, _("See \"git help gc\" for manual housekeeping.\n"));
                }
                if (detach_auto) {
-                       report_last_gc_error(); /* dies on error */
+                       int ret = report_last_gc_error();
+                       if (ret < 0)
+                               /* an I/O error occured, already reported */
+                               exit(128);
+                       if (ret == 1)
+                               /* Last gc --auto failed. Skip this one. */
+                               return 0;
  
                        if (lock_repo_for_gc(force, &pid))
                                return 0;
        gc_before_repack();
  
        if (!repository_format_precious_objects) {
 +              close_all_packs(the_repository->objects);
                if (run_command_v_opt(repack.argv, RUN_GIT_CMD))
                        die(FAILED_RUN, repack.argv[0]);
  
        if (pack_garbage.nr > 0)
                clean_pack_garbage();
  
 +      if (gc_write_commit_graph)
 +              write_commit_graph_reachable(get_object_directory(), 0,
 +                                           !quiet && !daemonized);
 +
        if (auto_gc && too_many_loose_objects())
                warning(_("There are too many unreachable loose objects; "
                        "run 'git prune' to remove them."));
diff --combined t/t6500-gc.sh
index 76a2d25dd202ee493d0709fed649b7e24ce536fe,a222efdbe19886783b20ef260b1d20a90379494a..4684d06552ac2eeafff19cfd696fd36d20cef5d4
@@@ -4,7 -4,6 +4,7 @@@ test_description='basic git gc test
  '
  
  . ./test-lib.sh
 +. "$TEST_DIRECTORY"/lib-terminal.sh
  
  test_expect_success 'setup' '
        # do not let the amount of physical memory affects gc
@@@ -100,26 -99,6 +100,26 @@@ test_expect_success 'auto gc with too m
        test_line_count = 2 new # There is one new pack and its .idx
  '
  
 +test_expect_success 'gc --no-quiet' '
 +      git -c gc.writeCommitGraph=true gc --no-quiet >stdout 2>stderr &&
 +      test_must_be_empty stdout &&
 +      test_line_count = 1 stderr &&
 +      test_i18ngrep "Computing commit graph generation numbers" stderr
 +'
 +
 +test_expect_success TTY 'with TTY: gc --no-quiet' '
 +      test_terminal git -c gc.writeCommitGraph=true gc --no-quiet >stdout 2>stderr &&
 +      test_must_be_empty stdout &&
 +      test_i18ngrep "Enumerating objects" stderr &&
 +      test_i18ngrep "Computing commit graph generation numbers" stderr
 +'
 +
 +test_expect_success 'gc --quiet' '
 +      git -c gc.writeCommitGraph=true gc --quiet >stdout 2>stderr &&
 +      test_must_be_empty stdout &&
 +      test_must_be_empty stderr
 +'
 +
  run_and_wait_for_auto_gc () {
        # We read stdout from gc for the side effect of waiting until the
        # background gc process exits, closing its fd 9.  Furthermore, the
@@@ -137,11 -116,11 +137,11 @@@ test_expect_success 'background auto g
        test_config gc.autopacklimit 1 &&
        test_config gc.autodetach true &&
        echo fleem >.git/gc.log &&
-       test_must_fail git gc --auto 2>err &&
-       test_i18ngrep "^fatal:" err &&
+       git gc --auto 2>err &&
+       test_i18ngrep "^warning:" err &&
        test_config gc.logexpiry 5.days &&
        test-tool chmtime =-345600 .git/gc.log &&
-       test_must_fail git gc --auto &&
+       git gc --auto &&
        test_config gc.logexpiry 2.days &&
        run_and_wait_for_auto_gc &&
        ls .git/objects/pack/pack-*.pack >packs &&