From: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
To: git@vger.kernel.org
Cc: t.gummerer@gmail.com, Johannes.Schindelin@gmx.de
Subject: [PATCH v12 20/26] stash: convert save to builtin
Date: Thu, 20 Dec 2018 21:44:36 +0200 [thread overview]
Message-ID: <1b16cdb63b0d40161bf3b70480ff7177f14fd3bf.1545331726.git.ungureanupaulsebastian@gmail.com> (raw)
In-Reply-To: <cover.1545331726.git.ungureanupaulsebastian@gmail.com>
Add stash save to the helper and delete functions which are no
longer needed (`show_help()`, `save_stash()`, `push_stash()`,
`create_stash()`, `clear_stash()`, `untracked_files()` and
`no_changes()`).
Signed-off-by: Paul-Sebastian Ungureanu <ungureanupaulsebastian@gmail.com>
---
builtin/stash--helper.c | 50 ++++++
git-stash.sh | 328 +---------------------------------------
2 files changed, 52 insertions(+), 326 deletions(-)
diff --git a/builtin/stash--helper.c b/builtin/stash--helper.c
index 5f9914ca27..19ead63c46 100644
--- a/builtin/stash--helper.c
+++ b/builtin/stash--helper.c
@@ -26,6 +26,8 @@ static const char * const git_stash_helper_usage[] = {
N_("git stash--helper [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
" [-u|--include-untracked] [-a|--all] [-m|--message <message>]\n"
" [--] [<pathspec>...]]"),
+ N_("git stash--helper save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
+ " [-u|--include-untracked] [-a|--all] [<message>]"),
NULL
};
@@ -81,6 +83,12 @@ static const char * const git_stash_helper_push_usage[] = {
NULL
};
+static const char * const git_stash_helper_save_usage[] = {
+ N_("git stash--helper save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]\n"
+ " [-u|--include-untracked] [-a|--all] [<message>]"),
+ NULL
+};
+
static const char *ref_stash = "refs/stash";
static struct strbuf stash_index_path = STRBUF_INIT;
@@ -1490,6 +1498,46 @@ static int push_stash(int argc, const char **argv, const char *prefix)
include_untracked);
}
+static int save_stash(int argc, const char **argv, const char *prefix)
+{
+ int keep_index = -1;
+ int patch_mode = 0;
+ int include_untracked = 0;
+ int quiet = 0;
+ int ret = 0;
+ const char *stash_msg = NULL;
+ struct pathspec ps;
+ struct strbuf stash_msg_buf = STRBUF_INIT;
+ struct option options[] = {
+ OPT_BOOL('k', "keep-index", &keep_index,
+ N_("keep index")),
+ OPT_BOOL('p', "patch", &patch_mode,
+ N_("stash in patch mode")),
+ OPT__QUIET(&quiet, N_("quiet mode")),
+ OPT_BOOL('u', "include-untracked", &include_untracked,
+ N_("include untracked files in stash")),
+ OPT_SET_INT('a', "all", &include_untracked,
+ N_("include ignore files"), 2),
+ OPT_STRING('m', "message", &stash_msg, "message",
+ N_("stash message")),
+ OPT_END()
+ };
+
+ argc = parse_options(argc, argv, prefix, options,
+ git_stash_helper_save_usage,
+ PARSE_OPT_KEEP_DASHDASH);
+
+ if (argc)
+ stash_msg = strbuf_join_argv(&stash_msg_buf, argc, argv, ' ');
+
+ memset(&ps, 0, sizeof(ps));
+ ret = do_push_stash(ps, stash_msg, quiet, keep_index,
+ patch_mode, include_untracked);
+
+ strbuf_release(&stash_msg_buf);
+ return ret;
+}
+
int cmd_stash__helper(int argc, const char **argv, const char *prefix)
{
pid_t pid = getpid();
@@ -1530,6 +1578,8 @@ int cmd_stash__helper(int argc, const char **argv, const char *prefix)
return !!create_stash(argc, argv, prefix);
else if (!strcmp(argv[0], "push"))
return !!push_stash(argc, argv, prefix);
+ else if (!strcmp(argv[0], "save"))
+ return !!save_stash(argc, argv, prefix);
usage_msg_opt(xstrfmt(_("unknown subcommand: %s"), argv[0]),
git_stash_helper_usage, options);
diff --git a/git-stash.sh b/git-stash.sh
index 51d7a06601..695f1feba3 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -36,331 +36,6 @@ else
reset_color=
fi
-no_changes () {
- git diff-index --quiet --cached HEAD --ignore-submodules -- "$@" &&
- git diff-files --quiet --ignore-submodules -- "$@" &&
- (test -z "$untracked" || test -z "$(untracked_files "$@")")
-}
-
-untracked_files () {
- if test "$1" = "-z"
- then
- shift
- z=-z
- else
- z=
- fi
- excl_opt=--exclude-standard
- test "$untracked" = "all" && excl_opt=
- git ls-files -o $z $excl_opt -- "$@"
-}
-
-prepare_fallback_ident () {
- if ! git -c user.useconfigonly=yes var GIT_COMMITTER_IDENT >/dev/null 2>&1
- then
- GIT_AUTHOR_NAME="git stash"
- GIT_AUTHOR_EMAIL=git@stash
- GIT_COMMITTER_NAME="git stash"
- GIT_COMMITTER_EMAIL=git@stash
- export GIT_AUTHOR_NAME
- export GIT_AUTHOR_EMAIL
- export GIT_COMMITTER_NAME
- export GIT_COMMITTER_EMAIL
- fi
-}
-
-clear_stash () {
- if test $# != 0
- then
- die "$(gettext "git stash clear with parameters is unimplemented")"
- fi
- if current=$(git rev-parse --verify --quiet $ref_stash)
- then
- git update-ref -d $ref_stash $current
- fi
-}
-
-create_stash () {
-
- prepare_fallback_ident
-
- stash_msg=
- untracked=
- while test $# != 0
- do
- case "$1" in
- -m|--message)
- shift
- stash_msg=${1?"BUG: create_stash () -m requires an argument"}
- ;;
- -m*)
- stash_msg=${1#-m}
- ;;
- --message=*)
- stash_msg=${1#--message=}
- ;;
- -u|--include-untracked)
- shift
- untracked=${1?"BUG: create_stash () -u requires an argument"}
- ;;
- --)
- shift
- break
- ;;
- esac
- shift
- done
-
- git update-index -q --refresh
- if no_changes "$@"
- then
- exit 0
- fi
-
- # state of the base commit
- if b_commit=$(git rev-parse --verify HEAD)
- then
- head=$(git rev-list --oneline -n 1 HEAD --)
- else
- die "$(gettext "You do not have the initial commit yet")"
- fi
-
- if branch=$(git symbolic-ref -q HEAD)
- then
- branch=${branch#refs/heads/}
- else
- branch='(no branch)'
- fi
- msg=$(printf '%s: %s' "$branch" "$head")
-
- # state of the index
- i_tree=$(git write-tree) &&
- i_commit=$(printf 'index on %s\n' "$msg" |
- git commit-tree $i_tree -p $b_commit) ||
- die "$(gettext "Cannot save the current index state")"
-
- if test -n "$untracked"
- then
- # Untracked files are stored by themselves in a parentless commit, for
- # ease of unpacking later.
- u_commit=$(
- untracked_files -z "$@" | (
- GIT_INDEX_FILE="$TMPindex" &&
- export GIT_INDEX_FILE &&
- rm -f "$TMPindex" &&
- git update-index -z --add --remove --stdin &&
- u_tree=$(git write-tree) &&
- printf 'untracked files on %s\n' "$msg" | git commit-tree $u_tree &&
- rm -f "$TMPindex"
- ) ) || die "$(gettext "Cannot save the untracked files")"
-
- untracked_commit_option="-p $u_commit";
- else
- untracked_commit_option=
- fi
-
- if test -z "$patch_mode"
- then
-
- # state of the working tree
- w_tree=$( (
- git read-tree --index-output="$TMPindex" -m $i_tree &&
- GIT_INDEX_FILE="$TMPindex" &&
- export GIT_INDEX_FILE &&
- git diff-index --name-only -z HEAD -- "$@" >"$TMP-stagenames" &&
- git update-index -z --add --remove --stdin <"$TMP-stagenames" &&
- git write-tree &&
- rm -f "$TMPindex"
- ) ) ||
- die "$(gettext "Cannot save the current worktree state")"
-
- else
-
- rm -f "$TMP-index" &&
- GIT_INDEX_FILE="$TMP-index" git read-tree HEAD &&
-
- # find out what the user wants
- GIT_INDEX_FILE="$TMP-index" \
- git add--interactive --patch=stash -- "$@" &&
-
- # state of the working tree
- w_tree=$(GIT_INDEX_FILE="$TMP-index" git write-tree) ||
- die "$(gettext "Cannot save the current worktree state")"
-
- git diff-tree -p HEAD $w_tree -- >"$TMP-patch" &&
- test -s "$TMP-patch" ||
- die "$(gettext "No changes selected")"
-
- rm -f "$TMP-index" ||
- die "$(gettext "Cannot remove temporary index (can't happen)")"
-
- fi
-
- # create the stash
- if test -z "$stash_msg"
- then
- stash_msg=$(printf 'WIP on %s' "$msg")
- else
- stash_msg=$(printf 'On %s: %s' "$branch" "$stash_msg")
- fi
- w_commit=$(printf '%s\n' "$stash_msg" |
- git commit-tree $w_tree -p $b_commit -p $i_commit $untracked_commit_option) ||
- die "$(gettext "Cannot record working tree state")"
-}
-
-push_stash () {
- keep_index=
- patch_mode=
- untracked=
- stash_msg=
- while test $# != 0
- do
- case "$1" in
- -k|--keep-index)
- keep_index=t
- ;;
- --no-keep-index)
- keep_index=n
- ;;
- -p|--patch)
- patch_mode=t
- # only default to keep if we don't already have an override
- test -z "$keep_index" && keep_index=t
- ;;
- -q|--quiet)
- GIT_QUIET=t
- ;;
- -u|--include-untracked)
- untracked=untracked
- ;;
- -a|--all)
- untracked=all
- ;;
- -m|--message)
- shift
- test -z ${1+x} && usage
- stash_msg=$1
- ;;
- -m*)
- stash_msg=${1#-m}
- ;;
- --message=*)
- stash_msg=${1#--message=}
- ;;
- --help)
- show_help
- ;;
- --)
- shift
- break
- ;;
- -*)
- option="$1"
- eval_gettextln "error: unknown option for 'stash push': \$option"
- usage
- ;;
- *)
- break
- ;;
- esac
- shift
- done
-
- eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
-
- if test -n "$patch_mode" && test -n "$untracked"
- then
- die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")"
- fi
-
- test -n "$untracked" || git ls-files --error-unmatch -- "$@" >/dev/null || exit 1
-
- git update-index -q --refresh
- if no_changes "$@"
- then
- say "$(gettext "No local changes to save")"
- exit 0
- fi
-
- git reflog exists $ref_stash ||
- clear_stash || die "$(gettext "Cannot initialize stash")"
-
- create_stash -m "$stash_msg" -u "$untracked" -- "$@"
- git stash--helper store -m "$stash_msg" -q $w_commit ||
- die "$(gettext "Cannot save the current status")"
- say "$(eval_gettext "Saved working directory and index state \$stash_msg")"
-
- if test -z "$patch_mode"
- then
- test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
- if test -n "$untracked" && test $# = 0
- then
- git clean --force --quiet -d $CLEAN_X_OPTION
- fi
-
- if test $# != 0
- then
- test -z "$untracked" && UPDATE_OPTION="-u" || UPDATE_OPTION=
- test "$untracked" = "all" && FORCE_OPTION="--force" || FORCE_OPTION=
- git add $UPDATE_OPTION $FORCE_OPTION -- "$@"
- git diff-index -p --cached --binary HEAD -- "$@" |
- git apply --index -R
- else
- git reset --hard -q
- fi
-
- if test "$keep_index" = "t" && test -n "$i_tree"
- then
- git read-tree --reset $i_tree
- git ls-files -z --modified -- "$@" |
- git checkout-index -z --force --stdin
- fi
- else
- git apply -R < "$TMP-patch" ||
- die "$(gettext "Cannot remove worktree changes")"
-
- if test "$keep_index" != "t"
- then
- git reset -q -- "$@"
- fi
- fi
-}
-
-save_stash () {
- push_options=
- while test $# != 0
- do
- case "$1" in
- --)
- shift
- break
- ;;
- -*)
- # pass all options through to push_stash
- push_options="$push_options $1"
- ;;
- *)
- break
- ;;
- esac
- shift
- done
-
- stash_msg="$*"
-
- if test -z "$stash_msg"
- then
- push_stash $push_options
- else
- push_stash $push_options -m "$stash_msg"
- fi
-}
-
-show_help () {
- exec git help stash
- exit 1
-}
-
#
# Parses the remaining options looking for flags and
# at most one revision defaulting to ${ref_stash}@{0}
@@ -425,7 +100,8 @@ show)
;;
save)
shift
- save_stash "$@"
+ cd "$START_DIR"
+ git stash--helper save "$@"
;;
push)
shift
--
2.20.1.441.g764a526393
next prev parent reply other threads:[~2018-12-20 19:45 UTC|newest]
Thread overview: 106+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <https://public-inbox.org/git/cover.1542925164.git.ungureanupaulsebastian@gmail.com/>
2018-12-20 19:44 ` [PATCH v12 00/26] Convert "git stash" to C builtin Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 01/26] sha1-name.c: add `get_oidf()` which acts like `get_oid()` Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 02/26] strbuf.c: add `strbuf_join_argv()` Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 03/26] strbuf.c: add `strbuf_insertf()` and `strbuf_vinsertf()` Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 04/26] ident: add the ability to provide a "fallback identity" Paul-Sebastian Ungureanu
2018-12-26 21:21 ` Junio C Hamano
2018-12-27 21:24 ` Johannes Schindelin
2018-12-28 19:40 ` Junio C Hamano
2018-12-20 19:44 ` [PATCH v12 05/26] stash: improve option parsing test coverage Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 06/26] t3903: modernize style Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 07/26] stash: rename test cases to be more descriptive Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 08/26] stash: add tests for `git stash show` config Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 09/26] stash: mention options in `show` synopsis Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 10/26] stash: convert apply to builtin Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 11/26] stash: convert drop and clear " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 12/26] stash: convert branch " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 13/26] stash: convert pop " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 14/26] stash: convert list " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 15/26] stash: convert show " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 16/26] stash: convert store " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 17/26] stash: convert create " Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 18/26] stash: convert push " Paul-Sebastian Ungureanu
2019-02-08 11:30 ` SZEDER Gábor
2019-02-10 22:17 ` Thomas Gummerer
2019-02-11 1:13 ` SZEDER Gábor
2019-02-12 23:18 ` Thomas Gummerer
2019-02-19 0:23 ` SZEDER Gábor
2019-02-19 10:47 ` Johannes Schindelin
2019-02-19 19:59 ` Junio C Hamano
2019-02-20 21:01 ` Johannes Schindelin
2019-02-19 23:59 ` Thomas Gummerer
2019-02-20 4:37 ` Junio C Hamano
2019-02-20 21:10 ` Johannes Schindelin
2019-02-20 22:30 ` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 00/27] Convert "git stash" to C builtin Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 01/27] sha1-name.c: add `get_oidf()` which acts like `get_oid()` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 02/27] strbuf.c: add `strbuf_join_argv()` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 03/27] strbuf.c: add `strbuf_insertf()` and `strbuf_vinsertf()` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 04/27] ident: add the ability to provide a "fallback identity" Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 05/27] stash: improve option parsing test coverage Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 06/27] t3903: modernize style Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 07/27] t3903: add test for --intent-to-add file Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 08/27] stash: rename test cases to be more descriptive Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 09/27] stash: add tests for `git stash show` config Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 10/27] stash: mention options in `show` synopsis Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 11/27] stash: convert apply to builtin Thomas Gummerer
2019-03-14 13:19 ` regression in new built-in stash + fsmonitor (was Re: [PATCH v13 11/27] stash: convert apply to builtin) Ævar Arnfjörð Bjarmason
2019-03-14 15:20 ` Johannes Schindelin
2019-03-14 15:40 ` Ævar Arnfjörð Bjarmason
2019-03-14 22:45 ` Johannes Schindelin
2019-03-14 23:39 ` Ævar Arnfjörð Bjarmason
2019-03-15 2:23 ` Ben Peart
2019-02-25 23:16 ` [PATCH v13 12/27] stash: convert drop and clear to builtin Thomas Gummerer
2019-03-07 19:15 ` Jeff King
2019-03-09 18:30 ` Thomas Gummerer
2019-03-10 23:26 ` Jeff King
2019-03-11 1:40 ` Junio C Hamano
2019-03-11 21:40 ` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 13/27] stash: convert branch " Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 14/27] stash: convert pop " Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 15/27] stash: convert list " Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 16/27] stash: convert show " Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 17/27] stash: convert store " Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 18/27] stash: convert create " Thomas Gummerer
2019-03-07 19:18 ` Jeff King
2019-03-08 15:30 ` Johannes Schindelin
2019-03-09 18:26 ` Thomas Gummerer
2019-03-11 1:47 ` Junio C Hamano
2019-03-11 7:30 ` Junio C Hamano
2019-03-11 21:42 ` Thomas Gummerer
2019-03-11 22:16 ` [PATCH v2] stash: pass pathspec as pointer Thomas Gummerer
2019-03-12 6:50 ` Junio C Hamano
2019-03-12 22:35 ` Johannes Schindelin
2019-03-12 23:40 ` Thomas Gummerer
2019-03-13 1:47 ` Junio C Hamano
2019-03-13 22:14 ` Johannes Schindelin
2019-03-15 22:33 ` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 19/27] stash: convert push to builtin Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 20/27] stash: make push -q quiet Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 21/27] stash: convert save to builtin Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 22/27] stash: optimize `get_untracked_files()` and `check_changes()` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 23/27] stash: replace all `write-tree` child processes with API calls Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 24/27] stash: convert `stash--helper.c` into `stash.c` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 25/27] stash: add back the original, scripted `git stash` Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 26/27] stash: optionally use the scripted version again Thomas Gummerer
2019-02-25 23:16 ` [PATCH v13 27/27] tests: add a special setup where stash.useBuiltin is off Thomas Gummerer
2019-02-26 12:40 ` [PATCH v13 00/27] Convert "git stash" to C builtin Johannes Schindelin
2019-02-26 20:48 ` Thomas Gummerer
2019-02-26 21:45 ` Ævar Arnfjörð Bjarmason
2019-02-26 22:37 ` Johannes Schindelin
2019-03-03 1:24 ` Junio C Hamano
2019-03-03 1:25 ` Junio C Hamano
2019-03-03 10:03 ` Thomas Gummerer
2018-12-20 19:44 ` [PATCH v12 19/26] stash: make push -q quiet Paul-Sebastian Ungureanu
2018-12-20 19:44 ` Paul-Sebastian Ungureanu [this message]
2018-12-20 19:44 ` [PATCH v12 21/26] stash: optimize `get_untracked_files()` and `check_changes()` Paul-Sebastian Ungureanu
2019-01-06 22:47 ` Thomas Gummerer
2018-12-20 19:44 ` [PATCH v12 22/26] stash: replace all `write-tree` child processes with API calls Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 23/26] stash: convert `stash--helper.c` into `stash.c` Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 24/26] stash: add back the original, scripted `git stash` Paul-Sebastian Ungureanu
2018-12-20 19:44 ` [PATCH v12 25/26] stash: optionally use the scripted version again Paul-Sebastian Ungureanu
2019-01-06 22:59 ` Thomas Gummerer
2018-12-20 19:44 ` [PATCH v12 26/26] tests: add a special setup where stash.useBuiltin is off Paul-Sebastian Ungureanu
2019-01-03 23:39 ` [PATCH v12 00/26] Convert "git stash" to C builtin Junio C Hamano
2019-01-18 12:06 ` Johannes Schindelin
2019-01-18 17:49 ` 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
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=1b16cdb63b0d40161bf3b70480ff7177f14fd3bf.1545331726.git.ungureanupaulsebastian@gmail.com \
--to=ungureanupaulsebastian@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=t.gummerer@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).