在git中的所有提交中编辑一个文件

Ped*_*yes 13 git

我犯了一个错误,git存储库中的项目上的一个文件包含一个密码.这不是问题,因为不是公共回购,但我想在回购中删除该密码.

存储库历史非常简单,因为我是唯一的开发人员,因此它只有12个提交,其中一个提交被标记.

这种情况下的更改不会影响历史记录中的任何内容(差异将保持不变),因为我想要删除的密码仅在第一次提交时出现.我想删除该字符串,就好像它曾经没有在那里一样.

是否有某种命令可以执行此操作,或者我必须从一开始就使用新的起点重新生成历史记录而不使用密码并在其上应用差异?

eis*_*eis 6

请参阅https://help.github.com/articles/remove-sensitive-data.如果你没有删除它,那么该文件将出现在所有提交中,因为所有提交都包含整个仓库的状态.

基本上,您需要做的是在所有提交中运行filter-branch,然后强制将其推送到repo中.该命令具有破坏性,并将更改文件存在于repo中的所有提交,因此请小心.


Ped*_*yes 5

谢谢,这正是我正在寻找的命令,并阅读了该文章和过滤器分支文档,我得到了我想要使用 sed 从文件中删除字符串的确切语法。

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

在哪里:

"password" -> 是需要删除的字符串

"./path_to_file/filename" -> 是存储库内需要修改的文件的路径

在 repo root 中运行就像一个魅力一样。

更改完成后,必须将其推送到远程服务器。需要强制执行此操作,以便服务器接受全新的重写的引用和标签。

因此,将存储库强制推送到远程服务器(大多数情况下是起源)

git push origin --all --force
Run Code Online (Sandbox Code Playgroud)

并将标签强制推送到远程服务器

git push origin --tags --force
Run Code Online (Sandbox Code Playgroud)