threads / discuss / 50571

does "git clean" deliberately ignore "core.excludesFile"?

Subject: does "git clean" deliberately ignore "core.excludesFile"?

## tl;dr

7 messages between Feb 23, 2019 and Feb 24, 2019.

replies: 6people: 3as markdown or json

Robert P. J. Day· Feb 23, 2019, 15:11 UTC · lore
  not sure why i never noticed this before, but the "-x" option for
"git clean" reads:
 -x
     Don’t use the standard ignore rules read from .gitignore
     (per directory) and $GIT_DIR/info/exclude, but do still use
     the ignore rules given with -e options. This allows
     removing all untracked files, including build products.
     This can be used (possibly in conjunction with git reset)
     to create a pristine working directory to test a clean
     build.
  but i see no mention of whether the file specified by
core.excludesFile is taken into account, and perusing the source code
doesn't seem to show that command checking that config option.
  am i misreading something? and if not, is there a reason git clean
does not consult core.excludesFile?
rday
-- 
========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                  http://crashcourse.ca/dokuwiki

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================
Junio C Hamano· Feb 23, 2019, 15:28 UTC · re: Robert P. J. Day · lore

Re: does "git clean" deliberately ignore "core.excludesFile"?

"Robert P. J. Day" <rpjday@crashcourse.ca> writes:
>   am i misreading something? and if not, is there a reason git clean
> does not consult core.excludesFile?

Can you ask "git log" and "git blame" whch of core.excludesFile and "clean -x" features came earlier and by how big a difference?

Most likely this is because the exclude came much much later, and either we forgot to teach the implementation of clean to pay attention to it or (much more likely) the implementaiton is fine but we did not update the doc, which was trying to overly be exhaustive, doing no good (if the original just stopped at saying "... the standard ignore rules read from the usual places", we won't be having this discussion).

Johannes Schindelin· Feb 23, 2019, 18:06 UTC · re: Junio C Hamano · lore

Re: does "git clean" deliberately ignore "core.excludesFile"?

Hi,
On Sat, 23 Feb 2019, Junio C Hamano wrote:
Show 7 quoted lines
> "Robert P. J. Day" <rpjday@crashcourse.ca> writes:
> 
> >   am i misreading something? and if not, is there a reason git clean
> > does not consult core.excludesFile?
> 
> Can you ask "git log" and "git blame" whch of  core.excludesFile and
> "clean -x" features came earlier and by how big a difference?

Or maybe we can have a look why the `core.excludesfile` regression test case in t7300 does not catch this?

https://github.com/git/git/blob/v2.21.0-rc2/t/t7300-clean.sh#L408-L417

Ciao, Dscho

Johannes Schindelin· Feb 23, 2019, 18:19 UTC · re: Johannes Schindelin · lore

Re: does "git clean" deliberately ignore "core.excludesFile"?

Hi,
On Sat, 23 Feb 2019, Johannes Schindelin wrote:
Show 14 quoted lines
> On Sat, 23 Feb 2019, Junio C Hamano wrote:
> 
> > "Robert P. J. Day" <rpjday@crashcourse.ca> writes:
> > 
> > >   am i misreading something? and if not, is there a reason git clean
> > > does not consult core.excludesFile?
> > 
> > Can you ask "git log" and "git blame" whch of  core.excludesFile and
> > "clean -x" features came earlier and by how big a difference?
> 
> Or maybe we can have a look why the `core.excludesfile` regression test
> case in t7300 does not catch this?
> 
> https://github.com/git/git/blob/v2.21.0-rc2/t/t7300-clean.sh#L408-L417

I actually doubt that `git clean` ignores `core.excludesFile`: in https://github.com/git/git/blob/v2.21.0-rc2/config.c#L1297-L1298, `git_default_core_config()` (which is called via the `git_clean_config()` -> `git_color_default_config()` -> `git_default_config()` chain from `cmd_clean()`) does interpret `core.excludesFile`:

	if (!strcmp(var, "core.excludesfile"))
		return git_config_pathname(&excludes_file, var, value);

Then, `cmd_clean()` goes on to parse the options, setting the `ignored` variable upon `-x` and then doing [this](https://github.com/git/git/blob/v2.21.0-rc2/builtin/clean.c#L957-L958):

	if (!ignored)
		setup_standard_excludes(&dir);

This function specifically looks at `excludes_file` in https://github.com/git/git/blob/v2.21.0-rc2/dir.c#L2481-L2483:

	if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
		add_excludes_from_file_1(dir, excludes_file,
					 dir->untracked ? &dir->ss_excludes_file : NULL);

So I am quite puzzled by the claim that `git clean` might not consult `core.excludesFile`.

Robert, care to come up with an example demonstrating where it does not?

Ciao, Johannes

Robert P. J. Day· Feb 23, 2019, 18:32 UTC · re: Johannes Schindelin · lore

Re: does "git clean" deliberately ignore "core.excludesFile"?

On Sat, 23 Feb 2019, Johannes Schindelin wrote:
Show 46 quoted lines
> Hi,
>
> On Sat, 23 Feb 2019, Johannes Schindelin wrote:
>
> > On Sat, 23 Feb 2019, Junio C Hamano wrote:
> >
> > > "Robert P. J. Day" <rpjday@crashcourse.ca> writes:
> > >
> > > >   am i misreading something? and if not, is there a reason git clean
> > > > does not consult core.excludesFile?
> > >
> > > Can you ask "git log" and "git blame" whch of  core.excludesFile and
> > > "clean -x" features came earlier and by how big a difference?
> >
> > Or maybe we can have a look why the `core.excludesfile` regression test
> > case in t7300 does not catch this?
> >
> > https://github.com/git/git/blob/v2.21.0-rc2/t/t7300-clean.sh#L408-L417
>
> I actually doubt that `git clean` ignores `core.excludesFile`: in
> https://github.com/git/git/blob/v2.21.0-rc2/config.c#L1297-L1298,
> `git_default_core_config()` (which is called via the `git_clean_config()`
> -> `git_color_default_config()` -> `git_default_config()` chain from
> `cmd_clean()`) does interpret `core.excludesFile`:
>
> 	if (!strcmp(var, "core.excludesfile"))
> 		return git_config_pathname(&excludes_file, var, value);
>
> Then, `cmd_clean()` goes on to parse the options, setting the `ignored`
> variable upon `-x` and then doing
> [this](https://github.com/git/git/blob/v2.21.0-rc2/builtin/clean.c#L957-L958):
>
> 	if (!ignored)
> 		setup_standard_excludes(&dir);
>
> This function specifically looks at `excludes_file` in
> https://github.com/git/git/blob/v2.21.0-rc2/dir.c#L2481-L2483:
>
> 	if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
> 		add_excludes_from_file_1(dir, excludes_file,
> 					 dir->untracked ? &dir->ss_excludes_file : NULL);
>
> So I am quite puzzled by the claim that `git clean` might not consult
> `core.excludesFile`.
>
> Robert, care to come up with an example demonstrating where it does not?
  sorry i wasn't clear, all i was pointing out was that "man
git-clean" *explicitly* mentioned two locations related to cleaning:
  -x
        Don’t use the standard ignore rules read from .gitignore
        (per directory) and $GIT_DIR/info/exclude, ...

without additionally *explicitly* mentioning core.excludesFile. if the man page simply said something like, "using the standard ignore processing" and left it at that, it would be fine, but to list two of the locations without the third is potentially confusing.

rday
-- 
========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                  http://crashcourse.ca/dokuwiki

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================
Junio C Hamano· Feb 24, 2019, 05:30 UTC · re: Robert P. J. Day · lore

Re: does "git clean" deliberately ignore "core.excludesFile"?

"Robert P. J. Day" <rpjday@crashcourse.ca> writes:
Show 8 quoted lines
> On Sat, 23 Feb 2019, Johannes Schindelin wrote:
>
>> Robert, care to come up with an example demonstrating where it does not?
>
>   sorry i wasn't clear, all i was pointing out was that "man
> git-clean" *explicitly* mentioned two locations related to cleaning:
> ...
> without additionally *explicitly* mentioning core.excludesFile.

OK, so together with the homework Dscho did for you and what I wrote earlier, I think you have enough information to answer the question yourself.

That is, the code does *not* ignore, and the doc was trying to be (overly) exhaustive but because it predates core.excludesFile, after the introduction of that configuration, it no longer is exhaustigve and has become stale.

Which would leave a small, easy and low-hanging fruit, I guess ;-).
Thanks.
Johannes Schindelin· Feb 24, 2019, 14:15 UTC · re: Junio C Hamano · lore

Re: does "git clean" deliberately ignore "core.excludesFile"?

Hi,
On Sat, 23 Feb 2019, Junio C Hamano wrote:
Show 21 quoted lines
> "Robert P. J. Day" <rpjday@crashcourse.ca> writes:
> 
> > On Sat, 23 Feb 2019, Johannes Schindelin wrote:
> >
> >> Robert, care to come up with an example demonstrating where it does not?
> >
> >   sorry i wasn't clear, all i was pointing out was that "man
> > git-clean" *explicitly* mentioned two locations related to cleaning:
> > ...
> > without additionally *explicitly* mentioning core.excludesFile.
> 
> OK, so together with the homework Dscho did for you and what I wrote
> earlier, I think you have enough information to answer the question
> yourself.
> 
> That is, the code does *not* ignore, and the doc was trying to be
> (overly) exhaustive but because it predates core.excludesFile, after
> the introduction of that configuration, it no longer is exhaustigve
> and has become stale.
> 
> Which would leave a small, easy and low-hanging fruit, I guess ;-).
#leftoverbits
;-)

Thanks, Dscho

> Thanks.
> 

← back to recent threads