Subject: Re: [PATCH RFC] init-db: introduce new -c/--config option

From: Jeff King <[email-masked]>
Date: Wed, 25 Mar 2015 14:39:59 -0400

On Thu, Mar 26, 2015 at 12:30:13AM +0600, Alexander Kuleshov wrote:

> I'm not sure about two things:
> 
> 1. Is there any way to do this with the current git? At least i didn't
> find how to do it, so decided to write this patch.
> If there is already ability to do the same without this patch, please
> let me know.

The reason we originally added "-c" to clone and not init is that clone
performs several other follow-on actions after the repository is
initialized. For example, you might want to run:

  git clone -c core.autocrlf=true ...

to have that option in place before clone checks out files to the
working tree. There is no direct way to have "git init" set the config
for you, but there is no harm in doing:

  git init
  git config core.autocrlf=true

because init returns control to you immediatel.

> 2. Now current patch overwrite the value of the configuration option
> from config,
> if there is given option with the same key. For example, when we do git init,
> .git/config contains core.filemode = true. If we will pass
> core.filemode = false with this patch to git init,
> there will be core.filemode = false in the .git/config. So, I'm not
> sure about it.
> I looked on git clone -c/--config, it just adds the same option to the
> .git/config, but it looks strange to me....

Most options, when there are multiple present, will use the last-seen
value (core.filemode is one of these, so having it there twice means the
second one takes precedence). Some options form a list (e.g., fetch
refspecs). So if you run:

  git clone -c remote.origin.fetch=refs/notes/*:refs/notes/* ...

you add a new refspec, but do not replace the default one to fetch the
actual branches. The knowledge of which config keys are which is known
only to the config callbacks, so it is generally safer for generic
config-munging code to add a potentially overriding key (the downside is
that you cannot use "-c" to "clear" a list-like key, but the inability
to do that is a failing of the config code in general).

-Peff