With core_subtree turned on (capability "subtree", request "subtree" from fetch-pack), traverse_commit_list will be in "subtree mode", which will not go farther than the given subtree. As the result, the pack is broken be design, only contains enough blobs/trees/commits to reach the given subtree. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- upload-pack.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-) diff --git a/upload-pack.c b/upload-pack.c index e432e83..9b6710a 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -160,7 +160,7 @@ static void create_pack_file(void) ssize_t sz; const char *argv[10]; int arg = 0; - int internal_rev_list = shallow_nr; + int internal_rev_list = shallow_nr || core_subtree; if (internal_rev_list) { memset(&rev_list, 0, sizeof(rev_list)); @@ -505,6 +505,20 @@ static void receive_needs(void) if (debug_fd) write_in_full(debug_fd, line, len); + if (!prefixcmp(line, "subtree ")) { + int len; + char *subtree; + if (core_subtree) + die("sorry, only one subtree supported"); + len = strlen(line+8); + subtree = malloc(len+1); + memcpy(subtree, line+8, len-1); + subtree[len-1] = '\0'; /* \n */ + if (subtree[len-2] != '/') + die("subtree request must end with a slash"); + core_subtree = subtree; + continue; + } if (!prefixcmp(line, "shallow ")) { unsigned char sha1[20]; struct object *object; @@ -624,7 +638,7 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo { static const char *capabilities = "multi_ack thin-pack side-band" " side-band-64k ofs-delta shallow no-progress" - " include-tag multi_ack_detailed"; + " include-tag multi_ack_detailed subtree"; struct object *o = parse_object(sha1); if (!o) -- 1.7.1.rc1.69.g24c2f7 -- 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