git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Derrick Stolee <stolee@gmail.com>
To: Jonathan Tan <jonathantanmy@google.com>
Cc: git@vger.kernel.org, gitster@pobox.com, peff@peff.net,
	git@jeffhostetler.com, sbeller@google.com, dstolee@microsoft.com
Subject: Re: [PATCH v2 11/14] commit: integrate commit graph with commit parsing
Date: Tue, 6 Feb 2018 09:53:01 -0500	[thread overview]
Message-ID: <11c4f90e-558c-b80c-61f0-f70cdcf6edd9@gmail.com> (raw)
In-Reply-To: <20180201175151.89555950582a2e6c5279849a@google.com>

On 2/1/2018 8:51 PM, Jonathan Tan wrote:
> On Tue, 30 Jan 2018 16:39:40 -0500
> Derrick Stolee <stolee@gmail.com> wrote:
>
>> +/* global storage */
>> +struct commit_graph *commit_graph = 0;
> NULL, not 0.
>
>> +static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos)
>> +{
>> +	uint32_t last, first = 0;
>> +
>> +	if (oid->hash[0])
>> +		first = ntohl(*(uint32_t*)(g->chunk_oid_fanout + 4 * (oid->hash[0] - 1)));
>> +	last = ntohl(*(uint32_t*)(g->chunk_oid_fanout + 4 * oid->hash[0]));
>> +
>> +	while (first < last) {
>> +		uint32_t mid = first + (last - first) / 2;
>> +		const unsigned char *current;
>> +		int cmp;
>> +
>> +		current = g->chunk_oid_lookup + g->hdr->hash_len * mid;
>> +		cmp = hashcmp(oid->hash, current);
>> +		if (!cmp) {
>> +			*pos = mid;
>> +			return 1;
>> +		}
>> +		if (cmp > 0) {
>> +			first = mid + 1;
>> +			continue;
>> +		}
>> +		last = mid;
>> +	}
>> +
>> +	*pos = first;
>> +	return 0;
>> +}
> This would be better in sha1-lookup.c, something like the reverse of commit
> f1068efefe6d ("sha1_file: drop experimental GIT_USE_LOOKUP search",
> 2017-08-09), except that it can be done using a simple binary search.

I rebased my patch onto your binary search patch, so I'll use that in 
the future.

>
>> +static int full_parse_commit(struct commit *item, struct commit_graph *g,
>> +			     uint32_t pos, const unsigned char *commit_data)
>> +{
>> +	struct object_id oid;
>> +	struct commit *new_parent;
>> +	uint32_t new_parent_pos;
>> +	uint32_t *parent_data_ptr;
>> +	uint64_t date_low, date_high;
>> +	struct commit_list **pptr;
>> +
>> +	item->object.parsed = 1;
>> +	item->graph_pos = pos;
>> +
>> +	hashcpy(oid.hash, commit_data);
>> +	item->tree = lookup_tree(&oid);
>> +
>> +	date_high = ntohl(*(uint32_t*)(commit_data + g->hdr->hash_len + 8)) & 0x3;
>> +	date_low = ntohl(*(uint32_t*)(commit_data + g->hdr->hash_len + 12));
>> +	item->date = (timestamp_t)((date_high << 32) | date_low);
>> +
>> +	pptr = &item->parents;
>> +
>> +	new_parent_pos = ntohl(*(uint32_t*)(commit_data + g->hdr->hash_len));
>> +	if (new_parent_pos == GRAPH_PARENT_NONE)
>> +		return 1;
>> +	get_nth_commit_oid(g, new_parent_pos, &oid);
>> +	new_parent = lookup_commit(&oid);
>> +	if (new_parent) {
>> +		new_parent->graph_pos = new_parent_pos;
>> +		pptr = &commit_list_insert(new_parent, pptr)->next;
>> +	} else {
>> +		die("could not find commit %s", oid_to_hex(&oid));
>> +	}
>> +
>> +	new_parent_pos = ntohl(*(uint32_t*)(commit_data + g->hdr->hash_len + 4));
>> +	if (new_parent_pos == GRAPH_PARENT_NONE)
>> +		return 1;
>> +	if (!(new_parent_pos & GRAPH_LARGE_EDGES_NEEDED)) {
>> +		get_nth_commit_oid(g, new_parent_pos, &oid);
>> +		new_parent = lookup_commit(&oid);
>> +		if (new_parent) {
>> +			new_parent->graph_pos = new_parent_pos;
>> +			pptr = &commit_list_insert(new_parent, pptr)->next;
>> +		} else
>> +			die("could not find commit %s", oid_to_hex(&oid));
>> +		return 1;
>> +	}
>> +
>> +	parent_data_ptr = (uint32_t*)(g->chunk_large_edges + 4 * (new_parent_pos ^ GRAPH_LARGE_EDGES_NEEDED));
>> +	do {
>> +		new_parent_pos = ntohl(*parent_data_ptr);
>> +
>> +		get_nth_commit_oid(g, new_parent_pos & GRAPH_EDGE_LAST_MASK, &oid);
>> +		new_parent = lookup_commit(&oid);
>> +		if (new_parent) {
>> +			new_parent->graph_pos = new_parent_pos & GRAPH_EDGE_LAST_MASK;
>> +			pptr = &commit_list_insert(new_parent, pptr)->next;
>> +		} else
>> +			die("could not find commit %s", oid_to_hex(&oid));
>> +		parent_data_ptr++;
>> +	} while (!(new_parent_pos & GRAPH_LAST_EDGE));
>> +
>> +	return 1;
>> +}
> The part that converts <pointer to parent data> into <struct commit *>
> seems to be duplicated 3 times. Refactor into a function?

Will do.

>
>> +/**
>> + * Fill 'item' to contain all information that would be parsed by parse_commit_buffer.
>> + */
>> +static int fill_commit_in_graph(struct commit *item, struct commit_graph *g, uint32_t pos)
>> +{
>> +	uint32_t new_parent_pos;
>> +	uint32_t *parent_data_ptr;
>> +	const unsigned char *commit_data = g->chunk_commit_data + (g->hdr->hash_len + 16) * pos;
>> +
>> +	new_parent_pos = ntohl(*(uint32_t*)(commit_data + g->hdr->hash_len));
>> +
>> +	if (new_parent_pos == GRAPH_PARENT_MISSING)
>> +		return 0;
>> +
>> +	if (new_parent_pos == GRAPH_PARENT_NONE)
>> +		return full_parse_commit(item, g, pos, commit_data);
>> +
>> +	new_parent_pos = ntohl(*(uint32_t*)(commit_data + g->hdr->hash_len + 4));
>> +
>> +	if (new_parent_pos == GRAPH_PARENT_MISSING)
>> +		return 0;
>> +	if (!(new_parent_pos & GRAPH_LARGE_EDGES_NEEDED))
>> +		return full_parse_commit(item, g, pos, commit_data);
>> +
>> +	new_parent_pos = new_parent_pos ^ GRAPH_LARGE_EDGES_NEEDED;
>> +
>> +	if (new_parent_pos == GRAPH_PARENT_MISSING)
>> +		return 0;
>> +
>> +	parent_data_ptr = (uint32_t*)(g->chunk_large_edges + 4 * new_parent_pos);
>> +	do {
>> +		new_parent_pos = ntohl(*parent_data_ptr);
>> +
>> +		if ((new_parent_pos & GRAPH_EDGE_LAST_MASK) == GRAPH_PARENT_MISSING)
>> +			return 0;
>> +
>> +		parent_data_ptr++;
>> +	} while (!(new_parent_pos & GRAPH_LAST_EDGE));
>> +
>> +	return full_parse_commit(item, g, pos, commit_data);
>> +}
> This function seems to just check for GRAPH_PARENT_MISSING - could that
> check be folded into full_parse_commit() instead? (Then
> full_parse_commit can be renamed to fill_commit_in_graph.)

I'd rather not have a really long method, but I could make the two steps 
their own static methods (one for checking and one for full parsing) to 
make it more clear that there are two steps here.

>
>> @@ -439,9 +656,24 @@ struct object_id *construct_commit_graph(const char *pack_dir)
>>   	char *fname;
>>   	struct commit_list *parent;
>>   
>> +	prepare_commit_graph();
>> +
>>   	oids.num = 0;
>>   	oids.size = 1024;
>> +
>> +	if (commit_graph && oids.size < commit_graph->num_commits)
>> +		oids.size = commit_graph->num_commits;
>> +
>>   	ALLOC_ARRAY(oids.list, oids.size);
>> +
>> +	if (commit_graph) {
>> +		for (i = 0; i < commit_graph->num_commits; i++) {
>> +			oids.list[i] = malloc(sizeof(struct object_id));
>> +			get_nth_commit_oid(commit_graph, i, oids.list[i]);
>> +		}
>> +		oids.num = commit_graph->num_commits;
>> +	}
>> +
>>   	for_each_packed_object(if_packed_commit_add_to_list, &oids, 0);
>>   	QSORT(oids.list, oids.num, commit_compare);

This change auto-includes the commits that were in the existing graph 
into the new graph.

>>   
>> @@ -525,6 +757,11 @@ struct object_id *construct_commit_graph(const char *pack_dir)
>>   	hashcpy(f_hash->hash, final_hash);
>>   	fname = get_commit_graph_filename_hash(pack_dir, f_hash);
>>   
>> +	if (commit_graph) {
>> +		close_commit_graph(commit_graph);
>> +		FREE_AND_NULL(commit_graph);
>> +	}
>> +
>>   	if (rename(graph_name, fname))
>>   		die("failed to rename %s to %s", graph_name, fname);

This change is necessary if we are going to use --delete-expired, as we 
need to unmap the file before we can delete it. Perhaps it would be 
better to close the graph in the builtin instead so that relationship is 
clearer.

> What is the relation of these changes to construct_commit_graph() to the
> rest of the patch?

(answered above, since the two changes have different purposes)

>> diff --git a/commit-graph.h b/commit-graph.h
>> index 43eb0aec84..05ddbbe165 100644
>> --- a/commit-graph.h
>> +++ b/commit-graph.h
>> @@ -4,6 +4,18 @@
>>   #include "git-compat-util.h"
>>   #include "commit.h"
>>   
>> +/**
>> + * Given a commit struct, try to fill the commit struct info, including:
>> + *  1. tree object
>> + *  2. date
>> + *  3. parents.
>> + *
>> + * Returns 1 if and only if the commit was found in the packed graph.
>> + *
>> + * See parse_commit_buffer() for the fallback after this call.
>> + */
>> +extern int parse_commit_in_graph(struct commit *item);
>> +
>>   extern struct object_id *get_graph_head_hash(const char *pack_dir,
>>   					     struct object_id *hash);
>>   extern char* get_commit_graph_filename_hash(const char *pack_dir,
>> @@ -40,7 +52,13 @@ extern struct commit_graph {
>>   
>>   extern int close_commit_graph(struct commit_graph *g);
>>   
>> -extern struct commit_graph *load_commit_graph_one(const char *graph_file, const char *pack_dir);
>> +extern struct commit_graph *load_commit_graph_one(const char *graph_file,
>> +						  const char *pack_dir);
>> +extern void prepare_commit_graph(void);
>> +
>> +extern struct object_id *get_nth_commit_oid(struct commit_graph *g,
>> +					    uint32_t n,
>> +					    struct object_id *oid);
>>   
>>   extern struct object_id *construct_commit_graph(const char *pack_dir);
> This header file now contains functions for reading the commit graph,
> and functions for writing one. It seems to me that those are (and should
> be) quite disjoint, so it might be better to separate them into two.

This header file provides a unified API surface for interacting with 
commit graphs. I'm not a fan of how other write commands are hidden in 
the builtins (like 'builtin/pack-objects.c' for writing packs). If there 
is a better example of how this split has been done in the root 
directory, I'm happy to consider it.

>
>> -int parse_commit_gently(struct commit *item, int quiet_on_missing)
>> +int parse_commit_internal(struct commit *item, int quiet_on_missing, int check_packed)
>>   {
>>   	enum object_type type;
>>   	void *buffer;
>> @@ -385,6 +386,8 @@ int parse_commit_gently(struct commit *item, int quiet_on_missing)
>>   		return -1;
>>   	if (item->object.parsed)
>>   		return 0;
>> +	if (check_packed && parse_commit_in_graph(item))
>> +		return 0;
>>   	buffer = read_sha1_file(item->object.oid.hash, &type, &size);
>>   	if (!buffer)
>>   		return quiet_on_missing ? -1 :
>> @@ -404,6 +407,11 @@ int parse_commit_gently(struct commit *item, int quiet_on_missing)
>>   	return ret;
>>   }
>>   
>> +int parse_commit_gently(struct commit *item, int quiet_on_missing)
>> +{
>> +	return parse_commit_internal(item, quiet_on_missing, 1);
>> +}
> Are you planning to use parse_commit_internal() from elsewhere? (It
> doesn't seem to be the case, at least from this patch series.)

At one point I was using it, but I removed the one caller and forgot to 
clean up.

>
>> diff --git a/log-tree.c b/log-tree.c
>> index fca29d4799..156aed4541 100644
>> --- a/log-tree.c
>> +++ b/log-tree.c
>> @@ -659,8 +659,7 @@ void show_log(struct rev_info *opt)
>>   		show_mergetag(opt, commit);
>>   	}
>>   
>> -	if (!get_cached_commit_buffer(commit, NULL))
>> -		return;
>> +	get_commit_buffer(commit, NULL);
> This undoes an optimization that I discuss in my e-mail message here
> [1]. If we decide to do this, it should at least be called out in the
> commit message.
>
> [1] https://public-inbox.org/git/b88725476d9f13ba4381d85e5fe049f6ef93f621.1506714999.git.jonathantanmy@google.com/

I will call this out more clearly in my commit message next time. My 
problem with the existing code is that it doesn't just ignore the commit 
contents but will actually not write a newline. I noticed during testing 
'git log --oneline' with the graph enabled and the output listed several 
short-shas in one line.

>
>> +_graph_git_two_modes() {
> No need for the name to start with an underscore, I think.
>
>> +    git -c core.commitgraph=true $1 >output
>> +    git -c core.commitgraph=false $1 >expect
>> +    cmp output expect
> Use test_cmp.
>
>> +}
>> +
>> +_graph_git_behavior() {
>> +    BRANCH=$1
>> +    COMPARE=$2
>> +    test_expect_success 'check normal git operations' \
>> +        '_graph_git_two_modes "log --oneline ${BRANCH}" &&
>> +         _graph_git_two_modes "log --topo-order ${BRANCH}" &&
>> +         _graph_git_two_modes "branch -vv" &&
>> +         _graph_git_two_modes "merge-base -a ${BRANCH} ${COMPARE}"'
>> +}
> This makes it difficult to debug failing tests, since they're all named
> the same. Better to just run the commands inline, and wrap the
> invocations of _graph_git_behavior in an appropriately named
> test_expect_success.

I'll add a parameter that adds a message to each test about the state of 
the repo and graph.

Thanks,
-Stolee

  reply	other threads:[~2018-02-06 14:53 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-30 21:39 [PATCH v2 00/14] Serialized Git Commit Graph Derrick Stolee
2018-01-30 21:39 ` [PATCH v2 01/14] commit-graph: add format document Derrick Stolee
2018-02-01 21:44   ` Jonathan Tan
2018-01-30 21:39 ` [PATCH v2 02/14] graph: add commit graph design document Derrick Stolee
2018-01-31  2:19   ` Stefan Beller
2018-01-30 21:39 ` [PATCH v2 03/14] commit-graph: create git-commit-graph builtin Derrick Stolee
2018-02-02  0:53   ` SZEDER Gábor
2018-01-30 21:39 ` [PATCH v2 04/14] commit-graph: implement construct_commit_graph() Derrick Stolee
2018-02-01 22:23   ` Jonathan Tan
2018-02-01 23:46   ` SZEDER Gábor
2018-02-02 15:32   ` SZEDER Gábor
2018-02-05 16:06     ` Derrick Stolee
2018-02-07 15:08       ` SZEDER Gábor
2018-02-07 15:10         ` Derrick Stolee
2018-01-30 21:39 ` [PATCH v2 05/14] commit-graph: implement git-commit-graph --write Derrick Stolee
2018-02-01 23:33   ` Jonathan Tan
2018-02-02 18:36     ` Stefan Beller
2018-02-02 22:48       ` Junio C Hamano
2018-02-03  1:58         ` Derrick Stolee
2018-02-03  9:28           ` Jeff King
2018-02-05 18:48             ` Junio C Hamano
2018-02-06 18:55               ` Derrick Stolee
2018-02-01 23:48   ` SZEDER Gábor
2018-02-05 18:07     ` Derrick Stolee
2018-02-02  1:47   ` SZEDER Gábor
2018-01-30 21:39 ` [PATCH v2 06/14] commit-graph: implement git-commit-graph --read Derrick Stolee
2018-01-31  2:22   ` Stefan Beller
2018-02-02  0:02   ` SZEDER Gábor
2018-02-02  0:23   ` Jonathan Tan
2018-02-05 19:29     ` Derrick Stolee
2018-01-30 21:39 ` [PATCH v2 07/14] commit-graph: implement git-commit-graph --update-head Derrick Stolee
2018-02-02  1:35   ` SZEDER Gábor
2018-02-05 21:01     ` Derrick Stolee
2018-02-02  2:45   ` SZEDER Gábor
2018-01-30 21:39 ` [PATCH v2 08/14] commit-graph: implement git-commit-graph --clear Derrick Stolee
2018-02-02  4:01   ` SZEDER Gábor
2018-01-30 21:39 ` [PATCH v2 09/14] commit-graph: teach git-commit-graph --delete-expired Derrick Stolee
2018-02-02 15:04   ` SZEDER Gábor
2018-01-30 21:39 ` [PATCH v2 10/14] commit-graph: add core.commitgraph setting Derrick Stolee
2018-01-31 22:44   ` Igor Djordjevic
2018-02-02 16:01   ` SZEDER Gábor
2018-01-30 21:39 ` [PATCH v2 11/14] commit: integrate commit graph with commit parsing Derrick Stolee
2018-02-02  1:51   ` Jonathan Tan
2018-02-06 14:53     ` Derrick Stolee [this message]
2018-01-30 21:39 ` [PATCH v2 12/14] commit-graph: read only from specific pack-indexes Derrick Stolee
2018-01-30 21:39 ` [PATCH v2 13/14] commit-graph: close under reachability Derrick Stolee
2018-01-30 21:39 ` [PATCH v2 14/14] commit-graph: build graph from starting commits Derrick Stolee
2018-01-30 21:47 ` [PATCH v2 00/14] Serialized Git Commit Graph Stefan Beller
2018-02-01  2:34   ` Stefan Beller
2018-02-08 20:37 ` [PATCH v3 " Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 01/14] commit-graph: add format document Derrick Stolee
2018-02-08 21:21     ` Junio C Hamano
2018-02-08 21:33       ` Derrick Stolee
2018-02-08 23:16         ` Junio C Hamano
2018-02-08 20:37   ` [PATCH v3 02/14] graph: add commit graph design document Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 03/14] commit-graph: create git-commit-graph builtin Derrick Stolee
2018-02-08 21:27     ` Junio C Hamano
2018-02-08 21:36       ` Derrick Stolee
2018-02-08 23:21         ` Junio C Hamano
2018-02-08 20:37   ` [PATCH v3 04/14] commit-graph: implement write_commit_graph() Derrick Stolee
2018-02-08 22:14     ` Junio C Hamano
2018-02-15 18:19     ` Junio C Hamano
2018-02-15 18:23       ` Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 05/14] commit-graph: implement 'git-commit-graph write' Derrick Stolee
2018-02-13 21:57     ` Jonathan Tan
2018-02-08 20:37   ` [PATCH v3 06/14] commit-graph: implement 'git-commit-graph read' Derrick Stolee
2018-02-08 23:38     ` Junio C Hamano
2018-02-08 20:37   ` [PATCH v3 07/14] commit-graph: update graph-head during write Derrick Stolee
2018-02-12 18:56     ` Junio C Hamano
2018-02-12 20:37       ` Junio C Hamano
2018-02-12 21:24         ` Derrick Stolee
2018-02-13 22:38     ` Jonathan Tan
2018-02-08 20:37   ` [PATCH v3 08/14] commit-graph: implement 'git-commit-graph clear' Derrick Stolee
2018-02-13 22:49     ` Jonathan Tan
2018-02-08 20:37   ` [PATCH v3 09/14] commit-graph: implement --delete-expired Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 10/14] commit-graph: add core.commitGraph setting Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 11/14] commit: integrate commit graph with commit parsing Derrick Stolee
2018-02-14  0:12     ` Jonathan Tan
2018-02-14 18:08       ` Derrick Stolee
2018-02-15 18:25     ` Junio C Hamano
2018-02-08 20:37   ` [PATCH v3 12/14] commit-graph: close under reachability Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 13/14] commit-graph: read only from specific pack-indexes Derrick Stolee
2018-02-08 20:37   ` [PATCH v3 14/14] commit-graph: build graph from starting commits Derrick Stolee
2018-02-09 13:02     ` SZEDER Gábor
2018-02-09 13:45       ` Derrick Stolee
2018-02-14 18:15   ` [PATCH v3 00/14] Serialized Git Commit Graph Derrick Stolee
2018-02-14 18:27     ` Stefan Beller
2018-02-14 19:11       ` Derrick Stolee
2018-02-19 18:53     ` [PATCH v4 00/13] " Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 01/13] commit-graph: add format document Derrick Stolee
2018-02-20 20:49         ` Junio C Hamano
2018-02-21 19:23         ` Stefan Beller
2018-02-21 19:45           ` Derrick Stolee
2018-02-21 19:48             ` Stefan Beller
2018-03-30 13:25         ` Jakub Narebski
2018-04-02 13:09           ` Derrick Stolee
2018-04-02 14:09             ` Jakub Narebski
2018-02-19 18:53       ` [PATCH v4 02/13] graph: add commit graph design document Derrick Stolee
2018-02-20 21:42         ` Junio C Hamano
2018-02-23 15:44           ` Derrick Stolee
2018-02-21 19:34         ` Stefan Beller
2018-02-19 18:53       ` [PATCH v4 03/13] commit-graph: create git-commit-graph builtin Derrick Stolee
2018-02-20 21:51         ` Junio C Hamano
2018-02-21 18:58           ` Junio C Hamano
2018-02-23 16:07             ` Derrick Stolee
2018-02-26 16:25         ` SZEDER Gábor
2018-02-26 17:08           ` Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 04/13] commit-graph: implement write_commit_graph() Derrick Stolee
2018-02-20 22:57         ` Junio C Hamano
2018-02-23 17:23           ` Derrick Stolee
2018-02-23 19:30             ` Junio C Hamano
2018-02-23 19:48               ` Junio C Hamano
2018-02-23 20:02               ` Derrick Stolee
2018-02-26 16:10         ` SZEDER Gábor
2018-02-28 18:47         ` Junio C Hamano
2018-02-19 18:53       ` [PATCH v4 05/13] commit-graph: implement 'git-commit-graph write' Derrick Stolee
2018-02-21 19:25         ` Junio C Hamano
2018-02-19 18:53       ` [PATCH v4 06/13] commit-graph: implement git commit-graph read Derrick Stolee
2018-02-21 20:11         ` Junio C Hamano
2018-02-22 18:25           ` Junio C Hamano
2018-02-19 18:53       ` [PATCH v4 07/13] commit-graph: implement --set-latest Derrick Stolee
2018-02-22 18:31         ` Junio C Hamano
2018-02-23 17:53           ` Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 08/13] commit-graph: implement --delete-expired Derrick Stolee
2018-02-21 21:34         ` Stefan Beller
2018-02-23 17:43           ` Derrick Stolee
2018-02-22 18:48         ` Junio C Hamano
2018-02-23 17:59           ` Derrick Stolee
2018-02-23 19:33             ` Junio C Hamano
2018-02-23 19:41               ` Derrick Stolee
2018-02-23 19:51                 ` Junio C Hamano
2018-02-19 18:53       ` [PATCH v4 09/13] commit-graph: add core.commitGraph setting Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 10/13] commit-graph: close under reachability Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 11/13] commit: integrate commit graph with commit parsing Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 12/13] commit-graph: read only from specific pack-indexes Derrick Stolee
2018-02-21 22:25         ` Stefan Beller
2018-02-23 19:19           ` Derrick Stolee
2018-02-19 18:53       ` [PATCH v4 13/13] commit-graph: build graph from starting commits Derrick Stolee
2018-03-30 11:10       ` [PATCH v4 00/13] Serialized Git Commit Graph Jakub Narebski
2018-04-02 13:02         ` Derrick Stolee
2018-04-02 14:46           ` Jakub Narebski
2018-04-02 15:02             ` Derrick Stolee
2018-04-02 17:35               ` Stefan Beller
2018-04-02 17:54                 ` Derrick Stolee
2018-04-02 18:02                   ` Stefan Beller
2018-04-07 22:37               ` Jakub Narebski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11c4f90e-558c-b80c-61f0-f70cdcf6edd9@gmail.com \
    --to=stolee@gmail.com \
    --cc=dstolee@microsoft.com \
    --cc=git@jeffhostetler.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jonathantanmy@google.com \
    --cc=peff@peff.net \
    --cc=sbeller@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).