为什么git的filter-branch tree-filter无法重写提交,但仍然使工作目录变脏?

3

我试图修改一个仓库(尚未共享,因此不必担心破坏其他人的历史记录),但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

“Hello?Hello?”的输出来自脚本,因此我知道脚本正在运行。
令人沮丧的是,在命令完成后,工作目录变得不干净:
$ 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操作期间无法看到它们。

我做错了什么?

(顺便说一句,我之前运行过很多次git filter-branch。我对它有一定的了解,但这个问题让我感到困惑。)


1
我们需要查看fixup.sh脚本中的内容,但我怀疑存在某种工作目录问题。树过滤器在一个不同于正常git工作目录的目录中运行;它应该对那个临时目录进行更改。(这是通过git filter-branch-d <dir>参数实现的。) - torek
啊哈!那可能就是了。我在正常的工作目录中硬编码了路径引用。 - escouten
是的。做到了。我已经用相对路径引用替换了我的 fixup.sh 脚本中的硬编码路径引用,目前它可以正常工作了。谢谢! - escouten
1个回答

4

将注释转换为答案

树过滤器在不是存储库的正常工作目录中运行。(实际目录来源于git filter-branch-d参数,如果您提供了一个;如果您没有提供,则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 不会在临时树中看到这些更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接