Here is a repro script:
#!/bin/sh
set -eux
git --version
tmpdir="$(mktemp -d)"
cd "${tmpdir}"
mkdir target repo
cd repo
git init
touch file; git add file
git commit -m "Initial commit"
git rebase HEAD --exec "git -C ${tmpdir}/target init"
The end of this script prints something like
Executing: git -C /tmp/tmp.gd2q51jO93/target init
Reinitialized existing Git repository in /tmp/tmp.gd2q51jO93/repo/.git/
Successfully rebased and updated refs/heads/master.
But this is wrong: the repository should be initialized in `target`, not
reinitialized in `repo`.
Notes:
- This propagates to subprocesses: if you run `exec make test` and
your test suite ends up calling `git -C`, then the same problem
occurs.
- Substituting `rebase --root` for `rebase HEAD` causes the problem to
go away.
- The `rebase HEAD` exec context adds the `GIT_DIR` environment
variable, and this is sufficient to reproduce the problem:
running `GIT_DIR="$PWD" git -C /tmp/target init` puts the repo in
the current working directory. The `rebase --root` context adds no
such environment variable. (You can use `--exec 'env >tempfile'` to
verify these.)
My `git --version` is 2.16.2.