git - 重写 git 历史,在每个文件中替换一个词

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

我想用 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 .bakgit 添加 所有 .bak 文件)。

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

关于git - 重写 git 历史,在每个文件中替换一个词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905409/

相关文章:

linux - Windows 管道的 EOL 处理

git - 如何使用 git filter-repo 修改远程历史记录?

git - 我可以在 GitHub pull 请求中更改提交的作者而不影响 `master` 分支的历史记录吗?

git - 在 git 历史记录中移动文件

git - Gerrit 项目未复制到 bitbucket,错误 : channel is not opened

git - 在 android studio 中尝试使用 CVS 后,我的 Android 项目现在变成了红色

git - 将忽略的目录移动到其他分支

git - 看不到 git filter-branch 提示的未暂存更改

git - 在 git 中提取一个已重命名的子目录历史记录

Git:删除除特定目录之外的所有内容(BFG Repo Cleaner)