On Wednesday 03 September 2014 13:21:06 Duy Nguyen wrote: > On Wed, Sep 3, 2014 at 5:17 AM, Peter Wu <peter@xxxxxxxxxxxxx> wrote: > > Hi, > > > > The `git archive` seems to accept a pathspec judging from the error message (git > > version 2.1.0): > > > > git archive HEAD -- :x > > fatal: pathspec 'x' did not match any files > > > > When I try to use deeper glob specs however, it throws an error (this also > > happens if I use `:(glob)**/Makefile`, tested in the git source tree): > > > > $ git archive HEAD -- ':(glob)*/Makefile' > > fatal: pathspec '*/Makefile' did not match any files > > > > Strange enough, command `git log -- ':(glob)*/Makefile'` works. Any idea what is > > wrong? > > There may be something wrong. This patch seems to make it work for me, > but it includes lots of empty directories. I'll have a closer look > later (btw it's surprising that negative pathspec works too..) I can confirm that this patch shows Makefile's, but also includes a lot of empty directories. As for why this happens, my guess is that write_archive_entries() recurses the full tree and adds every encountered directory (via read_tree_1, via write_archive_entry()). To fix this, write_archive (write_tar_archive, etc.) should be taught to handle glob patterns, or parse_pathspec should expand globs (and then parse_pathspec_arg might have to validate the remaining patterns). Kind regards, Peter > diff --git a/archive.c b/archive.c > index 3fc0fb2..a5be58d 100644 > --- a/archive.c > +++ b/archive.c > @@ -221,6 +221,7 @@ static int path_exists(struct tree *tree, const char *path) > int ret; > > parse_pathspec(&pathspec, 0, 0, "", paths); > + pathspec.recursive = 1; > ret = read_tree_recursive(tree, "", 0, 0, &pathspec, reject_entry, NULL); > free_pathspec(&pathspec); > return ret != 0; > @@ -237,6 +238,7 @@ static void parse_pathspec_arg(const char **pathspec, > parse_pathspec(&ar_args->pathspec, 0, > PATHSPEC_PREFER_FULL, > "", pathspec); > + ar_args->pathspec.recursive = 1; > if (pathspec) { > while (*pathspec) { > if (**pathspec && !path_exists(ar_args->tree, *pathspec)) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html