3

我想用 git-filter-branch 重写我的存储库的 git 历史记录,以将所有文件中所有出现的“foo.bar”替换为“bar.foo”。

我怎样才能做到这一点?

更新:
我一直在玩 --tree-filter 参数,我已经能够用这个替换指定文件中的单词:

git filter-branch -f --tree-filter '
    if [ -f testfile ]
    then
        sed -i s/foo.bar/bar.foo/g testfile
    fi ' -- --all

这似乎是我能达到的最接近的目标。

4

1 回答 1

2

树过滤器在每棵被过滤的树上运行,一次一棵树。

就其效果而言,您可以将其想象为您已经完成了:

git checkout <rev>

以便工作目录现在包含与给定修订关联的树。(事实上​​,它确实将每个修订版都检出到一个临时目录中,这就是它如此缓慢的原因。另请参见-d标志。)如果您想对树中的每个文件进行更改,您可以这样做:

find . -type f -print | xargs sed -i '' -e 's/foo\.bar/bar.foo/g'

特殊之处--tree-filter在于它会自动执行任何必需的git add和/或git rm(因此-i '';-i .bakgit add所有.bak文件)。

(如果您有标签,请记住使用--tag-name-filter,并注意带注释的标签上的签名删除。)

于 2013-11-11T12:51:52.893 回答