public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail•com>
To: Patrick Steinhardt <ps@pks•im>, git@vger•kernel.org
Cc: "D. Ben Knoble" <ben.knoble@gmail•com>,
	"Junio C Hamano" <gitster@pobox•com>,
	"Sergey Organov" <sorganov@gmail•com>,
	"Jean-Noël AVILA" <jn.avila@free•fr>,
	"Martin von Zweigbergk" <martinvonz@gmail•com>,
	"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail•com>,
	"Elijah Newren" <newren@gmail•com>,
	"Karthik Nayak" <karthik.188@gmail•com>
Subject: Re: [PATCH v6 11/11] builtin/history: implement "split" subcommand
Date: Fri, 21 Nov 2025 14:31:14 +0000	[thread overview]
Message-ID: <a27fce64-0d4c-4280-93e5-00cce812d1b2@gmail.com> (raw)
In-Reply-To: <20251027-b4-pks-history-builtin-v6-11-407dd3f57ad3@pks.im>

Hi Patrick

On 27/10/2025 11:33, Patrick Steinhardt wrote:
> It is quite a common use case that one wants to split up one commit into
> multiple commits by moving parts of the changes of the original commit
> out into a separate commit. This is quite an involved operation though:
> 
>    1. Identify the commit in question that is to be dropped.
> 
>    2. Perform an interactive rebase on top of that commit's parent.
> 
>    3. Modify the instruction sheet to "edit" the commit that is to be
>       split up.
> 
>    4. Drop the commit via "git reset HEAD~".
> 
>    5. Stage changes that should go into the first commit and commit it.
> 
>    6. Stage changes that should go into the second commit and commit it.
> 
>    7. Finalize the rebase.
> 
> This is quite complex, and overall I would claim that most people who
> are not experts in Git would struggle with this flow.

If they want to test the split commit it's even more complicated because 
they need to stash the unstaged changes. We should think about how we 
can add support for testing split commits to this command in the future.

> Introduce a new "split" subcommand for git-history(1) to make this way
> easier. All the user needs to do is to say `git history split $COMMIT`.
>  From hereon, Git asks the user which parts of the commit shall be moved
> out into a separate commit and, once done, asks the user for the commit
> message. Git then creates that split-out commit and applies the original
> commit on top of it.

As others have said (and I thought we'd agreed c.f. 
<aMfdR3JE4zq-2j9b@pks•im>) I think it would be better to prompt the user 
to edit the existing commit message when creating both commits. 
Elsewhere Elijah mention being able to split a commit into more than two 
commits. I wonder if we could loop running run_add_p_index() and 
committing the result until there are no more changes left. It does mean 
that the user has to actively select changes for the final commit though 
which might be annoying. We can always play with that later.

Looking below I do wonder if we can share more code between subcommands 
when it comes to checking the commit we're given on the command line and 
re-creating a commit and having the user edit the message.

> +static int split_commit(struct repository *repo,
> +			struct commit *original_commit,
> +			struct pathspec *pathspec,
> +			struct object_id *out)
 > {
> [...]> +	/*
> +	* Construct the first commit. This is done by taking the original
> +	* commit parent's tree and selectively patching changes from the diff
> +	* between that parent and its child.
> +	*/
> +	repo_git_path_replace(repo, &index_file, "%s", "history-split.index");
> +
> +	read_tree_cmd.git_cmd = 1;
> +	strvec_pushf(&read_tree_cmd.env, "GIT_INDEX_FILE=%s", index_file.buf);
> +	strvec_push(&read_tree_cmd.args, "read-tree");
> +	strvec_push(&read_tree_cmd.args, oid_to_hex(&parent_tree_oid));
> +	ret = run_command(&read_tree_cmd);

Why do we need to fork "read-tree" here rather than call unpack_trees() 
ourselves?

> [...]
> +	/* We retain authorship of the original commit. */
> +	original_message = repo_logmsg_reencode(repo, original_commit, NULL, NULL);
> +	ptr = find_commit_header(original_message, "author", &len);
> +	if (ptr)
> +		original_author = xmemdupz(ptr, len);
> +
> +	ret = fill_commit_message(repo, &parent_tree_oid, &split_tree->object.oid,
> +				  "", "split-out", &split_message);
> +	if (ret < 0)
> +		goto out;
> +
> +	ret = commit_tree(split_message.buf, split_message.len, &split_tree->object.oid,
> +			  original_commit->parents, &out[0], original_author, NULL);
> +	if (ret < 0) {
> +		ret = error(_("failed writing split-out commit"));
> +		goto out;
> +	}

Don't we have the same code for rewording a commit, maybe we should 
package this up into a shared helper function.

> +static int cmd_history_split(int argc,
> +			     const char **argv,
> +			     const char *prefix,
> +			     struct repository *repo)
> +{
> +	const char * const usage[] = {
> +		GIT_HISTORY_SPLIT_USAGE,
> +		NULL,
> +	};
> +	struct option options[] = {
> +		OPT_END(),
> +	};
> +	struct oidmap rewritten_commits = OIDMAP_INIT;
> +	struct commit *original_commit, *parent, *head;
> +	struct strvec commits = STRVEC_INIT;
> +	struct commit_list *from_list = NULL;
> +	struct object_id split_commits[2];
> +	struct pathspec pathspec = { 0 };
> +	int ret;
> +
> +	argc = parse_options(argc, argv, prefix, options, usage, 0);
> +	if (argc < 1) {
> +		ret = error(_("command expects a revision"));
> +		goto out;
> +	}
> +	repo_config(repo, git_default_config, NULL);
> +
> +	original_commit = lookup_commit_reference_by_name(argv[0]);
> +	if (!original_commit) {
> +		ret = error(_("commit to be split cannot be found: %s"), argv[0]);
> +		goto out;
> +	}
> +
> +	parent = original_commit->parents ? original_commit->parents->item : NULL;
> +	if (parent && repo_parse_commit(repo, parent)) {
> +		ret = error(_("unable to parse commit %s"),
> +			    oid_to_hex(&parent->object.oid));
> +		goto out;
> +	}
> +
> +	head = lookup_commit_reference_by_name("HEAD");
> +	if (!head) {
> +		ret = error(_("could not resolve HEAD to a commit"));
> +		goto out;
> +	}
> +
> +	commit_list_append(original_commit, &from_list);
> +	if (!repo_is_descendant_of(repo, head, from_list)) {
> +		ret = error(_("split commit must be reachable from current HEAD commit"));
> +		goto out;
> +	}

This is very similar to cmd_history_reword() up to this point. When we 
add the "drop" and "amend" subcommands they're going to want to do the 
same checks.

> +	parse_pathspec(&pathspec, 0,
> +		PATHSPEC_PREFER_FULL | PATHSPEC_SYMLINK_LEADING_PATH | PATHSPEC_PREFIX_ORIGIN,
> +		prefix, argv + 1);

This and calling split_commit() below are the only real differences with 
cmd_history_reword(), is it worth trying to share some more code between 
the two?

> diff --git a/t/t3452-history-split.sh b/t/t3452-history-split.sh
> [...]
> +test_expect_success 'refuses to work with merge commits' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		test_commit base &&
> +		git branch branch &&
> +		test_commit ours &&
> +		git switch branch &&
> +		test_commit theirs &&
> +		git switch - &&
> +		git merge theirs &&
> +		test_must_fail git history split HEAD 2>err &&
> +		test_grep "cannot rearrange commit history with merges" err &&
> +		test_must_fail git history split HEAD~ 2>err &&
> +		test_grep "cannot rearrange commit history with merges" err
> +	)
> +'

My comments from the reword tests apply here as well.

Thanks

Phillip

> +
> +test_expect_success 'refuses to work with unrelated commits' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		test_commit base &&
> +		git branch branch &&
> +		test_commit ours &&
> +		git switch branch &&
> +		test_commit theirs &&
> +		test_must_fail git history split ours 2>err &&
> +		test_grep "split commit must be reachable from current HEAD commit" err
> +	)
> +'
> +
> +test_expect_success 'can split up tip commit' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		test_commit initial &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		git symbolic-ref HEAD >expect &&
> +		set_fake_editor "split-out commit" &&
> +		git history split HEAD <<-EOF &&
> +		y
> +		n
> +		EOF
> +		git symbolic-ref HEAD >actual &&
> +		test_cmp expect actual &&
> +
> +		expect_log <<-EOF &&
> +		split-me
> +		split-out commit
> +		initial
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		bar
> +		initial.t
> +		EOF
> +
> +		expect_tree_entries HEAD <<-EOF
> +		bar
> +		foo
> +		initial.t
> +		EOF
> +	)
> +'
> +
> +test_expect_success 'can split up root commit' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m root &&
> +		test_commit tip &&
> +
> +		set_fake_editor "split-out commit" &&
> +		git history split HEAD~ <<-EOF &&
> +		y
> +		n
> +		EOF
> +
> +		expect_log <<-EOF &&
> +		tip
> +		root
> +		split-out commit
> +		EOF
> +
> +		expect_tree_entries HEAD~2 <<-EOF &&
> +		bar
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		bar
> +		foo
> +		EOF
> +
> +		expect_tree_entries HEAD <<-EOF
> +		bar
> +		foo
> +		tip.t
> +		EOF
> +	)
> +'
> +
> +test_expect_success 'can split up in-between commit' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		test_commit initial &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +		test_commit tip &&
> +
> +		set_fake_editor "split-out commit" &&
> +		git history split HEAD~ <<-EOF &&
> +		y
> +		n
> +		EOF
> +
> +		expect_log <<-EOF &&
> +		tip
> +		split-me
> +		split-out commit
> +		initial
> +		EOF
> +
> +		expect_tree_entries HEAD~2 <<-EOF &&
> +		bar
> +		initial.t
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		bar
> +		foo
> +		initial.t
> +		EOF
> +
> +		expect_tree_entries HEAD <<-EOF
> +		bar
> +		foo
> +		initial.t
> +		tip.t
> +		EOF
> +	)
> +'
> +
> +test_expect_success 'can pick multiple hunks' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar baz foo qux &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		set_fake_editor "split-out-commit" &&
> +		git history split HEAD <<-EOF &&
> +		y
> +		n
> +		y
> +		n
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		bar
> +		foo
> +		EOF
> +
> +		expect_tree_entries HEAD <<-EOF
> +		bar
> +		baz
> +		foo
> +		qux
> +		EOF
> +	)
> +'
> +
> +
> +test_expect_success 'can use only last hunk' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		set_fake_editor "split-out commit" &&
> +		git history split HEAD <<-EOF &&
> +		n
> +		y
> +		EOF
> +
> +		expect_log <<-EOF &&
> +		split-me
> +		split-out commit
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		foo
> +		EOF
> +
> +		expect_tree_entries HEAD <<-EOF
> +		bar
> +		foo
> +		EOF
> +	)
> +'
> +
> +test_expect_success 'aborts with empty commit message' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		set_fake_editor "" &&
> +		test_must_fail git history split HEAD <<-EOF 2>err &&
> +		y
> +		n
> +		EOF
> +		test_grep "Aborting commit due to empty commit message." err
> +	)
> +'
> +
> +test_expect_success 'commit message editor sees split-out changes' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		write_script fake-editor.sh <<-\EOF &&
> +		cp "$1" . &&
> +		echo "some commit message" >>"$1"
> +		EOF
> +		test_set_editor "$(pwd)"/fake-editor.sh &&
> +
> +		git history split HEAD <<-EOF &&
> +		y
> +		n
> +		EOF
> +
> +		cat >expect <<-EOF &&
> +
> +		# Please enter the commit message for the split-out changes. Lines starting
> +		# with ${SQ}#${SQ} will be ignored.
> +		# Changes to be committed:
> +		#	new file:   bar
> +		#
> +		EOF
> +		test_cmp expect COMMIT_EDITMSG &&
> +
> +		expect_log <<-EOF
> +		split-me
> +		some commit message
> +		EOF
> +	)
> +'
> +
> +test_expect_success 'can use pathspec to limit what gets split' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		set_fake_editor "split-out commit" &&
> +		git history split HEAD -- foo <<-EOF &&
> +		y
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		foo
> +		EOF
> +
> +		expect_tree_entries HEAD <<-EOF
> +		bar
> +		foo
> +		EOF
> +	)
> +'
> +
> +test_expect_success 'refuses to create empty split-out commit' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		test_commit base &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		test_must_fail git history split HEAD 2>err <<-EOF &&
> +		n
> +		n
> +		EOF
> +		test_grep "split commit is empty" err
> +	)
> +'
> +
> +test_expect_success 'hooks are executed for rewritten commits' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +		old_head=$(git rev-parse HEAD) &&
> +
> +		write_script .git/hooks/prepare-commit-msg <<-EOF &&
> +		touch "$(pwd)/hooks.log"
> +		EOF
> +		write_script .git/hooks/post-commit <<-EOF &&
> +		touch "$(pwd)/hooks.log"
> +		EOF
> +		write_script .git/hooks/post-rewrite <<-EOF &&
> +		touch "$(pwd)/hooks.log"
> +		EOF
> +
> +		set_fake_editor "split-out commit" &&
> +		git history split HEAD <<-EOF &&
> +		y
> +		n
> +		EOF
> +
> +		expect_log <<-EOF &&
> +		split-me
> +		split-out commit
> +		EOF
> +
> +		test_path_is_missing hooks.log
> +	)
> +'
> +
> +test_expect_success 'refuses to create empty original commit' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		touch bar foo &&
> +		git add . &&
> +		git commit -m split-me &&
> +
> +		test_must_fail git history split HEAD 2>err <<-EOF &&
> +		y
> +		y
> +		EOF
> +		test_grep "split commit tree matches original commit" err
> +	)
> +'
> +
> +test_expect_success 'retains changes in the worktree and index' '
> +	test_when_finished "rm -rf repo" &&
> +	git init repo &&
> +	(
> +		cd repo &&
> +		echo a >a &&
> +		echo b >b &&
> +		git add . &&
> +		git commit -m "initial commit" &&
> +		echo a-modified >a &&
> +		echo b-modified >b &&
> +		git add b &&
> +		set_fake_editor "a-only" &&
> +		git history split HEAD <<-EOF &&
> +		y
> +		n
> +		EOF
> +
> +		expect_tree_entries HEAD~ <<-EOF &&
> +		a
> +		EOF
> +		expect_tree_entries HEAD <<-EOF &&
> +		a
> +		b
> +		EOF
> +
> +		cat >expect <<-\EOF &&
> +		 M a
> +		M  b
> +		?? actual
> +		?? expect
> +		?? fake-editor.sh
> +		EOF
> +		git status --porcelain >actual &&
> +		test_cmp expect actual
> +	)
> +'
> +
> +test_done
> 


  parent reply	other threads:[~2025-11-21 14:31 UTC|newest]

Thread overview: 362+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-19 10:55 [PATCH RFC 00/11] Introduce git-history(1) command for easy history editing Patrick Steinhardt
2025-08-19 10:55 ` [PATCH RFC 01/11] sequencer: optionally skip printing commit summary Patrick Steinhardt
2025-08-19 10:55 ` [PATCH RFC 02/11] sequencer: add option to rewind HEAD after picking commits Patrick Steinhardt
2025-08-19 10:55 ` [PATCH RFC 03/11] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 04/11] builtin: add new "history" command Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 05/11] builtin/history: implement "drop" subcommand Patrick Steinhardt
2025-08-20 20:39   ` Ben Knoble
2025-08-22 12:21     ` Patrick Steinhardt
2025-08-23 16:15   ` Jean-Noël AVILA
2025-08-24 16:02     ` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 06/11] builtin/history: implement "reorder" subcommand Patrick Steinhardt
2025-08-23 16:24   ` Jean-Noël AVILA
2025-08-24 17:25   ` Kristoffer Haugsbakk
2025-08-24 17:34     ` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 07/11] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 08/11] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 09/11] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 10/11] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-08-20 21:15   ` D. Ben Knoble
2025-08-22 12:21     ` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 11/11] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-08-20 21:27   ` D. Ben Knoble
2025-08-22 12:22     ` Patrick Steinhardt
2025-08-22 18:08       ` Junio C Hamano
2025-08-24 16:03         ` Patrick Steinhardt
2025-08-23 16:37   ` Jean-Noël AVILA
2025-08-24 16:02     ` Patrick Steinhardt
2025-08-19 21:28 ` [PATCH RFC 00/11] Introduce git-history(1) command for easy history editing D. Ben Knoble
2025-08-20  6:54   ` Patrick Steinhardt
2025-08-20 16:55     ` Ben Knoble
2025-08-20 17:36 ` Junio C Hamano
2025-08-20 17:49   ` Ben Knoble
2025-08-22 12:21     ` Patrick Steinhardt
2025-08-22 17:58       ` Junio C Hamano
2025-08-21 16:26   ` Sergey Organov
2025-08-21 17:21     ` Ben Knoble
2025-08-21 18:15       ` Sergey Organov
2025-08-24  1:25 ` Martin von Zweigbergk
2025-08-24 16:03   ` Patrick Steinhardt
2025-09-17 20:12     ` SZEDER Gábor
2025-12-03 18:18       ` Matthias Beyer
2025-12-10  9:58         ` Phillip Wood
2025-12-10 10:37           ` Matthias Beyer
2025-12-10 11:34             ` Phillip Wood
2025-12-10 14:18               ` Junio C Hamano
2025-12-19 12:22                 ` Patrick Steinhardt
2025-12-19 13:58                   ` SZEDER Gábor
2025-12-19 14:09                     ` Patrick Steinhardt
2025-12-19 16:30                   ` Elijah Newren
2025-12-20 16:51                     ` Elijah Newren
2026-01-06 15:39                       ` Patrick Steinhardt
2025-12-22 10:46                   ` Phillip Wood
2026-01-06 15:40                     ` Patrick Steinhardt
2025-12-22 13:47                   ` D. Ben Knoble
2025-12-10 16:49             ` Martin von Zweigbergk
2025-12-10 18:27               ` Elijah Newren
2025-12-10 18:45                 ` Martin von Zweigbergk
2025-12-10 19:55                   ` Elijah Newren
2025-12-15 23:50             ` Kristoffer Haugsbakk
2025-08-24 17:31 ` Kristoffer Haugsbakk
2025-08-24 17:38   ` Patrick Steinhardt
2025-08-24 17:42 ` [PATCH RFC v2 00/16] " Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 01/16] sequencer: optionally skip printing commit summary Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 02/16] sequencer: add option to rewind HEAD after picking commits Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 03/16] sequencer: introduce new history editing mode Patrick Steinhardt
2025-08-26 12:55     ` D. Ben Knoble
2025-09-03 12:19       ` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 04/16] sequencer: stop using `the_repository` in `sequencer_remove_state()` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 05/16] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-08-25 16:38     ` Junio C Hamano
2025-09-03 12:19       ` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 06/16] builtin: add new "history" command Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 07/16] builtin/history: introduce subcommands to manage interrupted rewrites Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 08/16] builtin/history: implement "drop" subcommand Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 09/16] builtin/history: implement "reorder" subcommand Patrick Steinhardt
2025-08-26 13:03     ` D. Ben Knoble
2025-09-03 12:19       ` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 10/16] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-08-25 16:41     ` Junio C Hamano
2025-08-24 17:42   ` [PATCH RFC v2 11/16] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 12/16] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-08-25 16:43     ` Junio C Hamano
2025-08-24 17:42   ` [PATCH RFC v2 13/16] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 14/16] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 15/16] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-08-24 18:03     ` Kristoffer Haugsbakk
2025-09-03 12:20       ` Patrick Steinhardt
2025-08-26 13:14     ` D. Ben Knoble
2025-09-03 12:20       ` Patrick Steinhardt
2025-09-03 21:55         ` D. Ben Knoble
2025-09-04 12:57           ` Patrick Steinhardt
2025-09-12 18:26             ` D. Ben Knoble
2025-09-15  9:32               ` Patrick Steinhardt
2025-09-15 13:04                 ` Ben Knoble
2025-08-24 17:42   ` [PATCH RFC v2 16/16] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-08-24 18:08     ` Kristoffer Haugsbakk
2025-09-03 12:20       ` Patrick Steinhardt
2025-09-03 23:39   ` [PATCH RFC v2 00/16] Introduce git-history(1) command for easy history editing D. Ben Knoble
2025-09-04 13:05     ` Patrick Steinhardt
2025-09-04 14:27 ` [PATCH RFC v3 00/18] " Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 01/18] sequencer: optionally skip printing commit summary Patrick Steinhardt
2025-09-10 14:01     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 02/18] sequencer: add option to rewind HEAD after picking commits Patrick Steinhardt
2025-09-10 14:04     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-15 14:10         ` Phillip Wood
2025-09-04 14:27   ` [PATCH RFC v3 03/18] sequencer: introduce new history editing mode Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 04/18] sequencer: stop using `the_repository` in `sequencer_remove_state()` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 05/18] sequencer: wire up "rewritten-hook" for REPLAY_HISTORY_EDIT Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 06/18] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 07/18] builtin: add new "history" command Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 08/18] builtin/history: introduce subcommands to manage interrupted rewrites Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 09/18] builtin/history: implement "drop" subcommand Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 10/18] builtin/history: implement "reorder" subcommand Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 11/18] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 12/18] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 13/18] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 14/18] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 15/18] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 16/18] sequencer: allow callers to provide mappings for the old commit Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 17/18] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-09-10 14:04     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 18/18] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-09-10 14:05     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-15 14:10         ` Phillip Wood
2025-09-16  8:09           ` Patrick Steinhardt
2025-09-16  8:42             ` Phillip Wood
2025-09-05 10:29   ` [PATCH RFC v3 00/18] Introduce git-history(1) command for easy history editing Kristoffer Haugsbakk
2025-09-05 11:29     ` Patrick Steinhardt
2025-09-07  6:46   ` Elijah Newren
2025-09-10 14:05     ` Phillip Wood
2025-09-10 14:08       ` Phillip Wood
2025-09-15  9:33     ` Patrick Steinhardt
2025-09-16 11:23       ` Oswald Buddenhagen
2025-09-10 20:05   ` Junio C Hamano
2025-09-15  9:32     ` Patrick Steinhardt
2025-10-01 15:57 ` [PATCH v4 00/12] " Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 01/12] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-10-14  8:49     ` Karthik Nayak
2025-10-21 11:43       ` Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 02/12] replay: extract logic to pick commits Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 03/12] replay: stop using `the_repository` Patrick Steinhardt
2025-10-14  8:53     ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 04/12] replay: parse commits before dereferencing them Patrick Steinhardt
2025-10-14  8:57     ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 05/12] builtin: add new "history" command Patrick Steinhardt
2025-10-02  9:26     ` Kristoffer Haugsbakk
2025-10-14  9:07     ` Karthik Nayak
2025-10-21 11:43       ` Patrick Steinhardt
2025-10-22  3:32       ` Junio C Hamano
2025-10-22 12:12         ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 06/12] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-10-14 11:04     ` Karthik Nayak
2025-10-21 11:43       ` Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 07/12] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 08/12] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-10-02  9:25     ` Kristoffer Haugsbakk
2025-10-14 12:35     ` Karthik Nayak
2025-10-21 11:44       ` Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 09/12] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 10/12] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-10-02  9:28     ` Kristoffer Haugsbakk
2025-10-02 10:24       ` Patrick Steinhardt
2025-10-14 13:08     ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 11/12] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 12/12] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-10-14 13:38     ` Karthik Nayak
2025-10-21 11:44       ` Patrick Steinhardt
2025-10-21 21:19         ` D. Ben Knoble
2025-10-27  9:58           ` Patrick Steinhardt
2025-10-14 13:41   ` [PATCH v4 00/12] Introduce git-history(1) command for easy history editing Karthik Nayak
2025-10-14 16:47   ` Junio C Hamano
2025-10-21 14:15 ` [PATCH v5 " Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 01/12] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-10-21 20:38     ` Junio C Hamano
2025-10-21 14:15   ` [PATCH v5 02/12] replay: extract logic to pick commits Patrick Steinhardt
2025-10-21 20:41     ` Junio C Hamano
2025-10-21 14:15   ` [PATCH v5 03/12] replay: stop using `the_repository` Patrick Steinhardt
2025-10-21 20:48     ` Junio C Hamano
2025-10-21 20:52     ` Junio C Hamano
2025-10-21 14:15   ` [PATCH v5 04/12] replay: parse commits before dereferencing them Patrick Steinhardt
2025-10-21 20:57     ` Junio C Hamano
2025-10-27  9:57       ` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 05/12] builtin: add new "history" command Patrick Steinhardt
2025-10-21 21:15     ` Junio C Hamano
2025-10-27  9:57       ` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 06/12] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-10-21 21:34     ` Junio C Hamano
2025-10-21 21:43       ` D. Ben Knoble
2025-10-27  9:58         ` Patrick Steinhardt
2025-10-27  9:58       ` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 07/12] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 08/12] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 09/12] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 10/12] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 11/12] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-10-21 14:16   ` [PATCH v5 12/12] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-10-21 18:53   ` [PATCH v5 00/12] Introduce git-history(1) command for easy history editing Junio C Hamano
2025-10-27 11:33 ` [PATCH v6 00/11] " Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 01/11] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 02/11] replay: extract logic to pick commits Patrick Steinhardt
2025-11-17 16:27     ` Phillip Wood
2025-11-20  7:01       ` Elijah Newren
2025-10-27 11:33   ` [PATCH v6 03/11] replay: stop using `the_repository` Patrick Steinhardt
2025-11-20  7:01     ` Elijah Newren
2025-12-02 18:47       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 04/11] builtin: add new "history" command Patrick Steinhardt
2025-11-17 16:28     ` Phillip Wood
2025-12-02 18:48       ` Patrick Steinhardt
2025-11-20  7:02     ` Elijah Newren
2025-12-02 18:48       ` Patrick Steinhardt
2025-12-02 22:44         ` D. Ben Knoble
2025-12-03 10:48           ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 05/11] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-11-17 16:27     ` Phillip Wood
2025-12-02 18:50       ` Patrick Steinhardt
2025-12-10  9:52         ` Phillip Wood
2025-11-20  7:03     ` Elijah Newren
2025-12-02 18:50       ` Patrick Steinhardt
2025-11-25  8:31     ` SZEDER Gábor
2025-12-02 18:50       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 06/11] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-11-20  7:03     ` Elijah Newren
2025-10-27 11:33   ` [PATCH v6 07/11] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-11-20  7:03     ` Elijah Newren
2025-11-20 15:05     ` Phillip Wood
2025-12-02 18:48       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 08/11] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-11-20  7:03     ` Elijah Newren
2025-11-20 15:05     ` Phillip Wood
2025-10-27 11:33   ` [PATCH v6 09/11] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-11-20  7:04     ` Elijah Newren
2025-11-20 15:05       ` Phillip Wood
2025-12-02 18:49       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 10/11] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-11-20  7:04     ` Elijah Newren
2025-10-27 11:33   ` [PATCH v6 11/11] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-11-20  7:05     ` Elijah Newren
2025-12-02 18:49       ` Patrick Steinhardt
2025-11-21 14:31     ` Phillip Wood [this message]
2025-12-02 18:51       ` Patrick Steinhardt
2025-12-10  9:51         ` Phillip Wood
2025-12-19 13:00           ` Patrick Steinhardt
2025-11-12 19:13   ` [PATCH v6 00/11] Introduce git-history(1) command for easy history editing Sergey Organov
2025-11-20  7:07   ` Elijah Newren
2025-11-20 20:28     ` Junio C Hamano
2025-11-20 20:40       ` Elijah Newren
2025-11-20 20:49         ` Junio C Hamano
2025-11-20 22:02           ` Elijah Newren
2025-11-21 14:31             ` Phillip Wood
2025-11-21 16:01               ` Junio C Hamano
2025-11-23  2:54                 ` Elijah Newren
2025-12-02 18:49                   ` Patrick Steinhardt
2025-12-05  8:49                     ` Elijah Newren
2025-12-09  7:53                       ` Patrick Steinhardt
2025-12-09 17:43                         ` Martin von Zweigbergk
2025-12-10 11:32                           ` Phillip Wood
2025-12-10  6:55                         ` Elijah Newren
2025-12-09 18:29                     ` Kristoffer Haugsbakk
2025-12-12 22:00                       ` Working on top of mega merges D. Ben Knoble
2025-11-23  2:30               ` [PATCH v6 00/11] Introduce git-history(1) command for easy history editing Elijah Newren
2025-11-24 16:31                 ` Phillip Wood
2025-11-25  3:39                   ` Elijah Newren
2025-12-03 10:48 ` [PATCH v7 00/12] " Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 01/12] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 02/12] replay: extract logic to pick commits Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 03/12] replay: stop using `the_repository` Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 04/12] builtin: add new "history" command Patrick Steinhardt
2025-12-22 17:11     ` Kristoffer Haugsbakk
2026-01-06 15:41       ` Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 05/12] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 06/12] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 07/12] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 08/12] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 09/12] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 10/12] add-patch: allow disabling editing of hunks Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 11/12] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 12/12] builtin/history: implement "split" subcommand Patrick Steinhardt
2026-01-07 10:10 ` [PATCH v8 0/7] Introduce git-history(1) command for easy history editing Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 1/7] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-07 17:53     ` D. Ben Knoble
2026-01-09  7:37       ` Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 2/7] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 3/7] replay: small set of cleanups Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 4/7] replay: yield the object ID of the final rewritten commit Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 5/7] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 6/7] builtin: add new "history" command Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 7/7] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-07 18:01     ` D. Ben Knoble
2026-01-09  7:37       ` Patrick Steinhardt
2026-01-09 23:24         ` D. Ben Knoble
2026-01-10  1:20     ` Elijah Newren
2026-01-12 13:03       ` Patrick Steinhardt
2026-01-07 17:39   ` [PATCH v8 0/7] Introduce git-history(1) command for easy history editing D. Ben Knoble
2026-01-09  7:34     ` Patrick Steinhardt
2026-01-09 23:27       ` D. Ben Knoble
2026-01-09  8:35 ` [PATCH v9 " Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 1/7] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-10  1:14     ` Elijah Newren
2026-01-12 13:02       ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 2/7] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-10  1:16     ` Elijah Newren
2026-01-12 13:02       ` Patrick Steinhardt
2026-01-13  6:00         ` Elijah Newren
2026-01-13  7:31           ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 3/7] replay: small set of cleanups Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 4/7] replay: yield the object ID of the final rewritten commit Patrick Steinhardt
2026-01-10  1:17     ` Elijah Newren
2026-01-12 13:03       ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 5/7] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 6/7] builtin: add new "history" command Patrick Steinhardt
2026-01-10  1:17     ` Elijah Newren
2026-01-12 13:02       ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 7/7] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-10  1:26   ` [PATCH v9 0/7] Introduce git-history(1) command for easy history editing Elijah Newren
2026-01-10 17:14     ` SZEDER Gábor
2026-01-12 13:03       ` Patrick Steinhardt
2026-01-11  5:58   ` [PATCH 0/2] Some Elijah Newren
2026-01-11  5:58     ` [PATCH v9 8/7] SQUASH ME: Fixups Elijah Newren
2026-01-11  5:58     ` [PATCH v9 9/7] history: fix detached HEAD handling Elijah Newren
2026-01-11  6:15     ` [PATCH 0/2] Some Elijah Newren
2026-01-12 13:02     ` Patrick Steinhardt
2026-01-12 14:15 ` [PATCH v10 0/8] Introduce git-history(1) command for easy history editing Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 1/8] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-12 15:08     ` Junio C Hamano
2026-01-12 15:37       ` Patrick Steinhardt
2026-01-13  6:00     ` Elijah Newren
2026-01-13  7:31       ` Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 2/8] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 3/8] replay: small set of cleanups Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 4/8] replay: support empty commit ranges Patrick Steinhardt
2026-01-13  6:00     ` Elijah Newren
2026-01-13  7:30       ` Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 5/8] replay: support updating detached HEAD Patrick Steinhardt
2026-01-13  6:00     ` Elijah Newren
2026-01-13  7:30       ` Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 6/8] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 7/8] builtin: add new "history" command Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 8/8] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-13  6:01     ` Elijah Newren
2026-01-13  6:01   ` [PATCH v10 0/8] Introduce git-history(1) command for easy history editing Elijah Newren
2026-01-13  9:54 ` [PATCH v11 " Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 1/8] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 2/8] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 3/8] replay: small set of cleanups Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 4/8] replay: support empty commit ranges Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 5/8] replay: support updating detached HEAD Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 6/8] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 7/8] builtin: add new "history" command Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 8/8] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-16 16:28     ` SZEDER Gábor
2026-01-17 22:56       ` Elijah Newren
2026-01-18 17:50         ` Junio C Hamano
2026-02-03  0:01         ` Junio C Hamano
2026-02-05  8:19           ` Patrick Steinhardt
2026-01-16  6:43   ` [PATCH v11 0/8] Introduce git-history(1) command for easy history editing Elijah Newren
2026-01-16 15:21     ` Junio C Hamano
2026-01-16 16:32       ` SZEDER Gábor
2026-01-21 19:02         ` 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=a27fce64-0d4c-4280-93e5-00cce812d1b2@gmail.com \
    --to=phillip.wood123@gmail$(echo .)com \
    --cc=ben.knoble@gmail$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=gitster@pobox$(echo .)com \
    --cc=jn.avila@free$(echo .)fr \
    --cc=karthik.188@gmail$(echo .)com \
    --cc=kristofferhaugsbakk@fastmail$(echo .)com \
    --cc=martinvonz@gmail$(echo .)com \
    --cc=newren@gmail$(echo .)com \
    --cc=phillip.wood@dunelm$(echo .)org.uk \
    --cc=ps@pks$(echo .)im \
    --cc=sorganov@gmail$(echo .)com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox