Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7d4bebf
Merge branch 'jt/binsearch-with-fanout' into HEAD
gitster Mar 13, 2018
2ee13a7
Merge branch 'jk/cached-commit-buffer' into HEAD
gitster Mar 13, 2018
f2af9f5
csum-file: rename hashclose() to finalize_hashfile()
derrickstolee Apr 2, 2018
cfe8321
csum-file: refactor finalize_hashfile() method
derrickstolee Apr 2, 2018
b84f767
commit-graph: add format document
derrickstolee Apr 2, 2018
ae30d7b
graph: add commit graph design document
derrickstolee Apr 2, 2018
4ce58ee
commit-graph: create git-commit-graph builtin
derrickstolee Apr 2, 2018
08fd81c
commit-graph: implement write_commit_graph()
derrickstolee Apr 2, 2018
f237c8b
commit-graph: implement git-commit-graph write
derrickstolee Apr 2, 2018
2a2e32b
commit-graph: implement git commit-graph read
derrickstolee Apr 10, 2018
1b70dfd
commit-graph: add core.commitGraph setting
derrickstolee Apr 10, 2018
4f2542b
commit-graph: close under reachability
derrickstolee Apr 10, 2018
177722b
commit: integrate commit graph with commit parsing
derrickstolee Apr 10, 2018
049d51a
commit-graph: read only from specific pack-indexes
derrickstolee Apr 10, 2018
3d5df01
commit-graph: build graph from starting commits
derrickstolee Apr 10, 2018
7547b95
commit-graph: implement "--append" option
derrickstolee Apr 10, 2018
2d5792f
Merge branch 'bw/c-plus-plus' into ds/lazy-load-trees
gitster Apr 11, 2018
891435d
treewide: rename tree to maybe_tree
derrickstolee Apr 6, 2018
5bb03de
commit: create get_commit_tree() method
derrickstolee Apr 6, 2018
2e27bd7
treewide: replace maybe_tree with accessor methods
derrickstolee Apr 6, 2018
7b8a21d
commit-graph: lazy-load trees for commits
derrickstolee Apr 6, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
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>
  • Loading branch information
derrickstolee authored and gitster committed Apr 11, 2018
commit 3d5df01b5e42416a59e857135e932bbdd8cc3ba0
14 changes: 13 additions & 1 deletion Documentation/git-commit-graph.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,13 @@ COMMANDS
Write a commit graph file based on the commits found in packfiles.
+
With the `--stdin-packs` option, generate the new commit graph by
walking objects only in the specified pack-indexes.
walking objects only in the specified pack-indexes. (Cannot be combined
with --stdin-commits.)
+
With the `--stdin-commits` option, generate the new commit graph by
walking commits starting at the commits specified in stdin as a list
of OIDs in hex, one OID per line. (Cannot be combined with
--stdin-packs.)

'read'::

Expand All @@ -60,6 +66,12 @@ $ git commit-graph write
$ echo <pack-index> | git commit-graph write --stdin-packs
------------------------------------------------

* Write a graph file containing all reachable commits.
+
------------------------------------------------
$ git show-ref -s | git commit-graph write --stdin-commits
------------------------------------------------

* Read basic information from the commit-graph file.
+
------------------------------------------------
Expand Down
27 changes: 21 additions & 6 deletions builtin/commit-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
static char const * const builtin_commit_graph_usage[] = {
N_("git commit-graph [--object-dir <objdir>]"),
N_("git commit-graph read [--object-dir <objdir>]"),
N_("git commit-graph write [--object-dir <objdir>] [--stdin-packs]"),
N_("git commit-graph write [--object-dir <objdir>] [--stdin-packs|--stdin-commits]"),
NULL
};

Expand All @@ -18,13 +18,14 @@ static const char * const builtin_commit_graph_read_usage[] = {
};

static const char * const builtin_commit_graph_write_usage[] = {
N_("git commit-graph write [--object-dir <objdir>] [--stdin-packs]"),
N_("git commit-graph write [--object-dir <objdir>] [--stdin-packs|--stdin-commits]"),
NULL
};

static struct opts_commit_graph {
const char *obj_dir;
int stdin_packs;
int stdin_commits;
} opts;

static int graph_read(int argc, const char **argv)
Expand Down Expand Up @@ -79,6 +80,8 @@ static int graph_write(int argc, const char **argv)
{
const char **pack_indexes = NULL;
int packs_nr = 0;
const char **commit_hex = NULL;
int commits_nr = 0;
const char **lines = NULL;
int lines_nr = 0;
int lines_alloc = 0;
Expand All @@ -89,17 +92,21 @@ static int graph_write(int argc, const char **argv)
N_("The object directory to store the graph")),
OPT_BOOL(0, "stdin-packs", &opts.stdin_packs,
N_("scan pack-indexes listed by stdin for commits")),
OPT_BOOL(0, "stdin-commits", &opts.stdin_commits,
N_("start walk at commits listed by stdin")),
OPT_END(),
};

argc = parse_options(argc, argv, NULL,
builtin_commit_graph_write_options,
builtin_commit_graph_write_usage, 0);

if (opts.stdin_packs && opts.stdin_commits)
die(_("cannot use both --stdin-commits and --stdin-packs"));
if (!opts.obj_dir)
opts.obj_dir = get_object_directory();

if (opts.stdin_packs) {
if (opts.stdin_packs || opts.stdin_commits) {
struct strbuf buf = STRBUF_INIT;
lines_nr = 0;
lines_alloc = 128;
Expand All @@ -110,13 +117,21 @@ static int graph_write(int argc, const char **argv)
lines[lines_nr++] = strbuf_detach(&buf, NULL);
}

pack_indexes = lines;
packs_nr = lines_nr;
if (opts.stdin_packs) {
pack_indexes = lines;
packs_nr = lines_nr;
}
if (opts.stdin_commits) {
commit_hex = lines;
commits_nr = lines_nr;
}
}

write_commit_graph(opts.obj_dir,
pack_indexes,
packs_nr);
packs_nr,
commit_hex,
commits_nr);

return 0;
}
Expand Down
27 changes: 25 additions & 2 deletions commit-graph.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 3 additions & 1 deletion commit-graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ struct commit_graph *load_commit_graph_one(const char *graph_file);

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

#endif
13 changes: 13 additions & 0 deletions t/t5318-commit-graph.sh
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,19 @@ test_expect_success 'build graph from latest pack with closure' '
graph_git_behavior 'graph from pack, commit 8 vs merge 1' full commits/8 merge/1
graph_git_behavior 'graph from pack, commit 8 vs merge 2' full commits/8 merge/2

test_expect_success 'build graph from commits with closure' '
cd "$TRASH_DIRECTORY/full" &&
git tag -a -m "merge" tag/merge merge/2 &&
git rev-parse tag/merge >commits-in &&
git rev-parse merge/1 >>commits-in &&
cat commits-in | git commit-graph write --stdin-commits &&
test_path_is_file $objdir/info/commit-graph &&
graph_read_expect "6"
'

graph_git_behavior 'graph from commits, commit 8 vs merge 1' full commits/8 merge/1
graph_git_behavior 'graph from commits, commit 8 vs merge 2' full commits/8 merge/2

test_expect_success 'setup bare repo' '
cd "$TRASH_DIRECTORY" &&
git clone --bare --no-local full bare &&
Expand Down