git - 如何替换 git 历史文件中的文本?

标签 git substitution git-filter-branch git-rewrite-history bfg-repo-cleaner

我一直使用基于界面的 git 客户端 (smartGit),因此对 git 控制台没有太多经验。

但是,我现在需要替换历史记录中所有 .txt 文件中的一个字符串(因此,不是删除整个文件,而是替换一个字符串)。我找到了以下命令:

git filter-branch --tree-filter 'git ls-files -z "*.php" |xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#xXxXxXxXxXx#g"' -- --all

我试过了,不幸的是,虽然密码确实被更改了,但所有二进制文件都被损坏了。图片等都会损坏。

有没有更好的方法来执行此操作而不会损坏我的二进制文件?

谢谢。

编辑:

我被一些事情弄糊涂了。导致二进制文件损坏的实际代码是:

$ git filter-branch --tree-filter "find . -type f -exec sed -i -e 's/originalpassword/newpassword/g' {} \;"

奇怪的是,顶部的代码实际上删除了所有使用我的密码的文件。

最佳答案

我建议使用 BFG Repo-Cleaner ,一个更简单、更快速的 git-filter-branch 替代方案,专为从 Git 历史重写文件而设计。

您应该仔细按照以下步骤操作:https://rtyley.github.io/bfg-repo-cleaner/#usage - 但核心部分就是这样:下载 BFG's jar (需要 Java 7 或更高版本)并运行此命令:

$ java -jar bfg.jar  --replace-text replacements.txt -fi '*.php'  my-repo.git

replacements.txt 文件应包含您要执行的所有替换,格式如下(每行一个条目 - 请注意不应包含注释):

PASSWORD1 # Replace literal string 'PASSWORD1' with '***REMOVED***' (default)
PASSWORD2==>examplePass         # replace with 'examplePass' instead
PASSWORD3==>                    # replace with the empty string
regex:password=\w+==>password=  # Replace, using a regex
regex:\r(\n)==>$1               # Replace Windows newlines with Unix newlines

您的整个存储库历史记录将被扫描,.php 文件(小于 1MB)将执行替换:任何匹配的字符串(不在您的最新 commit) 将被替换。

完全披露:我是 BFG Repo-Cleaner 的作者。

关于git - 如何替换 git 历史文件中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110652/

相关文章:

解决冲突后Android Studio Git-merge不会结束

git - git rm cached 和 git reset HEAD 之间的区别

regex - vim 将字符替换为\n

git - 在一系列提交上运行 filter-branch

python - 部署 python 应用程序以通过 venv 使用特定版本的 Python 的最佳实践

git - 如何重命名 Git 标签?

batch-file - 在批处理子程序调用中将感叹号作为参数传递

performance - 一阶公式中变量的有效重命名

windows - Git:查找大包文件中的最大文件

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