Merge branch 'jk/ansi-color'
authorJunio C Hamano <gitster@pobox.com>
Mon, 11 Jul 2016 17:31:05 +0000 (10:31 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 11 Jul 2016 17:31:05 +0000 (10:31 -0700)
The output coloring scheme learned two new attributes, italic and
strike, in addition to existing bold, reverse, etc.

* jk/ansi-color:
color: support strike-through attribute
color: support "italic" attribute
color: allow "no-" for negating attributes
color: refactor parse_attr
add skip_prefix_mem helper
doc: refactor description of color format
color: fix max-size comment

1  2 
Documentation/config.txt
color.c
color.h
git-compat-util.h
diff --combined Documentation/config.txt
index e208af118d9e0db34e88b9170de2c1f2ad338578,6882e7065aacdb0a8cb74edf7bd2d1ffdc84ef12..db05dec743d1ad9b6b2b4272417dc968f2d56f7f
@@@ -81,16 -81,13 +81,16 @@@ Include
  
  You can include one config file from another by setting the special
  `include.path` variable to the name of the file to be included. The
 +variable takes a pathname as its value, and is subject to tilde
 +expansion.
 +
 +The
  included file is expanded immediately, as if its contents had been
  found at the location of the include directive. If the value of the
  `include.path` variable is a relative path, the path is considered to be
  relative to the configuration file in which the include directive was
 -found. The value of `include.path` is subject to tilde expansion: `~/`
 -is expanded to the value of `$HOME`, and `~user/` to the specified
 -user's home directory. See below for examples.
 +found.  See below for examples.
 +
  
  Example
  ~~~~~~~
        [include]
                path = /path/to/foo.inc ; include by absolute path
                path = foo ; expand "foo" relative to the current file
 -              path = ~/foo ; expand "foo" in your $HOME directory
 +              path = ~/foo ; expand "foo" in your `$HOME` directory
  
  
  Values
@@@ -150,35 -147,35 +150,42 @@@ integer:
         1024", "by 1024x1024", etc.
  
  color::
-        The value for a variables that takes a color is a list of
-        colors (at most two) and attributes (at most one), separated
-        by spaces.  The colors accepted are `normal`, `black`,
-        `red`, `green`, `yellow`, `blue`, `magenta`, `cyan` and
-        `white`; the attributes are `bold`, `dim`, `ul`, `blink` and
-        `reverse`.  The first color given is the foreground; the
-        second is the background.  The position of the attribute, if
-        any, doesn't matter. Attributes may be turned off specifically
-        by prefixing them with `no` (e.g., `noreverse`, `noul`, etc).
+        The value for a variable that takes a color is a list of
+        colors (at most two, one for foreground and one for background)
+        and attributes (as many as you want), separated by spaces.
  +
- Colors (foreground and background) may also be given as numbers between
- 0 and 255; these use ANSI 256-color mode (but note that not all
- terminals may support this).  If your terminal supports it, you may also
- specify 24-bit RGB values as hex, like `#ff0ab3`.
+ The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
+ `blue`, `magenta`, `cyan` and `white`.  The first color given is the
+ foreground; the second is the background.
  +
- The attributes are meant to be reset at the beginning of each item
- in the colored output, so setting color.decorate.branch to `black`
- will paint that branch name in a plain `black`, even if the previous
- thing on the same output line (e.g. opening parenthesis before the
- list of branch names in `log --decorate` output) is set to be
- painted with `bold` or some other attribute.
+ Colors may also be given as numbers between 0 and 255; these use ANSI
+ 256-color mode (but note that not all terminals may support this).  If
+ your terminal supports it, you may also specify 24-bit RGB values as
+ hex, like `#ff0ab3`.
+ +
+ The accepted attributes are `bold`, `dim`, `ul`, `blink`, `reverse`,
+ `italic`, and `strike` (for crossed-out or "strikethrough" letters).
+ The position of any attributes with respect to the colors
+ (before, after, or in between), doesn't matter. Specific attributes may
+ be turned off by prefixing them with `no` or `no-` (e.g., `noreverse`,
+ `no-ul`, etc).
+ +
+ For git's pre-defined color slots, the attributes are meant to be reset
+ at the beginning of each item in the colored output. So setting
+ `color.decorate.branch` to `black` will paint that branch name in a
+ plain `black`, even if the previous thing on the same output line (e.g.
+ opening parenthesis before the list of branch names in `log --decorate`
+ output) is set to be painted with `bold` or some other attribute.
+ However, custom log formats may do more complicated and layered
+ coloring, and the negated forms may be useful there.
  
 +pathname::
 +      A variable that takes a pathname value can be given a
 +      string that begins with "`~/`" or "`~user/`", and the usual
 +      tilde expansion happens to such a string: `~/`
 +      is expanded to the value of `$HOME`, and `~user/` to the
 +      specified user's home directory.
 +
  
  Variables
  ~~~~~~~~~
@@@ -279,12 -276,6 +286,12 @@@ See linkgit:git-update-index[1]
  +
  The default is true (when core.filemode is not specified in the config file).
  
 +core.hideDotFiles::
 +      (Windows-only) If true, mark newly-created directories and files whose
 +      name starts with a dot as hidden.  If 'dotGitOnly', only the `.git/`
 +      directory is hidden, but no other files starting with a dot.  The
 +      default mode is 'dotGitOnly'.
 +
  core.ignoreCase::
        If true, this option enables various workarounds to enable
        Git to work better on filesystems that are not case sensitive,
@@@ -324,15 -315,6 +331,15 @@@ core.trustctime:
        crawlers and some backup systems).
        See linkgit:git-update-index[1]. True by default.
  
 +core.untrackedCache::
 +      Determines what to do about the untracked cache feature of the
 +      index. It will be kept, if this variable is unset or set to
 +      `keep`. It will automatically be added if set to `true`. And
 +      it will automatically be removed, if set to `false`. Before
 +      setting it to `true`, you should check that mtime is working
 +      properly on your system.
 +      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
@@@ -353,9 -335,9 +360,9 @@@ core.quotePath:
  
  core.eol::
        Sets the line ending type to use in the working directory for
 -      files that have the `text` property set.  Alternatives are
 -      'lf', 'crlf' and 'native', which uses the platform's native
 -      line ending.  The default value is `native`.  See
 +      files that have the `text` property set when core.autocrlf is false.
 +      Alternatives are 'lf', 'crlf' and 'native', which uses the platform's
 +      native line ending.  The default value is `native`.  See
        linkgit:gitattributes[5] for more information on end-of-line
        conversion.
  
@@@ -434,7 -416,7 +441,7 @@@ core.gitProxy:
        may be set multiple times and is matched in the given order;
        the first match wins.
  +
 -Can be overridden by the 'GIT_PROXY_COMMAND' environment variable
 +Can be overridden by the `GIT_PROXY_COMMAND` environment variable
  (which always applies universally, without the special "for"
  handling).
  +
@@@ -478,9 -460,7 +485,9 @@@ false), while all other repositories ar
  
  core.worktree::
        Set the path to the root of the working tree.
 -      This can be overridden by the GIT_WORK_TREE environment
 +      If `GIT_COMMON_DIR` environment variable is set, core.worktree
 +      is ignored and not used for determining the root of working tree.
 +      This can be overridden by the `GIT_WORK_TREE` environment
        variable and the '--work-tree' command-line option.
        The value can be an absolute path or relative to the path to
        the .git directory, which is either specified by --git-dir
@@@ -502,10 -482,10 +509,10 @@@ repository's usual working tree)
  
  core.logAllRefUpdates::
        Enable the reflog. Updates to a ref <ref> is logged to the file
 -      "$GIT_DIR/logs/<ref>", by appending the new and old
 +      "`$GIT_DIR/logs/<ref>`", by appending the new and old
        SHA-1, the date/time and the reason of the update, but
        only when the file exists.  If this configuration
 -      variable is set to true, missing "$GIT_DIR/logs/<ref>"
 +      variable is set to true, missing "`$GIT_DIR/logs/<ref>`"
        file is automatically created for branch heads (i.e. under
        refs/heads/), remote refs (i.e. under refs/remotes/),
        note refs (i.e. under refs/notes/), and the symbolic ref HEAD.
@@@ -545,7 -525,7 +552,7 @@@ core.compression:
        -1 is the zlib default. 0 means no compression,
        and 1..9 are various speed/size tradeoffs, 9 being slowest.
        If set, this provides a default to other compression variables,
 -      such as 'core.looseCompression' and 'pack.compression'.
 +      such as `core.looseCompression` and `pack.compression`.
  
  core.looseCompression::
        An integer -1..9, indicating the compression level for objects that
@@@ -609,19 -589,20 +616,19 @@@ be delta compressed, but larger binary 
  Common unit suffixes of 'k', 'm', or 'g' are supported.
  
  core.excludesFile::
 -      In addition to '.gitignore' (per-directory) and
 -      '.git/info/exclude', Git looks into this file for patterns
 -      of files which are not meant to be tracked.  "`~/`" is expanded
 -      to the value of `$HOME` and "`~user/`" to the specified user's
 -      home directory. Its default value is $XDG_CONFIG_HOME/git/ignore.
 -      If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore
 +      Specifies the pathname to the file that contains patterns to
 +      describe paths that are not meant to be tracked, in addition
 +      to '.gitignore' (per-directory) and '.git/info/exclude'.
 +      Defaults to `$XDG_CONFIG_HOME/git/ignore`.
 +      If `$XDG_CONFIG_HOME` is either not set or empty, `$HOME/.config/git/ignore`
        is used instead. See linkgit:gitignore[5].
  
  core.askPass::
        Some commands (e.g. svn and http interfaces) that interactively
        ask for a password can be told to use an external program given
 -      via the value of this variable. Can be overridden by the 'GIT_ASKPASS'
 +      via the value of this variable. Can be overridden by the `GIT_ASKPASS`
        environment variable. If not set, fall back to the value of the
 -      'SSH_ASKPASS' environment variable or, failing that, a simple password
 +      `SSH_ASKPASS` environment variable or, failing that, a simple password
        prompt. The external program shall be given a suitable prompt as
        command-line argument and write the password on its STDOUT.
  
@@@ -630,25 -611,8 +637,25 @@@ core.attributesFile:
        '.git/info/attributes', Git looks into this file for attributes
        (see linkgit:gitattributes[5]). Path expansions are made the same
        way as for `core.excludesFile`. Its default value is
 -      $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not
 -      set or empty, $HOME/.config/git/attributes is used instead.
 +      `$XDG_CONFIG_HOME/git/attributes`. If `$XDG_CONFIG_HOME` is either not
 +      set or empty, `$HOME/.config/git/attributes` is used instead.
 +
 +core.hooksPath::
 +      By default Git will look for your hooks in the
 +      '$GIT_DIR/hooks' directory. Set this to different path,
 +      e.g. '/etc/git/hooks', and Git will try to find your hooks in
 +      that directory, e.g. '/etc/git/hooks/pre-receive' instead of
 +      in '$GIT_DIR/hooks/pre-receive'.
 ++
 +The path can be either absolute or relative. A relative path is
 +taken as relative to the directory where the hooks are run (see
 +the "DESCRIPTION" section of linkgit:githooks[5]).
 ++
 +This configuration variable is useful in cases where you'd like to
 +centrally configure your Git hooks instead of configuring them on a
 +per-repository basis, or as a more flexible and centralized
 +alternative to having an `init.templateDir` where you've changed
 +default hooks.
  
  core.editor::
        Commands such as `commit` and `tag` that lets you edit
@@@ -665,12 -629,6 +672,12 @@@ core.commentChar:
  If set to "auto", `git-commit` would select a character that is not
  the beginning character of any line in existing commit messages.
  
 +core.packedRefsTimeout::
 +      The length of time, in milliseconds, to retry when trying to
 +      lock the `packed-refs` file. Value 0 means not to retry at
 +      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.
@@@ -764,7 -722,7 +771,7 @@@ core.notesRef:
        notes should be printed.
  +
  This setting defaults to "refs/notes/commits", and it can be overridden by
 -the 'GIT_NOTES_REF' environment variable.  See linkgit:git-notes[1].
 +the `GIT_NOTES_REF` environment variable.  See linkgit:git-notes[1].
  
  core.sparseCheckout::
        Enable "sparse checkout" feature. See section "Sparse checkout" in
@@@ -800,7 -758,7 +807,7 @@@ it will be treated as a shell command
  "gitk --all --not ORIG_HEAD".  Note that shell commands will be
  executed from the top-level directory of a repository, which may
  not necessarily be the current directory.
 -'GIT_PREFIX' is set as returned by running 'git rev-parse --show-prefix'
 +`GIT_PREFIX` is set as returned by running 'git rev-parse --show-prefix'
  from the original current directory. See linkgit:git-rev-parse[1].
  
  am.keepcr::
        by giving '--no-keep-cr' from the command line.
        See linkgit:git-am[1], linkgit:git-mailsplit[1].
  
 +am.threeWay::
 +      By default, `git am` will fail if the patch does not apply cleanly. When
 +      set to true, this setting tells `git am` to fall back on 3-way merge if
 +      the patch records the identity of blobs it is supposed to apply to and
 +      we have those blobs available locally (equivalent to giving the `--3way`
 +      option from the command line). Defaults to `false`.
 +      See linkgit:git-am[1].
 +
  apply.ignoreWhitespace::
        When set to 'change', tells 'git apply' to ignore changes in
        whitespace, in the same way as the '--ignore-space-change'
@@@ -907,11 -857,9 +914,11 @@@ branch.<name>.rebase:
        "git pull" is run. See "pull.rebase" for doing this in a non
        branch-specific manner.
  +
 -      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 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]
@@@ -1138,19 -1086,15 +1145,19 @@@ commit.status:
        message.  Defaults to true.
  
  commit.template::
 -      Specify a file to use as the template for new commit messages.
 -      "`~/`" is expanded to the value of `$HOME` and "`~user/`" to the
 -      specified user's home directory.
 +      Specify the pathname of a file to use as the template for
 +      new commit messages.
 +
 +commit.verbose::
 +      A boolean or int to specify the level of verbose with `git commit`.
 +      See linkgit:git-commit[1].
  
  credential.helper::
        Specify an external helper to be called when a username or
        password credential is needed; the helper may consult external
 -      storage to avoid prompting the user for the credentials. See
 -      linkgit:gitcredentials[7] for details.
 +      storage to avoid prompting the user for the credentials. Note
 +      that multiple helpers may be defined. See linkgit:gitcredentials[7]
 +      for details.
  
  credential.useHttpPath::
        When acquiring credentials, consider the "path" component of an http
@@@ -1169,9 -1113,6 +1176,9 @@@ credential.<url>.*:
        example.com. See linkgit:gitcredentials[7] for details on how URLs are
        matched.
  
 +credentialCache.ignoreSIGHUP::
 +      Tell git-credential-cache--daemon to ignore SIGHUP, instead of quitting.
 +
  include::diff-config.txt[]
  
  difftool.<tool>.path::
@@@ -1189,15 -1130,6 +1196,15 @@@ difftool.<tool>.cmd:
  difftool.prompt::
        Prompt before each invocation of the diff tool.
  
 +fastimport.unpackLimit::
 +      If the number of objects imported by linkgit:git-fast-import[1]
 +      is below this limit, then the objects will be unpacked into
 +      loose object files.  However if the number of imported objects
 +      equals or exceeds this limit then the pack will be stored as a
 +      pack.  Storing the pack from a fast-import can make the import
 +      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
@@@ -1299,14 -1231,6 +1306,14 @@@ format.coverLetter:
        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.
 +
  filter.<driver>.clean::
        The command which is used to convert the content of a worktree
        file to a blob upon checkin.  See linkgit:gitattributes[5] for
@@@ -1317,25 -1241,6 +1324,25 @@@ filter.<driver>.smudge:
        object to a worktree file upon checkout.  See
        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.
 +
 +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.
 +
  gc.aggressiveDepth::
        The depth parameter used in the delta compression
        algorithm used by 'git gc --aggressive'.  This defaults
@@@ -1374,34 -1279,21 +1381,34 @@@ gc.packRefs:
  gc.pruneExpire::
        When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'.
        Override the grace period with this config variable.  The value
 -      "now" may be used to disable this  grace period and always prune
 -      unreachable objects immediately.
 +      "now" may be used to disable this grace period and always prune
 +      unreachable objects immediately, or "never" may be used to
 +      suppress pruning.
 +
 +gc.worktreePruneExpire::
 +      When 'git gc' is run, it calls
 +      'git worktree prune --expire 3.months.ago'.
 +      This config variable can be used to set a different grace
 +      period. The value "now" may be used to disable the grace
 +      period and prune `$GIT_DIR/worktrees` immediately, or "never"
 +      may be used to suppress pruning.
  
  gc.reflogExpire::
  gc.<pattern>.reflogExpire::
        'git reflog expire' removes reflog entries older than
 -      this time; defaults to 90 days.  With "<pattern>" (e.g.
 +      this time; defaults to 90 days. The value "now" expires all
 +      entries immediately, and "never" suppresses expiration
 +      altogether. With "<pattern>" (e.g.
        "refs/stash") in the middle the setting applies only to
        the refs that match the <pattern>.
  
  gc.reflogExpireUnreachable::
 -gc.<ref>.reflogExpireUnreachable::
 +gc.<pattern>.reflogExpireUnreachable::
        'git reflog expire' removes reflog entries older than
        this time and are not reachable from the current tip;
 -      defaults to 30 days.  With "<pattern>" (e.g. "refs/stash")
 +      defaults to 30 days. The value "now" expires all entries
 +      immediately, and "never" suppresses expiration altogether.
 +      With "<pattern>" (e.g. "refs/stash")
        in the middle, the setting applies only to the refs that
        match the <pattern>.
  
@@@ -1435,18 -1327,18 +1442,18 @@@ gitcvs.usecrlfattr:
        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
 +      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
 +      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'.
 +      it is binary, similar to `core.autocrlf`.
  
  gitcvs.dbName::
        Database used by git-cvsserver to cache revision information
@@@ -1465,7 -1357,7 +1472,7 @@@ gitcvs.dbDriver:
        See linkgit:git-cvsserver[1].
  
  gitcvs.dbUser, gitcvs.dbPass::
 -      Database user and password. Only useful if setting 'gitcvs.dbDriver',
 +      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).
@@@ -1477,8 -1369,8 +1484,8 @@@ gitcvs.dbTableNamePrefix:
        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
 +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.
@@@ -1511,25 -1403,17 +1518,25 @@@ grep.patternType:
  
  grep.extendedRegexp::
        If set to true, enable '--extended-regexp' option by default. This
 -      option is ignored when the 'grep.patternType' option is set to a value
 +      option is ignored when the `grep.patternType` option is set to a value
        other than 'default'.
  
 +grep.threads::
 +      Number of grep worker threads to use.
 +      See `grep.threads` in linkgit:git-grep[1] for more information.
 +
 +grep.fallbackToNoIndex::
 +      If set to true, fall back to git grep --no-index if git grep
 +      is executed outside of a git repository.  Defaults to false.
 +
  gpg.program::
 -      Use this custom program instead of "gpg" found on $PATH when
 +      Use this custom program instead of "`gpg`" found on `$PATH` when
        making or verifying a PGP signature. The program must support the
        same command-line interface as GPG, namely, to verify a detached
 -      signature, "gpg --verify $file - <$signature" is run, and the
 +      signature, "`gpg --verify $file - <$signature`" is run, and the
        program is expected to signal a good signature by exiting with
        code 0, and to generate an ASCII-armored detached signature, the
 -      standard input of "gpg -bsau $key" is fed with the contents to be
 +      standard input of "`gpg -bsau $key`" is fed with the contents to be
        signed, and the program is expected to send the result to its
        standard output.
  
@@@ -1542,7 -1426,7 +1549,7 @@@ gui.diffContext:
        made by the linkgit:git-gui[1]. The default is "5".
  
  gui.displayUntracked::
 -      Determines if linkgit::git-gui[1] shows untracked files
 +      Determines if linkgit:git-gui[1] shows untracked files
        in the file list. The default is "true".
  
  gui.encoding::
@@@ -1596,7 -1480,7 +1603,7 @@@ guitool.<name>.cmd:
        of the linkgit:git-gui[1] `Tools` menu is invoked. This option is
        mandatory for every tool. The command is executed from the root of
        the working directory, and in the environment it receives the name of
 -      the tool as 'GIT_GUITOOL', the name of the currently selected file as
 +      the tool as `GIT_GUITOOL`, the name of the currently selected file as
        'FILENAME', and the name of the current branch as 'CUR_BRANCH' (if
        the head is detached, 'CUR_BRANCH' is empty).
  
@@@ -1617,7 -1501,7 +1624,7 @@@ guitool.<name>.confirm:
  
  guitool.<name>.argPrompt::
        Request a string argument from the user, and pass it to the tool
 -      through the 'ARGS' environment variable. Since requesting an
 +      through the `ARGS` environment variable. Since requesting an
        argument implies confirmation, the 'confirm' option has no effect
        if this is enabled. If the option is set to 'true', 'yes', or '1',
        the dialog uses a built-in generic prompt; otherwise the exact
  
  guitool.<name>.revPrompt::
        Request a single valid revision from the user, and set the
 -      'REVISION' environment variable. In other aspects this option
 +      `REVISION` environment variable. In other aspects this option
        is similar to 'argPrompt', and can be used together with it.
  
  guitool.<name>.revUnmerged::
@@@ -1668,134 -1552,52 +1675,134 @@@ help.htmlPath:
  
  http.proxy::
        Override the HTTP proxy, normally configured using the 'http_proxy',
 -      'https_proxy', and 'all_proxy' environment variables (see
 -      `curl(1)`).  This can be overridden on a per-remote basis; see
 -      remote.<name>.proxy
 +      'https_proxy', and 'all_proxy' environment variables (see `curl(1)`). In
 +      addition to the syntax understood by curl, it is possible to specify a
 +      proxy string with a user name but no password, in which case git will
 +      attempt to acquire one in the same way it does for other credentials. See
 +      linkgit:gitcredentials[7] for more information. The syntax thus is
 +      '[protocol://][user[:password]@]proxyhost[:port]'. This can be overridden
 +      on a per-remote basis; see remote.<name>.proxy
 +
 +http.proxyAuthMethod::
 +      Set the method with which to authenticate against the HTTP proxy. This
 +      only takes effect if the configured proxy string contains a user name part
 +      (i.e. is of the form 'user@host' or 'user@host:port'). This can be
 +      overridden on a per-remote basis; see `remote.<name>.proxyAuthMethod`.
 +      Both can be overridden by the `GIT_HTTP_PROXY_AUTHMETHOD` environment
 +      variable.  Possible values are:
 ++
 +--
 +* `anyauth` - Automatically pick a suitable authentication method. It is
 +  assumed that the proxy answers an unauthenticated request with a 407
 +  status code and one or more Proxy-authenticate headers with supported
 +  authentication methods. This is the default.
 +* `basic` - HTTP Basic authentication
 +* `digest` - HTTP Digest authentication; this prevents the password from being
 +  transmitted to the proxy in clear text
 +* `negotiate` - GSS-Negotiate authentication (compare the --negotiate option
 +  of `curl(1)`)
 +* `ntlm` - NTLM authentication (compare the --ntlm option of `curl(1)`)
 +--
 +
 +http.emptyAuth::
 +      Attempt authentication without seeking a username or password.  This
 +      can be used to attempt GSS-Negotiate authentication without specifying
 +      a username in the URL, as libcurl normally requires a username for
 +      authentication.
 +
 +http.extraHeader::
 +      Pass an additional HTTP header when communicating with a server.  If
 +      more than one such entry exists, all of them are added as extra
 +      headers.  To allow overriding the settings inherited from the system
 +      config, an empty value will reset the extra headers to the empty list.
  
  http.cookieFile::
 -      File containing previously stored cookie lines which should be used
 +      The pathname of a file containing previously stored cookie lines,
 +      which should be used
        in the Git http session, if they match the server. The file format
        of the file to read cookies from should be plain HTTP headers or
 -      the Netscape/Mozilla cookie file format (see linkgit:curl[1]).
 -      NOTE that the file specified with http.cookieFile is only used as
 +      the Netscape/Mozilla cookie file format (see `curl(1)`).
 +      NOTE that the file specified with http.cookieFile is used only as
        input unless http.saveCookies is set.
  
  http.saveCookies::
        If set, store cookies received during requests to the file specified by
        http.cookieFile. Has no effect if http.cookieFile is unset.
  
 +http.sslVersion::
 +      The SSL version to use when negotiating an SSL connection, if you
 +      want to force the default.  The available and default version
 +      depend on whether libcurl was built against NSS or OpenSSL and the
 +      particular configuration of the crypto library in use. Internally
 +      this sets the 'CURLOPT_SSL_VERSION' option; see the libcurl
 +      documentation for more details on the format of this option and
 +      for the ssl version supported. Actually the possible values of
 +      this option are:
 +
 +      - sslv2
 +      - sslv3
 +      - tlsv1
 +      - tlsv1.0
 +      - tlsv1.1
 +      - tlsv1.2
 +
 ++
 +Can be overridden by the `GIT_SSL_VERSION` environment variable.
 +To force git to use libcurl's default ssl version and ignore any
 +explicit http.sslversion option, set `GIT_SSL_VERSION` to the
 +empty string.
 +
 +http.sslCipherList::
 +  A list of SSL ciphers to use when negotiating an SSL connection.
 +  The available ciphers depend on whether libcurl was built against
 +  NSS or OpenSSL and the particular configuration of the crypto
 +  library in use.  Internally this sets the 'CURLOPT_SSL_CIPHER_LIST'
 +  option; see the libcurl documentation for more details on the format
 +  of this list.
 ++
 +Can be overridden by the `GIT_SSL_CIPHER_LIST` environment variable.
 +To force git to use libcurl's default cipher list and ignore any
 +explicit http.sslCipherList option, set `GIT_SSL_CIPHER_LIST` to the
 +empty string.
 +
  http.sslVerify::
        Whether to verify the SSL certificate when fetching or pushing
 -      over HTTPS. Can be overridden by the 'GIT_SSL_NO_VERIFY' environment
 +      over HTTPS. Can be overridden by the `GIT_SSL_NO_VERIFY` environment
        variable.
  
  http.sslCert::
        File containing the SSL certificate when fetching or pushing
 -      over HTTPS. Can be overridden by the 'GIT_SSL_CERT' environment
 +      over HTTPS. Can be overridden by the `GIT_SSL_CERT` environment
        variable.
  
  http.sslKey::
        File containing the SSL private key when fetching or pushing
 -      over HTTPS. Can be overridden by the 'GIT_SSL_KEY' environment
 +      over HTTPS. Can be overridden by the `GIT_SSL_KEY` environment
        variable.
  
  http.sslCertPasswordProtected::
        Enable Git's password prompt for the SSL certificate.  Otherwise
        OpenSSL will prompt the user, possibly many times, if the
        certificate or private key is encrypted.  Can be overridden by the
 -      'GIT_SSL_CERT_PASSWORD_PROTECTED' environment variable.
 +      `GIT_SSL_CERT_PASSWORD_PROTECTED` environment variable.
  
  http.sslCAInfo::
        File containing the certificates to verify the peer with when
        fetching or pushing over HTTPS. Can be overridden by the
 -      'GIT_SSL_CAINFO' environment variable.
 +      `GIT_SSL_CAINFO` environment variable.
  
  http.sslCAPath::
        Path containing files with the CA certificates to verify the peer
        with when fetching or pushing over HTTPS. Can be overridden
 -      by the 'GIT_SSL_CAPATH' environment variable.
 +      by the `GIT_SSL_CAPATH` environment variable.
 +
 +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
 +      'sha256//' followed by the base64 encoded sha256 hash of the
 +      public key. See also libcurl 'CURLOPT_PINNEDPUBLICKEY'. git will
 +      exit with an error if this option is set but not supported by
 +      cURL.
  
  http.sslTry::
        Attempt to use AUTH SSL/TLS and encrypted data transfers
  
  http.maxRequests::
        How many HTTP requests to launch in parallel. Can be overridden
 -      by the 'GIT_HTTP_MAX_REQUESTS' environment variable. Default is 5.
 +      by the `GIT_HTTP_MAX_REQUESTS` environment variable. Default is 5.
  
  http.minSessions::
        The number of curl sessions (counted across slots) to be kept across
@@@ -1826,13 -1628,13 +1833,13 @@@ http.postBuffer:
  http.lowSpeedLimit, http.lowSpeedTime::
        If the HTTP transfer speed is less than 'http.lowSpeedLimit'
        for longer than 'http.lowSpeedTime' seconds, the transfer is aborted.
 -      Can be overridden by the 'GIT_HTTP_LOW_SPEED_LIMIT' and
 -      'GIT_HTTP_LOW_SPEED_TIME' environment variables.
 +      Can be overridden by the `GIT_HTTP_LOW_SPEED_LIMIT` and
 +      `GIT_HTTP_LOW_SPEED_TIME` environment variables.
  
  http.noEPSV::
        A boolean which disables using of EPSV ftp command by curl.
        This can helpful with some "poor" ftp servers which don't
 -      support EPSV mode. Can be overridden by the 'GIT_CURL_FTP_NO_EPSV'
 +      support EPSV mode. Can be overridden by the `GIT_CURL_FTP_NO_EPSV`
        environment variable. Default is false (curl will use EPSV).
  
  http.userAgent::
        such as Mozilla/4.0.  This may be necessary, for instance, if
        connecting through a firewall that restricts HTTP connections to a set
        of common USER_AGENT strings (but not including those like git/1.7.1).
 -      Can be overridden by the 'GIT_HTTP_USER_AGENT' environment variable.
 +      Can be overridden by the `GIT_HTTP_USER_AGENT` environment variable.
  
  http.<url>.*::
        Any of the http.* options above can be applied selectively to some URLs.
@@@ -1942,14 -1744,6 +1949,14 @@@ interactive.singleKey:
        setting is silently ignored if portable keystroke input
        is not available; requires the Perl module Term::ReadKey.
  
 +interactive.diffFilter::
 +      When an interactive command (such as `git add --patch`) shows
 +      a colorized diff, git will pipe the diff through the shell
 +      command defined by this configuration variable. The command may
 +      mark up the diff further for human consumption, provided that it
 +      retains a one-to-one correspondence with the lines in the
 +      original diff. Defaults to disabled (no filtering).
 +
  log.abbrevCommit::
        If true, makes linkgit:git-log[1], linkgit:git-show[1], and
        linkgit:git-whatchanged[1] assume `--abbrev-commit`. You may
  log.date::
        Set the default date-time mode for the 'log' command.
        Setting a value for log.date is similar to using 'git log''s
 -      `--date` option.  Possible values are `relative`, `local`,
 -      `default`, `iso`, `rfc`, and `short`; see linkgit:git-log[1]
 -      for details.
 +      `--date` option.  See linkgit:git-log[1] for details.
  
  log.decorate::
        Print out the ref names of any commits that are shown by the log
        command. If 'short' is specified, the ref name prefixes 'refs/heads/',
        'refs/tags/' and 'refs/remotes/' will not be printed. If 'full' is
        specified, the full ref name (including prefix) will be printed.
 -      This is the same as the log commands '--decorate' option.
 +      If 'auto' is specified, then if the output is going to a terminal,
 +      the ref names are shown as if 'short' were given, otherwise no ref
 +      names are shown. This is the same as the '--decorate' option
 +      of the `git log`.
 +
 +log.follow::
 +      If `true`, `git log` will act as if the `--follow` option was used when
 +      a single <path> is given.  This has the same limitations as `--follow`,
 +      i.e. it cannot be used to follow multiple files and does not work well
 +      on non-linear history.
  
  log.showRoot::
        If true, the initial commit will be shown as a big creation event.
@@@ -2078,18 -1865,6 +2085,18 @@@ mergetool.writeToTemp:
  mergetool.prompt::
        Prompt before each invocation of the merge resolution program.
  
 +notes.mergeStrategy::
 +      Which merge strategy to choose by default when resolving notes
 +      conflicts.  Must be one of `manual`, `ours`, `theirs`, `union`, or
 +      `cat_sort_uniq`.  Defaults to `manual`.  See "NOTES MERGE STRATEGIES"
 +      section of linkgit:git-notes[1] for more information on each strategy.
 +
 +notes.<name>.mergeStrategy::
 +      Which merge strategy to choose when doing a notes merge into
 +      refs/notes/<name>.  This overrides the more general
 +      "notes.mergeStrategy".  See the "NOTES MERGE STRATEGIES" section in
 +      linkgit:git-notes[1] for more information on the available strategies.
 +
  notes.displayRef::
        The (fully qualified) refname from which to show notes when
        showing commit messages.  The value of this variable can be set
@@@ -2118,8 -1893,8 +2125,8 @@@ notes.rewriteMode:
        When copying notes during a rewrite (see the
        "notes.rewrite.<command>" option), determines what to do if
        the target commit already has a note.  Must be one of
 -      `overwrite`, `concatenate`, or `ignore`.  Defaults to
 -      `concatenate`.
 +      `overwrite`, `concatenate`, `cat_sort_uniq`, or `ignore`.
 +      Defaults to `concatenate`.
  +
  This setting can be overridden with the `GIT_NOTES_REWRITE_MODE`
  environment variable.
@@@ -2203,7 -1978,7 +2210,7 @@@ pack.indexVersion:
        larger than 2 GB.
  +
  If you have an old Git that does not understand the version 2 `*.idx` file,
 -cloning or fetching over a non native protocol (e.g. "http" and "rsync")
 +cloning or fetching over a non native protocol (e.g. "http")
  that will copy both `*.pack` file and corresponding `*.idx` file from the
  other side may give you a repository that cannot be accessed with your
  older version of Git. If the `*.pack` file is smaller than 2 GB, however,
@@@ -2214,11 -1989,8 +2221,11 @@@ pack.packSizeLimit:
        The maximum size of a pack.  This setting only affects
        packing to a file when repacking, i.e. the git:// protocol
        is unaffected.  It can be overridden by the `--max-pack-size`
 -      option of linkgit:git-repack[1]. The minimum size allowed is
 -      limited to 1 MiB. The default is unlimited.
 +      option of linkgit:git-repack[1].  Reaching this limit results
 +      in the creation of multiple packfiles; which in turn prevents
 +      bitmaps from being created.
 +      The minimum size allowed is limited to 1 MiB.
 +      The default is unlimited.
        Common unit suffixes of 'k', 'm', or 'g' are
        supported.
  
@@@ -2277,11 -2049,9 +2284,11 @@@ pull.rebase:
        pull" is run. See "branch.<name>.rebase" for setting this on a
        per-branch basis.
  +
 -      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 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]
@@@ -2354,28 -2124,6 +2361,28 @@@ push.followTags:
        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.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'.
  
  rebase.stat::
        Whether to show a diffstat of what changed upstream since the last
@@@ -2392,22 -2140,6 +2399,22 @@@ rebase.autoStash:
        successful rebase might result in non-trivial conflicts.
        Defaults to false.
  
 +rebase.missingCommitsCheck::
 +      If set to "warn", git rebase -i will print a warning if some
 +      commits are removed (e.g. a line was deleted), however the
 +      rebase will still proceed. If set to "error", it will print
 +      the previous warning and stop the rebase, 'git rebase
 +      --edit-todo' can then be used to correct the error. If set to
 +      "ignore", no checking is done.
 +      To drop a commit without warning or error, use the `drop`
 +      command in the todo-list.
 +      Defaults to "ignore".
 +
 +rebase.instructionFormat
 +      A format string, as specified in linkgit:git-log[1], to be used for
 +      the instruction list during an interactive rebase.  The format will automatically
 +      have the long commit hash prepended to the format.
 +
  receive.advertiseAtomic::
        By default, git-receive-pack will advertise the atomic push
        capability to its clients. If you don't want to this capability
@@@ -2444,28 -2176,6 +2451,28 @@@ receive.fsckObjects:
        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.unpackLimit::
        If the number of objects received in a push is below this
        limit then the objects will be unpacked into loose object
@@@ -2511,10 -2221,13 +2518,10 @@@ receive.denyNonFastForwards:
        set when initializing a shared repository.
  
  receive.hideRefs::
 -      String(s) `receive-pack` uses to decide which refs to omit
 -      from its initial advertisement.  Use more than one
 -      definitions to specify multiple prefix strings. A ref that
 -      are under the hierarchies listed on the value of this
 -      variable is excluded, and is hidden when responding to `git
 -      push`, and an attempt to update or delete a hidden ref by
 -      `git push` is rejected.
 +      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
@@@ -2541,11 -2254,6 +2548,11 @@@ remote.<name>.proxy:
        the proxy to use for that remote.  Set to the empty string to
        disable proxying for that remote.
  
 +remote.<name>.proxyAuthMethod::
 +      For remotes that require curl (http, https and ftp), the method to use for
 +      authenticating against the proxy in use (probably set in
 +      `remote.<name>.proxy`). See `http.proxyAuthMethod`.
 +
  remote.<name>.fetch::
        The default set of "refspec" for linkgit:git-fetch[1]. See
        linkgit:git-fetch[1].
@@@ -2618,9 -2326,8 +2625,9 @@@ repack.writeBitmaps:
        objects to disk (e.g., when `git repack -a` is run).  This
        index can speed up the "counting objects" phase of subsequent
        packs created for clones and fetches, at the cost of some disk
 -      space and extra time spent on the initial repack.  Defaults to
 -      false.
 +      space and extra time spent on the initial repack.  This has
 +      no effect if multiple packfiles are created.
 +      Defaults to false.
  
  rerere.autoUpdate::
        When set to true, `git-rerere` updates the index with the
@@@ -2639,7 -2346,7 +2646,7 @@@ 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'.
 +      the value of `sendemail.identity`.
  
  sendemail.smtpEncryption::
        See linkgit:git-send-email[1] for description.  Note that this
@@@ -2656,7 -2363,7 +2663,7 @@@ sendemail.<identity>.*:
        Identity-specific versions of the 'sendemail.*' parameters
        found below, taking precedence over those when the this
        identity is selected, through command-line or
 -      'sendemail.identity'.
 +      `sendemail.identity`.
  
  sendemail.aliasesFile::
  sendemail.aliasFileType::
@@@ -2686,7 -2393,7 +2693,7 @@@ sendemail.xmailer:
        See linkgit:git-send-email[1] for description.
  
  sendemail.signedoffcc (deprecated)::
 -      Deprecated alias for 'sendemail.signedoffbycc'.
 +      Deprecated alias for `sendemail.signedoffbycc`.
  
  showbranch.default::
        The default set of branches for linkgit:git-show-branch[1].
@@@ -2748,16 -2455,6 +2755,16 @@@ status.submoduleSummary:
        submodule summary' command, which shows a similar output but does
        not honor these settings.
  
 +stash.showPatch::
 +      If this is set to true, the `git stash show` command without an
 +      option will show the stash in patch form.  Defaults to false.
 +      See description of 'show' command in linkgit:git-stash[1].
 +
 +stash.showStat::
 +      If this is set to true, the `git stash show` command without an
 +      option will show diffstat of the stash.  Defaults to true.
 +      See description of 'show' command in linkgit:git-stash[1].
 +
  submodule.<name>.path::
  submodule.<name>.url::
        The path within this project and URL for a submodule. These
@@@ -2800,17 -2497,6 +2807,17 @@@ submodule.<name>.ignore:
        "--ignore-submodules" option. The 'git submodule' commands are not
        affected by this setting.
  
 +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.
 +
 +tag.forceSignAnnotated::
 +      A boolean to specify whether annotated tags created should be GPG signed.
 +      If `--annotate` is specified on the command line, it takes
 +      precedence over this option.
 +
  tag.sort::
        This variable controls the sort ordering of tags when displayed by
        linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
@@@ -2829,27 -2515,9 +2836,27 @@@ transfer.fsckObjects:
        Defaults to false.
  
  transfer.hideRefs::
 -      This variable can be used to set both `receive.hideRefs`
 -      and `uploadpack.hideRefs` at the same time to the same
 -      values.  See entries for these other variables.
 +      String(s) `receive-pack` and `upload-pack` use to decide which
 +      refs to omit from their initial advertisements.  Use more than
 +      one definition to specify multiple prefix strings. A ref that is
 +      under the hierarchies listed in the value of this variable is
 +      excluded, and is hidden when responding to `git push` or `git
 +      fetch`.  See `receive.hideRefs` and `uploadpack.hideRefs` for
 +      program-specific versions of this config.
 ++
 +You may also include a `!` in front of the ref name to negate the entry,
 +explicitly exposing it, even if an earlier entry marked it as hidden.
 +If you have multiple hideRefs values, later entries override earlier ones
 +(and entries in more-specific config files override less-specific ones).
 ++
 +If a namespace is in use, the namespace prefix is stripped from each
 +reference before it is matched against `transfer.hiderefs` patterns.
 +For example, if `refs/heads/master` is specified in `transfer.hideRefs` and
 +the current namespace is `foo`, then `refs/namespaces/foo/refs/heads/master`
 +is omitted from the advertisements but `refs/heads/master` and
 +`refs/namespaces/bar/refs/heads/master` are still advertised as so-called
 +"have" lines. In order to match refs before stripping, add a `^` in front of
 +the ref name. If you combine `!` and `^`, `!` must be specified first.
  
  transfer.unpackLimit::
        When `fetch.unpackLimit` or `receive.unpackLimit` are
@@@ -2864,23 -2532,20 +2871,23 @@@ uploadarchive.allowUnreachable:
        `false`.
  
  uploadpack.hideRefs::
 -      String(s) `upload-pack` uses to decide which refs to omit
 -      from its initial advertisement.  Use more than one
 -      definitions to specify multiple prefix strings. A ref that
 -      are under the hierarchies listed on the value of this
 -      variable is excluded, and is hidden from `git ls-remote`,
 -      `git fetch`, etc.  An attempt to fetch a hidden ref by `git
 -      fetch` will fail.  See also `uploadpack.allowtipsha1inwant`.
 -
 -uploadpack.allowtipsha1inwant::
 +      This variable is the same as `transfer.hideRefs`, but applies
 +      only to `upload-pack` (and so affects only fetches, not pushes).
 +      An attempt to fetch a hidden ref by `git fetch` will fail.  See
 +      also `uploadpack.allowTipSHA1InWant`.
 +
 +uploadpack.allowTipSHA1InWant::
        When `uploadpack.hideRefs` is in effect, allow `upload-pack`
        to accept a fetch request that asks for an object at the tip
        of a hidden ref (by default, such a request is rejected).
        see also `uploadpack.hideRefs`.
  
 +uploadpack.allowReachableSHA1InWant::
 +      Allow `upload-pack` to accept a fetch request that asks for an
 +      object that is reachable from any ref tip. However, note that
 +      calculating object reachability is computationally expensive.
 +      Defaults to `false`.
 +
  uploadpack.keepAlive::
        When `upload-pack` has started `pack-objects`, there may be a
        quiet period while `pack-objects` prepares the pack. Normally
        `uploadpack.keepAlive` seconds. Setting this option to 0
        disables keepalive packets entirely. The default is 5 seconds.
  
 +uploadpack.packObjectsHook::
 +      If this option is set, when `upload-pack` would run
 +      `git pack-objects` to create a packfile for a client, it will
 +      run this shell command instead.  The `pack-objects` command and
 +      arguments it _would_ have run (including the `git pack-objects`
 +      at the beginning) are appended to the shell command. The stdin
 +      and stdout of the hook are treated as if `pack-objects` itself
 +      was run. I.e., `upload-pack` will feed input intended for
 +      `pack-objects` to the hook, and expects a completed packfile on
 +      stdout.
 ++
 +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).
 +
  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
@@@ -2933,24 -2583,14 +2940,24 @@@ url.<base>.pushInsteadOf:
  
  user.email::
        Your email address to be recorded in any newly created commits.
 -      Can be overridden by the 'GIT_AUTHOR_EMAIL', 'GIT_COMMITTER_EMAIL', and
 -      'EMAIL' environment variables.  See linkgit:git-commit-tree[1].
 +      Can be overridden by the `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_EMAIL`, and
 +      `EMAIL` environment variables.  See linkgit:git-commit-tree[1].
  
  user.name::
        Your full name to be recorded in any newly created commits.
 -      Can be overridden by the 'GIT_AUTHOR_NAME' and 'GIT_COMMITTER_NAME'
 +      Can be overridden by the `GIT_AUTHOR_NAME` and `GIT_COMMITTER_NAME`
        environment variables.  See linkgit:git-commit-tree[1].
  
 +user.useConfigOnly::
 +      Instruct Git to avoid trying to guess defaults for `user.email`
 +      and `user.name`, and instead retrieve the values only from the
 +      configuration. For example, if you have multiple email addresses
 +      and would like to use a different one for each repository, then
 +      with this configuration option set to `true` in the global config
 +      along with a name, Git will prompt you to set up an email before
 +      making new commits in a newly cloned repository.
 +      Defaults to `false`.
 +
  user.signingKey::
        If linkgit:git-tag[1] or linkgit:git-commit[1] is not selecting the
        key you want it to automatically when creating a signed tag or
diff --combined color.c
index 8f85153d0d2c1f4bf9340ced9371797eb3c92de9,a5b65812150382be09c41b1e30981b551b9b356a..81c26767239f9e028057c1843f57b77640db6c26
+++ b/color.c
@@@ -123,19 -123,34 +123,34 @@@ static int parse_color(struct color *ou
        return -1;
  }
  
- static int parse_attr(const char *name, int len)
+ static int parse_attr(const char *name, size_t len)
  {
-       static const int attr_values[] = { 1, 2, 4, 5, 7,
-                                          22, 22, 24, 25, 27 };
-       static const char * const attr_names[] = {
-               "bold", "dim", "ul", "blink", "reverse",
-               "nobold", "nodim", "noul", "noblink", "noreverse"
+       static const struct {
+               const char *name;
+               size_t len;
+               int val, neg;
+       } attrs[] = {
+ #define ATTR(x, val, neg) { (x), sizeof(x)-1, (val), (neg) }
+               ATTR("bold",      1, 22),
+               ATTR("dim",       2, 22),
+               ATTR("italic",    3, 23),
+               ATTR("ul",        4, 24),
+               ATTR("blink",     5, 25),
+               ATTR("reverse",   7, 27),
+               ATTR("strike",    9, 29)
+ #undef ATTR
        };
+       int negate = 0;
        int i;
-       for (i = 0; i < ARRAY_SIZE(attr_names); i++) {
-               const char *str = attr_names[i];
-               if (!strncasecmp(name, str, len) && !str[len])
-                       return attr_values[i];
+       if (skip_prefix_mem(name, len, "no", &name, &len)) {
+               skip_prefix_mem(name, len, "-", &name, &len);
+               negate = 1;
+       }
+       for (i = 0; i < ARRAY_SIZE(attrs); i++) {
+               if (attrs[i].len == len && !memcmp(attrs[i].name, name, len))
+                       return negate ? attrs[i].neg : attrs[i].val;
        }
        return -1;
  }
@@@ -145,34 -160,27 +160,34 @@@ int color_parse(const char *value, cha
        return color_parse_mem(value, strlen(value), dst);
  }
  
 +void color_set(char *dst, const char *color_bytes)
 +{
 +      xsnprintf(dst, COLOR_MAXLEN, "%s", color_bytes);
 +}
 +
  /*
   * Write the ANSI color codes for "c" to "out"; the string should
   * already have the ANSI escape code in it. "out" should have enough
   * space in it to fit any color.
   */
 -static char *color_output(char *out, const struct color *c, char type)
 +static char *color_output(char *out, int len, const struct color *c, char type)
  {
        switch (c->type) {
        case COLOR_UNSPECIFIED:
        case COLOR_NORMAL:
                break;
        case COLOR_ANSI:
 +              if (len < 2)
 +                      die("BUG: color parsing ran out of space");
                *out++ = type;
                *out++ = '0' + c->value;
                break;
        case COLOR_256:
 -              out += sprintf(out, "%c8;5;%d", type, c->value);
 +              out += xsnprintf(out, len, "%c8;5;%d", type, c->value);
                break;
        case COLOR_RGB:
 -              out += sprintf(out, "%c8;2;%d;%d;%d", type,
 -                             c->red, c->green, c->blue);
 +              out += xsnprintf(out, len, "%c8;2;%d;%d;%d", type,
 +                               c->red, c->green, c->blue);
                break;
        }
        return out;
@@@ -187,13 -195,12 +202,13 @@@ int color_parse_mem(const char *value, 
  {
        const char *ptr = value;
        int len = value_len;
 +      char *end = dst + COLOR_MAXLEN;
        unsigned int attr = 0;
        struct color fg = { COLOR_UNSPECIFIED };
        struct color bg = { COLOR_UNSPECIFIED };
  
        if (!strncasecmp(value, "reset", len)) {
 -              strcpy(dst, GIT_COLOR_RESET);
 +              xsnprintf(dst, end - dst, GIT_COLOR_RESET);
                return 0;
        }
  
                        goto bad;
        }
  
 +#undef OUT
 +#define OUT(x) do { \
 +      if (dst == end) \
 +              die("BUG: color parsing ran out of space"); \
 +      *dst++ = (x); \
 +} while(0)
 +
        if (attr || !color_empty(&fg) || !color_empty(&bg)) {
                int sep = 0;
                int i;
  
 -              *dst++ = '\033';
 -              *dst++ = '[';
 +              OUT('\033');
 +              OUT('[');
  
                for (i = 0; attr; i++) {
                        unsigned bit = (1 << i);
                                continue;
                        attr &= ~bit;
                        if (sep++)
 -                              *dst++ = ';';
 -                      dst += sprintf(dst, "%d", i);
 +                              OUT(';');
 +                      dst += xsnprintf(dst, end - dst, "%d", i);
                }
                if (!color_empty(&fg)) {
                        if (sep++)
 -                              *dst++ = ';';
 +                              OUT(';');
                        /* foreground colors are all in the 3x range */
 -                      dst = color_output(dst, &fg, '3');
 +                      dst = color_output(dst, end - dst, &fg, '3');
                }
                if (!color_empty(&bg)) {
                        if (sep++)
 -                              *dst++ = ';';
 +                              OUT(';');
                        /* background colors are all in the 4x range */
 -                      dst = color_output(dst, &bg, '4');
 +                      dst = color_output(dst, end - dst, &bg, '4');
                }
 -              *dst++ = 'm';
 +              OUT('m');
        }
 -      *dst = 0;
 +      OUT(0);
        return 0;
  bad:
        return error(_("invalid color value: %.*s"), value_len, value);
 +#undef OUT
  }
  
  int git_config_colorbool(const char *var, const char *value)
diff --combined color.h
index e155d13f784362a5fdd993e1e383e660fa324c30,2af1019a6027e47fc4071bff0b50359f88a0fe92..6cae166c2b222f008a3c801bec5c485c6fc0b2ff
+++ b/color.h
@@@ -3,20 -3,23 +3,23 @@@
  
  struct strbuf;
  
- /*  2 + (2 * num_attrs) + 8 + 1 + 8 + 'm' + NUL */
- /* "\033[1;2;4;5;7;38;5;2xx;48;5;2xxm\0" */
  /*
   * The maximum length of ANSI color sequence we would generate:
   * - leading ESC '['            2
-  * - attr + ';'                 3 * 10 (e.g. "1;")
+  * - attr + ';'                 2 * num_attr (e.g. "1;")
+  * - no-attr + ';'              3 * num_attr (e.g. "22;")
   * - fg color + ';'             17 (e.g. "38;2;255;255;255;")
   * - bg color + ';'             17 (e.g. "48;2;255;255;255;")
   * - terminating 'm' NUL        2
   *
-  * The above overcounts attr (we only use 5 not 8) and one semicolon
-  * but it is close enough.
+  * The above overcounts by one semicolon but it is close enough.
+  *
+  * The space for attributes is also slightly overallocated, as
+  * the negation for some attributes is the same (e.g., nobold and nodim).
+  *
+  * We allocate space for 7 attributes.
   */
- #define COLOR_MAXLEN 70
+ #define COLOR_MAXLEN 75
  
  /*
   * IMPORTANT: Due to the way these color codes are emulated on Windows,
@@@ -75,13 -78,6 +78,13 @@@ extern int color_stdout_is_tty
  int git_color_config(const char *var, const char *value, void *cb);
  int git_color_default_config(const char *var, const char *value, void *cb);
  
 +/*
 + * Set the color buffer (which must be COLOR_MAXLEN bytes)
 + * to the raw color bytes; this is useful for initializing
 + * default color variables.
 + */
 +void color_set(char *dst, const char *color_bytes);
 +
  int git_config_colorbool(const char *var, const char *value);
  int want_color(int var);
  int color_parse(const char *value, char *dst);
diff --combined git-compat-util.h
index 49d4029b8dddcb06dc6bea3d5f47c020785e3ddf,8e808c01d2508edd4d59994d4714486a13afeb42..c99cddc54b1ea14955e019dc84088b6c9fd74f88
  #elif defined(_MSC_VER)
  #include "compat/msvc.h"
  #else
 +#include <sys/utsname.h>
  #include <sys/wait.h>
  #include <sys/resource.h>
  #include <sys/socket.h>
@@@ -237,7 -236,7 +237,7 @@@ typedef unsigned long uintptr_t
  #else
  #define precompose_str(in,i_nfd2nfc)
  #define precompose_argv(c,v)
 -#define probe_utf8_pathname_composition(a,b)
 +#define probe_utf8_pathname_composition()
  #endif
  
  #ifdef MKDIR_WO_TRAILING_SLASH
@@@ -261,8 -260,6 +261,8 @@@ struct itimerval 
  #else
  #define basename gitbasename
  extern char *gitbasename(char *);
 +#define dirname gitdirname
 +extern char *gitdirname(char *);
  #endif
  
  #ifndef NO_ICONV
  #endif
  #include <openssl/ssl.h>
  #include <openssl/err.h>
 -#ifdef NO_HMAC_CTX_CLEANUP
 -#define HMAC_CTX_cleanup HMAC_cleanup
 -#endif
  #endif
  
  /* On most systems <netdb.h> would have given us this, but
  #define PRIuMAX "llu"
  #endif
  
 +#ifndef SCNuMAX
 +#define SCNuMAX PRIuMAX
 +#endif
 +
  #ifndef PRIu32
  #define PRIu32 "u"
  #endif
  #define _PATH_DEFPATH "/usr/local/bin:/usr/bin:/bin"
  #endif
  
 -#ifndef STRIP_EXTENSION
 -#define STRIP_EXTENSION ""
 -#endif
 -
  #ifndef has_dos_drive_prefix
  static inline int git_has_dos_drive_prefix(const char *path)
  {
  #define has_dos_drive_prefix git_has_dos_drive_prefix
  #endif
  
 +#ifndef skip_dos_drive_prefix
 +static inline int git_skip_dos_drive_prefix(char **path)
 +{
 +      return 0;
 +}
 +#define skip_dos_drive_prefix git_skip_dos_drive_prefix
 +#endif
 +
  #ifndef is_dir_sep
  static inline int git_is_dir_sep(int c)
  {
@@@ -404,14 -396,13 +404,14 @@@ struct strbuf
  
  /* General helper functions */
  extern void vreportf(const char *prefix, const char *err, va_list params);
 -extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
  extern NORETURN void usage(const char *err);
  extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
 +extern int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 +extern void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
  
  #ifndef NO_OPENSSL
  #ifdef APPLE_COMMON_CRYPTO
@@@ -441,7 -432,6 +441,7 @@@ static inline int const_error(void
  extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
  extern void set_error_routine(void (*routine)(const char *err, va_list params));
  extern void set_die_is_recursing_routine(int (*routine)(void));
 +extern void set_error_handle(FILE *);
  
  extern int starts_with(const char *str, const char *prefix);
  
@@@ -473,6 -463,23 +473,23 @@@ static inline int skip_prefix(const cha
        return 0;
  }
  
+ /*
+  * Like skip_prefix, but promises never to read past "len" bytes of the input
+  * buffer, and returns the remaining number of bytes in "out" via "outlen".
+  */
+ static inline int skip_prefix_mem(const char *buf, size_t len,
+                                 const char *prefix,
+                                 const char **out, size_t *outlen)
+ {
+       size_t prefix_len = strlen(prefix);
+       if (prefix_len <= len && !memcmp(buf, prefix, prefix_len)) {
+               *out = buf + prefix_len;
+               *outlen = len - prefix_len;
+               return 1;
+       }
+       return 0;
+ }
  /*
   * If buf ends with suffix, return 1 and subtract the length of the suffix
   * from *len. Otherwise, return 0 and leave *len untouched.
@@@ -585,7 -592,7 +602,7 @@@ extern int git_lstat(const char *, stru
  #endif
  
  #define DEFAULT_PACKED_GIT_LIMIT \
 -      ((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
 +      ((1024L * 1024L) * (size_t)(sizeof(void*) >= 8 ? 8192 : 256))
  
  #ifdef NO_PREAD
  #define pread git_pread
@@@ -676,6 -683,7 +693,6 @@@ extern int git_vsnprintf(char *str, siz
  #ifdef __GLIBC_PREREQ
  #if __GLIBC_PREREQ(2, 1)
  #define HAVE_STRCHRNUL
 -#define HAVE_MEMPCPY
  #endif
  #endif
  
@@@ -689,6 -697,14 +706,6 @@@ static inline char *gitstrchrnul(const 
  }
  #endif
  
 -#ifndef HAVE_MEMPCPY
 -#define mempcpy gitmempcpy
 -static inline void *gitmempcpy(void *dest, const void *src, size_t n)
 -{
 -      return (char *)memcpy(dest, src, n) + n;
 -}
 -#endif
 -
  #ifdef NO_INET_PTON
  int inet_pton(int af, const char *src, void *dst);
  #endif
@@@ -714,8 -730,8 +731,8 @@@ static inline size_t st_add(size_t a, s
                    (uintmax_t)a, (uintmax_t)b);
        return a + b;
  }
 -#define st_add3(a,b,c)   st_add((a),st_add((b),(c)))
 -#define st_add4(a,b,c,d) st_add((a),st_add3((b),(c),(d)))
 +#define st_add3(a,b,c)   st_add(st_add((a),(b)),(c))
 +#define st_add4(a,b,c,d) st_add(st_add3((a),(b),(c)),(d))
  
  static inline size_t st_mult(size_t a, size_t b)
  {
@@@ -751,84 -767,18 +768,84 @@@ extern void *xrealloc(void *ptr, size_
  extern void *xcalloc(size_t nmemb, size_t size);
  extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
  extern void *xmmap_gently(void *start, size_t length, int prot, int flags, int fd, off_t offset);
 +extern int xopen(const char *path, int flags, ...);
  extern ssize_t xread(int fd, void *buf, size_t len);
  extern ssize_t xwrite(int fd, const void *buf, size_t len);
  extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
  extern int xdup(int fd);
 +extern FILE *xfopen(const char *path, const char *mode);
  extern FILE *xfdopen(int fd, const char *mode);
  extern int xmkstemp(char *template);
  extern int xmkstemp_mode(char *template, int mode);
  extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
  extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
  extern char *xgetcwd(void);
 +extern FILE *fopen_for_writing(const char *path);
  
 -#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
 +#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
 +#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
 +
 +/*
 + * These functions help you allocate structs with flex arrays, and copy
 + * the data directly into the array. For example, if you had:
 + *
 + *   struct foo {
 + *     int bar;
 + *     char name[FLEX_ARRAY];
 + *   };
 + *
 + * you can do:
 + *
 + *   struct foo *f;
 + *   FLEX_ALLOC_MEM(f, name, src, len);
 + *
 + * to allocate a "foo" with the contents of "src" in the "name" field.
 + * The resulting struct is automatically zero'd, and the flex-array field
 + * is NUL-terminated (whether the incoming src buffer was or not).
 + *
 + * The FLEXPTR_* variants operate on structs that don't use flex-arrays,
 + * but do want to store a pointer to some extra data in the same allocated
 + * block. For example, if you have:
 + *
 + *   struct foo {
 + *     char *name;
 + *     int bar;
 + *   };
 + *
 + * you can do:
 + *
 + *   struct foo *f;
 + *   FLEX_ALLOC_STR(f, name, src);
 + *
 + * and "name" will point to a block of memory after the struct, which will be
 + * freed along with the struct (but the pointer can be repointed anywhere).
 + *
 + * The *_STR variants accept a string parameter rather than a ptr/len
 + * combination.
 + *
 + * Note that these macros will evaluate the first parameter multiple
 + * times, and it must be assignable as an lvalue.
 + */
 +#define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \
 +      (x) = NULL; /* silence -Wuninitialized for offset calculation */ \
 +      (x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \
 +} while (0)
 +#define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \
 +      (x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \
 +      (x)->ptrname = (void *)((x)+1); \
 +} while(0)
 +#define FLEX_ALLOC_STR(x, flexname, str) \
 +      FLEX_ALLOC_MEM((x), flexname, (str), strlen(str))
 +#define FLEXPTR_ALLOC_STR(x, ptrname, str) \
 +      FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str))
 +
 +static inline void *xalloc_flex(size_t base_len, size_t offset,
 +                              const void *src, size_t src_len)
 +{
 +      unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1));
 +      memcpy(ret + offset, src, src_len);
 +      return ret;
 +}
  
  static inline char *xstrdup_or_null(const char *str)
  {
@@@ -842,9 -792,6 +859,9 @@@ static inline size_t xsize_t(off_t len
        return (size_t)len;
  }
  
 +__attribute__((format (printf, 3, 4)))
 +extern int xsnprintf(char *dst, size_t max, const char *fmt, ...);
 +
  /* in ctype.c, for kwset users */
  extern const unsigned char tolower_trans_tbl[256];
  
@@@ -915,9 -862,6 +932,9 @@@ static inline int strtoul_ui(char cons
        char *p;
  
        errno = 0;
 +      /* negative values would be accepted by strtoul */
 +      if (strchr(s, '-'))
 +              return -1;
        ul = strtoul(s, &p, base);
        if (errno || *p || p == s || (unsigned int) ul != ul)
                return -1;
@@@ -1023,6 -967,9 +1040,6 @@@ int access_or_die(const char *path, in
  /* Warn on an inaccessible file that ought to be accessible */
  void warn_on_inaccessible(const char *path);
  
 -/* Get the passwd entry for the UID of the current process. */
 -struct passwd *xgetpwuid_self(void);
 -
  #ifdef GMTIME_UNRELIABLE_ERRORS
  struct tm *git_gmtime(const time_t *);
  struct tm *git_gmtime_r(const time_t *, struct tm *);
  # define SHELL_PATH "/bin/sh"
  #endif
  
 +#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
 +#define flockfile(fh)
 +#define funlockfile(fh)
 +#define getc_unlocked(fh) getc(fh)
 +#endif
 +
  #endif