git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Git clean enumerates ignored directories (since 2.27)

From
Jeff King <peff@peff.net>
Date
May 7, 2021, 03:25 UTC
Message-ID
<YJSzQm2p5bCAd8Fv@coredump.intra.peff.net>
In-Reply-To
<CABPp-BH3tbTyA9gj=2vb878d1MQVCTqT7=kS5U+sB6CoDX0Jww@mail.gmail.com>
On Thu, May 06, 2021 at 07:31:40PM -0700, Elijah Newren wrote:
Show 17 quoted lines
> On alpine linux-musl, I get an "error: Tests passed but test cleanup
> failed; aborting", which makes it report as a failed build.  I'm not
> sure how to fix it and am asking for ideas.
> 
> Apparently the deeply nested directory hierarchy cannot be removed on
> that platform with a simple "rm -rf $dirname".  It throws a "rm: can't
> stat '/__w/git/git/t/trash
> directory.t7300-clean/avoid-traversing-deep-hierarchy/directory400/directory399/directory398/.....(you
> get the idea)....': Filename too long" error message.[1]
> 
> Adding a "test_when_finished find directory400 -delete" also gives a
> "Filename too long" message followed by a lot of "Directory not empty"
> messages.[2]
> 
> Anyone have any bright ideas about how to tweak this test?  See [3]
> for the current incarnation of the code, which was basically taken
> from Brian's sample testcase.

My guess is that that version of "rm" is trying to feed the entire pathname directly to unlink() and rmdir(), and it exceeds PATH_MAX.

Even with GNU tools, for instance, I get:
  $ rmdir $(find avoid-traversing-deep-hierarchy -type d | tail -1)
  rmdir: failed to remove 'avoid-traversing-deep-hierarchy/directory400/
    [...and so on...]/directory1': File name too long

because it feeds the whole to a single rmdir() call. Whereas stracing GNU "rm -rf", it uses unlinkat() and openat() to delete each level individually (probably to avoid this exact problem).

Is the actual path length important, or just the depth? If the latter, then calling it "d400/d399/.../d2/d1" would likely help, as that's less than 2000 bytes.

-Peff
Previous: Elijah NewrenNext: Jeff King
Message 8 of 10 in “Git clean enumerates ignored directories (since 2.27)”
  1. Jason GoreApr 14, 2021
  2. brian m. carlsonApr 14, 2021
  3. Jeff KingApr 15, 2021
  4. Jason GoreApr 22, 2021
  5. Elijah NewrenApr 22, 2021
  6. Elijah NewrenMay 7, 2021
  7. Elijah NewrenMay 7, 2021
  8. Jeff KingMay 7, 2021
  9. Jeff KingMay 7, 2021
  10. Elijah NewrenMay 7, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.