¿Por qué git filter-branch tree-filter no puede reescribir commit pero luego deja sucio el directory de trabajo?

Estoy intentando revisar un repository ( aún no compartido, así que no me preocupo por romper el historial de nadie) y git filter-branch se comporta de una manera bastante extraña.

 $ git filter-branch -f --tree-filter /path/to/fixup.sh cross-check Rewrite ae78489a98f2a9429c559833d8320d5f50a99903 (1/1)Hello? Hello? Goodbye WARNING: Ref 'refs/heads/cross-check' is unchanged 

El "¿Hola? ¿Hola?" La salida es del script, así que sé que el script se está ejecutando.

Lo que es frustrante es que una vez que se completa el command, el directory de trabajo está sucio:

 $ git status On branch cross-check Your branch is up-to-date with 'origin/cross-check'. Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: .gitattributes modified: tools/lua/lib/lfs.so.1.2.1 modified: tools/lua/lib/luadoc/config.lua modified: tools/lua/lib/luadoc/doclet/debug.lua modified: tools/lua/lib/luadoc/doclet/formatter.lua modified: tools/lua/lib/luadoc/doclet/html.lua modified: tools/lua/lib/luadoc/doclet/raw.lua modified: tools/lua/lib/luadoc/init.lua modified: tools/lua/lib/luadoc/lp.lua modified: tools/lua/lib/luadoc/taglet/standard.lua modified: tools/lua/lib/luadoc/taglet/standard/tags.lua 

Esos son exactamente los cambios que quería en la confirmación revisada, pero por alguna razón, Git no puede verlos durante la operación de git filter-branch.

¿Qué estoy haciendo mal aquí?

(FWIW He corrido git filter-branch muchas, muchas veces antes. Estoy bastante familiarizado con esto en general, pero este me tiene perplejo).

(conversión de comentarios a respuesta)

El filter de tree se ejecuta en un directory que no es el directory de trabajo normal para el repository. (El directory real se deriva del argumento -d a git filter-branch , si proporciona uno, si no proporciona uno, filter-branch comienza con .git-rewrite . A esto, se parece al filter-branch script de filter-branch agrega /t :

 orig_dir=$(pwd) mkdir -p "$tempdir/t" && tempdir="$(cd "$tempdir"; pwd)" && cd "$tempdir/t" && workdir="$(pwd)" || die "" 

y luego usa files en $tempdir para todo lo demás).

Por lo tanto, si alguna fixup.sh en fixup.sh vuelve al directory de trabajo original, git no verá esos cambios en los treees temporales.