From: Jacob Abel <jacobabel@nullpo.dev>
To: git@vger.kernel.org
Cc: "Jacob Abel" <jacobabel@nullpo.dev>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Eric Sunshine" <sunshine@sunshineco.com>,
"Taylor Blau" <me@ttaylorr.com>
Subject: [PATCH v2 0/2] worktree: Support `--orphan` when creating new worktrees
Date: Fri, 04 Nov 2022 21:34:15 +0000 [thread overview]
Message-ID: <20221104213401.17393-1-jacobabel@nullpo.dev> (raw)
In-Reply-To: <20221104010242.11555-1-jacobabel@nullpo.dev>
While working with the worktree based git workflow, I realised that setting
up a new git repository required switching between the traditional and
worktree based workflows. Searching online I found a SO answer [1] which
seemed to support this and which indicated that adding support for this should
not be technically difficult.
This patchset has two parts:
* adding `-B` to the usage docs (noticed during dev and it seemed too small
to justify a separate submission)
* adding orphan branch functionality (as is present in `git-checkout`)
to `git-worktree-add`
Changes from v1:
* Reverted change to `checkout_worktree()` [2]. Instead we now change the
HEAD after `git reset --hard` with a call to `git symbolic-ref`.
* Removed noise-changes and weird formatting from the patchset.
* Updated tests and squashed them into the main `--orphan` patch as
requested [3].
* Improved test cleanup.
* Clarify comments regarding `new_branch_force` and `opts.orphan_branch` [4].
1. https://stackoverflow.com/a/68717229/15064705
2. https://lore.kernel.org/git/20221104010242.11555-3-jacobabel@nullpo.dev/
3. https://lore.kernel.org/git/221104.86k04bzeaa.gmgdl@evledraar.gmail.com/
4. https://lore.kernel.org/git/20221104164147.izizapz5mdwwalxu@phi/
Jacob Abel (2):
worktree add: Include -B in usage docs
worktree add: add --orphan flag
Documentation/git-worktree.txt | 18 +++++++-
builtin/worktree.c | 81 ++++++++++++++++++++++++++++------
t/t2400-worktree-add.sh | 50 +++++++++++++++++++++
3 files changed, 135 insertions(+), 14 deletions(-)
Range-diff against v1:
1: d74a58b3bb ! 1: f35d78cfb4 worktree add: Include -B in usage docs
@@ Documentation/git-worktree.txt: SYNOPSIS
## builtin/worktree.c ##
@@
- #include "worktree.h"
- #include "quote.h"
--#define BUILTIN_WORKTREE_ADD_USAGE \
-+#define BUILTIN_WORKTREE_ADD_USAGE \
+ #define BUILTIN_WORKTREE_ADD_USAGE \
N_("git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" \
- " [-b <new-branch>] <path> [<commit-ish>]")
+ " [[-b | -B] <new-branch>] <path> [<commit-ish>]")
2: 4e56a9494e < -: ---------- builtin/worktree.c: Update checkout_worktree() to use git-worktree
3: b8b4098ff5 ! 2: 653be67e8a worktree add: add --orphan flag
@@ Documentation/git-worktree.txt: This can also be set up as the default behaviour
## builtin/worktree.c ##
@@
- #define BUILTIN_WORKTREE_ADD_USAGE \
+ #define BUILTIN_WORKTREE_ADD_USAGE \
N_("git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]\n" \
- " [[-b | -B] <new-branch>] <path> [<commit-ish>]")
+ " [[-b | -B | --orphan] <new-branch>] <path> [<commit-ish>]")
@@ builtin/worktree.c: struct add_opts {
};
@@ builtin/worktree.c: static int checkout_worktree(const struct add_opts *opts,
- strvec_pushl(&cp.args, "checkout", "--no-recurse-submodules", NULL);
- if (opts->quiet)
- strvec_push(&cp.args, "--quiet");
-+ if (opts->orphan_branch)
-+ strvec_pushl(&cp.args, "--orphan", opts->orphan_branch, NULL);
- strvec_pushv(&cp.env, child_env->v);
return run_command(&cp);
}
+
++static int make_worktree_orphan(const struct add_opts *opts,
++ struct strvec *child_env)
++{
++ int ret;
++ struct strbuf symref = STRBUF_INIT;
++ struct child_process cp = CHILD_PROCESS_INIT;
++ cp.git_cmd = 1;
++
++ validate_new_branchname(opts->orphan_branch, &symref, 0);
++ strvec_pushl(&cp.args, "symbolic-ref", "HEAD", symref.buf, NULL);
++ if (opts->quiet)
++ strvec_push(&cp.args, "--quiet");
++ strvec_pushv(&cp.env, child_env->v);
++ ret = run_command(&cp);
++ strbuf_release(&symref);
++ return ret;
++}
++
+ static int add_worktree(const char *path, const char *refname,
+ const struct add_opts *opts)
+ {
@@ builtin/worktree.c: static int add_worktree(const char *path, const char *refname,
die_if_checked_out(symref.buf, 0);
}
commit = lookup_commit_reference_by_name(refname);
- if (!commit)
-+
+ if (!commit && !opts->implicit)
die(_("invalid reference: %s"), refname);
@@ builtin/worktree.c: static int add_worktree(const char *path, const char *refnam
strvec_pushl(&cp.args, "symbolic-ref", "HEAD",
symref.buf, NULL);
if (opts->quiet)
+@@ builtin/worktree.c: static int add_worktree(const char *path, const char *refname,
+ if (ret)
+ goto done;
+
+- if (opts->checkout &&
+- (ret = checkout_worktree(opts, &child_env)))
+- goto done;
++ if (opts->checkout) {
++ ret = checkout_worktree(opts, &child_env);
++ if (opts->orphan_branch && !ret)
++ ret = make_worktree_orphan(opts, &child_env);
++ if (ret)
++ goto done;
++ }
+
+ is_junk = 0;
+ FREE_AND_NULL(junk_work_tree);
@@ builtin/worktree.c: static int add_worktree(const char *path, const char *refname,
* Hook failure does not warrant worktree deletion, so run hook after
* is_junk is cleared, but do return appropriate code when hook fails.
@@ builtin/worktree.c: static int add_worktree(const char *path, const char *refnam
strvec_pushl(&opt.env, "GIT_DIR", "GIT_WORK_TREE", NULL);
@@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
- const char *opt_track = NULL;
- const char *lock_reason = NULL;
- int keep_locked = 0;
-+
- struct option options[] = {
-- OPT__FORCE(&opts.force,
-- N_("checkout <branch> even if already checked out in other worktree"),
-- PARSE_OPT_NOCOMPLETE),
-+ OPT__FORCE(
-+ &opts.force,
-+ N_("checkout <branch> even if already checked out in other worktree"),
-+ PARSE_OPT_NOCOMPLETE),
- OPT_STRING('b', NULL, &new_branch, N_("branch"),
N_("create a new branch")),
OPT_STRING('B', NULL, &new_branch_force, N_("branch"),
N_("create or reset a branch")),
-- OPT_BOOL('d', "detach", &opts.detach, N_("detach HEAD at named commit")),
-- OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
-- OPT_BOOL(0, "lock", &keep_locked, N_("keep the new working tree locked")),
+ OPT_STRING(0, "orphan", &opts.orphan_branch, N_("branch"),
-+ N_("create a new unparented branch")),
-+ OPT_BOOL('d', "detach", &opts.detach,
-+ N_("detach HEAD at named commit")),
-+ OPT_BOOL(0, "checkout", &opts.checkout,
-+ N_("populate the new working tree")),
-+ OPT_BOOL(0, "lock", &keep_locked,
-+ N_("keep the new working tree locked")),
- OPT_STRING(0, "reason", &lock_reason, N_("string"),
- N_("reason for locking")),
- OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
- OPT_PASSTHRU(0, "track", &opt_track, NULL,
- N_("set up tracking mode (see git-branch(1))"),
- PARSE_OPT_NOARG | PARSE_OPT_OPTARG),
-- OPT_BOOL(0, "guess-remote", &guess_remote,
-- N_("try to match the new branch name with a remote-tracking branch")),
-+ OPT_BOOL(
-+ 0, "guess-remote", &guess_remote,
-+ N_("try to match the new branch name with a remote-tracking branch")),
- OPT_END()
- };
-
++ N_("new unparented branch")),
+ OPT_BOOL('d', "detach", &opts.detach, N_("detach HEAD at named commit")),
+ OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
+ OPT_BOOL(0, "lock", &keep_locked, N_("keep the new working tree locked")),
+@@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
memset(&opts, 0, sizeof(opts));
opts.checkout = 1;
ac = parse_options(ac, av, prefix, options, git_worktree_add_usage, 0);
- if (!!opts.detach + !!new_branch + !!new_branch_force > 1)
- die(_("options '%s', '%s', and '%s' cannot be used together"), "-b", "-B", "--detach");
-+
+ opts.implicit = ac < 2;
+
-+ if (!!opts.detach + !!new_branch + !!new_branch_force +
-+ !!opts.orphan_branch >
-+ 1)
++ if (!!opts.detach + !!new_branch + !!new_branch_force + !!opts.orphan_branch > 1)
+ die(_("options '%s', '%s', '%s', and '%s' cannot be used together"),
+ "-b", "-B", "--orphan", "--detach");
+ if (opts.orphan_branch && opt_track)
-+ die(_("'%s' cannot be used with '%s'"), "--orphan", "--track");
++ die(_("'%s' and '%s' cannot be used together"), "--orphan", "--track");
+ if (opts.orphan_branch && !opts.checkout)
-+ die(_("'%s' cannot be used with '%s'"), "--orphan",
++ die(_("'%s' and '%s' cannot be used together"), "--orphan",
+ "--no-checkout");
if (lock_reason && !keep_locked)
die(_("the option '%s' requires '%s'"), "--reason", "--lock");
@@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
branch = "@{-1}";
+ /*
-+ * From here on, new_branch will contain the branch to be checked out,
-+ * and new_branch_force and opts.orphan_branch will tell us which one of
-+ * -b/-B/--orphan is being used.
++ * When creating a new branch, new_branch now contains the branch to
++ * create.
++ *
++ * Past this point, new_branch_force can be treated solely as a
++ * boolean flag to indicate whether `-B` was selected.
+ */
if (new_branch_force) {
struct strbuf symref = STRBUF_INIT;
@@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
strbuf_release(&symref);
}
+- if (ac < 2 && !new_branch && !opts.detach) {
++ /*
++ * As the orphan cannot be created until the contents of branch
++ * are staged, opts.orphan_branch should be treated as both a boolean
++ * indicating that `--orphan` was selected and as the name of the new
++ * orphan branch from this point on.
++ *
++ * When creating a new orphan, force checkout regardless of whether
++ * the existing branch is already checked out.
++ */
+ if (opts.orphan_branch) {
+ new_branch = opts.orphan_branch;
+ opts.force = 1;
+ }
+
- if (ac < 2 && !new_branch && !opts.detach) {
++ if (ac < 2 && !new_branch && !opts.detach && !opts.orphan_branch) {
const char *s = dwim_branch(path, &new_branch);
if (s)
+ branch = s;
@@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
if (!opts.quiet)
print_preparing_worktree_line(opts.detach, branch, new_branch, !!new_branch_force);
@@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix)
struct child_process cp = CHILD_PROCESS_INIT;
cp.git_cmd = 1;
strvec_push(&cp.args, "branch");
+
+ ## t/t2400-worktree-add.sh ##
+@@ t/t2400-worktree-add.sh: test_expect_success '"add" -B/--detach mutually exclusive' '
+ test_must_fail git worktree add -B poodle --detach bamboo main
+ '
+
++test_expect_success '"add" --orphan/-b mutually exclusive' '
++ test_must_fail git worktree add --orphan poodle -b poodle bamboo main
++'
++
++test_expect_success '"add" --orphan/-B mutually exclusive' '
++ test_must_fail git worktree add --orphan poodle -B poodle bamboo main
++'
++
++test_expect_success '"add" --orphan/--detach mutually exclusive' '
++ test_must_fail git worktree add --orphan poodle --detach bamboo main
++'
++
++test_expect_success '"add" --orphan/--no-checkout mutually exclusive' '
++ test_must_fail git worktree add --orphan poodle --no-checkout bamboo main
++'
++
++test_expect_success '"add" -B/--detach mutually exclusive' '
++ test_must_fail git worktree add -B poodle --detach bamboo main
++'
++
+ test_expect_success '"add -B" fails if the branch is checked out' '
+ git rev-parse newmain >before &&
+ test_must_fail git worktree add -B newmain bamboo main &&
+@@ t/t2400-worktree-add.sh: test_expect_success 'add --quiet' '
+ test_must_be_empty actual
+ '
+
++test_expect_success '"add --orphan"' '
++ test_when_finished "git worktree remove -f -f orphandir" &&
++ git worktree add --orphan neworphan orphandir main &&
++ echo refs/heads/neworphan >expected &&
++ git -C orphandir symbolic-ref HEAD >actual &&
++ test_cmp expected actual &&
++ git -C orphandir diff main
++'
++
++test_expect_success '"add --orphan" fails if the branch already exists' '
++ test_when_finished "git worktree remove -f -f orphandir" &&
++ git worktree add -b existingbranch orphandir main &&
++ test_must_fail git worktree add --orphan existingbranch orphandir2 main &&
++ test ! -d orphandir2
++'
++
++test_expect_success '"add --orphan" fails if the commit-ish doesnt exist' '
++ test_must_fail git worktree add --orphan badcommitish orphandir eee2222 &&
++ test ! -d orphandir
++'
++
++test_expect_success '"add --orphan" with empty repository' '
++ test_when_finished "rm -rf empty_repo" &&
++ echo refs/heads/newbranch >expected &&
++ GIT_DIR="empty_repo" git init --bare &&
++ git -C empty_repo worktree add --orphan newbranch worktreedir &&
++ git -C empty_repo/worktreedir symbolic-ref HEAD >actual &&
++ test_cmp expected actual
++'
++
+ test_expect_success 'local clone from linked checkout' '
+ git clone --local here here-clone &&
+ ( cd here-clone && git fsck )
4: a167f440c3 < -: ---------- worktree add: Add unit tests for --orphan
--
2.37.4
next prev parent reply other threads:[~2022-11-04 21:34 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-04 1:02 [PATCH 0/4] worktree: Support `--orphan` when creating new worktrees Jacob Abel
2022-11-04 1:03 ` [PATCH 1/4] worktree add: Include -B in usage docs Jacob Abel
2022-11-04 3:05 ` Eric Sunshine
2022-11-04 4:24 ` Jacob Abel
2022-11-04 1:03 ` [PATCH 2/4] builtin/worktree.c: Update checkout_worktree() to use git-worktree Jacob Abel
2022-11-04 1:32 ` Ævar Arnfjörð Bjarmason
2022-11-04 3:58 ` Jacob Abel
2022-11-04 20:45 ` Taylor Blau
2022-11-04 1:03 ` [PATCH 3/4] worktree add: add --orphan flag Jacob Abel
2022-11-04 1:33 ` Ævar Arnfjörð Bjarmason
2022-11-04 4:11 ` Jacob Abel
2022-11-04 5:03 ` Eric Sunshine
2022-11-04 16:41 ` Jacob Abel
2022-11-10 4:13 ` Eric Sunshine
2022-11-10 21:21 ` Jacob Abel
2022-11-04 1:03 ` [PATCH 4/4] worktree add: Add unit tests for --orphan Jacob Abel
2022-11-04 1:37 ` Ævar Arnfjörð Bjarmason
2022-11-04 4:17 ` Jacob Abel
2022-11-04 4:33 ` [PATCH 0/4] worktree: Support `--orphan` when creating new worktrees Eric Sunshine
2022-11-04 4:47 ` Jacob Abel
2022-11-04 4:50 ` Jacob Abel
2022-11-04 21:34 ` Jacob Abel [this message]
2022-11-04 21:34 ` [PATCH v2 1/2] worktree add: Include -B in usage docs Jacob Abel
2022-11-04 21:34 ` [PATCH v2 2/2] worktree add: add --orphan flag Jacob Abel
2022-11-10 23:32 ` [PATCH v3 0/2] worktree: Support `--orphan` when creating new worktrees Jacob Abel
2022-11-10 23:32 ` [PATCH v3 1/2] worktree add: Include -B in usage docs Jacob Abel
2022-11-10 23:32 ` [PATCH v3 2/2] worktree add: add --orphan flag Jacob Abel
2022-11-15 21:08 ` Ævar Arnfjörð Bjarmason
2022-11-15 21:29 ` Eric Sunshine
2022-11-15 22:35 ` Ævar Arnfjörð Bjarmason
2022-11-16 0:19 ` Eric Sunshine
2022-11-19 3:13 ` Jacob Abel
2022-11-19 3:09 ` Jacob Abel
2022-11-19 11:50 ` Ævar Arnfjörð Bjarmason
2022-11-19 1:44 ` Jacob Abel
2022-11-22 6:00 ` Eric Sunshine
2022-11-22 23:09 ` Jacob Abel
2022-11-15 22:09 ` Ævar Arnfjörð Bjarmason
2022-11-19 2:57 ` Jacob Abel
2022-11-19 11:50 ` Ævar Arnfjörð Bjarmason
2022-11-16 0:39 ` [PATCH v3 0/2] worktree: Support `--orphan` when creating new worktrees Eric Sunshine
2022-11-17 10:00 ` Ævar Arnfjörð Bjarmason
2022-11-19 3:47 ` Jacob Abel
2022-11-19 11:48 ` Ævar Arnfjörð Bjarmason
2022-11-22 5:16 ` Eric Sunshine
2022-11-22 23:26 ` Jacob Abel
2022-11-22 23:55 ` Ævar Arnfjörð Bjarmason
2022-11-23 2:47 ` Jacob Abel
2022-11-23 2:43 ` Rubén Justo
2022-11-23 5:37 ` Jacob Abel
2022-11-23 7:35 ` Rubén Justo
2022-11-22 14:45 ` Phillip Wood
2022-11-23 4:21 ` Jacob Abel
2022-12-12 1:42 ` [PATCH v4 0/3] " Jacob Abel
2022-12-12 1:42 ` [PATCH v4 1/3] worktree add: Include -B in usage docs Jacob Abel
2022-12-12 1:42 ` [PATCH v4 2/3] worktree add: add --orphan flag Jacob Abel
2022-12-12 8:11 ` Ævar Arnfjörð Bjarmason
2022-12-12 14:55 ` Jacob Abel
2022-12-12 18:14 ` Ævar Arnfjörð Bjarmason
2022-12-12 22:39 ` Jacob Abel
2022-12-12 1:43 ` [PATCH v4 3/3] worktree add: Add hint to use --orphan when bad ref Jacob Abel
2022-12-12 8:35 ` Ævar Arnfjörð Bjarmason
2022-12-12 14:59 ` Jacob Abel
2022-12-12 18:16 ` Ævar Arnfjörð Bjarmason
2022-12-12 18:35 ` Eric Sunshine
2022-12-12 22:36 ` Jacob Abel
2022-12-12 22:38 ` Jacob Abel
2022-12-20 2:37 ` [PATCH v5 0/4] worktree: Support `--orphan` when creating new worktrees Jacob Abel
2022-12-20 2:37 ` [PATCH v5 1/4] worktree add: Include -B in usage docs Jacob Abel
2022-12-20 3:42 ` Junio C Hamano
2022-12-20 23:24 ` Jacob Abel
2022-12-20 2:37 ` [PATCH v5 2/4] worktree add: refactor opt exclusion tests Jacob Abel
2022-12-20 4:00 ` Junio C Hamano
2022-12-20 23:29 ` Jacob Abel
2022-12-20 2:38 ` [PATCH v5 3/4] worktree add: add --orphan flag Jacob Abel
2022-12-20 4:19 ` Junio C Hamano
2022-12-21 0:17 ` Jacob Abel
2022-12-20 2:38 ` [PATCH v5 4/4] worktree add: Add hint to use --orphan when bad ref Jacob Abel
2022-12-20 6:18 ` Junio C Hamano
2022-12-21 0:42 ` Jacob Abel
2022-12-28 6:16 ` [PATCH v6 0/4] worktree: Support `--orphan` when creating new worktrees Jacob Abel
2022-12-28 6:16 ` [PATCH v6 1/4] worktree add: include -B in usage docs Jacob Abel
2022-12-28 6:16 ` [PATCH v6 2/4] worktree add: refactor opt exclusion tests Jacob Abel
2022-12-28 12:54 ` Junio C Hamano
2022-12-29 6:51 ` Jacob Abel
2022-12-29 10:07 ` Junio C Hamano
2022-12-29 20:48 ` Jacob Abel
2023-01-06 6:31 ` Jacob Abel
2023-01-06 12:34 ` Junio C Hamano
2023-01-07 4:45 ` Jacob Abel
2022-12-28 6:17 ` [PATCH v6 3/4] worktree add: add --orphan flag Jacob Abel
2022-12-28 6:17 ` [PATCH v6 4/4] worktree add: add hint to direct users towards --orphan Jacob Abel
2023-01-06 14:19 ` Phillip Wood
2022-12-28 8:01 ` [PATCH v6 0/4] worktree: Support `--orphan` when creating new worktrees Ævar Arnfjörð Bjarmason
2022-12-29 6:38 ` Jacob Abel
2022-12-29 10:42 ` Ævar Arnfjörð Bjarmason
2022-12-29 21:22 ` Jacob Abel
2023-01-07 4:58 ` [PATCH v7 " Jacob Abel
2023-01-07 4:59 ` [PATCH v7 1/4] worktree add: include -B in usage docs Jacob Abel
2023-01-07 4:59 ` [PATCH v7 2/4] worktree add: refactor opt exclusion tests Jacob Abel
2023-01-08 7:13 ` Junio C Hamano
2023-01-08 15:08 ` Jacob Abel
2023-01-07 4:59 ` [PATCH v7 3/4] worktree add: add --orphan flag Jacob Abel
2023-01-07 4:59 ` [PATCH v7 4/4] worktree add: add hint to direct users towards --orphan Jacob Abel
2023-01-09 12:26 ` [PATCH v7 0/4] worktree: Support `--orphan` when creating new worktrees Ævar Arnfjörð Bjarmason
2023-01-09 17:11 ` Jacob Abel
2023-01-09 17:21 ` Ævar Arnfjörð Bjarmason
2023-01-09 17:26 ` Jacob Abel
2023-01-09 17:32 ` [PATCH v8 " Jacob Abel
2023-01-09 17:32 ` [PATCH v8 1/4] worktree add: include -B in usage docs Jacob Abel
2023-01-09 17:33 ` [PATCH v8 2/4] worktree add: refactor opt exclusion tests Jacob Abel
2023-01-09 17:33 ` [PATCH v8 3/4] worktree add: add --orphan flag Jacob Abel
2023-01-13 10:20 ` Phillip Wood
2023-01-13 17:32 ` Junio C Hamano
2023-01-14 22:47 ` Jacob Abel
2023-01-15 3:09 ` Junio C Hamano
2023-01-15 3:41 ` rsbecker
2023-01-15 3:49 ` Junio C Hamano
2023-01-18 22:46 ` 'Jacob Abel'
2023-01-18 22:18 ` Jacob Abel
2023-01-19 15:32 ` Ævar Arnfjörð Bjarmason
2023-01-19 16:32 ` Junio C Hamano
2023-01-16 10:47 ` Phillip Wood
2023-01-18 22:40 ` Jacob Abel
2023-01-19 16:18 ` Phillip Wood
2023-01-19 22:20 ` Jacob Abel
2023-01-09 17:33 ` [PATCH v8 4/4] worktree add: add hint to direct users towards --orphan Jacob Abel
2023-01-09 19:20 ` [PATCH v8 0/4] worktree: Support `--orphan` when creating new worktrees Ævar Arnfjörð Bjarmason
2023-01-13 17:34 ` Junio C Hamano
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221104213401.17393-1-jacobabel@nullpo.dev \
--to=jacobabel@nullpo.dev \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=me@ttaylorr.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.