commit-graph: build graph from starting commits
Teach git-commit-graph to read commits from stdin when the --stdin-commits flag is specified. Commits reachable from these commits are added to the graph. This is a much faster way to construct the graph than inspecting all packed objects, but is restricted to known tips. For the Linux repository, 700,000+ commits were added to the graph file starting from 'master' in 7-9 seconds, depending on the number of packfiles in the repo (1, 24, or 120). Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
049d51a2bb
commit
3d5df01b5e
@ -551,7 +551,9 @@ static void close_reachable(struct packed_oid_list *oids)
|
||||
|
||||
void write_commit_graph(const char *obj_dir,
|
||||
const char **pack_indexes,
|
||||
int nr_packs)
|
||||
int nr_packs,
|
||||
const char **commit_hex,
|
||||
int nr_commits)
|
||||
{
|
||||
struct packed_oid_list oids;
|
||||
struct packed_commit_list commits;
|
||||
@ -591,7 +593,28 @@ void write_commit_graph(const char *obj_dir,
|
||||
close_pack(p);
|
||||
}
|
||||
strbuf_release(&packname);
|
||||
} else
|
||||
}
|
||||
|
||||
if (commit_hex) {
|
||||
for (i = 0; i < nr_commits; i++) {
|
||||
const char *end;
|
||||
struct object_id oid;
|
||||
struct commit *result;
|
||||
|
||||
if (commit_hex[i] && parse_oid_hex(commit_hex[i], &oid, &end))
|
||||
continue;
|
||||
|
||||
result = lookup_commit_reference_gently(&oid, 1);
|
||||
|
||||
if (result) {
|
||||
ALLOC_GROW(oids.list, oids.nr + 1, oids.alloc);
|
||||
oidcpy(&oids.list[oids.nr], &(result->object.oid));
|
||||
oids.nr++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!pack_indexes && !commit_hex)
|
||||
for_each_packed_object(add_packed_commits, &oids, 0);
|
||||
|
||||
close_reachable(&oids);
|
||||
|
Reference in New Issue
Block a user