this allows creating packs that contain only the blobs relevant to a
specific subdirectory, e.g.

    echo HEAD | git pack-objects --revs --sparse-prefix=/contrib/

will create a pack containing the complete history of HEAD, including
all commits, all trees, and the files in the contrib directory.

Signed-off-by: Robin Ruede <r.ru...@gmail.com>
---
 builtin/pack-objects.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index a2f8cfd..0674f57 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -2621,6 +2621,8 @@ int cmd_pack_objects(int argc, const char **argv, const 
char *prefix)
        struct argv_array rp = ARGV_ARRAY_INIT;
        int rev_list_unpacked = 0, rev_list_all = 0, rev_list_reflog = 0;
        int rev_list_index = 0;
+       const char *sparse_prefix = NULL;
+
        struct option pack_objects_options[] = {
                OPT_SET_INT('q', "quiet", &progress,
                            N_("do not show progress meter"), 0),
@@ -2685,6 +2687,8 @@ int cmd_pack_objects(int argc, const char **argv, const 
char *prefix)
                         N_("create thin packs")),
                OPT_BOOL(0, "shallow", &shallow,
                         N_("create packs suitable for shallow fetches")),
+               OPT_STRING(0, "sparse-prefix", &sparse_prefix, N_("path"),
+                 N_("only include blobs relevant for sparse checkout (implies 
--revs)")),
                OPT_BOOL(0, "honor-pack-keep", &ignore_packed_keep,
                         N_("ignore packs that have companion .keep file")),
                OPT_INTEGER(0, "compression", &pack_compression_level,
@@ -2725,6 +2729,13 @@ int cmd_pack_objects(int argc, const char **argv, const 
char *prefix)
        } else
                argv_array_push(&rp, "--objects");
 
+       if (sparse_prefix) {
+               use_internal_rev_list = 1;
+               // with bitmaps the path of the blobs is not known
+               use_bitmap_index = 0;
+               argv_array_push(&rp, "--sparse-prefix");
+               argv_array_push(&rp, sparse_prefix);
+       }
        if (rev_list_all) {
                use_internal_rev_list = 1;
                argv_array_push(&rp, "--all");
-- 
2.9.1.283.g3ca5b4c.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to