René Scharfe [off-list ref] writes:
But just because there is currently no way (that I know of) to change
the working directory on the remote end that doesn't mean the command
needs to ignore the working directory when operating locally, where it
can be changed easily.
I do not think it has much to do with "working directory". The
remote one would most often be bare, and especially the public
ones are so. I think the issue is if I ask a tarball of this
commit without giving any specific parameters, what should
happen.
And I think most people find it natural if you give them the
whole tree no matter where they start from.
You could:
$ git archive HEAD -- t/howto
to have a narrowed tarball, and even if you make:
$ cd t/howto
$ git archive HEAD
to produce the whole tree, the user can still do:
$ cd t/howto
$ git archive HEAD -- .
to get the narrowed tree if the command understands the prefix
it receives from git_setup_directory().
So while I understand when you say this is "another input
method", letting people in a deep directory to abbreviate their
cwd with "." would equally a good input method, and probably
better than the current implementation, which leaves people
without a single way to say "I want the whole tree" without
cd'ing up.
Junio C Hamano schrieb:
And I think most people find it natural if you give them the whole
tree no matter where they start from.
Well, I can't argue against that, as I don't have any numbers. But I
can understand this expectation a bit ("archive HEAD!" -- "here is an
ear" might be confusing ;).
You could:
$ git archive HEAD -- t/howto
to have a narrowed tarball, and even if you make:
$ cd t/howto $ git archive HEAD
to produce the whole tree, the user can still do:
$ cd t/howto $ git archive HEAD -- .
to get the narrowed tree if the command understands the prefix it
receives from git_setup_directory().
So while I understand when you say this is "another input method",
letting people in a deep directory to abbreviate their cwd with "."
would equally a good input method, and probably better than the
current implementation, which leaves people without a single way to
say "I want the whole tree" without cd'ing up.
Hmm, switching the feature's default mode around instead of cutting it
off completely might be a good idea. Something like this? Unlike the
current implementation, it always writes the full path from the repo
root for each file.
René
diff --git a/builtin-archive.c b/builtin-archive.c
index 7f4e409..efa8679 100644
--- a/builtin-archive.c
+++ b/builtin-archive.c
@@ -128,18 +128,6 @@ void parse_treeish_arg(const char **argv, struct archiver_args *ar_args,
if (tree == NULL)
die("not a tree object");
- if (prefix) {
- unsigned char tree_sha1[20];
- unsigned int mode;
- int err;
-
- err = get_tree_entry(tree->object.sha1, prefix,
- tree_sha1, &mode);
- if (err || !S_ISDIR(mode))
- die("current working directory is untracked");
-
- tree = parse_tree_indirect(tree_sha1);
- }
ar_args->tree = tree;
ar_args->commit_sha1 = commit_sha1;
ar_args->time = archive_time;@@ -241,6 +229,7 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
struct archiver ar;
int tree_idx;
const char *remote = NULL;
+ const char **pathspec;
remote = extract_remote_arg(&argc, argv);
if (remote)
@@ -255,7 +244,11 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
argv += tree_idx;
parse_treeish_arg(argv, &ar.args, prefix);
- parse_pathspec_arg(argv + 1, &ar.args);
+
+ pathspec = argv + 1;
+ if (*pathspec && prefix)
+ pathspec = get_pathspec(prefix, pathspec);
+ parse_pathspec_arg(pathspec, &ar.args);
return ar.write_archive(&ar.args);
}