Merge branches 'bp/reset-quiet' and 'js/mingw-http-ssl' into nd/config-split
authorJunio C Hamano <gitster@pobox.com>
Mon, 29 Oct 2018 01:15:31 +0000 (10:15 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Oct 2018 01:15:46 +0000 (10:15 +0900)
* bp/reset-quiet:
reset: warn when refresh_index() takes more than 2 seconds
reset: add new reset.quiet config setting
reset: don't compute unstaged changes after reset when --quiet

* js/mingw-http-ssl:
http: when using Secure Channel, ignore sslCAInfo by default
http: add support for disabling SSL revocation checks in cURL
http: add support for selecting SSL backends at runtime

1  2  3 
Documentation/config.txt
http.c
diff --combined Documentation/config.txt
index 552827935ae16d809a26e937d53ef07710526264,ce26a743bad9f59f352904a749536b1da8ee7e97,56a110446915ea36039876cd067ebdba318be1ad..ff2d0190f6768658bbaa7d638325e456132f3821
@@@@ -225,7 -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).
   
@@@@ -333,6 -333,10 -333,6 +333,10 @@@@ advice.*:
        commitBeforeMerge::
                Advice shown when linkgit:git-merge[1] refuses to
                merge to avoid overwriting local changes.
+ +     resetQuiet::
+ +             Advice to consider using the `--quiet` option to linkgit:git-reset[1]
+ +             when the command takes more than 2 seconds to enumerate unstaged
+ +             changes after reset.
        resolveConflict::
                Advice shown by various commands when conflicts
                prevent the operation from being performed.
@@@@ -616,24 -620,24 -616,6 +620,24 @@@@ core.preferSymlinkRefs:
        This is sometimes needed to work with old scripts that
        expect HEAD to be a symbolic link.
   
  +core.alternateRefsCommand::
  +     When advertising tips of available history from an alternate, use the shell to
  +     execute the specified command instead of linkgit:git-for-each-ref[1]. The
  +     first argument is the absolute path of the alternate. Output must contain one
  +     hex object id per line (i.e., the same as produce by `git for-each-ref
  +     --format='%(objectname)'`).
  ++
  +Note that you cannot generally put `git for-each-ref` directly into the config
  +value, as it does not take a repository path as an argument (but you can wrap
  +the command above in a shell script).
  +
  +core.alternateRefsPrefixes::
  +     When listing references from an alternate, list only references that begin
  +     with the given prefix. Prefixes match as if they were given as arguments to
  +     linkgit:git-for-each-ref[1]. To list multiple prefixes, separate them with
  +     whitespace. If `core.alternateRefsCommand` is set, setting
  +     `core.alternateRefsPrefixes` has no effect.
  +
   core.bare::
        If true this repository is assumed to be 'bare' and has no
        working directory associated with it.  If this is the case a
@@@@ -850,6 -854,6 -832,12 +854,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
@@@@ -949,11 -953,11 -937,6 +953,11 @@@@ core.useReplaceRefs:
        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
        linkgit:git-read-tree[1] for more information.
@@@@ -1171,14 -1175,14 -1154,6 +1175,14 @@@@ and by linkgit:git-worktree[1] when 'gi
   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.
@@@@ -1532,9 -1536,9 -1507,159 +1536,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. See `transfer.fsckObjects` for what's
  -     checked. Defaults to false. If not set, the value of
  -     `transfer.fsckObjects` is used instead.
  -
  -fetch.fsck.<msg-id>::
  -     Acts like `fsck.<msg-id>`, but is used by
  -     linkgit:git-fetch-pack[1] instead of linkgit:git-fsck[1]. See
  -     the `fsck.<msg-id>` documentation for details.
  -
  -fetch.fsck.skipList::
  -     Acts like `fsck.skipList`, but is used by
  -     linkgit:git-fetch-pack[1] instead of linkgit:git-fsck[1]. See
  -     the `fsck.skipList` documentation for details.
  -
  -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.
  -
  -fetch.negotiationAlgorithm::
  -     Control how information about the commits in the local repository is
  -     sent when negotiating the contents of the packfile to be sent by the
  -     server. Set to "skipping" to use an algorithm that skips commits in an
  -     effort to converge faster, but may result in a larger-than-necessary
  -     packfile; The default is "default" which instructs Git to use the default algorithm
  -     that never skips commits (unless the server has acknowledged it or one
  -     of its descendants).
  -     Unknown values will cause 'git fetch' to error out.
  -+
  -See also the `--negotiation-tip` option for linkgit:git-fetch[1].
  -
  -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
@@@@ -1585,16 -1589,16 -1710,12 +1589,16 @@@@ doing the same for `receive.fsck.<msg-i
   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.
@@@@ -1604,15 -1608,15 -1725,6 +1608,15 @@@@ Unlike variables like `color.ui` and `c
   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
@@@@ -1661,8 -1665,8 -1773,7 +1665,8 @@@@ gc.writeCommitGraph:
        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.
@@@@ -1723,7 -1727,7 -1834,73 +1727,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::
@@@@ -1788,7 -1792,7 -1965,63 +1792,7 @@@@ gpg.<format>.program:
        be used as a legacy synonym for `gpg.openpgp.program`. The default
        value for `gpg.x509.program` is "gpgsm".
   
  -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.
  +include::gui-config.txt[]
   
   guitool.<name>.cmd::
        Specifies the shell command line to execute when the corresponding item
@@@@ -2003,6 -2007,6 -2236,27 +2007,27 @@@@ http.sslCAPath:
        with when fetching or pushing over HTTPS. Can be overridden
        by the `GIT_SSL_CAPATH` environment variable.
   
++ http.sslBackend::
++      Name of the SSL backend to use (e.g. "openssl" or "schannel").
++      This option is ignored if cURL lacks support for choosing the SSL
++      backend at runtime.
++ 
++ http.schannelCheckRevoke::
++      Used to enforce or disable certificate revocation checks in cURL
++      when http.sslBackend is set to "schannel". Defaults to `true` if
++      unset. Only necessary to disable this if Git consistently errors
++      and the message is about checking the revocation status of a
++      certificate. This option is ignored if cURL lacks support for
++      setting the relevant SSL option at runtime.
++ 
++ http.schannelUseSSLCAInfo::
++      As of cURL v7.60.0, the Secure Channel backend can use the
++      certificate bundle provided via `http.sslCAInfo`, but that would
++      override the Windows Certificate Store. Since this is not desirable
++      by default, Git will tell cURL not to use that bundle by default
++      when the `schannel` backend was configured via `http.sslBackend`,
++      unless `http.schannelUseSSLCAInfo` overrides this behavior.
++ 
   http.pinnedpubkey::
        Public key of the https service. It may either be the filename of
        a PEM or DER encoded public key file or a string starting with
        The configuration variables in the 'imap' section are described
        in linkgit:git-imap-send[1].
   
  +index.threads::
  +     Specifies the number of threads to spawn when loading the index.
  +     This is meant to reduce index load time on multiprocessor machines.
  +     Specifying 0 or 'true' will cause Git to auto-detect the number of
  +     CPU's and set the number of threads accordingly. Specifying 1 or
  +     'false' will disable multithreading. Defaults to 'true'.
  +
   index.version::
        Specify the version with which new index files should be
        initialized.  This does not affect existing repositories.
@@@@ -2445,21 -2449,21 -2692,6 +2470,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.
@@@@ -2617,17 -2621,17 -2849,284 +2642,17 @@@@ protocol.version:
   * `1` - the original wire protocol with the addition of a version string
     in the initial response from the server.
   
  ---
  +* `2` - link:technical/protocol-v2.html[wire protocol version 2].
   
  -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`.
  +include::pull-config.txt[]
   
  -* `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).
  -
  ---
  -
  -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).
  -
  ---
  -
  -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. See `transfer.fsckObjects` for what's checked.
  -     Defaults to false. If not set, the value of
  -     `transfer.fsckObjects` is used instead.
  -
  -receive.fsck.<msg-id>::
  -     Acts like `fsck.<msg-id>`, but is used by
  -     linkgit:git-receive-pack[1] instead of
  -     linkgit:git-fsck[1]. See the `fsck.<msg-id>` documentation for
  -     details.
  -
  -receive.fsck.skipList::
  -     Acts like `fsck.skipList`, but is used by
  -     linkgit:git-receive-pack[1] instead of
  -     linkgit:git-fsck[1]. See the `fsck.skipList` documentation for
  -     details.
  -
  -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
@@@@ -2727,10 -2731,10 -3226,6 +2752,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
@@@@ -2753,15 -2757,18 -3248,71 +2778,18 @@@@ 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::
+ +reset.quiet::
+ +     When set to true, 'git reset' will default to the '--quiet' option.
+ +
  +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].
   
@@@@ -2873,7 -2880,7 -3424,88 +2901,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. See linkgit:gitsubmodules[7] for
  -     details.
  -
  -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. See linkgit:gitsubmodules[7] for details.
  -
  -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.
@@@@ -3021,15 -3028,15 -3653,15 +3049,15 @@@@ uploadpack.packObjectsHook:
        was run. I.e., `upload-pack` will feed input intended for
        `pack-objects` to the hook, and expects a completed packfile on
        stdout.
  -
  -uploadpack.allowFilter::
  -     If this option is set, `upload-pack` will support partial
  -     clone and partial fetch object filtering.
   +
   Note that this configuration variable is ignored if it is seen in the
   repository-level config (this is a safety measure against fetching from
   untrusted repositories).
   
  +uploadpack.allowFilter::
  +     If this option is set, `upload-pack` will support partial
  +     clone and partial fetch object filtering.
  +
   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
diff --combined http.c
index 98ff122585c4da84894ccae97db54859e45f3bec,98ff122585c4da84894ccae97db54859e45f3bec,43e75ac583b428b4a350c66f34e66cc325580476..28009ca73ac859160ea8aa34ac8b3ace8692e1e2
--- 1/http.c
--- 2/http.c
--- 3/http.c
+++ b/http.c
@@@@ -155,6 -155,6 -155,16 +155,16 @@@@ static struct active_request_slot *acti
   
   static char *cached_accept_language;
   
++ static char *http_ssl_backend;
++ 
++ static int http_schannel_check_revoke = 1;
++ /*
++  * With the backend being set to `schannel`, setting sslCAinfo would override
++  * the Certificate Store in cURL v7.60.0 and later, which is not what we want
++  * by default.
++  */
++ static int http_schannel_use_ssl_cainfo;
++ 
   size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_)
   {
        size_t size = eltsize * nmemb;
@@@@ -302,6 -302,6 -312,22 +312,22 @@@@ static int http_options(const char *var
                curl_ssl_try = git_config_bool(var, value);
                return 0;
        }
++      if (!strcmp("http.sslbackend", var)) {
++              free(http_ssl_backend);
++              http_ssl_backend = xstrdup_or_null(value);
++              return 0;
++      }
++ 
++      if (!strcmp("http.schannelcheckrevoke", var)) {
++              http_schannel_check_revoke = git_config_bool(var, value);
++              return 0;
++      }
++ 
++      if (!strcmp("http.schannelusesslcainfo", var)) {
++              http_schannel_use_ssl_cainfo = git_config_bool(var, value);
++              return 0;
++      }
++ 
        if (!strcmp("http.minsessions", var)) {
                min_curl_sessions = git_config_int(var, value);
   #ifndef USE_CURL_MULTI
@@@@ -803,6 -803,6 -829,16 +829,16 @@@@ static CURL *get_curl_handle(void
        }
   #endif
   
++      if (http_ssl_backend && !strcmp("schannel", http_ssl_backend) &&
++          !http_schannel_check_revoke) {
++ #if LIBCURL_VERSION_NUM >= 0x072c00
++              curl_easy_setopt(result, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NO_REVOKE);
++ #else
++              warning("CURLSSLOPT_NO_REVOKE not applied to curl SSL options because\n"
++                      "your curl version is too old (< 7.44.0)");
++ #endif
++      }
++ 
        if (http_proactive_auth)
                init_curl_http_auth(result);
   
        if (ssl_pinnedkey != NULL)
                curl_easy_setopt(result, CURLOPT_PINNEDPUBLICKEY, ssl_pinnedkey);
   #endif
--      if (ssl_cainfo != NULL)
++      if (http_ssl_backend && !strcmp("schannel", http_ssl_backend) &&
++          !http_schannel_use_ssl_cainfo) {
++              curl_easy_setopt(result, CURLOPT_CAINFO, NULL);
++ #if LIBCURL_VERSION_NUM >= 0x073400
++              curl_easy_setopt(result, CURLOPT_PROXY_CAINFO, NULL);
++ #endif
++      } else if (ssl_cainfo != NULL)
                curl_easy_setopt(result, CURLOPT_CAINFO, ssl_cainfo);
   
        if (curl_low_speed_limit > 0 && curl_low_speed_time > 0) {
@@@@ -995,6 -995,6 -1037,33 +1037,33 @@@@ void http_init(struct remote *remote, c
        git_config(urlmatch_config_entry, &config);
        free(normalized_url);
   
++ #if LIBCURL_VERSION_NUM >= 0x073800
++      if (http_ssl_backend) {
++              const curl_ssl_backend **backends;
++              struct strbuf buf = STRBUF_INIT;
++              int i;
++ 
++              switch (curl_global_sslset(-1, http_ssl_backend, &backends)) {
++              case CURLSSLSET_UNKNOWN_BACKEND:
++                      strbuf_addf(&buf, _("Unsupported SSL backend '%s'. "
++                                          "Supported SSL backends:"),
++                                          http_ssl_backend);
++                      for (i = 0; backends[i]; i++)
++                              strbuf_addf(&buf, "\n\t%s", backends[i]->name);
++                      die("%s", buf.buf);
++              case CURLSSLSET_NO_BACKENDS:
++                      die(_("Could not set SSL backend to '%s': "
++                            "cURL was built without SSL backends"),
++                          http_ssl_backend);
++              case CURLSSLSET_TOO_LATE:
++                      die(_("Could not set SSL backend to '%s': already set"),
++                          http_ssl_backend);
++              case CURLSSLSET_OK:
++                      break; /* Okay! */
++              }
++      }
++ #endif
++ 
        if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK)
                die("curl_global_init failed");
   
@@@@ -2394,7 -2394,7 -2463,7 +2463,7 @@@@ int finish_http_object_request(struct h
                unlink_or_warn(freq->tmpfile.buf);
                return -1;
        }
  -     if (hashcmp(freq->sha1, freq->real_sha1)) {
  +     if (!hasheq(freq->sha1, freq->real_sha1)) {
                unlink_or_warn(freq->tmpfile.buf);
                return -1;
        }