Introduce a new command-line option --inline-blobs that always inlines blobs instead of referring to them via marks or their original SHA-1 hash. Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx> --- Documentation/git-fast-export.txt | 5 +++++ builtin/fast-export.c | 23 +++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt index e05b686..cd48b4b 100644 --- a/Documentation/git-fast-export.txt +++ b/Documentation/git-fast-export.txt @@ -90,6 +90,11 @@ marks the same across runs. resulting stream can only be used by a repository which already contains the necessary objects. +--inline-blobs:: + Inline all blobs, instead of referring to them via marks or + their original SHA-1 hash. This is useful to parsers, as they + don't need to persist blobs. + --full-tree:: This option will cause fast-export to issue a "deleteall" directive for each commit followed by a full list of all files diff --git a/builtin/fast-export.c b/builtin/fast-export.c index c8fd46b..202a3b9 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -27,6 +27,7 @@ static enum { ABORT, VERBATIM, WARN, STRIP } signed_tag_mode = ABORT; static enum { ERROR, DROP, REWRITE } tag_of_filtered_mode = ABORT; static int fake_missing_tagger; static int no_data; +static int inline_blobs; static int full_tree; static int parse_opt_signed_tag_mode(const struct option *opt, @@ -118,7 +119,7 @@ static void handle_object(const unsigned char *sha1) char *buf; struct object *object; - if (no_data) + if (no_data || inline_blobs) return; if (is_null_sha1(sha1)) @@ -218,7 +219,23 @@ static void show_filemodify(struct diff_queue_struct *q, if (no_data || S_ISGITLINK(spec->mode)) printf("M %06o %s %s\n", spec->mode, sha1_to_hex(spec->sha1), spec->path); - else { + else if (inline_blobs) { + unsigned long size; + enum object_type type; + char *buf; + + buf = read_sha1_file(spec->sha1, &type, &size); + if (!buf) + die ("Could not read blob %s", + sha1_to_hex(spec->sha1)); + printf("M %06o inline %s\n", spec->mode, spec->path); + printf("data %lu\n", size); + if (size && fwrite(buf, size, 1, stdout) != 1) + die_errno ("Could not write blob '%s'", + sha1_to_hex(spec->sha1)); + printf("\n"); + + } else { struct object *object = lookup_object(spec->sha1); printf("M %06o :%d %s\n", spec->mode, get_object_mark(object), spec->path); @@ -627,6 +644,8 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix) "Fake a tagger when tags lack one"), OPT_BOOLEAN(0, "full-tree", &full_tree, "Output full tree for each commit"), + OPT_BOOLEAN(0, "inline-blobs", &inline_blobs, + "Output all blobs inline"), { OPTION_NEGBIT, 0, "data", &no_data, NULL, "Skip output of blob data", PARSE_OPT_NOARG | PARSE_OPT_NEGHELP, NULL, 1 }, -- 1.7.4.rc1.7.g2cf08.dirty -- 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