]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'js/mingw-perl5lib'
authorJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 13:37:20 +0000 (22:37 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Nov 2018 13:37:20 +0000 (22:37 +0900)
Windows fix.

* js/mingw-perl5lib:
  mingw: unset PERL5LIB by default
  config: move Windows-specific config settings into compat/mingw.c
  config: allow for platform-specific core.* config settings
  config: rename `dummy` parameter to `cb` in git_default_config()

1  2 
Documentation/config/core.txt
cache.h
compat/mingw.c
compat/mingw.h
config.c
environment.c

index 30adc61195452ab0d18a3fbfcd7b04f756692875,0000000000000000000000000000000000000000..d0e6635fe0b56b87826240bc80cfef40b722bef4
mode 100644,000000..100644
--- /dev/null
@@@ -1,594 -1,0 +1,600 @@@
 +core.fileMode::
 +      Tells Git if the executable bit of files in the working tree
 +      is to be honored.
 ++
 +Some filesystems lose the executable bit when a file that is
 +marked as executable is checked out, or checks out a
 +non-executable file with executable bit on.
 +linkgit:git-clone[1] or linkgit:git-init[1] probe the filesystem
 +to see if it handles the executable bit correctly
 +and this variable is automatically set as necessary.
 ++
 +A repository, however, may be on a filesystem that handles
 +the filemode correctly, and this variable is set to 'true'
 +when created, but later may be made accessible from another
 +environment that loses the filemode (e.g. exporting ext4 via
 +CIFS mount, visiting a Cygwin created repository with
 +Git for Windows or Eclipse).
 +In such a case it may be necessary to set this variable to 'false'.
 +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::
 +      Internal variable which enables various workarounds to enable
 +      Git to work better on filesystems that are not case sensitive,
 +      like APFS, HFS+, FAT, NTFS, etc. For example, if a directory listing
 +      finds "makefile" when Git expects "Makefile", Git will assume
 +      it is really the same file, and continue to remember it as
 +      "Makefile".
 ++
 +The default is false, except linkgit:git-clone[1] or linkgit:git-init[1]
 +will probe and set core.ignoreCase true if appropriate when the repository
 +is created.
 ++
 +Git relies on the proper configuration of this variable for your operating
 +and file system. Modifying this value may result in unexpected behavior.
 +
 +core.precomposeUnicode::
 +      This option is only used by Mac OS implementation of Git.
 +      When core.precomposeUnicode=true, Git reverts the unicode decomposition
 +      of filenames done by Mac OS. This is useful when sharing a repository
 +      between Mac OS and Linux or Windows.
 +      (Git for Windows 1.7.10 or higher is needed, or Git under cygwin 1.7).
 +      When false, file names are handled fully transparent by Git,
 +      which is backward compatible with older versions of Git.
 +
 +core.protectHFS::
 +      If set to true, do not allow checkout of paths that would
 +      be considered equivalent to `.git` on an HFS+ filesystem.
 +      Defaults to `true` on Mac OS, and `false` elsewhere.
 +
 +core.protectNTFS::
 +      If set to true, do not allow checkout of paths that would
 +      cause problems with the NTFS filesystem, e.g. conflict with
 +      8.3 "short" names.
 +      Defaults to `true` on Windows, and `false` elsewhere.
 +
 +core.fsmonitor::
 +      If set, the value of this variable is used as a command which
 +      will identify all files that may have changed since the
 +      requested date/time. This information is used to speed up git by
 +      avoiding unnecessary processing of files that have not changed.
 +      See the "fsmonitor-watchman" section of linkgit:githooks[5].
 +
 +core.trustctime::
 +      If false, the ctime differences between the index and the
 +      working tree are ignored; useful when the inode change time
 +      is regularly modified by something outside Git (file system
 +      crawlers and some backup systems).
 +      See linkgit:git-update-index[1]. True by default.
 +
 +core.splitIndex::
 +      If true, the split-index feature of the index will be used.
 +      See linkgit:git-update-index[1]. False 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::
 +      When missing or is set to `default`, many fields in the stat
 +      structure are checked to detect if a file has been modified
 +      since Git looked at it.  When this configuration variable is
 +      set to `minimal`, sub-second part of mtime and ctime, the
 +      uid and gid of the owner of the file, the inode number (and
 +      the device number, if Git was compiled to use it), are
 +      excluded from the check among these fields, leaving only the
 +      whole-second part of mtime (and ctime, if `core.trustCtime`
 +      is set) and the filesize to be checked.
 ++
 +There are implementations of Git that do not leave usable values in
 +some fields (e.g. JGit); by excluding these fields from the
 +comparison, the `minimal` mode may help interoperability when the
 +same repository is used by these other systems at the same time.
 +
 +core.quotePath::
 +      Commands that output paths (e.g. 'ls-files', 'diff'), will
 +      quote "unusual" characters in the pathname by enclosing the
 +      pathname in double-quotes and escaping those characters with
 +      backslashes in the same way C escapes control characters (e.g.
 +      `\t` for TAB, `\n` for LF, `\\` for backslash) or bytes with
 +      values larger than 0x80 (e.g. octal `\302\265` for "micro" in
 +      UTF-8).  If this variable is set to false, bytes higher than
 +      0x80 are not considered "unusual" any more. Double-quotes,
 +      backslash and control characters are always escaped regardless
 +      of the setting of this variable.  A simple space character is
 +      not considered "unusual".  Many commands can output pathnames
 +      completely verbatim using the `-z` option. The default value
 +      is true.
 +
 +core.eol::
 +      Sets the line ending type to use in the working directory for
 +      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.
 +
 +core.safecrlf::
 +      If true, makes Git check if converting `CRLF` is reversible when
 +      end-of-line conversion is active.  Git will verify if a command
 +      modifies a file in the work tree either directly or indirectly.
 +      For example, committing a file followed by checking out the
 +      same file should yield the original file in the work tree.  If
 +      this is not the case for the current setting of
 +      `core.autocrlf`, Git will reject the file.  The variable can
 +      be set to "warn", in which case Git will only warn about an
 +      irreversible conversion but continue the operation.
 ++
 +CRLF conversion bears a slight chance of corrupting data.
 +When it is enabled, Git will convert CRLF to LF during commit and LF to
 +CRLF during checkout.  A file that contains a mixture of LF and
 +CRLF before the commit cannot be recreated by Git.  For text
 +files this is the right thing to do: it corrects line endings
 +such that we have only LF line endings in the repository.
 +But for binary files that are accidentally classified as text the
 +conversion can corrupt data.
 ++
 +If you recognize such corruption early you can easily fix it by
 +setting the conversion type explicitly in .gitattributes.  Right
 +after committing you still have the original file in your work
 +tree and this file is not yet corrupted.  You can explicitly tell
 +Git that this file is binary and Git will handle the file
 +appropriately.
 ++
 +Unfortunately, the desired effect of cleaning up text files with
 +mixed line endings and the undesired effect of corrupting binary
 +files cannot be distinguished.  In both cases CRLFs are removed
 +in an irreversible way.  For text files this is the right thing
 +to do because CRLFs are line endings, while for binary files
 +converting CRLFs corrupts data.
 ++
 +Note, this safety check does not mean that a checkout will generate a
 +file identical to the original file for a different setting of
 +`core.eol` and `core.autocrlf`, but only for the current one.  For
 +example, a text file with `LF` would be accepted with `core.eol=lf`
 +and could later be checked out with `core.eol=crlf`, in which case the
 +resulting file would contain `CRLF`, although the original file
 +contained `LF`.  However, in both work trees the line endings would be
 +consistent, that is either all `LF` or all `CRLF`, but never mixed.  A
 +file with mixed line endings would be reported by the `core.safecrlf`
 +mechanism.
 +
 +core.autocrlf::
 +      Setting this variable to "true" is the same as setting
 +      the `text` attribute to "auto" on all files and core.eol to "crlf".
 +      Set to true if you want to have `CRLF` line endings in your
 +      working directory and the repository has LF line endings.
 +      This variable can be set to 'input',
 +      in which case no output conversion is performed.
 +
 +core.checkRoundtripEncoding::
 +      A comma and/or whitespace separated list of encodings that Git
 +      performs UTF-8 round trip checks on if they are used in an
 +      `working-tree-encoding` attribute (see linkgit:gitattributes[5]).
 +      The default value is `SHIFT-JIS`.
 +
 +core.symlinks::
 +      If false, symbolic links are checked out as small plain files that
 +      contain the link text. linkgit:git-update-index[1] and
 +      linkgit:git-add[1] will not change the recorded type to regular
 +      file. Useful on filesystems like FAT that do not support
 +      symbolic links.
 ++
 +The default is true, except linkgit:git-clone[1] or linkgit:git-init[1]
 +will probe and set core.symlinks false if appropriate when the repository
 +is created.
 +
 +core.gitProxy::
 +      A "proxy command" to execute (as 'command host port') instead
 +      of establishing direct connection to the remote server when
 +      using the Git protocol for fetching. If the variable value is
 +      in the "COMMAND for DOMAIN" format, the command is applied only
 +      on hostnames ending with the specified domain string. This variable
 +      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
 +(which always applies universally, without the special "for"
 +handling).
 ++
 +The special string `none` can be used as the proxy command to
 +specify that no proxy be used for a given domain pattern.
 +This is useful for excluding servers inside a firewall from
 +proxy use, while defaulting to a common proxy for external domains.
 +
 +core.sshCommand::
 +      If this variable is set, `git fetch` and `git push` will
 +      use the specified command instead of `ssh` when they need to
 +      connect to a remote system. The command is in the same form as
 +      the `GIT_SSH_COMMAND` environment variable and is overridden
 +      when the environment variable is set.
 +
 +core.ignoreStat::
 +      If true, Git will avoid using lstat() calls to detect if files have
 +      changed by setting the "assume-unchanged" bit for those tracked files
 +      which it has updated identically in both the index and working tree.
 ++
 +When files are modified outside of Git, the user will need to stage
 +the modified files explicitly (e.g. see 'Examples' section in
 +linkgit:git-update-index[1]).
 +Git will not normally detect changes to those files.
 ++
 +This is useful on systems where lstat() calls are very slow, such as
 +CIFS/Microsoft Windows.
 ++
 +False by default.
 +
 +core.preferSymlinkRefs::
 +      Instead of the default "symref" format for HEAD
 +      and other symbolic reference files, use symbolic links.
 +      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 produced 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
 +      number of commands that require a working directory will be
 +      disabled, such as linkgit:git-add[1] or linkgit:git-merge[1].
 ++
 +This setting is automatically guessed by linkgit:git-clone[1] or
 +linkgit:git-init[1] when the repository was created.  By default a
 +repository that ends in "/.git" is assumed to be not bare (bare =
 +false), while all other repositories are assumed to be bare (bare
 += true).
 +
 +core.worktree::
 +      Set the path to the root of the working tree.
 +      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
 +      or GIT_DIR, or automatically discovered.
 +      If --git-dir or GIT_DIR is specified but none of
 +      --work-tree, GIT_WORK_TREE and core.worktree is specified,
 +      the current working directory is regarded as the top level
 +      of your working tree.
 ++
 +Note that this variable is honored even when set in a configuration
 +file in a ".git" subdirectory of a directory and its value differs
 +from the latter directory (e.g. "/path/to/.git/config" has
 +core.worktree set to "/different/path"), which is most likely a
 +misconfiguration.  Running Git commands in the "/path/to" directory will
 +still use "/different/path" as the root of the work tree and can cause
 +confusion unless you know what you are doing (e.g. you are creating a
 +read-only snapshot of the same index to a location different from the
 +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
 +      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>`"
 +      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`.
 +      If it is set to `always`, then a missing reflog is automatically
 +      created for any ref under `refs/`.
 ++
 +This information can be used to determine what commit
 +was the tip of a branch "2 days ago".
 ++
 +This value is true by default in a repository that has
 +a working directory associated with it, and false by
 +default in a bare repository.
 +
 +core.repositoryFormatVersion::
 +      Internal variable identifying the repository format and layout
 +      version.
 +
 +core.sharedRepository::
 +      When 'group' (or 'true'), the repository is made shareable between
 +      several users in a group (making sure all the files and objects are
 +      group-writable). When 'all' (or 'world' or 'everybody'), the
 +      repository will be readable by all users, additionally to being
 +      group-shareable. When 'umask' (or 'false'), Git will use permissions
 +      reported by umask(2). When '0xxx', where '0xxx' is an octal number,
 +      files in the repository will have this mode value. '0xxx' will override
 +      user's umask value (whereas the other options will only override
 +      requested parts of the user's umask value). Examples: '0660' will make
 +      the repo read/write-able for the owner and group, but inaccessible to
 +      others (equivalent to 'group' unless umask is e.g. '0022'). '0640' is a
 +      repository that is group-readable but not group-writable.
 +      See linkgit:git-init[1]. False by default.
 +
 +core.warnAmbiguousRefs::
 +      If true, Git will warn you if the ref name you passed it is ambiguous
 +      and might match multiple refs in the repository. True by default.
 +
 +core.compression::
 +      An integer -1..9, indicating a default compression level.
 +      -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`.
 +
 +core.looseCompression::
 +      An integer -1..9, indicating the compression level for objects that
 +      are not in a pack file. -1 is the zlib default. 0 means no
 +      compression, and 1..9 are various speed/size tradeoffs, 9 being
 +      slowest.  If not set,  defaults to core.compression.  If that is
 +      not set,  defaults to 1 (best speed).
 +
 +core.packedGitWindowSize::
 +      Number of bytes of a pack file to map into memory in a
 +      single mapping operation.  Larger window sizes may allow
 +      your system to process a smaller number of large pack files
 +      more quickly.  Smaller window sizes will negatively affect
 +      performance due to increased calls to the operating system's
 +      memory manager, but may improve performance when accessing
 +      a large number of large pack files.
 ++
 +Default is 1 MiB if NO_MMAP was set at compile time, otherwise 32
 +MiB on 32 bit platforms and 1 GiB on 64 bit platforms.  This should
 +be reasonable for all users/operating systems.  You probably do
 +not need to adjust this value.
 ++
 +Common unit suffixes of 'k', 'm', or 'g' are supported.
 +
 +core.packedGitLimit::
 +      Maximum number of bytes to map simultaneously into memory
 +      from pack files.  If Git needs to access more than this many
 +      bytes at once to complete an operation it will unmap existing
 +      regions to reclaim virtual address space within the process.
 ++
 +Default is 256 MiB on 32 bit platforms and 32 TiB (effectively
 +unlimited) on 64 bit platforms.
 +This should be reasonable for all users/operating systems, except on
 +the largest projects.  You probably do not need to adjust this value.
 ++
 +Common unit suffixes of 'k', 'm', or 'g' are supported.
 +
 +core.deltaBaseCacheLimit::
 +      Maximum number of bytes to reserve for caching base objects
 +      that may be referenced by multiple deltified objects.  By storing the
 +      entire decompressed base objects in a cache Git is able
 +      to avoid unpacking and decompressing frequently used base
 +      objects multiple times.
 ++
 +Default is 96 MiB on all platforms.  This should be reasonable
 +for all users/operating systems, except on the largest projects.
 +You probably do not need to adjust this value.
 ++
 +Common unit suffixes of 'k', 'm', or 'g' are supported.
 +
 +core.bigFileThreshold::
 +      Files larger than this size are stored deflated, without
 +      attempting delta compression.  Storing large files without
 +      delta compression avoids excessive memory usage, at the
 +      slight expense of increased disk usage. Additionally files
 +      larger than this size are always treated as binary.
 ++
 +Default is 512 MiB on all platforms.  This should be reasonable
 +for most projects as source code and other text files can still
 +be delta compressed, but larger binary media files won't be.
 ++
 +Common unit suffixes of 'k', 'm', or 'g' are supported.
 +
 +core.excludesFile::
 +      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`
 +      environment variable. If not set, fall back to the value of the
 +      `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.
 +
 +core.attributesFile::
 +      In addition to '.gitattributes' (per-directory) and
 +      '.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.
 +
 +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 let you edit
 +      messages by launching an editor use the value of this
 +      variable when it is set, and the environment variable
 +      `GIT_EDITOR` is not set.  See linkgit:git-var[1].
 +
 +core.commentChar::
 +      Commands such as `commit` and `tag` that let you edit
 +      messages consider a line that begins with this character
 +      commented, and removes them after the editor returns
 +      (default '#').
 ++
 +If set to "auto", `git-commit` would select a character that is not
 +the beginning character of any line in existing commit messages.
 +
 +core.filesRefLockTimeout::
 +      The length of time, in milliseconds, to retry when trying to
 +      lock an individual reference. Value 0 means not to retry at
 +      all; -1 means to try indefinitely. Default is 100 (i.e.,
 +      retry for 100ms).
 +
 +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).
 +
 +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
 +      is the `$GIT_PAGER` environment variable, then `core.pager`
 +      configuration, then `$PAGER`, and then the default chosen at
 +      compile time (usually 'less').
 ++
 +When the `LESS` environment variable is unset, Git sets it to `FRX`
 +(if `LESS` environment variable is set, Git does not change it at
 +all).  If you want to selectively override Git's default setting
 +for `LESS`, you can set `core.pager` to e.g. `less -S`.  This will
 +be passed to the shell by Git, which will translate the final
 +command to `LESS=FRX less -S`. The environment does not set the
 +`S` option but the command line does, instructing less to truncate
 +long lines. Similarly, setting `core.pager` to `less -+F` will
 +deactivate the `F` option specified by the environment from the
 +command-line, deactivating the "quit if one screen" behavior of
 +`less`.  One can specifically activate some flags for particular
 +commands: for example, setting `pager.blame` to `less -S` enables
 +line truncation only for `git blame`.
 ++
 +Likewise, when the `LV` environment variable is unset, Git sets it
 +to `-c`.  You can override this setting by exporting `LV` with
 +another value or setting `core.pager` to `lv +c`.
 +
 +core.whitespace::
 +      A comma separated list of common whitespace problems to
 +      notice.  'git diff' will use `color.diff.whitespace` to
 +      highlight them, and 'git apply --whitespace=error' will
 +      consider them as errors.  You can prefix `-` to disable
 +      any of them (e.g. `-trailing-space`):
 ++
 +* `blank-at-eol` treats trailing whitespaces at the end of the line
 +  as an error (enabled by default).
 +* `space-before-tab` treats a space character that appears immediately
 +  before a tab character in the initial indent part of the line as an
 +  error (enabled by default).
 +* `indent-with-non-tab` treats a line that is indented with space
 +  characters instead of the equivalent tabs as an error (not enabled by
 +  default).
 +* `tab-in-indent` treats a tab character in the initial indent part of
 +  the line as an error (not enabled by default).
 +* `blank-at-eof` treats blank lines added at the end of file as an error
 +  (enabled by default).
 +* `trailing-space` is a short-hand to cover both `blank-at-eol` and
 +  `blank-at-eof`.
 +* `cr-at-eol` treats a carriage-return at the end of line as
 +  part of the line terminator, i.e. with it, `trailing-space`
 +  does not trigger if the character before such a carriage-return
 +  is not a whitespace (not enabled by default).
 +* `tabwidth=<n>` tells how many character positions a tab occupies; this
 +  is relevant for `indent-with-non-tab` and when Git fixes `tab-in-indent`
 +  errors. The default tab width is 8. Allowed values are 1 to 63.
 +
 +core.fsyncObjectFiles::
 +      This boolean will enable 'fsync()' when writing object files.
 ++
 +This is a total waste of time and effort on a filesystem that orders
 +data writes properly, but can be useful for filesystems that do not use
 +journalling (traditional UNIX filesystems) or that only journal metadata
 +and not file contents (OS X's HFS+, or Linux ext3 with "data=writeback").
 +
 +core.preloadIndex::
 +      Enable parallel index preload for operations like 'git diff'
 ++
 +This can speed up operations like 'git diff' and 'git status' especially
 +on filesystems like NFS that have weak caching semantics and thus
 +relatively high IO latencies.  When enabled, Git will do the
 +index comparison to the filesystem data in parallel, allowing
 +overlapping IO's.  Defaults to true.
 +
++core.unsetenvvars::
++      Windows-only: comma-separated list of environment variables'
++      names that need to be unset before spawning any other process.
++      Defaults to `PERL5LIB` to account for the fact that Git for
++      Windows insists on using its own Perl interpreter.
++
 +core.createObject::
 +      You can set this to 'link', in which case a hardlink followed by
 +      a delete of the source are used to make sure that object creation
 +      will not overwrite existing objects.
 ++
 +On some file system/operating system combinations, this is unreliable.
 +Set this config setting to 'rename' there; However, This will remove the
 +check that makes sure that existing object files will not get overwritten.
 +
 +core.notesRef::
 +      When showing commit messages, also show notes which are stored in
 +      the given ref.  The ref must be fully qualified.  If the given
 +      ref does not exist, it is not an error but means that no
 +      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].
 +
 +core.commitGraph::
 +      If true, then git will read the commit-graph file (if it exists)
 +      to parse the graph structure of commits. Defaults to false. See
 +      linkgit:git-commit-graph[1] for more information.
 +
 +core.useReplaceRefs::
 +      If set to `false`, behave as if the `--no-replace-objects`
 +      option was given on the command line. See linkgit:git[1] and
 +      linkgit:git-replace[1] for more information.
 +
 +core.multiPackIndex::
 +      Use the multi-pack-index file to track multiple packfiles using a
 +      single index. See link:technical/multi-pack-index.html[the
 +      multi-pack-index design document].
 +
 +core.sparseCheckout::
 +      Enable "sparse checkout" feature. See section "Sparse checkout" in
 +      linkgit:git-read-tree[1] for more information.
 +
 +core.abbrev::
 +      Set the length object names are abbreviated to.  If
 +      unspecified or set to "auto", an appropriate value is
 +      computed based on the approximate number of packed objects
 +      in your repository, which hopefully is enough for
 +      abbreviated object names to stay unique for some time.
 +      The minimum length is 4.
diff --combined cache.h
index a4a77493809a1bfb19d73cd41920bf276b57e771,0ce95c5a8d72ed2d573d97bfae00ab06b2daafaa..a59141f8b2a9843d9c2c2c62c84871be6d0cbf39
+++ b/cache.h
@@@ -906,14 -906,6 +906,6 @@@ int use_optional_locks(void)
  extern char comment_line_char;
  extern int auto_comment_line_char;
  
- /* Windows only */
- enum hide_dotfiles_type {
-       HIDE_DOTFILES_FALSE = 0,
-       HIDE_DOTFILES_TRUE,
-       HIDE_DOTFILES_DOTGITONLY
- };
- extern enum hide_dotfiles_type hide_dotfiles;
  enum log_refs_config {
        LOG_REFS_UNSET = -1,
        LOG_REFS_NONE = 0,
@@@ -962,13 -954,11 +954,13 @@@ extern int grafts_replace_parents
  extern int repository_format_precious_objects;
  extern char *repository_format_partial_clone;
  extern const char *core_partial_clone_filter_default;
 +extern int repository_format_worktree_config;
  
  struct repository_format {
        int version;
        int precious_objects;
        char *partial_clone; /* value of extensions.partialclone */
 +      int worktree_config;
        int is_bare;
        int hash_algo;
        char *work_tree;
@@@ -1489,7 -1479,6 +1481,7 @@@ extern const char *fmt_name(const char 
  extern const char *ident_default_name(void);
  extern const char *ident_default_email(void);
  extern const char *git_editor(void);
 +extern const char *git_sequence_editor(void);
  extern const char *git_pager(int stdout_is_tty);
  extern int is_terminal_dumb(void);
  extern int git_ident_config(const char *, const char *, void *);
diff --combined compat/mingw.c
index 3b44dd99d79aed48a325b1e59b28d98d0c0790b9,181e74c23b587d4bee0e93077823ea01ccb6c027..e8e538a2e048a17ff7e07c411cd7b51021c90a4a
@@@ -6,6 -6,7 +6,7 @@@
  #include "../run-command.h"
  #include "../cache.h"
  #include "win32/lazyload.h"
+ #include "../config.h"
  
  #define HCAST(type, handle) ((type)(intptr_t)handle)
  
@@@ -203,6 -204,35 +204,35 @@@ static int ask_yes_no_if_possible(cons
        }
  }
  
+ /* Windows only */
+ enum hide_dotfiles_type {
+       HIDE_DOTFILES_FALSE = 0,
+       HIDE_DOTFILES_TRUE,
+       HIDE_DOTFILES_DOTGITONLY
+ };
+ static enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
+ static char *unset_environment_variables;
+ int mingw_core_config(const char *var, const char *value, void *cb)
+ {
+       if (!strcmp(var, "core.hidedotfiles")) {
+               if (value && !strcasecmp(value, "dotgitonly"))
+                       hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
+               else
+                       hide_dotfiles = git_config_bool(var, value);
+               return 0;
+       }
+       if (!strcmp(var, "core.unsetenvvars")) {
+               free(unset_environment_variables);
+               unset_environment_variables = xstrdup(value);
+               return 0;
+       }
+       return 0;
+ }
  /* Normalizes NT paths as returned by some low-level APIs. */
  static wchar_t *normalize_ntpath(wchar_t *wbuf)
  {
@@@ -618,11 -648,9 +648,11 @@@ static inline long long filetime_to_hns
        return winTime - 116444736000000000LL;
  }
  
 -static inline time_t filetime_to_time_t(const FILETIME *ft)
 +static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts)
  {
 -      return (time_t)(filetime_to_hnsec(ft) / 10000000);
 +      long long hnsec = filetime_to_hnsec(ft);
 +      ts->tv_sec = (time_t)(hnsec / 10000000);
 +      ts->tv_nsec = (hnsec % 10000000) * 100;
  }
  
  /**
@@@ -681,9 -709,9 +711,9 @@@ static int do_lstat(int follow, const c
                buf->st_size = fdata.nFileSizeLow |
                        (((off_t)fdata.nFileSizeHigh)<<32);
                buf->st_dev = buf->st_rdev = 0; /* not used by Git */
 -              buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
 -              buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
 -              buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
 +              filetime_to_timespec(&(fdata.ftLastAccessTime), &(buf->st_atim));
 +              filetime_to_timespec(&(fdata.ftLastWriteTime), &(buf->st_mtim));
 +              filetime_to_timespec(&(fdata.ftCreationTime), &(buf->st_ctim));
                if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
                        WIN32_FIND_DATAW findbuf;
                        HANDLE handle = FindFirstFileW(wfilename, &findbuf);
@@@ -764,29 -792,6 +794,29 @@@ static int do_stat_internal(int follow
        return do_lstat(follow, alt_name, buf);
  }
  
 +static int get_file_info_by_handle(HANDLE hnd, struct stat *buf)
 +{
 +      BY_HANDLE_FILE_INFORMATION fdata;
 +
 +      if (!GetFileInformationByHandle(hnd, &fdata)) {
 +              errno = err_win_to_posix(GetLastError());
 +              return -1;
 +      }
 +
 +      buf->st_ino = 0;
 +      buf->st_gid = 0;
 +      buf->st_uid = 0;
 +      buf->st_nlink = 1;
 +      buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
 +      buf->st_size = fdata.nFileSizeLow |
 +              (((off_t)fdata.nFileSizeHigh)<<32);
 +      buf->st_dev = buf->st_rdev = 0; /* not used by Git */
 +      filetime_to_timespec(&(fdata.ftLastAccessTime), &(buf->st_atim));
 +      filetime_to_timespec(&(fdata.ftLastWriteTime), &(buf->st_mtim));
 +      filetime_to_timespec(&(fdata.ftCreationTime), &(buf->st_ctim));
 +      return 0;
 +}
 +
  int mingw_lstat(const char *file_name, struct stat *buf)
  {
        return do_stat_internal(0, file_name, buf);
@@@ -799,31 -804,32 +829,31 @@@ int mingw_stat(const char *file_name, s
  int mingw_fstat(int fd, struct stat *buf)
  {
        HANDLE fh = (HANDLE)_get_osfhandle(fd);
 -      BY_HANDLE_FILE_INFORMATION fdata;
 +      DWORD avail, type = GetFileType(fh) & ~FILE_TYPE_REMOTE;
  
 -      if (fh == INVALID_HANDLE_VALUE) {
 -              errno = EBADF;
 -              return -1;
 -      }
 -      /* direct non-file handles to MS's fstat() */
 -      if (GetFileType(fh) != FILE_TYPE_DISK)
 -              return _fstati64(fd, buf);
 +      switch (type) {
 +      case FILE_TYPE_DISK:
 +              return get_file_info_by_handle(fh, buf);
  
 -      if (GetFileInformationByHandle(fh, &fdata)) {
 -              buf->st_ino = 0;
 -              buf->st_gid = 0;
 -              buf->st_uid = 0;
 +      case FILE_TYPE_CHAR:
 +      case FILE_TYPE_PIPE:
 +              /* initialize stat fields */
 +              memset(buf, 0, sizeof(*buf));
                buf->st_nlink = 1;
 -              buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
 -              buf->st_size = fdata.nFileSizeLow |
 -                      (((off_t)fdata.nFileSizeHigh)<<32);
 -              buf->st_dev = buf->st_rdev = 0; /* not used by Git */
 -              buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
 -              buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
 -              buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
 +
 +              if (type == FILE_TYPE_CHAR) {
 +                      buf->st_mode = _S_IFCHR;
 +              } else {
 +                      buf->st_mode = _S_IFIFO;
 +                      if (PeekNamedPipe(fh, NULL, 0, NULL, &avail, NULL))
 +                              buf->st_size = avail;
 +              }
                return 0;
 +
 +      default:
 +              errno = EBADF;
 +              return -1;
        }
 -      errno = EBADF;
 -      return -1;
  }
  
  static inline void time_t_to_filetime(time_t t, FILETIME *ft)
@@@ -1181,6 -1187,27 +1211,27 @@@ static wchar_t *make_environment_block(
        return wenvblk;
  }
  
+ static void do_unset_environment_variables(void)
+ {
+       static int done;
+       char *p = unset_environment_variables;
+       if (done || !p)
+               return;
+       done = 1;
+       for (;;) {
+               char *comma = strchr(p, ',');
+               if (comma)
+                       *comma = '\0';
+               unsetenv(p);
+               if (!comma)
+                       break;
+               p = comma + 1;
+       }
+ }
  struct pinfo_t {
        struct pinfo_t *next;
        pid_t pid;
@@@ -1199,9 -1226,12 +1250,12 @@@ static pid_t mingw_spawnve_fd(const cha
        wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs, *wenvblk = NULL;
        unsigned flags = CREATE_UNICODE_ENVIRONMENT;
        BOOL ret;
+       HANDLE cons;
+       do_unset_environment_variables();
  
        /* Determine whether or not we are associated to a console */
-       HANDLE cons = CreateFile("CONOUT$", GENERIC_WRITE,
+       cons = CreateFile("CONOUT$", GENERIC_WRITE,
                        FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL, NULL);
        if (cons == INVALID_HANDLE_VALUE) {
@@@ -2438,6 -2468,8 +2492,8 @@@ void mingw_startup(void
        /* fix Windows specific environment settings */
        setup_windows_environment();
  
+       unset_environment_variables = xstrdup("PERL5LIB");
        /* initialize critical section for waitpid pinfo_t list */
        InitializeCriticalSection(&pinfo_cs);
  
diff --combined compat/mingw.h
index a577df0d74aa2b920c7d6779356127c215ec73d9,e9d2b9cdd3f13ddda77a9f7301067f4f7f127034..2f1f8e3e05367041580c150d82514ea09bcf0d7f
@@@ -11,6 -11,9 +11,9 @@@ typedef _sigset_t sigset_t
  #undef _POSIX_THREAD_SAFE_FUNCTIONS
  #endif
  
+ extern int mingw_core_config(const char *var, const char *value, void *cb);
+ #define platform_core_config mingw_core_config
  /*
   * things that are not available in header files
   */
@@@ -327,41 -330,18 +330,41 @@@ static inline int getrlimit(int resourc
  }
  
  /*
 - * Use mingw specific stat()/lstat()/fstat() implementations on Windows.
 + * Use mingw specific stat()/lstat()/fstat() implementations on Windows,
 + * including our own struct stat with 64 bit st_size and nanosecond-precision
 + * file times.
   */
  #ifndef __MINGW64_VERSION_MAJOR
  #define off_t off64_t
  #define lseek _lseeki64
 +struct timespec {
 +      time_t tv_sec;
 +      long tv_nsec;
 +};
  #endif
  
 -/* use struct stat with 64 bit st_size */
 +struct mingw_stat {
 +    _dev_t st_dev;
 +    _ino_t st_ino;
 +    _mode_t st_mode;
 +    short st_nlink;
 +    short st_uid;
 +    short st_gid;
 +    _dev_t st_rdev;
 +    off64_t st_size;
 +    struct timespec st_atim;
 +    struct timespec st_mtim;
 +    struct timespec st_ctim;
 +};
 +
 +#define st_atime st_atim.tv_sec
 +#define st_mtime st_mtim.tv_sec
 +#define st_ctime st_ctim.tv_sec
 +
  #ifdef stat
  #undef stat
  #endif
 -#define stat _stati64
 +#define stat mingw_stat
  int mingw_lstat(const char *file_name, struct stat *buf);
  int mingw_stat(const char *file_name, struct stat *buf);
  int mingw_fstat(int fd, struct stat *buf);
  #endif
  #define lstat mingw_lstat
  
 -#ifndef _stati64
 -# define _stati64(x,y) mingw_stat(x,y)
 -#elif defined (_USE_32BIT_TIME_T)
 -# define _stat32i64(x,y) mingw_stat(x,y)
 -#else
 -# define _stat64(x,y) mingw_stat(x,y)
 -#endif
  
  int mingw_utime(const char *file_name, const struct utimbuf *times);
  #define utime mingw_utime
@@@ -406,9 -393,6 +409,9 @@@ int mingw_raise(int sig)
  int winansi_isatty(int fd);
  #define isatty winansi_isatty
  
 +int winansi_dup2(int oldfd, int newfd);
 +#define dup2 winansi_dup2
 +
  void winansi_init(void);
  HANDLE winansi_get_osfhandle(int fd);
  
diff --combined config.c
index aa0ed854f68f530c90cf00eb2d496b64734aa4ce,5bf19a23c2db169aa27bb954c2c0f3d3bb4ff613..2ffd39c22006beaf8c4b0941d82183dd3b756955
+++ b/config.c
@@@ -1093,7 -1093,7 +1093,7 @@@ int git_config_color(char *dest, const 
        return 0;
  }
  
- static int git_default_core_config(const char *var, const char *value)
+ static int git_default_core_config(const char *var, const char *value, void *cb)
  {
        /* This needs a better name */
        if (!strcmp(var, "core.filemode")) {
                return 0;
        }
  
-       if (!strcmp(var, "core.hidedotfiles")) {
-               if (value && !strcasecmp(value, "dotgitonly"))
-                       hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
-               else
-                       hide_dotfiles = git_config_bool(var, value);
-               return 0;
-       }
        if (!strcmp(var, "core.partialclonefilter")) {
                return git_config_string(&core_partial_clone_filter_default,
                                         var, value);
        }
  
        /* Add other config variables here and to Documentation/config.txt. */
-       return 0;
+       return platform_core_config(var, value, cb);
  }
  
  static int git_default_i18n_config(const char *var, const char *value)
@@@ -1448,13 -1440,13 +1440,13 @@@ static int git_default_mailmap_config(c
        return 0;
  }
  
- int git_default_config(const char *var, const char *value, void *dummy)
+ int git_default_config(const char *var, const char *value, void *cb)
  {
        if (starts_with(var, "core."))
-               return git_default_core_config(var, value);
+               return git_default_core_config(var, value, cb);
  
        if (starts_with(var, "user."))
-               return git_ident_config(var, value, dummy);
+               return git_ident_config(var, value, cb);
  
        if (starts_with(var, "i18n."))
                return git_default_i18n_config(var, value);
@@@ -1695,17 -1687,6 +1687,17 @@@ static int do_git_config_sequence(cons
        if (repo_config && !access_or_die(repo_config, R_OK, 0))
                ret += git_config_from_file(fn, repo_config, data);
  
 +      /*
 +       * Note: this should have a new scope, CONFIG_SCOPE_WORKTREE.
 +       * But let's not complicate things before it's actually needed.
 +       */
 +      if (repository_format_worktree_config) {
 +              char *path = git_pathdup("config.worktree");
 +              if (!access_or_die(path, R_OK, 0))
 +                      ret += git_config_from_file(fn, path, data);
 +              free(path);
 +      }
 +
        current_parsing_scope = CONFIG_SCOPE_CMDLINE;
        if (git_config_from_parameters(fn, data) < 0)
                die(_("unable to parse command-line config"));
diff --combined environment.c
index 268310b3dc8228152478b2b2f273c06518ee353f,30ecd4e784019bbf2059b2a0b69c43289cbc3d24..346559770773e923766c06593ada84c72815061f
@@@ -33,7 -33,6 +33,7 @@@ int ref_paranoia = -1
  int repository_format_precious_objects;
  char *repository_format_partial_clone;
  const char *core_partial_clone_filter_default;
 +int repository_format_worktree_config;
  const char *git_commit_encoding;
  const char *git_log_output_encoding;
  const char *apply_default_whitespace;
@@@ -72,7 -71,6 +72,6 @@@ int core_apply_sparse_checkout
  int merge_log_config = -1;
  int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
  unsigned long pack_size_limit_cfg;
- enum hide_dotfiles_type hide_dotfiles = HIDE_DOTFILES_DOTGITONLY;
  enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
  
  #ifndef PROTECT_HFS_DEFAULT