我一直使用基于界面的 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/