diff --git a/builtin/stash.c b/builtin/stash.c index 1ef2017c59..86cd0b456e 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1539,8 +1539,12 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q struct child_process cp = CHILD_PROCESS_INIT; cp.git_cmd = 1; - if (startup_info->original_cwd) + if (startup_info->original_cwd) { cp.dir = startup_info->original_cwd; + strvec_pushf(&cp.env_array, "%s=%s", + GIT_WORK_TREE_ENVIRONMENT, + the_repository->worktree); + } strvec_pushl(&cp.args, "clean", "--force", "--quiet", "-d", ":/", NULL); if (include_untracked == INCLUDE_ALL_FILES) diff --git a/sequencer.c b/sequencer.c index 6abd72160c..5213d16e97 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4223,8 +4223,11 @@ static int run_git_checkout(struct repository *r, struct replay_opts *opts, cmd.git_cmd = 1; - if (startup_info->original_cwd) + if (startup_info->original_cwd) { cmd.dir = startup_info->original_cwd; + strvec_pushf(&cmd.env_array, "%s=%s", + GIT_WORK_TREE_ENVIRONMENT, r->worktree); + } strvec_push(&cmd.args, "checkout"); strvec_push(&cmd.args, commit); strvec_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action); diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh index 23dbd3c82e..71b1735e1d 100755 --- a/t/t3400-rebase.sh +++ b/t/t3400-rebase.sh @@ -416,4 +416,25 @@ test_expect_success MINGW,SYMLINKS_WINDOWS 'rebase when .git/logs is a symlink' mv actual_logs .git/logs ' +test_expect_success 'rebase when inside worktree subdirectory' ' + git init main-wt && + ( + cd main-wt && + git commit --allow-empty -m "initial" && + mkdir -p foo/bar && + test_commit foo/bar/baz && + mkdir -p a/b && + test_commit a/b/c && + # create another branch for our other worktree + git branch other && + git worktree add ../other-wt other && + cd ../other-wt && + # create and cd into a subdirectory + mkdir -p random/dir && + cd random/dir && + # now do the rebase + git rebase --onto HEAD^^ HEAD^ # drops the HEAD^ commit + ) +' + test_done