Am 12.03.23 um 22:25 schrieb Junio C Hamano: > René Scharfe <l.s.r@xxxxxx> writes: > >>> * fail loudly when "git -C sub archive <pathspec>" makes us use >>> "../" prefix because <pathspec> goes above the $PWD for backward >>> compatibility and sanity. >> >> Without the patch this fails, but are there really people that depend on >> it failing? We could certainly forbid it, but do we need to? > > I dunno. It was an obvious way to avoid having to think about > interaction with --strip-components and "../", but there certainly > may be other solutions for it people can think of. > > Also on the receiving end, don't people get upset to see that their > "tar xf" escapes the directory they just created only to extract the > tarball? bsdtar creates entries starting with "../" without complaint, but refuses to extract them as-is -- you need to e.g. use --strip-components to get rid of those dots. Awkward. Not allowing those entries to be created is more consistent, especially since we're already restrictive like that. OK. >>> * with --some-option, make "git -C sub archive --some-option :/" >>> act exactly like "git archive :/". >> >> Perhaps I'm reading this too literally, but it would be easier to remove >> "-C sub" from that command. Or to add "-C $(git rev-parse --show-cdup)". >> We could add a shortcut for that (see patch below). > > More like > > $ cd some/deep/place > ... work work work > $ git archive --full-tree :/other :/hier :/archy > > is what I had in mind. Without --full-tree, due to the first bullet > point above, paths in our archive are relative to some/deep/place. I don't see the difference. Here ":/other" is the youngest commit with "other" in its message, ":/hier" and ":/archy" are pathspecs selecting subdirectories. If we stay in a different subdirectory then this is simply currently forbidden and we'd keep it like that: $ cd xdiff $ git archive :/needle :/t/t0019 :/t/t4020 | tar tf - fatal: pathspec ':/t/t0019' did not match any files We'd just improve the message a bit. Going up still helps: $ git -C "$(git rev-parse --show-cdup)" archive :/needle :/t/t0019 :/t/t4020 | tar tf - t/ t/t0019/ t/t0019/parse_json.perl t/t4020/ t/t4020/diff.NUL # We could shorten that. $ ../git --cdup archive :/needle :/t/t0019 :/t/t4020 | tar tf - t/ t/t0019/ t/t0019/parse_json.perl t/t4020/ t/t4020/diff.NUL Or am I missing something here? René