From: Ben Peart <Ben.Peart@microsoft.com>
To: "git@vger.kernel.org" <git@vger.kernel.org>
Cc: "gitster@pobox.com" <gitster@pobox.com>,
"pclouds@gmail.com" <pclouds@gmail.com>,
Ben Peart <Ben.Peart@microsoft.com>
Subject: [PATCH v2 0/3] read-cache: speed up index load through parallelization
Date: Wed, 29 Aug 2018 15:25:18 +0000 [thread overview]
Message-ID: <20180829152500.46640-1-benpeart@microsoft.com> (raw)
In-Reply-To: <20180823154053.20212-1-benpeart@microsoft.com>
The big changes in this itteration are:
- Switched to index.threads to provide control over the use of threading
- Added another worker thread to load the index extensions in parallel
- Applied optimization expand_name_field() suggested by Duy
The net result of these optimizations is a savings of 25.8% (1,000,000 files)
to 38.1% (100,000 files) as measured by p0002-read-cache.sh.
This patch conflicts with Duy's patch to remove the double memory copy and
pass in the previous ce instead. The two will need to be merged/reconciled
once they settle down a bit.
Base Ref: master
Web-Diff: https://github.com/benpeart/git/commit/39f2b0f5fe
Checkout: git fetch https://github.com/benpeart/git read-index-multithread-v2 && git checkout 39f2b0f5fe
### Interdiff (v1..v2):
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 3344685cc4..79f8296d9c 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -899,14 +899,6 @@ relatively high IO latencies. When enabled, Git will do the
index comparison to the filesystem data in parallel, allowing
overlapping IO's. Defaults to true.
-core.fastIndex::
- Enable parallel index loading
-+
-This can speed up operations like 'git diff' and 'git status' especially
-when the index is very large. When enabled, Git will do the index
-loading from the on disk format to the in-memory format in parallel.
-Defaults to true.
-
core.createObject::
You can set this to 'link', in which case a hardlink followed by
a delete of the source are used to make sure that object creation
@@ -2399,6 +2391,12 @@ imap::
The configuration variables in the 'imap' section are described
in linkgit:git-imap-send[1].
+index.threads::
+ Specifies the number of threads to spawn when loading the index.
+ This is meant to reduce index load time on multiprocessor machines.
+ Specifying 0 or 'true' will cause Git to auto-detect the number of
+ CPU's and set the number of threads accordingly. Defaults to 'true'.
+
index.version::
Specify the version with which new index files should be
initialized. This does not affect existing repositories.
diff --git a/config.c b/config.c
index 883092fdd3..3bda124550 100644
--- a/config.c
+++ b/config.c
@@ -2289,17 +2289,18 @@ int git_config_get_fsmonitor(void)
return 0;
}
-int git_config_get_fast_index(void)
+int git_config_get_index_threads(void)
{
- int val;
+ int is_bool, val;
- if (!git_config_get_maybe_bool("core.fastindex", &val))
+ if (!git_config_get_bool_or_int("index.threads", &is_bool, &val)) {
+ if (is_bool)
+ return val ? 0 : 1;
+ else
return val;
+ }
- if (getenv("GIT_FASTINDEX_TEST"))
- return 1;
-
- return -1; /* default value */
+ return 0; /* auto-detect */
}
NORETURN
diff --git a/config.h b/config.h
index 74ca4e7db5..a06027e69b 100644
--- a/config.h
+++ b/config.h
@@ -250,7 +250,7 @@ extern int git_config_get_untracked_cache(void);
extern int git_config_get_split_index(void);
extern int git_config_get_max_percent_split_change(void);
extern int git_config_get_fsmonitor(void);
-extern int git_config_get_fast_index(void);
+extern int git_config_get_index_threads(void);
/* This dies if the configured or default date is in the future */
extern int git_config_get_expiry(const char *key, const char **output);
diff --git a/read-cache.c b/read-cache.c
index 0fa7e1a04c..f5e7c86c42 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -24,10 +24,6 @@
#include "utf8.h"
#include "fsmonitor.h"
-#ifndef min
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-#endif
-
/* Mask for the name length in ce_flags in the on-disk index */
#define CE_NAMEMASK (0x0fff)
@@ -1758,9 +1754,8 @@ static unsigned long expand_name_field(struct strbuf *name, const char *cp_)
if (name->len < len)
die("malformed name field in the index");
- strbuf_remove(name, name->len - len, len);
- for (ep = cp; *ep; ep++)
- ; /* find the end */
+ strbuf_setlen(name, name->len - len);
+ ep = cp + strlen((const char *)cp);
strbuf_add(name, cp, ep - cp);
return (const char *)ep + 1 - cp_;
}
@@ -1893,7 +1888,13 @@ static size_t estimate_cache_size(size_t ondisk_size, unsigned int entries)
return ondisk_size + entries * per_entry;
}
-static unsigned long load_cache_entry_block(struct index_state *istate, struct mem_pool *ce_mem_pool, int offset, int nr, void *mmap, unsigned long start_offset, struct strbuf *previous_name)
+/*
+ * A helper function that will load the specified range of cache entries
+ * from the memory mapped file and add them to the given index.
+ */
+static unsigned long load_cache_entry_block(struct index_state *istate,
+ struct mem_pool *ce_mem_pool, int offset, int nr, void *mmap,
+ unsigned long start_offset, struct strbuf *previous_name)
{
int i;
unsigned long src_offset = start_offset;
@@ -1912,7 +1913,8 @@ static unsigned long load_cache_entry_block(struct index_state *istate, struct m
return src_offset - start_offset;
}
-static unsigned long load_all_cache_entries(struct index_state *istate, void *mmap, size_t mmap_size, unsigned long src_offset)
+static unsigned long load_all_cache_entries(struct index_state *istate,
+ void *mmap, size_t mmap_size, unsigned long src_offset)
{
struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
unsigned long consumed;
@@ -1927,7 +1929,8 @@ static unsigned long load_all_cache_entries(struct index_state *istate, void *mm
estimate_cache_size(mmap_size, istate->cache_nr));
}
- consumed = load_cache_entry_block(istate, istate->ce_mem_pool, 0, istate->cache_nr, mmap, src_offset, previous_name);
+ consumed = load_cache_entry_block(istate, istate->ce_mem_pool,
+ 0, istate->cache_nr, mmap, src_offset, previous_name);
strbuf_release(&previous_name_buf);
return consumed;
}
@@ -1955,67 +1958,110 @@ struct load_cache_entries_thread_data
struct mem_pool *ce_mem_pool;
int offset, nr;
void *mmap;
+ size_t mmap_size;
unsigned long start_offset;
struct strbuf previous_name_buf;
struct strbuf *previous_name;
unsigned long consumed; /* return # of bytes in index file processed */
};
-/*
-* A thread proc to run the load_cache_entries() computation
-* across multiple background threads.
-*/
static void *load_cache_entries_thread(void *_data)
{
struct load_cache_entries_thread_data *p = _data;
- p->consumed += load_cache_entry_block(p->istate, p->ce_mem_pool, p->offset, p->nr, p->mmap, p->start_offset, p->previous_name);
+ p->consumed += load_cache_entry_block(p->istate, p->ce_mem_pool,
+ p->offset, p->nr, p->mmap, p->start_offset, p->previous_name);
+ return NULL;
+}
+
+static void *load_index_extensions_thread(void *_data)
+{
+ struct load_cache_entries_thread_data *p = _data;
+ unsigned long src_offset = p->start_offset;
+
+ while (src_offset <= p->mmap_size - the_hash_algo->rawsz - 8) {
+ /* After an array of active_nr index entries,
+ * there can be arbitrary number of extended
+ * sections, each of which is prefixed with
+ * extension name (4-byte) and section length
+ * in 4-byte network byte order.
+ */
+ uint32_t extsize;
+ memcpy(&extsize, (char *)p->mmap + src_offset + 4, 4);
+ extsize = ntohl(extsize);
+ if (read_index_extension(p->istate,
+ (const char *)p->mmap + src_offset,
+ (char *)p->mmap + src_offset + 8,
+ extsize) < 0) {
+ munmap(p->mmap, p->mmap_size);
+ die("index file corrupt");
+ }
+ src_offset += 8;
+ src_offset += extsize;
+ }
+ p->consumed += src_offset - p->start_offset;
+
return NULL;
}
-static unsigned long load_cache_entries(struct index_state *istate, void *mmap, size_t mmap_size, unsigned long src_offset)
+static unsigned long load_cache_entries(struct index_state *istate,
+ void *mmap, size_t mmap_size, unsigned long src_offset)
{
struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
struct load_cache_entries_thread_data *data;
- int threads, cpus, thread_nr;
+ int nr_threads, cpus, ce_per_thread;
unsigned long consumed;
int i, thread;
+ nr_threads = git_config_get_index_threads();
+ if (!nr_threads) {
cpus = online_cpus();
- threads = istate->cache_nr / THREAD_COST;
- if (threads > cpus)
- threads = cpus;
+ nr_threads = istate->cache_nr / THREAD_COST;
+ if (nr_threads > cpus)
+ nr_threads = cpus;
+ }
/* enable testing with fewer than default minimum of entries */
- if ((istate->cache_nr > 1) && (threads < 2) && getenv("GIT_FASTINDEX_TEST"))
- threads = 2;
+ if ((istate->cache_nr > 1) && (nr_threads < 2) && git_env_bool("GIT_INDEX_THREADS_TEST", 0))
+ nr_threads = 2;
- if (threads < 2 || !git_config_get_fast_index())
+ if (nr_threads < 2)
return load_all_cache_entries(istate, mmap, mmap_size, src_offset);
+ /* a little sanity checking */
+ if (istate->name_hash_initialized)
+ die("the name hash isn't thread safe");
+
mem_pool_init(&istate->ce_mem_pool, 0);
if (istate->version == 4)
previous_name = &previous_name_buf;
else
previous_name = NULL;
- thread_nr = (istate->cache_nr + threads - 1) / threads;
- data = xcalloc(threads, sizeof(struct load_cache_entries_thread_data));
+ /* allocate an extra thread for loading the index extensions */
+ ce_per_thread = DIV_ROUND_UP(istate->cache_nr, nr_threads);
+ data = xcalloc(nr_threads + 1, sizeof(struct load_cache_entries_thread_data));
- /* loop through index entries starting a thread for every thread_nr entries */
+ /*
+ * Loop through index entries starting a thread for every ce_per_thread
+ * entries.
+ */
consumed = thread = 0;
- for (i = 0; ; i++) {
+ for (i = 0; i < istate->cache_nr; i++) {
struct ondisk_cache_entry *ondisk;
const char *name;
unsigned int flags;
- /* we've reached the begining of a block of cache entries, kick off a thread to process them */
- if (0 == i % thread_nr) {
+ /*
+ * we've reached the beginning of a block of cache entries,
+ * kick off a thread to process them
+ */
+ if (0 == i % ce_per_thread) {
struct load_cache_entries_thread_data *p = &data[thread];
p->istate = istate;
p->offset = i;
- p->nr = min(thread_nr, istate->cache_nr - i);
+ p->nr = ce_per_thread < istate->cache_nr - i ? ce_per_thread : istate->cache_nr - i;
/* create a mem_pool for each thread */
if (istate->version == 4)
@@ -2034,8 +2080,8 @@ static unsigned long load_cache_entries(struct index_state *istate, void *mmap,
if (pthread_create(&p->pthread, NULL, load_cache_entries_thread, p))
die("unable to create load_cache_entries_thread");
- if (++thread == threads || p->nr != thread_nr)
- break;
+
+ ++thread;
}
ondisk = (struct ondisk_cache_entry *)((char *)mmap + src_offset);
@@ -2064,7 +2110,18 @@ static unsigned long load_cache_entries(struct index_state *istate, void *mmap,
src_offset += (name - ((char *)ondisk)) + expand_name_field(previous_name, name);
}
- for (i = 0; i < threads; i++) {
+ /* create a thread to load the index extensions */
+ struct load_cache_entries_thread_data *p = &data[thread];
+ p->istate = istate;
+ mem_pool_init(&p->ce_mem_pool, 0);
+ p->mmap = mmap;
+ p->mmap_size = mmap_size;
+ p->start_offset = src_offset;
+
+ if (pthread_create(&p->pthread, NULL, load_index_extensions_thread, p))
+ die("unable to create load_index_extensions_thread");
+
+ for (i = 0; i < nr_threads + 1; i++) {
struct load_cache_entries_thread_data *p = data + i;
if (pthread_join(p->pthread, NULL))
die("unable to join load_cache_entries_thread");
### Patches
Ben Peart (3):
read-cache: speed up index load through parallelization
read-cache: load cache extensions on worker thread
read-cache: micro-optimize expand_name_field() to speed up V4 index
parsing.
Documentation/config.txt | 6 +
config.c | 14 ++
config.h | 1 +
read-cache.c | 281 +++++++++++++++++++++++++++++++++++----
4 files changed, 275 insertions(+), 27 deletions(-)
base-commit: 29d9e3e2c47dd4b5053b0a98c891878d398463e3
--
2.18.0.windows.1
next prev parent reply other threads:[~2018-08-29 15:26 UTC|newest]
Thread overview: 199+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-23 15:41 [PATCH v1] read-cache: speed up index load through parallelization Ben Peart
2018-08-23 17:31 ` Stefan Beller
2018-08-23 19:44 ` Ben Peart
2018-08-24 18:40 ` Duy Nguyen
2018-08-28 14:53 ` Ben Peart
2018-08-23 18:06 ` Junio C Hamano
2018-08-23 20:33 ` Ben Peart
2018-08-24 15:37 ` Duy Nguyen
2018-08-24 15:57 ` Duy Nguyen
2018-08-24 17:28 ` Ben Peart
2018-08-25 6:44 ` [PATCH] read-cache.c: optimize reading index format v4 Nguyễn Thái Ngọc Duy
2018-08-27 19:36 ` Junio C Hamano
2018-08-28 19:25 ` Duy Nguyen
2018-08-28 23:54 ` Ben Peart
2018-08-29 17:14 ` Junio C Hamano
2018-09-04 16:08 ` Duy Nguyen
2018-09-02 13:19 ` [PATCH v2 0/1] " Nguyễn Thái Ngọc Duy
2018-09-02 13:19 ` [PATCH v2 1/1] read-cache.c: " Nguyễn Thái Ngọc Duy
2018-09-04 18:58 ` Junio C Hamano
2018-09-04 19:31 ` Junio C Hamano
2018-08-24 18:20 ` [PATCH v1] read-cache: speed up index load through parallelization Duy Nguyen
2018-08-24 18:40 ` Ben Peart
2018-08-24 19:00 ` Duy Nguyen
2018-08-24 19:57 ` Ben Peart
2018-08-29 15:25 ` Ben Peart [this message]
2018-08-29 15:25 ` [PATCH v2 1/3] " Ben Peart
2018-08-29 17:14 ` Junio C Hamano
2018-08-29 21:35 ` Ben Peart
2018-09-03 19:16 ` Duy Nguyen
2018-08-29 15:25 ` [PATCH v2 2/3] read-cache: load cache extensions on worker thread Ben Peart
2018-08-29 17:12 ` Junio C Hamano
2018-08-29 21:42 ` Ben Peart
2018-08-29 22:19 ` Junio C Hamano
2018-09-03 19:21 ` Duy Nguyen
2018-09-03 19:27 ` Duy Nguyen
2018-08-29 15:25 ` [PATCH v2 3/3] read-cache: micro-optimize expand_name_field() to speed up V4 index parsing Ben Peart
2018-09-06 21:03 ` [PATCH v3 0/4] read-cache: speed up index load through parallelization Ben Peart
2018-09-06 21:03 ` [PATCH v3 1/4] read-cache: optimize expand_name_field() to speed up V4 index parsing Ben Peart
2018-09-06 21:03 ` [PATCH v3 2/4] eoie: add End of Index Entry (EOIE) extension Ben Peart
2018-09-07 17:55 ` Junio C Hamano
2018-09-07 20:23 ` Ben Peart
2018-09-08 6:29 ` Martin Ågren
2018-09-08 14:03 ` Ben Peart
2018-09-08 17:08 ` Martin Ågren
2018-09-06 21:03 ` [PATCH v3 3/4] read-cache: load cache extensions on a worker thread Ben Peart
2018-09-07 21:10 ` Junio C Hamano
2018-09-08 14:56 ` Ben Peart
2018-09-06 21:03 ` [PATCH v3 4/4] read-cache: speed up index load through parallelization Ben Peart
2018-09-07 4:16 ` Torsten Bögershausen
2018-09-07 13:43 ` Ben Peart
2018-09-07 17:21 ` [PATCH v3 0/4] " Junio C Hamano
2018-09-07 18:31 ` Ben Peart
2018-09-08 13:18 ` Duy Nguyen
2018-09-11 23:26 ` [PATCH v4 0/5] " Ben Peart
2018-09-11 23:26 ` [PATCH v4 1/5] eoie: add End of Index Entry (EOIE) extension Ben Peart
2018-09-11 23:26 ` [PATCH v4 2/5] read-cache: load cache extensions on a worker thread Ben Peart
2018-09-11 23:26 ` [PATCH v4 3/5] read-cache: speed up index load through parallelization Ben Peart
2018-09-11 23:26 ` [PATCH v4 4/5] read-cache.c: optimize reading index format v4 Ben Peart
2018-09-11 23:26 ` [PATCH v4 5/5] read-cache: clean up casting and byte decoding Ben Peart
2018-09-12 14:34 ` [PATCH v4 0/5] read-cache: speed up index load through parallelization Ben Peart
2018-09-12 16:18 ` [PATCH v5 " Ben Peart
2018-09-12 16:18 ` [PATCH v5 1/5] eoie: add End of Index Entry (EOIE) extension Ben Peart
2018-09-13 22:44 ` Junio C Hamano
2018-09-15 10:02 ` Duy Nguyen
2018-09-17 14:54 ` Ben Peart
2018-09-17 16:05 ` Duy Nguyen
2018-09-17 17:31 ` Junio C Hamano
2018-09-17 17:38 ` Duy Nguyen
2018-09-17 19:08 ` Junio C Hamano
2018-09-12 16:18 ` [PATCH v5 2/5] read-cache: load cache extensions on a worker thread Ben Peart
2018-09-15 10:22 ` Duy Nguyen
2018-09-15 10:24 ` Duy Nguyen
2018-09-17 16:38 ` Ben Peart
2018-09-15 16:23 ` Duy Nguyen
2018-09-17 17:19 ` Junio C Hamano
2018-09-17 16:26 ` Ben Peart
2018-09-17 16:45 ` Duy Nguyen
2018-09-17 21:32 ` Junio C Hamano
2018-09-12 16:18 ` [PATCH v5 3/5] read-cache: load cache entries on worker threads Ben Peart
2018-09-15 10:31 ` Duy Nguyen
2018-09-17 17:25 ` Ben Peart
2018-09-15 11:07 ` Duy Nguyen
2018-09-15 11:09 ` Duy Nguyen
2018-09-17 18:52 ` Ben Peart
2018-09-15 11:29 ` Duy Nguyen
2018-09-12 16:18 ` [PATCH v5 4/5] read-cache.c: optimize reading index format v4 Ben Peart
2018-09-12 16:18 ` [PATCH v5 5/5] read-cache: clean up casting and byte decoding Ben Peart
2018-09-26 19:54 ` [PATCH v6 0/7] speed up index load through parallelization Ben Peart
2018-09-26 19:54 ` [PATCH v6 1/7] read-cache.c: optimize reading index format v4 Ben Peart
2018-09-26 19:54 ` [PATCH v6 2/7] read-cache: clean up casting and byte decoding Ben Peart
2018-09-26 19:54 ` [PATCH v6 3/7] eoie: add End of Index Entry (EOIE) extension Ben Peart
2018-09-28 0:19 ` SZEDER Gábor
2018-09-28 18:38 ` Ben Peart
2018-09-29 0:51 ` SZEDER Gábor
2018-09-29 5:45 ` Duy Nguyen
2018-09-29 18:24 ` Junio C Hamano
2018-09-26 19:54 ` [PATCH v6 4/7] config: add new index.threads config setting Ben Peart
2018-09-28 0:26 ` SZEDER Gábor
2018-09-28 13:39 ` Ben Peart
2018-09-28 17:07 ` Junio C Hamano
2018-09-28 19:41 ` Ben Peart
2018-09-28 20:30 ` Ramsay Jones
2018-09-28 22:15 ` Junio C Hamano
2018-10-01 13:17 ` Ben Peart
2018-10-01 15:06 ` SZEDER Gábor
2018-09-26 19:54 ` [PATCH v6 5/7] read-cache: load cache extensions on a worker thread Ben Peart
2018-09-26 19:54 ` [PATCH v6 6/7] ieot: add Index Entry Offset Table (IEOT) extension Ben Peart
2018-09-26 19:54 ` [PATCH v6 7/7] read-cache: load cache entries on worker threads Ben Peart
2018-09-26 22:06 ` [PATCH v6 0/7] speed up index load through parallelization Junio C Hamano
2018-09-27 17:13 ` Duy Nguyen
2018-10-01 13:45 ` [PATCH v7 " Ben Peart
2018-10-01 13:45 ` [PATCH v7 1/7] read-cache.c: optimize reading index format v4 Ben Peart
2018-10-01 13:45 ` [PATCH v7 2/7] read-cache: clean up casting and byte decoding Ben Peart
2018-10-01 15:10 ` Duy Nguyen
2018-10-01 13:45 ` [PATCH v7 3/7] eoie: add End of Index Entry (EOIE) extension Ben Peart
2018-10-01 15:17 ` SZEDER Gábor
2018-10-02 14:34 ` Ben Peart
2018-10-01 15:30 ` Duy Nguyen
2018-10-02 15:13 ` Ben Peart
2018-10-01 13:45 ` [PATCH v7 4/7] config: add new index.threads config setting Ben Peart
2018-10-01 13:45 ` [PATCH v7 5/7] read-cache: load cache extensions on a worker thread Ben Peart
2018-10-01 15:50 ` Duy Nguyen
2018-10-02 15:00 ` Ben Peart
2018-10-01 13:45 ` [PATCH v7 6/7] ieot: add Index Entry Offset Table (IEOT) extension Ben Peart
2018-10-01 16:27 ` Duy Nguyen
2018-10-02 16:34 ` Ben Peart
2018-10-02 17:02 ` Duy Nguyen
2018-10-01 13:45 ` [PATCH v7 7/7] read-cache: load cache entries on worker threads Ben Peart
2018-10-01 17:09 ` Duy Nguyen
2018-10-02 19:09 ` Ben Peart
2018-10-10 15:59 ` [PATCH v8 0/7] speed up index load through parallelization Ben Peart
2018-10-10 15:59 ` [PATCH v8 1/7] read-cache.c: optimize reading index format v4 Ben Peart
2018-10-10 15:59 ` [PATCH v8 2/7] read-cache: clean up casting and byte decoding Ben Peart
2018-10-10 15:59 ` [PATCH v8 3/7] eoie: add End of Index Entry (EOIE) extension Ben Peart
2018-10-10 15:59 ` [PATCH v8 4/7] config: add new index.threads config setting Ben Peart
2018-10-10 15:59 ` [PATCH v8 5/7] read-cache: load cache extensions on a worker thread Ben Peart
2018-10-10 15:59 ` [PATCH v8 6/7] ieot: add Index Entry Offset Table (IEOT) extension Ben Peart
2018-10-10 15:59 ` [PATCH v8 7/7] read-cache: load cache entries on worker threads Ben Peart
2018-10-19 16:11 ` Jeff King
2018-10-22 2:14 ` Junio C Hamano
2018-10-22 14:40 ` Ben Peart
2018-10-12 3:18 ` [PATCH v8 0/7] speed up index load through parallelization Junio C Hamano
2018-10-14 12:28 ` Duy Nguyen
2018-10-15 17:33 ` Ben Peart
2018-11-13 0:38 ` [PATCH 0/3] Avoid confusing messages from new index extensions (Re: [PATCH v8 0/7] speed up index load through parallelization) Jonathan Nieder
2018-11-13 0:39 ` [PATCH 1/3] eoie: default to not writing EOIE section Jonathan Nieder
2018-11-13 1:05 ` Junio C Hamano
2018-11-13 15:14 ` Ben Peart
2018-11-13 18:25 ` Jonathan Nieder
2018-11-14 1:36 ` Junio C Hamano
2018-11-15 0:19 ` Jonathan Nieder
2018-11-13 0:39 ` [PATCH 2/3] ieot: default to not writing IEOT section Jonathan Nieder
2018-11-13 0:58 ` Jonathan Tan
2018-11-13 1:09 ` Junio C Hamano
2018-11-13 1:12 ` Jonathan Nieder
2018-11-13 15:37 ` Duy Nguyen
2018-11-13 18:09 ` Jonathan Nieder
2018-11-13 15:22 ` Ben Peart
2018-11-13 18:18 ` Jonathan Nieder
2018-11-13 19:15 ` Ben Peart
2018-11-13 21:08 ` Jonathan Nieder
2018-11-14 18:09 ` Ben Peart
2018-11-15 0:05 ` Jonathan Nieder
2018-11-14 3:05 ` Junio C Hamano
2018-11-20 6:09 ` [PATCH v2 0/5] Avoid confusing messages from new index extensions Jonathan Nieder
2018-11-20 6:11 ` [PATCH 1/5] eoie: default to not writing EOIE section Jonathan Nieder
2018-11-20 13:06 ` Ben Peart
2018-11-20 13:21 ` SZEDER Gábor
2018-11-21 16:46 ` Jeff King
2018-11-22 0:47 ` Junio C Hamano
2018-11-20 15:01 ` Ben Peart
2018-11-20 6:12 ` [PATCH 2/5] ieot: default to not writing IEOT section Jonathan Nieder
2018-11-20 13:07 ` Ben Peart
2018-11-26 19:59 ` Stefan Beller
2018-11-26 21:47 ` Ben Peart
2018-11-26 22:02 ` Stefan Beller
2018-11-27 0:50 ` Junio C Hamano
2018-11-20 6:12 ` [PATCH 3/5] index: do not warn about unrecognized extensions Jonathan Nieder
2018-11-20 6:14 ` [PATCH 4/5] index: make index.threads=true enable ieot and eoie Jonathan Nieder
2018-11-20 13:24 ` Ben Peart
2018-11-20 6:15 ` [PATCH 5/5] index: offer advice for unknown index extensions Jonathan Nieder
2018-11-20 9:26 ` Ævar Arnfjörð Bjarmason
2018-11-20 13:30 ` Ben Peart
2018-11-21 0:22 ` Junio C Hamano
2018-11-21 0:39 ` Jonathan Nieder
2018-11-21 0:44 ` Jonathan Nieder
2018-11-21 5:01 ` Junio C Hamano
2018-11-21 5:04 ` Jonathan Nieder
2018-11-21 5:15 ` Junio C Hamano
2018-11-21 5:31 ` Junio C Hamano
2018-11-21 1:03 ` Jonathan Nieder
2018-11-21 4:23 ` Junio C Hamano
2018-11-21 4:57 ` Jonathan Nieder
2018-11-21 9:30 ` Ævar Arnfjörð Bjarmason
2018-11-13 0:40 ` [PATCH 3/3] index: do not warn about unrecognized extensions Jonathan Nieder
2018-11-13 1:10 ` Junio C Hamano
2018-11-13 15:25 ` Ben Peart
2018-11-14 3:24 ` Junio C Hamano
2018-11-14 18:19 ` Ben Peart
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=20180829152500.46640-1-benpeart@microsoft.com \
--to=ben.peart@microsoft.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.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).