我想用 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
这似乎是我能达到的最接近目标的结果。
最佳答案
树过滤器在每棵被过滤的树上运行,一次一棵树。
就其效果而言,你可以想象一下,就好像你做了:
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 添加
所有 .bak
文件)。
(如果您有标签,请记住使用 --tag-name-filter
,并注意删除带注释的标签上的签名。)
关于git - 重写 git 历史,在每个文件中替换一个词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905409/