Re: [PATCH] t7300-clean: demonstrate deleting nested repo with an ignored file breakage
- From
SZEDER Gábor <szeder.dev@gmail.com>
- Date
- Aug 26, 2019, 07:48 UTC
- Message-ID
- <20190826074841.GP20404@szeder.dev>
- In-Reply-To
- <20f71f02-4895-fe57-8704-a44494b971b9@iee.email>
On Sun, Aug 25, 2019 at 11:32:28PM +0100, Philip Oakley wrote:
Show 7 quoted lines
> Hi Szeder, > > On 25/08/2019 19:59, SZEDER Gábor wrote: > >'git clean -fd' must not delete an untracked directory if it belongs > s/untracked// > I don't believe it should matter either way for a sub-module > (sub-directory).
I just paraphrased the documentation of the '-d' option for a bit of context.
Remove untracked directories in addition to untracked files. If an untracked directory is managed by a different Git repository, it is not removed by default. Use -f option twice if you really want to remove such a directory.
Show 10 quoted lines
> >to a different Git repository or worktree. > msybr split the assertion from the fault explanation. > > Unfortunately, if a > >'.gitignore' rule in the outer repository happens to match a file in a > >nested repository or worktree, then something goes awry and 'git clean > >-fd' does delete the content of the nested repository's worktree > good so far. > >except that ignored file, potentially leading to data loss. > this appears at cross purposes as the description has changed from > 'ignored/untracked directory' to 'ignored file'.
The description does not mention any ignored directories.
> I'm not sure which part the > data loss is meant to refer to.
Well, there is only one part where the description talks about stuff getting deleted... and that's what it refers to :)
Show 7 quoted lines
> >Add a test to 't7300-clean.sh' to demonstrate this breakage. > > > >This issue is a regression introduced in 6b1db43109 (clean: teach > >clean -d to preserve ignored paths, 2017-05-23). > > > >Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> > >---
On a related note, 'git clean -fdx' does leave the nested repository or worktree intact in the same situation, as it should.
Show 36 quoted lines
> > t/t7300-clean.sh | 22 ++++++++++++++++++++++ > > 1 file changed, 22 insertions(+) > > > >diff --git a/t/t7300-clean.sh b/t/t7300-clean.sh > >index a2c45d1902..d01fd120ab 100755 > >--- a/t/t7300-clean.sh > >+++ b/t/t7300-clean.sh > >@@ -669,6 +669,28 @@ test_expect_success 'git clean -d skips untracked dirs containing ignored files' > > test_path_is_missing foo/b/bb > > ' > >+test_expect_failure 'git clean -d skips nested repo containing ignored files' ' > >+ test_when_finished "rm -rf nested-repo-with-ignored-file" && > >+ > >+ git init nested-repo-with-ignored-file && > >+ ( > >+ cd nested-repo-with-ignored-file && > >+ >file && > >+ git add file && > >+ git commit -m Initial && > >+ > >+ # This file is ignored by a .gitignore rule in the outer repo > >+ # added in the previous test. > >+ >ignoreme > >+ ) && > >+ > >+ git clean -fd && > >+ > >+ test_path_is_file nested-repo-with-ignored-file/.git/index && > >+ test_path_is_file nested-repo-with-ignored-file/ignoreme && > >+ test_path_is_file nested-repo-with-ignored-file/file > >+' > >+ > > test_expect_success MINGW 'handle clean & core.longpaths = false nicely' ' > > test_config core.longpaths false && > > a50=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && >