From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: sandals@crustytoothpaste.net, avarab@gmail.com,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v3 0/6] Create commit-graph file format v2
Date: Wed, 01 May 2019 06:11:13 -0700 (PDT) [thread overview]
Message-ID: <pull.112.v3.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.112.v2.git.gitgitgadget@gmail.com>
The commit-graph file format has some shortcomings that were discussed
on-list:
1. It doesn't use the 4-byte format ID from the_hash_algo.
2. There is no way to change the reachability index from generation numbers
to corrected commit date [1].
3. The unused byte in the format could be used to signal the file is
incremental, but current clients ignore the value even if it is
non-zero.
This series adds a new version (2) to the commit-graph file. The fifth byte
already specified the file format, so existing clients will gracefully
respond to files with a different version number. The only real change now
is that the header takes 12 bytes instead of 8, due to using the 4-byte
format ID for the hash algorithm.
The new bytes reserved for the reachability index version and incremental
file formats are now expected to be equal to the defaults. When we update
these values to be flexible in the future, if a client understands
commit-graph v2 but not those new values, then it will fail gracefully.
NOTE: this series was rebased onto ab/commit-graph-fixes, as the conflicts
were significant and subtle.
Updates in V3: Thanks for all the feedback so far!
* Moved the version information into an unsigned char parameter, instead of
a flag.
* We no longer default to the v2 file format, as that will break users who
downgrade. This required some changes to the test script.
* Removed the "Future work" section from the commit-graph design document
in a new patch.
* I did not change the file name for v2 file formats, as Ævar suggested.
I'd like the discussion to continue on this topic.
Thanks, -Stolee
[1]
https://public-inbox.org/git/6367e30a-1b3a-4fe9-611b-d931f51effef@gmail.com/
Derrick Stolee (6):
commit-graph: return with errors during write
commit-graph: collapse parameters into flags
commit-graph: create new version parameter
commit-graph: add --version=<n> option
commit-graph: implement file format version 2
commit-graph: remove Future Work section
Documentation/git-commit-graph.txt | 3 +
.../technical/commit-graph-format.txt | 26 ++-
Documentation/technical/commit-graph.txt | 17 --
builtin/commit-graph.c | 33 ++--
builtin/commit.c | 5 +-
builtin/gc.c | 8 +-
commit-graph.c | 153 +++++++++++++-----
commit-graph.h | 16 +-
t/t5318-commit-graph.sh | 75 ++++++++-
9 files changed, 250 insertions(+), 86 deletions(-)
base-commit: 93b4405ffe4ad9308740e7c1c71383bfc369baaa
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-112%2Fderrickstolee%2Fgraph%2Fv2-head-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-112/derrickstolee/graph/v2-head-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/112
Range-diff vs v2:
1: 91f300ec0a = 1: 91f300ec0a commit-graph: return with errors during write
2: 04f5df1135 ! 2: 924b22f990 commit-graph: collapse parameters into flags
@@ -86,7 +86,7 @@
-int write_commit_graph_reachable(const char *obj_dir, int append,
- int report_progress)
-+int write_commit_graph_reachable(const char *obj_dir, int flags)
++int write_commit_graph_reachable(const char *obj_dir, unsigned int flags)
{
struct string_list list = STRING_LIST_INIT_DUP;
int result;
@@ -103,7 +103,7 @@
struct string_list *pack_indexes,
struct string_list *commit_hex,
- int append, int report_progress)
-+ int flags)
++ unsigned int flags)
{
struct packed_oid_list oids;
struct packed_commit_list commits;
@@ -129,12 +129,12 @@
+#define COMMIT_GRAPH_APPEND (1 << 0)
+#define COMMIT_GRAPH_PROGRESS (1 << 1)
+
-+int write_commit_graph_reachable(const char *obj_dir, int flags);
++int write_commit_graph_reachable(const char *obj_dir, unsigned int flags);
int write_commit_graph(const char *obj_dir,
struct string_list *pack_indexes,
struct string_list *commit_hex,
- int append, int report_progress);
-+ int flags);
++ unsigned int flags);
int verify_commit_graph(struct repository *r, struct commit_graph *g);
3: 4ddb829163 ! 3: 8446011a43 commit-graph: create new version flags
@@ -1,12 +1,12 @@
Author: Derrick Stolee <dstolee@microsoft.com>
- commit-graph: create new version flags
+ commit-graph: create new version parameter
In anticipation of a new commit-graph file format version, create
- a flag for the write_commit_graph() and write_commit_graph_reachable()
+ a parameter for the write_commit_graph() and write_commit_graph_reachable()
methods to take a version number.
- When there is no specified version, the implementation selects a
+ When the given version is zero, the implementation selects a
default value. Currently, the only valid value is 1.
The file format will change the header information, so place the
@@ -14,6 +14,55 @@
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
+ diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
+ --- a/builtin/commit-graph.c
+ +++ b/builtin/commit-graph.c
+@@
+ read_replace_refs = 0;
+
+ if (opts.reachable)
+- return write_commit_graph_reachable(opts.obj_dir, flags);
++ return write_commit_graph_reachable(opts.obj_dir, flags, 0);
+
+ string_list_init(&lines, 0);
+ if (opts.stdin_packs || opts.stdin_commits) {
+@@
+ result = write_commit_graph(opts.obj_dir,
+ pack_indexes,
+ commit_hex,
+- flags);
++ flags, 0);
+
+ UNLEAK(lines);
+ return result;
+
+ diff --git a/builtin/commit.c b/builtin/commit.c
+ --- a/builtin/commit.c
+ +++ b/builtin/commit.c
+@@
+ "not exceeded, and then \"git reset HEAD\" to recover."));
+
+ if (git_env_bool(GIT_TEST_COMMIT_GRAPH, 0) &&
+- write_commit_graph_reachable(get_object_directory(), 0))
++ write_commit_graph_reachable(get_object_directory(), 0, 0))
+ return 1;
+
+ repo_rerere(the_repository, 0);
+
+ diff --git a/builtin/gc.c b/builtin/gc.c
+ --- a/builtin/gc.c
+ +++ b/builtin/gc.c
+@@
+
+ if (gc_write_commit_graph &&
+ write_commit_graph_reachable(get_object_directory(),
+- !quiet && !daemonized ? COMMIT_GRAPH_PROGRESS : 0))
++ !quiet && !daemonized ? COMMIT_GRAPH_PROGRESS : 0,
++ 0))
+ return 1;
+
+ if (auto_gc && too_many_loose_objects())
+
diff --git a/commit-graph.c b/commit-graph.c
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -74,18 +123,43 @@
for (i = 0; i < graph->num_chunks; i++) {
uint32_t chunk_id;
uint64_t chunk_offset;
+@@
+ return 0;
+ }
+
+-int write_commit_graph_reachable(const char *obj_dir, unsigned int flags)
++int write_commit_graph_reachable(const char *obj_dir, unsigned int flags,
++ unsigned char version)
+ {
+ struct string_list list = STRING_LIST_INIT_DUP;
+ int result;
+
+ for_each_ref(add_ref_to_list, &list);
+ result = write_commit_graph(obj_dir, NULL, &list,
+- flags);
++ flags, version);
+
+ string_list_clear(&list, 0);
+ return result;
+@@
+ int write_commit_graph(const char *obj_dir,
+ struct string_list *pack_indexes,
+ struct string_list *commit_hex,
+- unsigned int flags)
++ unsigned int flags,
++ unsigned char version)
+ {
+ struct packed_oid_list oids;
+ struct packed_commit_list commits;
@@
int res = 0;
int append = flags & COMMIT_GRAPH_APPEND;
int report_progress = flags & COMMIT_GRAPH_PROGRESS;
-+ int version = 0;
+ int header_size = 0;
if (!commit_graph_compatible(the_repository))
return 0;
-+ if (flags & COMMIT_GRAPH_VERSION_1)
-+ version = 1;
+ if (!version)
+ version = 1;
+ if (version != 1) {
@@ -132,10 +206,18 @@
--- a/commit-graph.h
+++ b/commit-graph.h
@@
-
#define COMMIT_GRAPH_APPEND (1 << 0)
#define COMMIT_GRAPH_PROGRESS (1 << 1)
-+#define COMMIT_GRAPH_VERSION_1 (1 << 2)
- int write_commit_graph_reachable(const char *obj_dir, int flags);
+-int write_commit_graph_reachable(const char *obj_dir, unsigned int flags);
++int write_commit_graph_reachable(const char *obj_dir, unsigned int flags,
++ unsigned char version);
int write_commit_graph(const char *obj_dir,
+ struct string_list *pack_indexes,
+ struct string_list *commit_hex,
+- unsigned int flags);
++ unsigned int flags,
++ unsigned char version);
+
+ int verify_commit_graph(struct repository *r, struct commit_graph *g);
+
4: b1b0c76eb4 ! 4: 6a0e99f9f9 commit-graph: add --version=<n> option
@@ -62,18 +62,29 @@
};
@@
+ if (!opts.obj_dir)
+ opts.obj_dir = get_object_directory();
if (opts.append)
- flags |= COMMIT_GRAPH_APPEND;
+- flags |= COMMIT_GRAPH_APPEND;
++ flags |= COMMIT_GRAPH_APPEND;
-+ switch (opts.version) {
-+ case 1:
-+ flags |= COMMIT_GRAPH_VERSION_1;
-+ break;
-+ }
-+
read_replace_refs = 0;
if (opts.reachable)
+- return write_commit_graph_reachable(opts.obj_dir, flags, 0);
++ return write_commit_graph_reachable(opts.obj_dir, flags, opts.version);
+
+ string_list_init(&lines, 0);
+ if (opts.stdin_packs || opts.stdin_commits) {
+@@
+ result = write_commit_graph(opts.obj_dir,
+ pack_indexes,
+ commit_hex,
+- flags, 0);
++ flags, opts.version);
+
+ UNLEAK(lines);
+ return result;
diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh
--- a/t/t5318-commit-graph.sh
5: 09362bda1b ! 5: cca8267dfe commit-graph: implement file format version 2
@@ -23,14 +23,8 @@
non-zero.
Update the 'git commit-graph read' subcommand to display the new
- data.
-
- Set the default file format version to 2, and adjust the tests to
- expect the new 'git commit-graph read' output.
-
- Add explicit tests for the upgrade path from version 1 to 2. Users
- with an existing commit-graph with version 1 will seamlessly
- upgrade to version 2 on their next write.
+ data, and check this output in the test that explicitly writes a
+ v2 commit-graph file.
While we converted the existing 'verify' tests to use a version 1
file to avoid recalculating data offsets, add explicit 'verify'
@@ -103,17 +97,6 @@
printf("num_commits: %u\n", graph->num_commits);
printf("chunks:");
-@@
- case 1:
- flags |= COMMIT_GRAPH_VERSION_1;
- break;
-+
-+ case 2:
-+ flags |= COMMIT_GRAPH_VERSION_2;
-+ break;
- }
-
- read_replace_refs = 0;
diff --git a/commit-graph.c b/commit-graph.c
--- a/commit-graph.c
@@ -170,14 +153,9 @@
graph->hash_len = the_hash_algo->rawsz;
@@
- if (flags & COMMIT_GRAPH_VERSION_1)
- version = 1;
-+ if (flags & COMMIT_GRAPH_VERSION_2)
-+ version = 2;
if (!version)
-- version = 1;
+ version = 1;
- if (version != 1) {
-+ version = 2;
+ if (version <= 0 || version > 2) {
error(_("unsupported commit-graph version %d"),
version);
@@ -198,18 +176,6 @@
chunk_ids[0] = GRAPH_CHUNKID_OIDFANOUT;
- diff --git a/commit-graph.h b/commit-graph.h
- --- a/commit-graph.h
- +++ b/commit-graph.h
-@@
- #define COMMIT_GRAPH_APPEND (1 << 0)
- #define COMMIT_GRAPH_PROGRESS (1 << 1)
- #define COMMIT_GRAPH_VERSION_1 (1 << 2)
-+#define COMMIT_GRAPH_VERSION_2 (1 << 3)
-
- int write_commit_graph_reachable(const char *obj_dir, int flags);
- int write_commit_graph(const char *obj_dir,
-
diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh
--- a/t/t5318-commit-graph.sh
+++ b/t/t5318-commit-graph.sh
@@ -238,37 +204,37 @@
OPTIONAL=""
NUM_CHUNKS=3
if test ! -z $2
-@@
- NUM_CHUNKS=$((3 + $(echo "$2" | wc -w)))
- fi
- cat >expect <<- EOF
-- header: 43475048 1 1 $NUM_CHUNKS 0
-+ header: 43475048 2 $NUM_CHUNKS 1 0
-+ hash algorithm: 73686131
- num_commits: $1
- chunks: oid_fanout oid_lookup commit_metadata$OPTIONAL
- EOF
@@
)
'
-+test_expect_success 'write v1 graph' '
-+ git commit-graph write --reachable --version=1 &&
-+ git commit-graph verify
-+'
-+
-+graph_git_behavior 'version 1 graph, commit 8 vs merge 2' full commits/8 merge/2
-+graph_git_behavior 'version 1 graph, commit 8 vs merge 2' full commits/8 merge/2
++graph_read_expect_v2 () {
++ OPTIONAL=""
++ NUM_CHUNKS=3
++ if test ! -z $2
++ then
++ OPTIONAL=" $2"
++ NUM_CHUNKS=$((3 + $(echo "$2" | wc -w)))
++ fi
++ cat >expect <<- EOF
++ header: 43475048 2 $NUM_CHUNKS 1 0
++ hash algorithm: 73686131
++ num_commits: $1
++ chunks: oid_fanout oid_lookup commit_metadata$OPTIONAL
++ EOF
++ git commit-graph read >output &&
++ test_cmp expect output
++}
+
-+test_expect_success 'upgrade from v1 to v2' '
-+ git checkout -b new-commit-for-upgrade &&
-+ test_commit force-upgrade &&
++test_expect_success 'write v2 graph' '
++ cd "$TRASH_DIRECTORY/full" &&
+ git commit-graph write --reachable --version=2 &&
++ graph_read_expect_v2 11 extra_edges &&
+ git commit-graph verify
+'
+
-+graph_git_behavior 'upgraded graph, commit 8 vs merge 2' full commits/8 merge/2
-+graph_git_behavior 'upgraded graph, commit 8 vs merge 2' full commits/8 merge/2
++graph_git_behavior 'version 2 graph, commit 8 vs merge 2' full commits/8 merge/2
++graph_git_behavior 'version 2 graph, commit 8 vs merge 2' full commits/8 merge/2
+
# the verify tests below expect the commit-graph to contain
# exactly the commits reachable from the commits/8 branch.
-: ---------- > 6: e72bca6c78 commit-graph: remove Future Work section
--
gitgitgadget
next prev parent reply other threads:[~2019-05-01 13:11 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-23 21:59 [PATCH 0/6] Create commit-graph file format v2 Derrick Stolee via GitGitGadget
2019-01-23 21:59 ` [PATCH 1/6] commit-graph: return with errors during write Derrick Stolee via GitGitGadget
2019-01-23 21:59 ` [PATCH 2/6] commit-graph: collapse parameters into flags Derrick Stolee via GitGitGadget
2019-01-23 21:59 ` [PATCH 3/6] commit-graph: create new version flags Derrick Stolee via GitGitGadget
2019-01-23 21:59 ` [PATCH 4/6] commit-graph: add --version=<n> option Derrick Stolee via GitGitGadget
2019-01-24 9:31 ` Ævar Arnfjörð Bjarmason
2019-01-23 21:59 ` [PATCH 5/6] commit-graph: implement file format version 2 Derrick Stolee via GitGitGadget
2019-01-23 23:56 ` Jonathan Tan
2019-01-24 9:40 ` Ævar Arnfjörð Bjarmason
2019-01-24 14:34 ` Derrick Stolee
2019-03-21 9:21 ` Ævar Arnfjörð Bjarmason
2019-01-23 21:59 ` [PATCH 6/6] commit-graph: test verifying a corrupt v2 header Derrick Stolee via GitGitGadget
2019-01-23 23:59 ` Jonathan Tan
2019-01-24 23:05 ` [PATCH 0/6] Create commit-graph file format v2 Junio C Hamano
2019-01-24 23:39 ` Junio C Hamano
2019-01-25 13:54 ` Derrick Stolee
2019-04-24 19:58 ` [PATCH v2 0/5] " Derrick Stolee via GitGitGadget
2019-04-24 19:58 ` [PATCH v2 1/5] commit-graph: return with errors during write Derrick Stolee via GitGitGadget
2019-04-24 19:58 ` [PATCH v2 2/5] commit-graph: collapse parameters into flags Derrick Stolee via GitGitGadget
2019-04-25 5:21 ` Junio C Hamano
2019-04-24 19:58 ` [PATCH v2 3/5] commit-graph: create new version flags Derrick Stolee via GitGitGadget
2019-04-25 5:29 ` Junio C Hamano
2019-04-25 11:09 ` Derrick Stolee
2019-04-25 21:31 ` Ævar Arnfjörð Bjarmason
2019-04-26 2:20 ` Junio C Hamano
2019-04-24 19:58 ` [PATCH v2 4/5] commit-graph: add --version=<n> option Derrick Stolee via GitGitGadget
2019-04-24 19:58 ` [PATCH v2 5/5] commit-graph: implement file format version 2 Derrick Stolee via GitGitGadget
2019-04-25 22:09 ` [PATCH v2 0/5] Create commit-graph file format v2 Ævar Arnfjörð Bjarmason
2019-04-26 2:28 ` Junio C Hamano
2019-04-26 8:33 ` Ævar Arnfjörð Bjarmason
2019-04-26 12:06 ` Derrick Stolee
2019-04-26 13:55 ` Ævar Arnfjörð Bjarmason
2019-04-27 12:57 ` Ævar Arnfjörð Bjarmason
2019-05-01 13:11 ` Derrick Stolee via GitGitGadget [this message]
2019-05-01 13:11 ` [PATCH v3 1/6] commit-graph: return with errors during write Derrick Stolee via GitGitGadget
2019-05-01 14:46 ` Ævar Arnfjörð Bjarmason
2019-05-01 13:11 ` [PATCH v3 2/6] commit-graph: collapse parameters into flags Derrick Stolee via GitGitGadget
2019-05-01 13:11 ` [PATCH v3 3/6] commit-graph: create new version parameter Derrick Stolee via GitGitGadget
2019-05-01 13:11 ` [PATCH v3 4/6] commit-graph: add --version=<n> option Derrick Stolee via GitGitGadget
2019-05-01 13:11 ` [PATCH v3 5/6] commit-graph: implement file format version 2 Derrick Stolee via GitGitGadget
2019-05-01 19:12 ` Ævar Arnfjörð Bjarmason
2019-05-01 19:56 ` Derrick Stolee
2019-05-01 13:11 ` [PATCH v3 6/6] commit-graph: remove Future Work section Derrick Stolee via GitGitGadget
2019-05-01 14:58 ` Ævar Arnfjörð Bjarmason
2019-05-01 19:59 ` Derrick Stolee
2019-05-01 20:25 ` [PATCH v3 0/6] Create commit-graph file format v2 Ævar Arnfjörð Bjarmason
2019-05-02 13:26 ` Derrick Stolee
2019-05-02 18:02 ` Ævar Arnfjörð Bjarmason
2019-05-03 12:47 ` Derrick Stolee
2019-05-03 13:41 ` Ævar Arnfjörð Bjarmason
2019-05-06 8:27 ` Christian Couder
2019-05-06 13:47 ` Derrick Stolee
2019-05-03 14:16 ` SZEDER Gábor
2019-05-03 15:11 ` Derrick Stolee
2019-05-09 14:22 ` [PATCH v4 00/11] Commit-graph write refactor (was: Create commit-graph file format v2) Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 01/11] commit-graph: fix the_repository reference Derrick Stolee via GitGitGadget
2019-05-13 2:56 ` Junio C Hamano
2019-05-09 14:22 ` [PATCH v4 02/11] commit-graph: return with errors during write Derrick Stolee via GitGitGadget
2019-05-13 3:13 ` Junio C Hamano
2019-05-13 11:04 ` Derrick Stolee
2019-05-13 11:22 ` Derrick Stolee
2019-05-09 14:22 ` [PATCH v4 03/11] commit-graph: collapse parameters into flags Derrick Stolee via GitGitGadget
2019-05-13 3:44 ` Junio C Hamano
2019-05-13 11:07 ` Derrick Stolee
2019-05-09 14:22 ` [PATCH v4 04/11] commit-graph: remove Future Work section Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 05/11] commit-graph: create write_commit_graph_context Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 07/11] commit-graph: extract fill_oids_from_commit_hex() Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 06/11] commit-graph: extract fill_oids_from_packs() Derrick Stolee via GitGitGadget
2019-05-13 5:05 ` Junio C Hamano
2019-05-09 14:22 ` [PATCH v4 08/11] commit-graph: extract fill_oids_from_all_packs() Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 09/11] commit-graph: extract count_distinct_commits() Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 10/11] commit-graph: extract copy_oids_to_commits() Derrick Stolee via GitGitGadget
2019-05-09 14:22 ` [PATCH v4 11/11] commit-graph: extract write_commit_graph_file() Derrick Stolee via GitGitGadget
2019-05-13 5:09 ` Junio C Hamano
2019-05-09 17:58 ` [PATCH v4 00/11] Commit-graph write refactor (was: Create commit-graph file format v2) Josh Steadmon
2019-06-12 13:29 ` [PATCH v5 " Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 01/11] commit-graph: fix the_repository reference Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 02/11] commit-graph: return with errors during write Derrick Stolee via GitGitGadget
2019-06-29 17:23 ` SZEDER Gábor
2019-07-01 12:19 ` Derrick Stolee
2019-06-12 13:29 ` [PATCH v5 03/11] commit-graph: collapse parameters into flags Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 04/11] commit-graph: remove Future Work section Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 05/11] commit-graph: create write_commit_graph_context Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 06/11] commit-graph: extract fill_oids_from_packs() Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 08/11] commit-graph: extract fill_oids_from_all_packs() Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 07/11] commit-graph: extract fill_oids_from_commit_hex() Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 09/11] commit-graph: extract count_distinct_commits() Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 10/11] commit-graph: extract copy_oids_to_commits() Derrick Stolee via GitGitGadget
2019-06-12 13:29 ` [PATCH v5 11/11] commit-graph: extract write_commit_graph_file() Derrick Stolee via GitGitGadget
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=pull.112.v3.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=sandals@crustytoothpaste.net \
/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).