rev-list: add an option to mark fewer edges as uninteresting

In commit fbd4a70 (list-objects: mark more commits as edges in
mark_edges_uninteresting - 2013-08-16), we marked an increasing number
of edges uninteresting.  This change, and the subsequent change to make
this conditional on --objects-edge, are used by --thin to make much
smaller packs for shallow clones.

Unfortunately, they cause a significant performance regression when
pushing non-shallow clones with lots of refs (23.322 seconds vs.
4.785 seconds with 22400 refs).  Add an option to git rev-list,
--objects-edge-aggressive, that preserves this more aggressive behavior,
while leaving --objects-edge to provide more performant behavior.
Preserve the current behavior for the moment by using the aggressive
option.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
brian m. carlson 2014-12-24 23:05:39 +00:00 коммит произвёл Junio C Hamano
Родитель 8297643fcd
Коммит 1684c1b219
6 изменённых файлов: 16 добавлений и 4 удалений

Просмотреть файл

@ -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 ]

Просмотреть файл

@ -657,6 +657,10 @@ These options are mostly targeted for packing of Git repositories.
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.
--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.

Просмотреть файл

@ -2711,7 +2711,7 @@ 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, "--objects-edge-aggressive");
} else } else
argv_array_push(&rp, "--objects"); argv_array_push(&rp, "--objects");

Просмотреть файл

@ -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;

Просмотреть файл

@ -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;

Просмотреть файл

@ -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,