我正在尝试修改一个回购(不是尚未共享,所以不用担心打破其他人的历史记录),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很多次。一般来说我对它非常熟悉,但这个让我感到难过。)
答案 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将不会在临时树中看到这些更改。