Merge branch 'bc/fetch-thin-less-aggressive-in-normal-repository'

Earlier we made "rev-list --object-edge" more aggressively list the
objects at the edge commits, in order to reduce number of objects
fetched into a shallow repository, but the change affected cases
other than "fetching into a shallow repository" and made it
unusably slow (e.g. fetching into a normal repository should not
have to suffer the overhead from extra processing).  Limit it to a
more specific case by introducing --objects-edge-aggressive, a new
option to rev-list.

* bc/fetch-thin-less-aggressive-in-normal-repository:
  pack-objects: use --objects-edge-aggressive for shallow repos
  rev-list: add an option to mark fewer edges as uninteresting
  Documentation: add missing article in rev-list-options.txt
maint
Junio C Hamano 2015-01-12 11:38:56 -08:00
commit 832258da96
9 changed files with 35 additions and 7 deletions

View File

@ -13,7 +13,7 @@ SYNOPSIS
[--no-reuse-delta] [--delta-base-offset] [--non-empty] [--no-reuse-delta] [--delta-base-offset] [--non-empty]
[--local] [--incremental] [--window=<n>] [--depth=<n>] [--local] [--incremental] [--window=<n>] [--depth=<n>]
[--revs [--unpacked | --all]] [--stdout | base-name] [--revs [--unpacked | --all]] [--stdout | base-name]
[--keep-true-parents] < object-list [--shallow] [--keep-true-parents] < object-list




DESCRIPTION DESCRIPTION
@ -190,6 +190,11 @@ required objects and is thus unusable by Git without making it
self-contained. Use `git index-pack --fix-thin` self-contained. Use `git index-pack --fix-thin`
(see linkgit:git-index-pack[1]) to restore the self-contained property. (see linkgit:git-index-pack[1]) to restore the self-contained property.


--shallow::
Optimize a pack that will be provided to a client with a shallow
repository. This option, combined with \--thin, can result in a
smaller pack at the cost of speed.

--delta-base-offset:: --delta-base-offset::
A packed archive can express the base object of a delta as A packed archive can express the base object of a delta as
either a 20-byte object name or as an offset in the either a 20-byte object name or as an offset in the

View File

@ -46,7 +46,8 @@ SYNOPSIS
[ \--extended-regexp | -E ] [ \--extended-regexp | -E ]
[ \--fixed-strings | -F ] [ \--fixed-strings | -F ]
[ \--date=(local|relative|default|iso|iso-strict|rfc|short) ] [ \--date=(local|relative|default|iso|iso-strict|rfc|short) ]
[ [\--objects | \--objects-edge] [ \--unpacked ] ] [ [ \--objects | \--objects-edge | \--objects-edge-aggressive ]
[ \--unpacked ] ]
[ \--pretty | \--header ] [ \--pretty | \--header ]
[ \--bisect ] [ \--bisect ]
[ \--bisect-vars ] [ \--bisect-vars ]

View File

@ -653,10 +653,15 @@ These options are mostly targeted for packing of Git repositories.
--objects-edge:: --objects-edge::
Similar to `--objects`, but also print the IDs of excluded Similar to `--objects`, but also print the IDs of excluded
commits prefixed with a ``-'' character. This is used by commits prefixed with a ``-'' character. This is used by
linkgit:git-pack-objects[1] to build ``thin'' pack, which records linkgit:git-pack-objects[1] to build a ``thin'' pack, which records
objects in deltified form based on objects contained in these objects in deltified form based on objects contained in these
excluded commits to reduce network traffic. excluded commits to reduce network traffic.


--objects-edge-aggressive::
Similar to `--objects-edge`, but it tries harder to find excluded
commits at the cost of increased time. This is used instead of
`--objects-edge` to build ``thin'' packs for shallow repositories.

--unpacked:: --unpacked::
Only useful with `--objects`; print the object IDs that are not Only useful with `--objects`; print the object IDs that are not
in packs. in packs.

View File

@ -2613,6 +2613,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
{ {
int use_internal_rev_list = 0; int use_internal_rev_list = 0;
int thin = 0; int thin = 0;
int shallow = 0;
int all_progress_implied = 0; int all_progress_implied = 0;
struct argv_array rp = ARGV_ARRAY_INIT; struct argv_array rp = ARGV_ARRAY_INIT;
int rev_list_unpacked = 0, rev_list_all = 0, rev_list_reflog = 0; int rev_list_unpacked = 0, rev_list_all = 0, rev_list_reflog = 0;
@ -2677,6 +2678,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
PARSE_OPT_OPTARG, option_parse_unpack_unreachable }, PARSE_OPT_OPTARG, option_parse_unpack_unreachable },
OPT_BOOL(0, "thin", &thin, OPT_BOOL(0, "thin", &thin,
N_("create thin packs")), N_("create thin packs")),
OPT_BOOL(0, "shallow", &shallow,
N_("create packs suitable for shallow fetches")),
OPT_BOOL(0, "honor-pack-keep", &ignore_packed_keep, OPT_BOOL(0, "honor-pack-keep", &ignore_packed_keep,
N_("ignore packs that have companion .keep file")), N_("ignore packs that have companion .keep file")),
OPT_INTEGER(0, "compression", &pack_compression_level, OPT_INTEGER(0, "compression", &pack_compression_level,
@ -2711,7 +2714,9 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
argv_array_push(&rp, "pack-objects"); argv_array_push(&rp, "pack-objects");
if (thin) { if (thin) {
use_internal_rev_list = 1; use_internal_rev_list = 1;
argv_array_push(&rp, "--objects-edge"); argv_array_push(&rp, shallow
? "--objects-edge-aggressive"
: "--objects-edge");
} else } else
argv_array_push(&rp, "--objects"); argv_array_push(&rp, "--objects");



View File

@ -157,7 +157,7 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)


if (commit->object.flags & UNINTERESTING) { if (commit->object.flags & UNINTERESTING) {
mark_tree_uninteresting(commit->tree); mark_tree_uninteresting(commit->tree);
if (revs->edge_hint && !(commit->object.flags & SHOWN)) { if (revs->edge_hint_aggressive && !(commit->object.flags & SHOWN)) {
commit->object.flags |= SHOWN; commit->object.flags |= SHOWN;
show_edge(commit); show_edge(commit);
} }
@ -165,7 +165,7 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)
} }
mark_edge_parents_uninteresting(commit, revs, show_edge); mark_edge_parents_uninteresting(commit, revs, show_edge);
} }
if (revs->edge_hint) { if (revs->edge_hint_aggressive) {
for (i = 0; i < revs->cmdline.nr; i++) { for (i = 0; i < revs->cmdline.nr; i++) {
struct object *obj = revs->cmdline.rev[i].item; struct object *obj = revs->cmdline.rev[i].item;
struct commit *commit = (struct commit *)obj; struct commit *commit = (struct commit *)obj;

View File

@ -1853,6 +1853,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->tree_objects = 1; revs->tree_objects = 1;
revs->blob_objects = 1; revs->blob_objects = 1;
revs->edge_hint = 1; revs->edge_hint = 1;
} else if (!strcmp(arg, "--objects-edge-aggressive")) {
revs->tag_objects = 1;
revs->tree_objects = 1;
revs->blob_objects = 1;
revs->edge_hint = 1;
revs->edge_hint_aggressive = 1;
} else if (!strcmp(arg, "--verify-objects")) { } else if (!strcmp(arg, "--verify-objects")) {
revs->tag_objects = 1; revs->tag_objects = 1;
revs->tree_objects = 1; revs->tree_objects = 1;

View File

@ -93,6 +93,7 @@ struct rev_info {
blob_objects:1, blob_objects:1,
verify_objects:1, verify_objects:1,
edge_hint:1, edge_hint:1,
edge_hint_aggressive:1,
limited:1, limited:1,
unpacked:1, unpacked:1,
boundary:2, boundary:2,

View File

@ -47,6 +47,7 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL,
}; };
struct child_process po = CHILD_PROCESS_INIT; struct child_process po = CHILD_PROCESS_INIT;
int i; int i;
@ -60,6 +61,8 @@ static int pack_objects(int fd, struct ref *refs, struct sha1_array *extra, stru
argv[i++] = "-q"; argv[i++] = "-q";
if (args->progress) if (args->progress)
argv[i++] = "--progress"; argv[i++] = "--progress";
if (is_repository_shallow())
argv[i++] = "--shallow";
po.argv = argv; po.argv = argv;
po.in = -1; po.in = -1;
po.out = args->stateless_rpc ? -1 : fd; po.out = args->stateless_rpc ? -1 : fd;

View File

@ -86,7 +86,7 @@ static void create_pack_file(void)
"corruption on the remote side."; "corruption on the remote side.";
int buffered = -1; int buffered = -1;
ssize_t sz; ssize_t sz;
const char *argv[12]; const char *argv[13];
int i, arg = 0; int i, arg = 0;
FILE *pipe_fd; FILE *pipe_fd;


@ -100,6 +100,8 @@ static void create_pack_file(void)
argv[arg++] = "--thin"; argv[arg++] = "--thin";


argv[arg++] = "--stdout"; argv[arg++] = "--stdout";
if (shallow_nr)
argv[arg++] = "--shallow";
if (!no_progress) if (!no_progress)
argv[arg++] = "--progress"; argv[arg++] = "--progress";
if (use_ofs_delta) if (use_ofs_delta)