Pourquoi le filter d'arborescence git filter-branch ne parvient-il pas à réécrire le commit mais à laisser le directory de travail encrassé?

J'essaie de réviser un repo (pas encore partagé, donc pas de soucis de casser l'histoire de quelqu'un d'autre) et git filter-branch se comporte de façon plutôt étrange.

 $ 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 

Le "Bonjour? Bonjour?" la sortie provient du script, donc je sais que le script est en cours d'exécution.

Ce qui est frustrant, c'est qu'après la fin de la command, le directory de travail est alors sale:

 $ 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: .gitatsortingbutes 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 

Ce sont exactement les changements que je voulais dans la validation révisée, mais pour une raison quelconque, git n'est pas capable de les voir pendant l'opération git filter-branch.

Qu'est-ce que je fais mal ici?

(FWIW Je l'ai déjà fait plusieurs fois, je suis assez familier avec ça en général, mais celui-ci m'a bluffé.)

Solutions Collecting From Web of "Pourquoi le filter d'arborescence git filter-branch ne parvient-il pas à réécrire le commit mais à laisser le directory de travail encrassé?"

(convertir les commentaires pour répondre)

Le filter d'arborescence est exécuté dans un directory qui n'est pas le directory de travail normal du référentiel. (Le directory réel est dérivé de l'argument -d à git filter-branch , si vous en fournissez un, si vous n'en fournissez pas, filter-branch commence par .git-rewrite . filter-branch script de filter-branch ajoute /t :

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

puis utilise les files dans $tempdir pour tout le rest.)

Ainsi, si des paths dans fixup.sh renvoient au directory de travail d'origine, git ne verra pas ces changements dans les trees temporaires.