我想用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
这似乎是我能达到我想要的最接近的目标。
答案 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 .bak
会git add
所有.bak
文件。)
(如果您有标签,请记得使用--tag-name-filter
,并注意在带注释的标签上删除签名。)