Merge branch 'jc/renormalize-merge-kill-safer-crlf' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:35:51 +0000 (21:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Sep 2016 04:35:52 +0000 (21:35 -0700)
"git merge" with renormalization did not work well with
merge-recursive, due to "safer crlf" conversion kicking in when it
shouldn't.

* jc/renormalize-merge-kill-safer-crlf:
merge: avoid "safer crlf" during recording of merge results
convert: unify the "auto" handling of CRLF

1  2 
Documentation/config.txt
Documentation/gitattributes.txt
cache.h
merge-recursive.c
read-cache.c
diff --combined Documentation/config.txt
index 6ad3eb66df092928bfad661bfbee37aa4e98dda1,62ade8b7580ebee3e9fed319663ec8e5f1ad481f..f4721a048b4c413767c0f069d07005c8948244dd
@@@ -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
@@@ -140,7 -137,7 +140,7 @@@ boolean:
         false;; Boolean false can be spelled as `no`, `off`,
                `false`, or `0`.
  +
 -When converting value to the canonical form using '--bool' type
 +When converting value to the canonical form using `--bool` type
  specifier; 'git config' will ensure that the output is "true" or
  "false" (spelled in lowercase).
  
@@@ -172,13 -169,6 +172,13 @@@ thing on the same output line (e.g. ope
  list of branch names in `log --decorate` output) is set to be
  painted with `bold` or some other attribute.
  
 +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 -269,6 +279,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,
@@@ -405,13 -389,11 +405,11 @@@ file with mixed line endings would be r
  mechanism.
  
  core.autocrlf::
-       Setting this variable to "true" is almost the same as setting
-       the `text` attribute to "auto" on all files except that text
-       files are not guaranteed to be normalized: files that contain
-       `CRLF` in the repository will not be touched.  Use this
-       setting if you want to have `CRLF` line endings in your
-       working directory even though the repository does not have
-       normalized line endings.  This variable can be set to 'input',
+       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.symlinks::
@@@ -434,7 -416,7 +432,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,10 -460,10 +476,10 @@@ false), while all other repositories ar
  
  core.worktree::
        Set the path to the root of the working tree.
 -      If GIT_COMMON_DIR environment variable is set, core.worktree
 +      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.
 +      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.
@@@ -502,10 -484,10 +500,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 -527,7 +543,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 -591,20 +607,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 -613,8 +628,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
@@@ -764,7 -730,7 +762,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
@@@ -779,7 -745,7 +777,7 @@@ core.abbrev:
  add.ignoreErrors::
  add.ignore-errors (deprecated)::
        Tells 'git add' to continue adding files when some files cannot be
 -      added due to indexing errors. Equivalent to the '--ignore-errors'
 +      added due to indexing errors. Equivalent to the `--ignore-errors`
        option of linkgit:git-add[1].  `add.ignore-errors` is deprecated,
        as it does not follow the usual naming convention for configuration
        variables.
@@@ -800,14 -766,14 +798,14 @@@ 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::
        If true, git-am will call git-mailsplit for patches in mbox format
 -      with parameter '--keep-cr'. In this case git-mailsplit will
 +      with parameter `--keep-cr`. In this case git-mailsplit will
        not remove `\r` from lines ending with `\r\n`. Can be overridden
 -      by giving '--no-keep-cr' from the command line.
 +      by giving `--no-keep-cr` from the command line.
        See linkgit:git-am[1], linkgit:git-mailsplit[1].
  
  am.threeWay::
  
  apply.ignoreWhitespace::
        When set to 'change', tells 'git apply' to ignore changes in
 -      whitespace, in the same way as the '--ignore-space-change'
 +      whitespace, in the same way as the `--ignore-space-change`
        option.
        When set to one of: no, none, never, false tells 'git apply' to
        respect all whitespace differences.
  
  apply.whitespace::
        Tells 'git apply' how to handle whitespaces, in the same way
 -      as the '--whitespace' option. See linkgit:git-apply[1].
 +      as the `--whitespace` option. See linkgit:git-apply[1].
  
  branch.autoSetupMerge::
        Tells 'git branch' and 'git checkout' to set up new branches
@@@ -930,7 -896,7 +928,7 @@@ browser.<tool>.cmd:
  
  browser.<tool>.path::
        Override the path for the given tool that may be used to
 -      browse HTML help (see '-w' option in linkgit:git-help[1]) or a
 +      browse HTML help (see `-w` option in linkgit:git-help[1]) or a
        working repository in gitweb (see linkgit:git-instaweb[1]).
  
  clean.requireForce::
@@@ -1138,19 -1104,15 +1136,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
@@@ -1294,10 -1256,6 +1292,10 @@@ 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
@@@ -1374,7 -1332,7 +1372,7 @@@ gc.worktreePruneExpire:
        '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"
 +      period and prune `$GIT_DIR/worktrees` immediately, or "never"
        may be used to suppress pruning.
  
  gc.reflogExpire::
@@@ -1420,24 -1378,24 +1418,24 @@@ gitcvs.logFile:
  
  gitcvs.usecrlfattr::
        If true, the server will look up the end-of-line conversion
 -      attributes for files to determine the '-k' modes to use. If
 +      attributes for files to determine the `-k` modes to use. If
        the attributes force Git to treat a file as text,
 -      the '-k' mode will be left blank so CVS clients will
 +      the `-k` mode will be left blank so CVS clients will
        treat it as text. If they suppress text conversion, the file
        will be set with '-kb' mode, which suppresses any newline munging
        the client might otherwise do. If the attributes do not allow
 -      the file type to be determined, then 'gitcvs.allBinary' is
 +      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
@@@ -1456,7 -1414,7 +1454,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).
@@@ -1468,8 -1426,8 +1466,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.
@@@ -1492,17 -1450,17 +1490,17 @@@ gitweb.snapshot:
        See linkgit:gitweb.conf[5] for description.
  
  grep.lineNumber::
 -      If set to true, enable '-n' option by default.
 +      If set to true, enable `-n` option by default.
  
  grep.patternType::
        Set the default matching behavior. Using a value of 'basic', 'extended',
 -      'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
 -      '--fixed-strings', or '--perl-regexp' option accordingly, while the
 +      'fixed', or 'perl' will enable the `--basic-regexp`, `--extended-regexp`,
 +      `--fixed-strings`, or `--perl-regexp` option accordingly, while the
        value 'default' will return to the default matching behavior.
  
  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
 +      If set to true, enable `--extended-regexp` option by default. This
 +      option is ignored when the `grep.patternType` option is set to a value
        other than 'default'.
  
  grep.threads::
@@@ -1514,13 -1472,13 +1512,13 @@@ grep.fallbackToNoIndex:
        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.
  
@@@ -1533,7 -1491,7 +1531,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::
@@@ -1587,7 -1545,7 +1585,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).
  
@@@ -1608,7 -1566,7 +1606,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::
@@@ -1672,7 -1630,7 +1670,7 @@@ http.proxyAuthMethod:
        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
 +      Both can be overridden by the `GIT_HTTP_PROXY_AUTHMETHOD` environment
        variable.  Possible values are:
  +
  --
@@@ -1694,19 -1652,12 +1692,19 @@@ http.emptyAuth:
        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::
@@@ -1731,9 -1682,9 +1729,9 @@@ http.sslVersion:
        - tlsv1.2
  
  +
 -Can be overridden by the 'GIT_SSL_VERSION' environment variable.
 +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
 +explicit http.sslversion option, set `GIT_SSL_VERSION` to the
  empty string.
  
  http.sslCipherList::
    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.
 +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
 +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
@@@ -1798,7 -1749,7 +1796,7 @@@ http.sslTry:
  
  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
@@@ -1817,13 -1768,13 +1815,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.
@@@ -1933,14 -1884,6 +1931,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
@@@ -1956,10 -1899,7 +1954,10 @@@ log.decorate:
        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
@@@ -2205,11 -2145,8 +2203,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.
  
@@@ -2341,16 -2278,16 +2339,16 @@@ new default)
  --
  
  push.followTags::
 -      If set to true enable '--follow-tags' option by default.  You
 +      If set to true enable `--follow-tags` option by default.  You
        may override this configuration at time of push by specifying
 -      '--no-follow-tags'.
 +      `--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
 +      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
 +      `--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.
  
@@@ -2373,7 -2310,7 +2371,7 @@@ rebase.stat:
        rebase. False by default.
  
  rebase.autoSquash::
 -      If set to true enable '--autosquash' option by default.
 +      If set to true enable `--autosquash` option by default.
  
  rebase.autoStash::
        When set to true, automatically create a temporary stash
@@@ -2609,9 -2546,8 +2607,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
@@@ -2630,7 -2566,7 +2628,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
@@@ -2647,7 -2583,7 +2645,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::
@@@ -2677,7 -2613,7 +2675,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].
@@@ -2791,17 -2727,6 +2789,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
@@@ -2909,17 -2834,17 +2907,17 @@@ 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
 +      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
index 145dd10967cd3654fb331b8c5d6a1e3e622ef6ef,d7a124b73518a5fde2a6719697e38aad60f45179..6d20400e758a9133620f5647fee74eb16618d3b1
@@@ -115,6 -115,7 +115,7 @@@ text file is normalized, its line endin
  repository.  To control what line ending style is used in the working
  directory, use the `eol` attribute for a single file and the
  `core.eol` configuration variable for all text files.
+ Note that `core.autocrlf` overrides `core.eol`
  
  Set::
  
@@@ -130,8 -131,9 +131,9 @@@ Unset:
  Set to string value "auto"::
  
        When `text` is set to "auto", the path is marked for automatic
-       end-of-line normalization.  If Git decides that the content is
-       text, its line endings are normalized to LF on checkin.
+       end-of-line conversion.  If Git decides that the content is
+       text, its line endings are converted to LF on checkin.
+       When the file has been commited with CRLF, no conversion is done.
  
  Unspecified::
  
@@@ -146,7 -148,7 +148,7 @@@ unspecified
  ^^^^^
  
  This attribute sets a specific line-ending style to be used in the
- working directory.  It enables end-of-line normalization without any
+ working directory.  It enables end-of-line conversion without any
  content checks, effectively setting the `text` attribute.
  
  Set to string value "crlf"::
@@@ -186,9 -188,10 +188,10 @@@ the working directory, and prevent .jp
  regardless of their content.
  
  ------------------------
+ *               text=auto
  *.txt         text
- *.vcproj      eol=crlf
- *.sh          eol=lf
+ *.vcproj      text eol=crlf
+ *.sh          text eol=lf
  *.jpg         -text
  ------------------------
  
@@@ -198,7 -201,7 +201,7 @@@ normalization in Git
  
  If you simply want to have CRLF line endings in your working directory
  regardless of the repository you are working with, you can set the
- config variable "core.autocrlf" without changing any attributes.
+ config variable "core.autocrlf" without using any attributes.
  
  ------------------------
  [core]
@@@ -374,11 -377,6 +377,11 @@@ substitution.  For example
        smudge = git-p4-filter --smudge %f
  ------------------------
  
 +Note that "%f" is the name of the path that is being worked on. Depending
 +on the version that is being filtered, the corresponding file on disk may
 +not exist, or may have different contents. So, smudge and clean commands
 +should not try to access the file on disk, but only act as filters on the
 +content provided to them on standard input.
  
  Interaction between checkin/checkout attributes
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --combined cache.h
index c141b3ca0d9c3066632277d933477e0e30881c5f,b33cb54b94bbfa4ad42b7bc243a7f6dde7fc1f96..c0d6cdb60c2f551c874d0a4100bd71405e67cb27
+++ b/cache.h
@@@ -367,8 -367,8 +367,8 @@@ extern void free_name_hash(struct index
  #define rename_cache_entry_at(pos, new_name) rename_index_entry_at(&the_index, (pos), (new_name))
  #define remove_cache_entry_at(pos) remove_index_entry_at(&the_index, (pos))
  #define remove_file_from_cache(path) remove_file_from_index(&the_index, (path))
 -#define add_to_cache(path, st, flags) add_to_index(&the_index, (path), (st), (flags))
 -#define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags))
 +#define add_to_cache(path, st, flags) add_to_index(&the_index, (path), (st), (flags), 0)
 +#define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags), 0)
  #define refresh_cache(flags) refresh_index(&the_index, (flags), NULL, NULL, NULL)
  #define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options))
  #define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options))
@@@ -581,8 -581,8 +581,8 @@@ extern int remove_file_from_index(struc
  #define ADD_CACHE_IGNORE_ERRORS       4
  #define ADD_CACHE_IGNORE_REMOVAL 8
  #define ADD_CACHE_INTENT 16
 -extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags);
 -extern int add_file_to_index(struct index_state *, const char *path, int flags);
 +extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags, int force_mode);
 +extern int add_file_to_index(struct index_state *, const char *path, int flags, int force_mode);
  extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, unsigned int refresh_options);
  extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b);
  extern void set_object_name_for_intent_to_add_entry(struct cache_entry *ce);
@@@ -632,6 -632,7 +632,7 @@@ extern void fill_stat_cache_info(struc
  #define REFRESH_IGNORE_SUBMODULES     0x0010  /* ignore submodules */
  #define REFRESH_IN_PORCELAIN  0x0020  /* user friendly output, not "needs update" */
  extern int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg);
+ extern struct cache_entry *refresh_cache_entry(struct cache_entry *, unsigned int);
  
  extern void update_index_if_able(struct index_state *, struct lock_file *);
  
@@@ -651,10 -652,10 +652,10 @@@ extern int prefer_symlink_refs
  extern int log_all_ref_updates;
  extern int warn_ambiguous_refs;
  extern int warn_on_object_refname_ambiguity;
 -extern int shared_repository;
  extern const char *apply_default_whitespace;
  extern const char *apply_default_ignorewhitespace;
  extern const char *git_attributes_file;
 +extern const char *git_hooks_path;
  extern int zlib_compression_level;
  extern int core_compression_level;
  extern int core_compression_seen;
@@@ -664,9 -665,6 +665,9 @@@ extern size_t delta_base_cache_limit
  extern unsigned long big_file_threshold;
  extern unsigned long pack_size_limit_cfg;
  
 +void set_shared_repository(int value);
 +int get_shared_repository(void);
 +
  /*
   * Do replace refs need to be checked this run?  This variable is
   * initialized to true unless --no-replace-object is used or
@@@ -701,14 -699,6 +702,14 @@@ extern int ref_paranoia
  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 branch_track {
        BRANCH_TRACK_UNSPECIFIED = -1,
        BRANCH_TRACK_NEVER = 0,
@@@ -756,39 -746,9 +757,39 @@@ extern int grafts_replace_parents
   */
  #define GIT_REPO_VERSION 0
  #define GIT_REPO_VERSION_READ 1
 -extern int repository_format_version;
  extern int repository_format_precious_objects;
 -extern int check_repository_format(void);
 +
 +struct repository_format {
 +      int version;
 +      int precious_objects;
 +      int is_bare;
 +      char *work_tree;
 +      struct string_list unknown_extensions;
 +};
 +
 +/*
 + * Read the repository format characteristics from the config file "path" into
 + * "format" struct. Returns the numeric version. On error, -1 is returned,
 + * format->version is set to -1, and all other fields in the struct are
 + * undefined.
 + */
 +int read_repository_format(struct repository_format *format, const char *path);
 +
 +/*
 + * Verify that the repository described by repository_format is something we
 + * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
 + * any errors encountered.
 + */
 +int verify_repository_format(const struct repository_format *format,
 +                           struct strbuf *err);
 +
 +/*
 + * Check the repository format version in the path found in get_git_dir(),
 + * and die if it is a version we don't understand. Generally one would
 + * set_git_dir() before calling this, and use it only for "are we in a valid
 + * repo?".
 + */
 +extern void check_repository_format(void);
  
  #define MTIME_CHANGED 0x0001
  #define CTIME_CHANGED 0x0002
   */
  extern const char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
  extern const char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
 +extern const char *git_common_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
  
  extern char *mksnpath(char *buf, size_t n, const char *fmt, ...)
        __attribute__((format (printf, 3, 4)));
  extern void strbuf_git_path(struct strbuf *sb, const char *fmt, ...)
        __attribute__((format (printf, 2, 3)));
 +extern void strbuf_git_common_path(struct strbuf *sb, const char *fmt, ...)
 +      __attribute__((format (printf, 2, 3)));
  extern char *git_path_buf(struct strbuf *buf, const char *fmt, ...)
        __attribute__((format (printf, 2, 3)));
  extern void strbuf_git_path_submodule(struct strbuf *sb, const char *path,
@@@ -970,6 -927,8 +971,6 @@@ static inline int is_empty_blob_sha1(co
  
  int git_mkstemp(char *path, size_t n, const char *template);
  
 -int git_mkstemps(char *path, size_t n, const char *template, int suffix_len);
 -
  /* set default permissions by passing mode arguments to open(2) */
  int git_mkstemps_mode(char *pattern, int suffix_len, int mode);
  int git_mkstemp_mode(char *pattern, int mode);
@@@ -1166,8 -1125,6 +1167,8 @@@ extern int get_sha1_blob(const char *st
  extern void maybe_die_on_misspelt_object_name(const char *name, const char *prefix);
  extern int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *orc);
  
 +extern int get_oid(const char *str, struct object_id *oid);
 +
  typedef int each_abbrev_fn(const unsigned char *sha1, void *);
  extern int for_each_abbrev(const char *prefix, each_abbrev_fn, void *);
  
@@@ -1262,7 -1219,6 +1263,7 @@@ extern const char *ident_default_email(
  extern const char *git_editor(void);
  extern const char *git_pager(int stdout_is_tty);
  extern int git_ident_config(const char *, const char *, void *);
 +extern void reset_ident_date(void);
  
  struct ident_split {
        const char *name_begin;
@@@ -1509,7 -1465,7 +1510,7 @@@ struct object_info 
        /* Request */
        enum object_type *typep;
        unsigned long *sizep;
 -      unsigned long *disk_sizep;
 +      off_t *disk_sizep;
        unsigned char *delta_base_sha1;
        struct strbuf *typename;
  
@@@ -1571,6 -1527,7 +1572,6 @@@ extern void git_config(config_fn_t fn, 
  extern int git_config_with_options(config_fn_t fn, void *,
                                   struct git_config_source *config_source,
                                   int respect_includes);
 -extern int git_config_early(config_fn_t fn, void *, const char *repo_config);
  extern int git_parse_ulong(const char *, unsigned long *);
  extern int git_parse_maybe_bool(const char *);
  extern int git_config_int(const char *, const char *);
@@@ -1594,6 -1551,7 +1595,6 @@@ extern void git_config_set_multivar_in_
  extern int git_config_rename_section(const char *, const char *);
  extern int git_config_rename_section_in_file(const char *, const char *, const char *);
  extern const char *git_etc_gitconfig(void);
 -extern int check_repository_format_version(const char *var, const char *value, void *cb);
  extern int git_env_bool(const char *, int);
  extern unsigned long git_env_ulong(const char *, unsigned long);
  extern int git_config_system(void);
@@@ -1722,6 -1680,7 +1723,6 @@@ extern int copy_file(const char *dst, c
  extern int copy_file_with_time(const char *dst, const char *src, int mode);
  
  extern void write_or_die(int fd, const void *buf, size_t count);
 -extern int write_or_whine(int fd, const void *buf, size_t count, const char *msg);
  extern int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg);
  extern void fsync_or_die(int fd, const char *);
  
@@@ -1772,14 -1731,14 +1773,14 @@@ void packet_trace_identity(const char *
   * return 0 if success, 1 - if addition of a file failed and
   * ADD_FILES_IGNORE_ERRORS was specified in flags
   */
 -int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int flags);
 +int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int flags, int force_mode);
  
  /* diff.c */
  extern int diff_auto_refresh_index;
  
  /* match-trees.c */
 -void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int);
 -void shift_tree_by(const unsigned char *, const unsigned char *, unsigned char *, const char *);
 +void shift_tree(const struct object_id *, const struct object_id *, struct object_id *, int);
 +void shift_tree_by(const struct object_id *, const struct object_id *, struct object_id *, const char *);
  
  /*
   * whitespace rules.
@@@ -1813,7 -1772,7 +1814,7 @@@ int split_cmdline(char *cmdline, const 
  /* Takes a negative value returned by split_cmdline */
  const char *split_cmdline_strerror(int cmdline_errno);
  
 -/* git.c */
 +/* setup.c */
  struct startup_info {
        int have_repository;
        const char *prefix;
diff --combined merge-recursive.c
index 65cb5d6c1f59d635e44a0fea648e39a976c0eaf0,de37e5153c791cb51fc77974edc30d0c44daf4d7..9748bafd3073b431c9c8574b721dab41233ecb09
@@@ -29,9 -29,9 +29,9 @@@ static struct tree *shift_tree_object(s
        struct object_id shifted;
  
        if (!*subtree_shift) {
 -              shift_tree(one->object.oid.hash, two->object.oid.hash, shifted.hash, 0);
 +              shift_tree(&one->object.oid, &two->object.oid, &shifted, 0);
        } else {
 -              shift_tree_by(one->object.oid.hash, two->object.oid.hash, shifted.hash,
 +              shift_tree_by(&one->object.oid, &two->object.oid, &shifted,
                              subtree_shift);
        }
        if (!oidcmp(&two->object.oid, &shifted))
@@@ -202,12 -202,21 +202,21 @@@ static int add_cacheinfo(unsigned int m
                const char *path, int stage, int refresh, int options)
  {
        struct cache_entry *ce;
-       ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage,
-                             (refresh ? (CE_MATCH_REFRESH |
-                                         CE_MATCH_IGNORE_MISSING) : 0 ));
+       int ret;
+       ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, 0);
        if (!ce)
                return error(_("addinfo_cache failed for path '%s'"), path);
-       return add_cache_entry(ce, options);
+       ret = add_cache_entry(ce, options);
+       if (refresh) {
+               struct cache_entry *nce;
+               nce = refresh_cache_entry(ce, CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING);
+               if (nce != ce)
+                       ret = add_cache_entry(nce, options);
+       }
+       return ret;
  }
  
  static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)
@@@ -622,7 -631,7 +631,7 @@@ static char *unique_path(struct merge_o
        base_len = newpath.len;
        while (string_list_has_string(&o->current_file_set, newpath.buf) ||
               string_list_has_string(&o->current_directory_set, newpath.buf) ||
 -             file_exists(newpath.buf)) {
 +             (!o->call_depth && file_exists(newpath.buf))) {
                strbuf_setlen(&newpath, base_len);
                strbuf_addf(&newpath, "_%d", suffix++);
        }
@@@ -1234,8 -1243,8 +1243,8 @@@ static void conflict_rename_rename_2to1
               a->path, c1->path, ci->branch1,
               b->path, c2->path, ci->branch2);
  
 -      remove_file(o, 1, a->path, would_lose_untracked(a->path));
 -      remove_file(o, 1, b->path, would_lose_untracked(b->path));
 +      remove_file(o, 1, a->path, o->call_depth || would_lose_untracked(a->path));
 +      remove_file(o, 1, b->path, o->call_depth || would_lose_untracked(b->path));
  
        mfi_c1 = merge_file_special_markers(o, a, c1, &ci->ren1_other,
                                            o->branch1, c1->path,
@@@ -1773,6 -1782,8 +1782,6 @@@ static int process_entry(struct merge_o
                        output(o, 1, _("CONFLICT (%s): There is a directory with name %s in %s. "
                               "Adding %s as %s"),
                               conf, path, other_branch, path, new_path);
 -                      if (o->call_depth)
 -                              remove_file_from_cache(path);
                        update_file(o, 0, sha, mode, new_path);
                        if (o->call_depth)
                                remove_file_from_cache(path);
diff --combined read-cache.c
index db2776605529bd43f77ca48e84b9e2ded95b493e,6af409a10c206831253f5956a130d4884aa372ea..491e52d120a6c02e6a4e7de1e2f5934db4de9f22
@@@ -19,9 -19,6 +19,6 @@@
  #include "split-index.h"
  #include "utf8.h"
  
- static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
-                                              unsigned int options);
  /* Mask for the name length in ce_flags in the on-disk index */
  
  #define CE_NAMEMASK  (0x0fff)
@@@ -630,7 -627,7 +627,7 @@@ void set_object_name_for_intent_to_add_
        hashcpy(ce->sha1, sha1);
  }
  
 -int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags)
 +int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags, int force_mode)
  {
        int size, namelen, was_same;
        mode_t st_mode = st->st_mode;
        else
                ce->ce_flags |= CE_INTENT_TO_ADD;
  
 -      if (trust_executable_bit && has_symlinks)
 +      if (S_ISREG(st_mode) && force_mode)
 +              ce->ce_mode = create_ce_mode(force_mode);
 +      else if (trust_executable_bit && has_symlinks)
                ce->ce_mode = create_ce_mode(st_mode);
        else {
                /* If there is an existing entry, pick the mode bits and type
        return 0;
  }
  
 -int add_file_to_index(struct index_state *istate, const char *path, int flags)
 +int add_file_to_index(struct index_state *istate, const char *path,
 +      int flags, int force_mode)
  {
        struct stat st;
        if (lstat(path, &st))
                die_errno("unable to stat '%s'", path);
 -      return add_to_index(istate, path, &st, flags);
 +      return add_to_index(istate, path, &st, flags, force_mode);
  }
  
  struct cache_entry *make_cache_entry(unsigned int mode,
@@@ -1257,7 -1251,7 +1254,7 @@@ int refresh_index(struct index_state *i
        return has_errors;
  }
  
- static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
+ struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
                                               unsigned int options)
  {
        return refresh_cache_ent(&the_index, ce, options, NULL, NULL);