From: Paul Berry <stereotype441@gmail.com>
To: Michael Schubert <mschub@elegosoft.com>
Cc: git <git@vger.kernel.org>
Subject: Re: [BUG] git clean -X skips a directory containing only ignored files
Date: Tue, 31 Jan 2012 09:39:02 -0800 [thread overview]
Message-ID: <CA+yLL65OWXMGnftKzpLLnESd_-Ogyj_UXg2m7h0FSyriuh91pw@mail.gmail.com> (raw)
In-Reply-To: <4F27FF01.6040706@elegosoft.com>
On 31 January 2012 06:47, Michael Schubert <mschub@elegosoft.com> wrote:
> On 01/31/2012 12:36 AM, Paul Berry wrote:
>> I am trying to use "git clean -X" to remove object files (which
>> are gitignored) from my source tree, but it appears to miss
>> object files that are in a subdirectory without any git-tracked
>> files:
>>
>> $ git init test
>> Initialized empty Git repository in /home/pberry/tmp/test/.git/
>> $ cd test
>> $ mkdir foo
>> $ touch foo/bar.o
>> $ echo '*.o' > .gitignore
>> $ git add .gitignore
>> $ git commit -mgitignore
>> [master (root-commit) 6b5ffcb] gitignore
>> 1 files changed, 1 insertions(+), 0 deletions(-)
>> create mode 100644 .gitignore
>> $ git status
>> # On branch master
>> nothing to commit (working directory clean)
>> $ git clean -d -X -f
>> $ ls foo
>> bar.o
>>
>> It seems to me that bar.o should have been removed, because
>> according to the git-clean docs, -X means "Remove only files
>> ignored by git", and bar.o is definitely being ignored by git.
>>
>>
>> It looks like a very similar bug was reported back in 2010, but
>> not fixed:
>> http://git.661346.n2.nabble.com/BUG-git-clean-X-behaviour-when-gitignore-has-sub-directory-entries-td5575307.html.
>> I've confirmed that the workaround mentioned by Jonathan Nieder
>> in that thread fixes my problem too (removing "dir.flags |=
>> DIR_SHOW_OTHER_DIRECTORIES;" from builtin/clean.c). However I'm
>> guessing from Jonathan's comments that it would be better to fix
>> this bug elsewhere (somewhere in dir.c perhaps).
>
> Removing DIR_SHOW_OTHER_DIRECTORIES just happens to not trigger
> this particular "bug" but breaks pretty much everything else.
Yeah, I had a feeling that might be the case.
>
> As a workaround, you could explicitly add the directory to your
> gitignore file.
>
> Here's a test:
>
> -- >8 --
>
> Subject: [PATCH] t7300-clean: show known breakage with "git clean -d -X"
>
> "git clean -d -X" fails for directories containing only untracked files.
> Example:
>
> $ ls -R .
> .:
> foo
> ./foo:
> bar.o
> $ cat .gitignore
> *.o
> $ git clean -d -X -f
> $ ! test -d foo || echo fail
>
> Reported-by: Paul Berry <stereotype441@gmail.com>
> Signed-off-by: Michael Schubert <mschub@elegosoft.com>
> ---
> t/t7300-clean.sh | 7 +++++++
> 1 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh
> index 800b536..0b6d545 100755
> --- a/t/t7300-clean.sh
> +++ b/t/t7300-clean.sh
> @@ -332,6 +332,13 @@ test_expect_success 'git clean -d -X' '
>
> '
>
> +test_expect_failure 'git clean -d -X' '
> + mkdir -p a/b &&
> + touch a/b/c.o &&
> + git clean -d -X &&
> + ! test -d a
Thanks for the test case. BTW, you might consider changing this last
line to "! test -f a/b/c.o". Reasoning: it is clear from the docs
that c.o should be removed by "git clean -X" (since c.o is an ignored
file). It is less clear whether the directories a and a/b should be
removed by "git clean -X", since those directories are not in
themselves ignored, only their contents.
> +'
> +
> test_expect_success 'clean.requireForce defaults to true' '
>
> git config --unset clean.requireForce &&
> --
> 1.7.9.174.g356eff6
next prev parent reply other threads:[~2012-01-31 17:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-30 23:36 [BUG] git clean -X skips a directory containing only ignored files Paul Berry
2012-01-31 14:47 ` Michael Schubert
2012-01-31 17:39 ` Paul Berry [this message]
2012-01-31 16:20 ` Andrew Wong
2012-02-01 12:18 ` Michael Schubert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CA+yLL65OWXMGnftKzpLLnESd_-Ogyj_UXg2m7h0FSyriuh91pw@mail.gmail.com \
--to=stereotype441@gmail.com \
--cc=git@vger.kernel.org \
--cc=mschub@elegosoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).