From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Cc: Eric Sunshine <sunshine@sunshineco.com>,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH v2 00/21] Various memory leak fixes
Date: Fri, 24 May 2024 12:03:10 +0200 [thread overview]
Message-ID: <cover.1716541556.git.ps@pks.im> (raw)
In-Reply-To: <cover.1716465556.git.ps@pks.im>
[-- Attachment #1: Type: text/plain, Size: 13556 bytes --]
Hi,
this is the second version of my patch series that fixes various memory
leaks in Git. Changes compared to v1:
- t4153 and t7006 aren't marked as passing anymore. I thought they
pass because most of these tests were skipped because of a missing
TTY prerequisite both on my local machine, but also in our CI.
- Add another patch to install the Perl IO:Pty module on Alpine and
Ubuntu. This fulfills the TTY prerequisite and thus surfaces the
memory leaks in both of the above tests.
- Add another unit test for strvec that exercise replacing a string in
the strvec with a copy of itself.
- A bunch of commit message improvements.
Thanks!
Patrick
Patrick Steinhardt (21):
ci: add missing dependency for TTY prereq
t: mark a bunch of tests as leak-free
transport-helper: fix leaking helper name
strbuf: fix leak when `appendwholeline()` fails with EOF
checkout: clarify memory ownership in `unique_tracking_name()`
http: refactor code to clarify memory ownership
config: clarify memory ownership in `git_config_pathname()`
diff: refactor code to clarify memory ownership of prefixes
convert: refactor code to clarify ownership of
check_roundtrip_encoding
builtin/log: stop using globals for log config
builtin/log: stop using globals for format config
config: clarify memory ownership in `git_config_string()`
config: plug various memory leaks
builtin/credential: clear credential before exit
commit-reach: fix memory leak in `ahead_behind()`
submodule: fix leaking memory for submodule entries
strvec: add functions to replace and remove strings
builtin/mv: refactor `add_slash()` to always return allocated strings
builtin/mv duplicate string list memory
builtin/mv: refactor to use `struct strvec`
builtin/mv: fix leaks for submodule gitfile paths
Makefile | 1 +
alias.c | 6 +-
attr.c | 2 +-
attr.h | 2 +-
builtin/blame.c | 2 +-
builtin/checkout.c | 14 +-
builtin/commit.c | 4 +-
builtin/config.c | 2 +-
builtin/credential.c | 2 +
builtin/log.c | 708 ++++++++++--------
builtin/merge.c | 4 +-
builtin/mv.c | 222 +++---
builtin/rebase.c | 2 +-
builtin/receive-pack.c | 6 +-
builtin/repack.c | 8 +-
builtin/worktree.c | 20 +-
checkout.c | 4 +-
checkout.h | 6 +-
ci/install-dependencies.sh | 4 +-
commit-reach.c | 4 +
config.c | 52 +-
config.h | 10 +-
convert.c | 30 +-
convert.h | 2 +-
delta-islands.c | 2 +-
diff.c | 20 +-
environment.c | 16 +-
environment.h | 14 +-
fetch-pack.c | 4 +-
fsck.c | 4 +-
fsmonitor-settings.c | 5 +-
gpg-interface.c | 6 +-
http.c | 50 +-
imap-send.c | 12 +-
mailmap.c | 4 +-
mailmap.h | 4 +-
merge-ll.c | 6 +-
pager.c | 2 +-
pretty.c | 14 +-
promisor-remote.h | 2 +-
remote.c | 20 +-
remote.h | 8 +-
sequencer.c | 2 +-
setup.c | 6 +-
strbuf.c | 4 +-
strvec.c | 20 +
strvec.h | 13 +
submodule-config.c | 2 +
t/t0300-credentials.sh | 2 +
t/t0411-clone-from-partial.sh | 1 +
t/t0610-reftable-basics.sh | 1 +
t/t0611-reftable-httpd.sh | 1 +
t/t1013-read-tree-submodule.sh | 1 +
t/t1306-xdg-files.sh | 1 +
t/t1350-config-hooks-path.sh | 1 +
t/t1400-update-ref.sh | 2 +
t/t2013-checkout-submodule.sh | 1 +
t/t2024-checkout-dwim.sh | 1 +
t/t2060-switch.sh | 1 +
t/t2405-worktree-submodule.sh | 1 +
t/t3007-ls-files-recurse-submodules.sh | 1 +
t/t3203-branch-output.sh | 2 +
t/t3415-rebase-autosquash.sh | 1 +
t/t3426-rebase-submodule.sh | 1 +
t/t3512-cherry-pick-submodule.sh | 1 +
t/t3513-revert-submodule.sh | 1 +
t/t3600-rm.sh | 1 +
t/t3906-stash-submodule.sh | 1 +
t/t4001-diff-rename.sh | 4 +-
t/t4041-diff-submodule-option.sh | 1 +
t/t4043-diff-rename-binary.sh | 1 +
t/t4059-diff-submodule-not-initialized.sh | 1 +
t/t4060-diff-submodule-option-diff-format.sh | 1 +
t/t4120-apply-popt.sh | 1 +
t/t4137-apply-submodule.sh | 1 +
t/t4210-log-i18n.sh | 2 +
t/t5563-simple-http-auth.sh | 1 +
t/t5564-http-proxy.sh | 1 +
t/t5581-http-curl-verbose.sh | 1 +
t/t6006-rev-list-format.sh | 1 +
t/t6041-bisect-submodule.sh | 1 +
t/t6400-merge-df.sh | 1 +
t/t6412-merge-large-rename.sh | 1 +
t/t6426-merge-skip-unneeded-updates.sh | 1 +
t/t6429-merge-sequence-rename-caching.sh | 1 +
t/t6438-submodule-directory-file-conflicts.sh | 1 +
t/t7001-mv.sh | 2 +
t/t7005-editor.sh | 1 +
t/t7102-reset.sh | 1 +
t/t7112-reset-submodule.sh | 1 +
t/t7417-submodule-path-url.sh | 1 +
t/t7421-submodule-summary-add.sh | 1 +
t/t7423-submodule-symlinks.sh | 1 +
t/t9129-git-svn-i18n-commitencoding.sh | 1 -
t/t9139-git-svn-non-utf8-commitencoding.sh | 1 -
t/t9200-git-cvsexportcommit.sh | 1 +
t/t9401-git-cvsserver-crlf.sh | 1 +
t/t9600-cvsimport.sh | 1 +
t/t9601-cvsimport-vendor-branch.sh | 1 +
t/t9602-cvsimport-branches-tags.sh | 1 +
t/t9603-cvsimport-patchsets.sh | 2 +
t/t9604-cvsimport-timestamps.sh | 2 +
t/unit-tests/t-strvec.c | 269 +++++++
t/unit-tests/test-lib.c | 13 +
t/unit-tests/test-lib.h | 13 +
transport-helper.c | 6 +-
transport.c | 1 +
upload-pack.c | 2 +-
userdiff.h | 12 +-
109 files changed, 1151 insertions(+), 586 deletions(-)
create mode 100644 t/unit-tests/t-strvec.c
Range-diff against v1:
-: ---------- > 1: 857b8b14ce ci: add missing dependency for TTY prereq
1: 0e9fa9ca73 ! 2: ceade7dbba t: mark a bunch of tests as leak-free
@@ Commit message
- t2405: Passes since 6741e917de (repository: avoid leaking
`fsmonitor` data, 2024-04-12).
- - t4153: Passes since 71c7916053 (apply: plug a leak in apply_data,
- 2024-04-23).
-
- - t7006: Passes since at least Git v2.40. I did not care to go back
- any further than that.
-
- t7423: Introduced via b20c10fd9b (t7423: add tests for symlinked
submodule directories, 2024-01-28), passes since e8d0608944
(submodule: require the submodule path to contain directories only,
@@ t/t2405-worktree-submodule.sh: test_description='Combination of submodules and m
base_path=$(pwd -P)
- ## t/t4153-am-resume-override-opts.sh ##
-@@
-
- test_description='git-am command-line options override saved options'
-
-+TEST_PASSES_SANITIZE_LEAK=true
- . ./test-lib.sh
- . "$TEST_DIRECTORY"/lib-terminal.sh
-
-
- ## t/t7006-pager.sh ##
-@@
-
- test_description='Test automatic use of a pager.'
-
-+TEST_PASSES_SANITIZE_LEAK=true
- . ./test-lib.sh
- . "$TEST_DIRECTORY"/lib-pager.sh
- . "$TEST_DIRECTORY"/lib-terminal.sh
-
## t/t7423-submodule-symlinks.sh ##
@@
2: 05fbadbae2 ! 3: a96b5ac359 transport-helper: fix leaking helper name
@@ Commit message
ownership of the name, nor do we free it. The associated memory thus
leaks.
- Fix this memory leak and mark now-passing tests as leak free.
+ Fix this memory leak by freeing the string at the calling side in
+ `transport_get()`. `transport_helper_init()` now creates its own copy of
+ the string and thus can free it as required.
+
+ An alterantive way to fix this would be to transfer ownership of the
+ string passed into `transport_helper_init()`, which would avoid the call
+ to xstrdup(1). But it does make for a more surprising calling convention
+ as we do not typically transfer ownership of strings like this.
+
+ Mark now-passing tests as leak free.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
3: d76079797f = 4: 9dd8709d1b strbuf: fix leak when `appendwholeline()` fails with EOF
4: ffd9eb795f = 5: 6d4e9ce706 checkout: clarify memory ownership in `unique_tracking_name()`
5: d4bf3c1f95 = 6: 141cae2de1 http: refactor code to clarify memory ownership
6: 1702762772 = 7: ff5e761e55 config: clarify memory ownership in `git_config_pathname()`
7: 18dce492df ! 8: afe69c7303 diff: refactor code to clarify memory ownership of prefixes
@@ Metadata
## Commit message ##
diff: refactor code to clarify memory ownership of prefixes
- The source end destination prefixes are tracked in a `const char *`
+ The source and destination prefixes are tracked in a `const char *`
array, but may at times contain allocated strings. The result is that
those strings may be leaking because we never free them.
8: 667eb3f8ff = 9: eb7fce55b0 convert: refactor code to clarify ownership of check_roundtrip_encoding
9: 11eed8cea7 = 10: ee2fcf388c builtin/log: stop using globals for log config
10: d8cd9a05f8 = 11: 3490ad3a02 builtin/log: stop using globals for format config
11: a857637e61 = 12: 6cfc28c7e2 config: clarify memory ownership in `git_config_string()`
12: b2f8878b55 = 13: 70e8e26513 config: plug various memory leaks
13: 23e2cf98b7 = 14: f1a1c43e76 builtin/credential: clear credential before exit
14: a11ce6a0ed = 15: 64b92156f8 commit-reach: fix memory leak in `ahead_behind()`
15: 24362604b2 = 16: cd8a992f08 submodule: fix leaking memory for submodule entries
16: c43c93db3b ! 17: 128e2eaf7a strvec: add functions to replace and remove strings
@@ t/unit-tests/t-strvec.c (new)
+ strvec_clear(&vec);
+}
+
++static void t_replace_with_substring(void)
++{
++ struct strvec vec = STRVEC_INIT;
++ strvec_pushl(&vec, "foo", NULL);
++ strvec_replace(&vec, 0, vec.v[0] + 1);
++ check_strvec(&vec, "oo", NULL);
++ strvec_clear(&vec);
++}
++
+static void t_remove_at_head(void)
+{
+ struct strvec vec = STRVEC_INIT;
@@ t/unit-tests/t-strvec.c (new)
+ TEST(t_replace_at_head(), "replace at head");
+ TEST(t_replace_in_between(), "replace in between");
+ TEST(t_replace_at_tail(), "replace at tail");
++ TEST(t_replace_with_substring(), "replace with substring");
+ TEST(t_remove_at_head(), "remove at head");
+ TEST(t_remove_in_between(), "remove in between");
+ TEST(t_remove_at_tail(), "remove at tail");
17: 97470398ad = 18: 1310b24fc2 builtin/mv: refactor `add_slash()` to always return allocated strings
18: 7a2e5e82cc = 19: d4fef9825a builtin/mv duplicate string list memory
19: b546ca4d62 = 20: 797cdb286a builtin/mv: refactor to use `struct strvec`
20: bba735388d = 21: 095469193c builtin/mv: fix leaks for submodule gitfile paths
--
2.45.1.216.g4365c6fcf9.dirty
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2024-05-24 10:06 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-23 12:25 [PATCH 00/20] Various memory leak fixes Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 01/20] t: mark a bunch of tests as leak-free Patrick Steinhardt
2024-05-23 17:44 ` Junio C Hamano
2024-05-24 6:56 ` Patrick Steinhardt
2024-05-24 16:05 ` Junio C Hamano
2024-05-24 17:53 ` Junio C Hamano
2024-05-24 20:34 ` Karthik Nayak
2024-05-23 12:25 ` [PATCH 02/20] transport-helper: fix leaking helper name Patrick Steinhardt
2024-05-23 17:36 ` Junio C Hamano
2024-05-24 20:38 ` Karthik Nayak
2024-05-23 12:25 ` [PATCH 03/20] strbuf: fix leak when `appendwholeline()` fails with EOF Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 04/20] checkout: clarify memory ownership in `unique_tracking_name()` Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 05/20] http: refactor code to clarify memory ownership Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 06/20] config: clarify memory ownership in `git_config_pathname()` Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 07/20] diff: refactor code to clarify memory ownership of prefixes Patrick Steinhardt
2024-05-23 16:59 ` Eric Sunshine
2024-05-23 12:25 ` [PATCH 08/20] convert: refactor code to clarify ownership of check_roundtrip_encoding Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 09/20] builtin/log: stop using globals for log config Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 10/20] builtin/log: stop using globals for format config Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 11/20] config: clarify memory ownership in `git_config_string()` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 12/20] config: plug various memory leaks Patrick Steinhardt
2024-05-23 17:13 ` Junio C Hamano
2024-05-24 6:58 ` Patrick Steinhardt
2024-05-24 8:55 ` Patrick Steinhardt
2024-05-24 16:12 ` Junio C Hamano
2024-05-24 16:11 ` Junio C Hamano
2024-05-23 12:26 ` [PATCH 13/20] builtin/credential: clear credential before exit Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 14/20] commit-reach: fix memory leak in `ahead_behind()` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 15/20] submodule: fix leaking memory for submodule entries Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 16/20] strvec: add functions to replace and remove strings Patrick Steinhardt
2024-05-23 17:09 ` Eric Sunshine
2024-05-24 6:56 ` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 17/20] builtin/mv: refactor `add_slash()` to always return allocated strings Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 18/20] builtin/mv duplicate string list memory Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 19/20] builtin/mv: refactor to use `struct strvec` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 20/20] builtin/mv: fix leaks for submodule gitfile paths Patrick Steinhardt
2024-05-23 16:45 ` [PATCH 00/20] Various memory leak fixes Junio C Hamano
2024-05-24 6:56 ` Patrick Steinhardt
2024-05-24 10:03 ` Patrick Steinhardt [this message]
2024-05-24 10:03 ` [PATCH v2 01/21] ci: add missing dependency for TTY prereq Patrick Steinhardt
2024-05-24 16:31 ` Junio C Hamano
2024-05-24 10:03 ` [PATCH v2 02/21] t: mark a bunch of tests as leak-free Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 03/21] transport-helper: fix leaking helper name Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 04/21] strbuf: fix leak when `appendwholeline()` fails with EOF Patrick Steinhardt
2024-05-25 4:46 ` Jeff King
2024-05-27 6:44 ` Patrick Steinhardt
2024-05-29 9:16 ` Jeff King
2024-05-29 11:25 ` Patrick Steinhardt
2024-05-30 7:16 ` Jeff King
2024-05-24 10:03 ` [PATCH v2 05/21] checkout: clarify memory ownership in `unique_tracking_name()` Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 06/21] http: refactor code to clarify memory ownership Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 07/21] config: clarify memory ownership in `git_config_pathname()` Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 08/21] diff: refactor code to clarify memory ownership of prefixes Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 09/21] convert: refactor code to clarify ownership of check_roundtrip_encoding Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 10/21] builtin/log: stop using globals for log config Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 11/21] builtin/log: stop using globals for format config Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 12/21] config: clarify memory ownership in `git_config_string()` Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 13/21] config: plug various memory leaks Patrick Steinhardt
2024-05-24 10:13 ` Patrick Steinhardt
2024-05-25 4:33 ` Jeff King
2024-05-27 6:46 ` Patrick Steinhardt
2024-05-29 9:20 ` Jeff King
2024-05-24 10:04 ` [PATCH v2 14/21] builtin/credential: clear credential before exit Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 15/21] commit-reach: fix memory leak in `ahead_behind()` Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 16/21] submodule: fix leaking memory for submodule entries Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 17/21] strvec: add functions to replace and remove strings Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 18/21] builtin/mv: refactor `add_slash()` to always return allocated strings Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 19/21] builtin/mv duplicate string list memory Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 20/21] builtin/mv: refactor to use `struct strvec` Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 21/21] builtin/mv: fix leaks for submodule gitfile paths Patrick Steinhardt
2024-05-25 2:10 ` [PATCH v2 00/21] Various memory leak fixes Junio C Hamano
2024-05-27 6:44 ` Patrick Steinhardt
2024-05-27 17:38 ` Junio C Hamano
2024-05-27 18:02 ` Junio C Hamano
2024-05-28 5:09 ` Patrick Steinhardt
2024-05-29 8:25 ` Karthik Nayak
2024-05-27 11:45 ` [PATCH v3 " Patrick Steinhardt
2024-05-27 11:45 ` [PATCH v3 01/21] ci: add missing dependency for TTY prereq Patrick Steinhardt
2024-05-27 11:45 ` [PATCH v3 02/21] t: mark a bunch of tests as leak-free Patrick Steinhardt
2024-05-27 11:45 ` [PATCH v3 03/21] transport-helper: fix leaking helper name Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 04/21] strbuf: fix leak when `appendwholeline()` fails with EOF Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 05/21] checkout: clarify memory ownership in `unique_tracking_name()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 06/21] http: refactor code to clarify memory ownership Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 07/21] config: clarify memory ownership in `git_config_pathname()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 08/21] diff: refactor code to clarify memory ownership of prefixes Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 09/21] convert: refactor code to clarify ownership of check_roundtrip_encoding Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 10/21] builtin/log: stop using globals for log config Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 11/21] builtin/log: stop using globals for format config Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 12/21] config: clarify memory ownership in `git_config_string()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 13/21] config: plug various memory leaks Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 14/21] builtin/credential: clear credential before exit Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 15/21] commit-reach: fix memory leak in `ahead_behind()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 16/21] submodule: fix leaking memory for submodule entries Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 17/21] strvec: add functions to replace and remove strings Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 18/21] builtin/mv: refactor `add_slash()` to always return allocated strings Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 19/21] builtin/mv duplicate string list memory Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 20/21] builtin/mv: refactor to use `struct strvec` Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 21/21] builtin/mv: fix leaks for submodule gitfile paths Patrick Steinhardt
2024-05-27 17:52 ` [PATCH v3 00/21] Various memory leak fixes Junio C Hamano
2024-05-30 6:38 ` [PATCH 0/5] add-ons for ps/leakfixes Jeff King
2024-05-30 6:39 ` [PATCH 1/5] t-strvec: use va_end() to match va_start() Jeff King
2024-05-30 6:39 ` [PATCH 2/5] t-strvec: mark variable-arg helper with LAST_ARG_MUST_BE_NULL Jeff King
2024-05-30 6:44 ` [PATCH 3/5] mv: move src_dir cleanup to end of cmd_mv() Jeff King
2024-05-30 7:04 ` Patrick Steinhardt
2024-05-30 7:21 ` Jeff King
2024-05-30 7:24 ` Patrick Steinhardt
2024-05-30 8:15 ` Jeff King
2024-05-30 8:19 ` Patrick Steinhardt
2024-05-30 8:28 ` Jeff King
2024-05-30 6:45 ` [PATCH 4/5] mv: factor out empty src_dir removal Jeff King
2024-05-30 6:46 ` [PATCH 5/5] mv: replace src_dir with a strvec Jeff King
2024-05-30 15:36 ` Junio C Hamano
2024-05-31 11:12 ` Jeff King
2024-05-31 14:56 ` Junio C Hamano
2024-05-30 7:05 ` [PATCH 0/5] add-ons for ps/leakfixes Patrick Steinhardt
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=cover.1716541556.git.ps@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=sunshine@sunshineco.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).