为什么git filter-branch树过滤器无法重写提交但是然后将工作目录弄脏了?

时间:2014-05-08 00:24:38

标签: git version-control git-filter-branch

我正在尝试修改一个回购(不是尚未共享,所以不用担心打破其他人的历史记录),git filter-branch表现得很奇怪。

$ 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

“你好?你好?”输出来自脚本,所以我知道脚本正在运行。

令人沮丧的是,在命令完成后,工作目录会变脏:

$ 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

那些完全我在修订提交中想要的更改,但由于某种原因,git在git filter-branch操作期间无法看到它们。

我在这里做错了什么?

(FWIW我之前经常使用git filter-branch很多次。一般来说我对它非常熟悉,但这个让我感到难过。)

1 个答案:

答案 0 :(得分:4)

(将评论转换为答案)

树过滤器在不是存储库的正常工作目录的目录中运行。 (实际目录来自-d参数git filter-branch,如果你提供一个;如果你不提供,则filter-branch以.git-rewrite开头。对此,它看起来filter-branch脚本添加了/t

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

然后将$tempdir中的文件用于其他所有内容。)

因此,如果fixup.sh中的任何路径引用回原始工作目录,git将不会在临时树中看到这些更改。