Mike Hommey wrote: > - fast-import's `ls` command documentation about its output format > mentions that the output may contain commits, so I tried the trick of > creating a tree with commits, but fast-import then fails with: > fatal: Not a blob (actually a commit) > which I totally understand, but then I wonder why the documentation > mentions it and how one would get a tree containing references to > commits. I guess the documentation should be fixed. Odd. Here's what happens when I try: $ echo "ls $(git rev-parse HEAD)" | git fast-import --quiet fatal: Missing space after tree-ish: ls a4a226a366ab0a173ed9e5f70f2a95d0d21e54c5 fast-import: dumping crash report to .git/fast_import_crash_14080 $ echo "ls $(git rev-parse HEAD) " | git fast-import --quiet 040000 tree d3d38e7d71cb40ebbaf2798b01837b3de43fd4a1 How did you get that "Not a blob" message? I think a good fix would be to teach parse_ls a mode with no <path> parameter. Something like this (untested; needs cleanup and tests): Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> diff --git i/fast-import.c w/fast-import.c index d0bd285..a9a46be 100644 --- i/fast-import.c +++ w/fast-import.c @@ -278,6 +278,8 @@ struct recent_command { char *buf; }; +extern const char *tag_type; + /* Configured limits on output */ static unsigned long max_depth = 10; static off_t max_packsize; @@ -3047,6 +3049,49 @@ static void parse_ls(const char *p, struct branch *b) struct tree_entry *root = NULL; struct tree_entry leaf = {NULL}; + /* ls SP <tree-ish> */ + if (*p != '"' && !strchr(p, ' ')) { + unsigned char sha1[20]; + struct object_entry *e; + static struct strbuf line = STRBUF_INIT; + const char *type; + + if (*p == ':') { /* <mark> */ + e = find_mark(parse_mark_ref_eol(p)); + if (!e) + die("Unknown mark: %s", command_buf.buf); + hashcpy(sha1, e->idx.sha1); + } else { /* <sha1> */ + if (get_sha1_hex(p, sha1)) + die("Invalid dataref: %s", command_buf.buf); + e = find_object(sha1); + p += 40; + if (*p) + die("Garbage after dataref: %s", command_buf.buf); + } + + switch (e->type) { + case OBJ_COMMIT: + type = commit_type; + break; + case OBJ_TREE: + type = tree_type; + break; + case OBJ_BLOB: + type = blob_type; + break; + case OBJ_TAG: + type = tag_type; + break; + default: + die("Not a tree-ish: %s", command_buf.buf); + } + + strbuf_reset(&line); + strbuf_addf(&line, "%s %s\n", type, sha1_to_hex(sha1)); + cat_blob_write(line.buf, line.len); + } + /* ls SP (<tree-ish> SP)? <path> */ if (*p == '"') { if (!b) -- 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