git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [Bug] Rebase from worktree subdir is broken (was Re: [PATCH v5 07/11] rebase: do not attempt to remove startup_info->original_cwd)

From
Elijah Newren <newren@gmail.com>
Date
Jan 27, 2022, 20:03 UTC
Message-ID
<20220127200341.333996-1-newren@gmail.com>
In-Reply-To
<CAPig+cQVNdmHQnhORqh2XtJSMhcOymR99pmKTWOAyhoQ10khSw@mail.gmail.com>
On Wed, Jan 26, 2022 at 9:53 AM Eric Sunshine <sunshine@sunshineco.com> wrote:
Show 24 quoted lines
>
> On Wed, Jan 26, 2022 at 6:00 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
> > On 25/01/2022 23:59, Elijah Newren wrote:
> > > There's nothing wrong with running checkout from a subdirectory.  It
> > > is unfortunate that setup.c auto-discovers both the git directory and
> > > the working tree, but sets GIT_DIR without setting GIT_WORK_TREE in
> > > the case of a non-main worktree; it's not particularly friendly for
> > > subcommands.  Of course, it's also unfortunate that sequencer still
> > > forks subprocesses other than those requested by a user with e.g.
> > > --exec.
> > >
> > > But, anyway, I've got a patch that I'll send as soon as it passes CI
> > > (https://github.com/git/git/pull/1205).
> >
> > The patch hasn't come through to me on the mailing list yet, but it
> > looks good. I thought we set both GIT_DIR and GIT_WORK_TREE when we were
> > in a non-main worktree but obviously we don't. Eric do you happen to
> > know if that is intentional?
>
> As far as I know, there is no reason to set GIT_DIR and GIT_WORK_TREE,
> in general, when in a linked worktree since each worktree has its own
> .git file ("gitfile") which tells Git commands where the repository is
> and signals that that directory itself (which contains the .git file)
> is indeed a Git worktree.
Oh, interesting.  Not setting GIT_DIR either does sound a bit better.

...though after digging for a while, it turns out to be a bit more involved than I thought. Although the below patch passes our current testsuite and fixes the reported bug, I'm worried I've missed some cases not tested by the testsuite.

Not sure if we want to pursue this, drop it, or something else.  Thoughts?
-- >8 --
Subject: [RFC/POC PATCH] setup: do not pre-emptively set GIT_DIR based on discovery

setup_git_directory_gently() handles a few cases, but when it discovers the git directory and finds it is not ".git", it sets and exports the GIT_DIR environment variable to the discovered value. It does not set GIT_WORK_TREE, though, even when it also discovers it. This has two drawbacks:

  * Since Git assumes the working tree is '.' when GIT_DIR is set and
    GIT_WORK_TREE isn't, any subprocesses called by Git which need to
    operate on the working tree either need to be careful to always
    invoke with their cwd being the toplevel of the actual working tree
    (and potentially losing information about 'prefix'), or take care to
    also specify the GIT_WORK_TREE environment value when forking.
  * The GIT_DIR environment variable behaves somewhat like an implicit
    'the_repository'; it's another bit of global state that is
    potentially problematic for libifying efforts of libgit.

Avoid these issues by no longer exporting GIT_DIR from the setup code (other locations like the parser handling the --git-dir flag will still set it, though).

Some comments on the various code changes:
   * clone/push/fetch related:
     * there are *many* subprocesses involved in fetch/push and friends,
       and they typically need to know the GIT_DIR they are operating on
     * this involves: fetch-patch.c, connected.c, bundle.c, clone.c,
       transport-helper.c, receive-pack.c, upload-pack.c
     * this accounts for the majority of this patch
     * much of this work could be avoided by having enter_repo() call
       xsetenv(GIT_DIR_ENVIRONMENT, ".", 1) just after its set_git_dir()
       call, but I don't know if that'd be considered a half measure
   * rev-parse.c: substitute usage of the GIT_DIR environment variable
     with the_repository->gitdir that should have the same value
     (exept when the latter is ".git" the former will be NULL, so there
     are some small logic tweaks).
   * run-command: hooks have been operating under the assumption that
     GIT_DIR is set for a long time.  This is possibly
     counter-productive for the same reasons listed above, and it has
     certainly been brought up before on the list, but backward
     compatibility concerns led me to just propagate it to avoid
     breaking anything.
   * test-subprocess: not sure if we should automatically export
     GIT_DIR, but the existing code and one test in the repo relied on
     it, so I just included it.
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/clone.c            |  7 ++++++-
 builtin/receive-pack.c     | 12 ++++++++++++
 builtin/rev-parse.c        |  8 +++-----
 bundle.c                   |  2 ++
 connected.c                |  2 ++
 environment.c              |  1 -
 fetch-pack.c               |  6 ++++++
 run-command.c              |  2 ++
 t/helper/test-subprocess.c |  2 ++
 transport-helper.c         |  3 +++
 upload-pack.c              |  2 ++
 11 files changed, 40 insertions(+), 7 deletions(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index 727e16e0ae..5304939cec 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -836,13 +836,18 @@ static void dissociate_from_references(void)
 {
 	static const char* argv[] = { "repack", "-a", "-d", NULL };
 	char *alternates = git_pathdup("objects/info/alternates");
+	struct strvec env = STRVEC_INIT;
+	strvec_pushf(&env, GIT_DIR_ENVIRONMENT "=%s", the_repository->gitdir);
 
 	if (!access(alternates, F_OK)) {
-		if (run_command_v_opt(argv, RUN_GIT_CMD|RUN_COMMAND_NO_STDIN))
+		if (run_command_v_opt_cd_env(argv,
+					     RUN_GIT_CMD|RUN_COMMAND_NO_STDIN,
+					     NULL, env.v))
 			die(_("cannot repack to clean up"));
 		if (unlink(alternates) && errno != ENOENT)
 			die_errno(_("cannot unlink temporary alternates file"));
 	}
+	strvec_clear(&env);
 	free(alternates);
 }
 
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 9f4a0b816c..b5d2633b78 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -825,6 +825,8 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed,
 	proc.stdout_to_stderr = 1;
 	proc.trace2_hook_name = hook_name;
 
+	strvec_pushf(&proc.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 	if (feed_state->push_options) {
 		int i;
 		for (i = 0; i < feed_state->push_options->nr; i++)
@@ -953,6 +955,8 @@ static int run_update_hook(struct command *cmd)
 	strvec_push(&proc.args, cmd->ref_name);
 	strvec_push(&proc.args, oid_to_hex(&cmd->old_oid));
 	strvec_push(&proc.args, oid_to_hex(&cmd->new_oid));
+	strvec_pushf(&proc.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 
 	proc.no_stdin = 1;
 	proc.stdout_to_stderr = 1;
@@ -1128,6 +1132,8 @@ static int run_proc_receive_hook(struct command *commands,
 	}
 
 	strvec_push(&proc.args, hook_path);
+	strvec_pushf(&proc.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 	proc.in = -1;
 	proc.out = -1;
 	proc.trace2_hook_name = "proc-receive";
@@ -1645,6 +1651,8 @@ static void run_update_post_hook(struct command *commands)
 	proc.stdout_to_stderr = 1;
 	proc.err = use_sideband ? -1 : 0;
 	proc.trace2_hook_name = "post-update";
+	strvec_pushf(&proc.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 
 	if (!start_command(&proc)) {
 		if (use_sideband)
@@ -2236,6 +2244,8 @@ static const char *unpack(int err_fd, struct shallow_info *si)
 		child.no_stdout = 1;
 		child.err = err_fd;
 		child.git_cmd = 1;
+		strvec_pushf(&child.env_array, "%s=%s",
+			     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 		status = run_command(&child);
 		if (status)
 			return "unpack-objects abnormal exit";
@@ -2267,6 +2277,8 @@ static const char *unpack(int err_fd, struct shallow_info *si)
 		child.out = -1;
 		child.err = err_fd;
 		child.git_cmd = 1;
+		strvec_pushf(&child.env_array, "%s=%s",
+			     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 		status = start_command(&child);
 		if (status)
 			return "index-pack fork failed";
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 8480a59f57..1d578d48a1 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -930,12 +930,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 			}
 			if (!strcmp(arg, "--git-dir") ||
 			    !strcmp(arg, "--absolute-git-dir")) {
-				const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
+				const char *gitdir = the_repository->gitdir;
 				char *cwd;
 				int len;
 				enum format_type wanted = format;
 				if (arg[2] == 'g') {	/* --git-dir */
-					if (gitdir) {
+					if (strcmp(gitdir, ".git")) {
 						print_path(gitdir, prefix, format, DEFAULT_UNMODIFIED);
 						continue;
 					}
@@ -945,9 +945,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 					}
 				} else {		/* --absolute-git-dir */
 					wanted = FORMAT_CANONICAL;
-					if (!gitdir && !prefix)
-						gitdir = ".git";
-					if (gitdir) {
+					if (strcmp(gitdir, ".git") || !prefix) {
 						struct strbuf realpath = STRBUF_INIT;
 						strbuf_realpath(&realpath, gitdir, 1);
 						puts(realpath.buf);
diff --git a/bundle.c b/bundle.c
index a0bb687b0f..897d36c83a 100644
--- a/bundle.c
+++ b/bundle.c
@@ -573,6 +573,8 @@ int unbundle(struct repository *r, struct bundle_header *header,
 {
 	struct child_process ip = CHILD_PROCESS_INIT;
 	strvec_pushl(&ip.args, "index-pack", "--fix-thin", "--stdin", NULL);
+	strvec_pushf(&ip.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 
 	if (extra_index_pack_args) {
 		strvec_pushv(&ip.args, extra_index_pack_args->v);
diff --git a/connected.c b/connected.c
index ed3025e7a2..3dfc6278e8 100644
--- a/connected.c
+++ b/connected.c
@@ -109,6 +109,8 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
 			     _("Checking connectivity"));
 
 	rev_list.git_cmd = 1;
+	strvec_pushf(&rev_list.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 	if (opt->env)
 		strvec_pushv(&rev_list.env_array, opt->env);
 	rev_list.in = -1;
diff --git a/environment.c b/environment.c
index fd0501e77a..db31c37a62 100644
--- a/environment.c
+++ b/environment.c
@@ -327,7 +327,6 @@ char *get_graft_file(struct repository *r)
 
 static void set_git_dir_1(const char *path)
 {
-	xsetenv(GIT_DIR_ENVIRONMENT, path, 1);
 	setup_git_env(path);
 }
 
diff --git a/fetch-pack.c b/fetch-pack.c
index dd6ec449f2..8b59014c3a 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -892,6 +892,8 @@ static int get_pack(struct fetch_pack_args *args,
 		cmd_name = "index-pack";
 		strvec_push(&cmd.args, cmd_name);
 		strvec_push(&cmd.args, "--stdin");
+		strvec_pushf(&cmd.env_array, "%s=%s",
+			     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 		if (!args->quiet && !args->no_progress)
 			strvec_push(&cmd.args, "-v");
 		if (args->use_thin_pack)
@@ -927,6 +929,8 @@ static int get_pack(struct fetch_pack_args *args,
 	}
 	else {
 		cmd_name = "unpack-objects";
+		strvec_pushf(&cmd.env_array, "%s=%s",
+			     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 		strvec_push(&cmd.args, cmd_name);
 		if (args->quiet || args->no_progress)
 			strvec_push(&cmd.args, "-q");
@@ -1703,6 +1707,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 			strvec_pushf(&cmd.args, "--index-pack-arg=%s",
 				     index_pack_args.v[j]);
 		strvec_push(&cmd.args, uri);
+		strvec_pushf(&cmd.env_array, "%s=%s",
+			     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 		cmd.git_cmd = 1;
 		cmd.no_stdin = 1;
 		cmd.out = -1;
diff --git a/run-command.c b/run-command.c
index 69dde42f1e..0fb21f92bf 100644
--- a/run-command.c
+++ b/run-command.c
@@ -1319,6 +1319,8 @@ int run_hook_ve(const char *const *env, const char *name, va_list args)
 	strvec_push(&hook.args, p);
 	while ((p = va_arg(args, const char *)))
 		strvec_push(&hook.args, p);
+	strvec_pushf(&hook.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 	if (env)
 		strvec_pushv(&hook.env_array, (const char **)env);
 	hook.no_stdin = 1;
diff --git a/t/helper/test-subprocess.c b/t/helper/test-subprocess.c
index ff22f2fa2c..d58bf7e18d 100644
--- a/t/helper/test-subprocess.c
+++ b/t/helper/test-subprocess.c
@@ -16,5 +16,7 @@ int cmd__subprocess(int argc, const char **argv)
 	}
 	cp.git_cmd = 1;
 	strvec_pushv(&cp.args, (const char **)argv + 1);
+	strvec_pushf(&cp.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 	return run_command(&cp);
 }
diff --git a/transport-helper.c b/transport-helper.c
index a0297b0986..d26b5ecd10 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -448,6 +448,9 @@ static int get_importer(struct transport *transport, struct child_process *fasti
 		strvec_pushf(&fastimport->args, "--cat-blob-fd=%d", cat_blob_fd);
 	}
 	fastimport->git_cmd = 1;
+	if (have_git_dir())
+		strvec_pushf(&fastimport->env_array, "%s=%s",
+			     GIT_DIR_ENVIRONMENT, get_git_dir());
 
 	code = start_command(fastimport);
 	return code;
diff --git a/upload-pack.c b/upload-pack.c
index 8acc98741b..7bf36d6d3a 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -295,6 +295,8 @@ static void create_pack_file(struct upload_pack_data *pack_data,
 		strvec_push(&pack_objects.args, "--shallow-file");
 		strvec_push(&pack_objects.args, "");
 	}
+	strvec_pushf(&pack_objects.env_array, "%s=%s",
+		     GIT_DIR_ENVIRONMENT, the_repository->gitdir);
 	strvec_push(&pack_objects.args, "pack-objects");
 	strvec_push(&pack_objects.args, "--revs");
 	if (pack_data->use_thin_pack)
-- 
2.35.0.2.g9420af4777.dirty
Previous: Phillip WoodNext: Eric Sunshine
Message 135 of 163 in “Avoid removing the current working directory, even if it becomes empty”
  1. 0/8 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 21, 2021
  2. 2/8 repository, setup: introduce the_cwdElijah Newren via GitGitGadget, Nov 21, 2021
  3. Junio C HamanoNov 21, 2021
  4. Elijah NewrenNov 22, 2021
  5. René ScharfeNov 21, 2021
  6. Elijah NewrenNov 22, 2021
  7. 1/8 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  8. Ævar Arnfjörð BjarmasonNov 21, 2021
  9. Elijah NewrenNov 23, 2021
  10. Ævar Arnfjörð BjarmasonNov 23, 2021
  11. Elijah NewrenNov 23, 2021
  12. Ævar Arnfjörð BjarmasonNov 25, 2021
  13. 4/8 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 21, 2021
  14. 3/8 unpack-trees: refuse to remove the current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  15. 7/8 stash: do not attempt to remove current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  16. 6/8 clean: do not attempt to remove current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  17. Ævar Arnfjörð BjarmasonNov 21, 2021
  18. Elijah NewrenNov 23, 2021
  19. 5/8 symlinks: do not include current working directory in dir removalElijah Newren via GitGitGadget, Nov 21, 2021
  20. René ScharfeNov 21, 2021
  21. Elijah NewrenNov 23, 2021
  22. 8/8 dir: avoid removing the current working directoryElijah Newren via GitGitGadget, Nov 21, 2021
  23. Glen ChooNov 23, 2021
  24. Elijah NewrenNov 23, 2021
  25. Glen ChooNov 23, 2021
  26. Elijah NewrenNov 23, 2021
  27. Glen ChooNov 23, 2021
  28. Junio C HamanoNov 23, 2021
  29. Elijah NewrenNov 23, 2021
  30. Junio C HamanoNov 24, 2021
  31. Elijah NewrenNov 23, 2021
  32. Glen ChooNov 24, 2021
  33. Junio C HamanoNov 24, 2021
  34. Ævar Arnfjörð BjarmasonNov 24, 2021
  35. Elijah NewrenNov 24, 2021
  36. Ævar Arnfjörð BjarmasonNov 24, 2021
  37. Philip OakleyNov 24, 2021
  38. Junio C HamanoNov 24, 2021
  39. Philip OakleyNov 25, 2021
  40. Ævar Arnfjörð BjarmasonNov 25, 2021
  41. Ævar Arnfjörð BjarmasonNov 24, 2021
  42. Elijah NewrenNov 25, 2021
  43. Ævar Arnfjörð BjarmasonNov 25, 2021
  44. The overhead of bin-wrappers/ (was: [PATCH 8/8] dir: avoid removing the current working directory)Ævar Arnfjörð Bjarmason, Nov 26, 2021
  45. Elijah NewrenNov 25, 2021
  46. Junio C HamanoNov 24, 2021
  47. Junio C HamanoNov 21, 2021
  48. 0/9 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 25, 2021
  49. 1/9 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 25, 2021
  50. Ævar Arnfjörð BjarmasonNov 25, 2021
  51. 2/9 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  52. Ævar Arnfjörð BjarmasonNov 25, 2021
  53. Elijah NewrenNov 26, 2021
  54. Junio C HamanoNov 26, 2021
  55. Elijah NewrenNov 26, 2021
  56. Derrick StoleeNov 29, 2021
  57. Junio C HamanoNov 29, 2021
  58. Elijah NewrenNov 29, 2021
  59. Derrick StoleeNov 29, 2021
  60. 3/9 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  61. Ævar Arnfjörð BjarmasonNov 25, 2021
  62. Elijah NewrenNov 26, 2021
  63. Derrick StoleeNov 29, 2021
  64. Elijah NewrenNov 29, 2021
  65. 4/9 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 25, 2021
  66. Derrick StoleeNov 29, 2021
  67. Elijah NewrenNov 29, 2021
  68. 5/9 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Nov 25, 2021
  69. 7/9 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  70. Ævar Arnfjörð BjarmasonNov 25, 2021
  71. Elijah NewrenNov 26, 2021
  72. 6/9 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  73. 8/9 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Nov 25, 2021
  74. 9/9 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Nov 25, 2021
  75. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 26, 2021
  76. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 26, 2021
  77. Ævar Arnfjörð BjarmasonNov 27, 2021
  78. Elijah NewrenNov 27, 2021
  79. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  80. Ævar Arnfjörð BjarmasonNov 27, 2021
  81. Elijah NewrenNov 27, 2021
  82. Ævar Arnfjörð BjarmasonNov 27, 2021
  83. Elijah NewrenNov 27, 2021
  84. Ævar Arnfjörð BjarmasonNov 28, 2021
  85. Elijah NewrenNov 29, 2021
  86. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  87. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 26, 2021
  88. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Nov 26, 2021
  89. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  90. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  91. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  92. Derrick StoleeNov 29, 2021
  93. Elijah NewrenNov 29, 2021
  94. Derrick StoleeNov 29, 2021
  95. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Nov 26, 2021
  96. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 26, 2021
  97. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Nov 26, 2021
  98. Derrick StoleeNov 29, 2021
  99. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Nov 29, 2021
  100. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  101. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Nov 29, 2021
  102. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  103. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Nov 29, 2021
  104. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  105. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  106. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  107. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Nov 29, 2021
  108. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Nov 29, 2021
  109. Junio C HamanoNov 30, 2021
  110. Elijah NewrenNov 30, 2021
  111. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Nov 29, 2021
  112. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Nov 29, 2021
  113. Eric SunshineNov 29, 2021
  114. Elijah NewrenNov 30, 2021
  115. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Dec 1, 2021
  116. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Dec 1, 2021
  117. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  118. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  119. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Dec 1, 2021
  120. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Dec 1, 2021
  121. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  122. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  123. [Bug] Rebase from worktree subdir is broken (was Re: [PATCH v5 07/11] rebase: do not attempt to remove startup_info->original_cwd)Glen Choo, Jan 25, 2022
  124. Elijah NewrenJan 25, 2022
  125. Glen ChooJan 26, 2022
  126. Elijah NewrenJan 26, 2022
  127. Eric SunshineJan 26, 2022
  128. Eric SunshineJan 26, 2022
  129. Elijah NewrenJan 26, 2022
  130. Glen ChooJan 26, 2022
  131. Elijah NewrenJan 26, 2022
  132. Phillip WoodJan 26, 2022
  133. Eric SunshineJan 26, 2022
  134. Phillip WoodJan 27, 2022
  135. Elijah NewrenJan 27, 2022
  136. Eric SunshineFeb 5, 2022
  137. Eric SunshineFeb 5, 2022
  138. Elijah NewrenFeb 5, 2022
  139. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  140. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Dec 1, 2021
  141. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Dec 1, 2021
  142. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Dec 1, 2021
  143. Derrick StoleeDec 7, 2021
  144. Ævar Arnfjörð BjarmasonDec 7, 2021
  145. Derrick StoleeDec 7, 2021
  146. Ævar Arnfjörð BjarmasonDec 8, 2021
  147. Elijah NewrenDec 7, 2021
  148. Derrick StoleeDec 7, 2021
  149. 00/11 Avoid removing the current working directory, even if it becomes emptyElijah Newren via GitGitGadget, Dec 9, 2021
  150. 01/11 t2501: add various tests for removing the current working directoryElijah Newren via GitGitGadget, Dec 9, 2021
  151. Ævar Arnfjörð BjarmasonMar 11, 2022
  152. 02/11 setup: introduce startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  153. 03/11 unpack-trees: refuse to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  154. 04/11 unpack-trees: add special cwd handlingElijah Newren via GitGitGadget, Dec 9, 2021
  155. 06/11 clean: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  156. 05/11 symlinks: do not include startup_info->original_cwd in dir removalElijah Newren via GitGitGadget, Dec 9, 2021
  157. 07/11 rebase: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  158. 08/11 stash: do not attempt to remove startup_info->original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  159. 09/11 dir: avoid incidentally removing the original_cwd in remove_path()Elijah Newren via GitGitGadget, Dec 9, 2021
  160. 10/11 dir: new flag to remove_dir_recurse() to spare the original_cwdElijah Newren via GitGitGadget, Dec 9, 2021
  161. 11/11 t2501: simplify the tests since we can now assume desired behaviorElijah Newren via GitGitGadget, Dec 9, 2021
  162. Phillip WoodNov 30, 2021
  163. Elijah NewrenDec 1, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.