重写git历史记录替换每个文件中的单词

时间:2013-11-11 11:38:18

标签: git git-filter-branch git-rewrite-history

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

我怎样才能做到这一点?

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

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

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

1 个答案:

答案 0 :(得分:1)

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

就其效果而言,你可以想象它就像你做过的那样:

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,并注意在带注释的标签上删除签名。)

相关问题