如何从github历史记录中的文件中删除敏感数据

doc*_*rer 5 git github revert

我正在使用一个共享的 github 存储库来协作一个项目。因为我是个白痴,所以我提交并推送了一个包含我不想共享的密码的脚本文件(是的,我可以更改密码,但无论如何我想删除它!)。

有没有办法从github的历史记录中恢复提交,在本地删除密码,然后重新提交并推送更新的文件?我不想完全删除文件,也不想丢失 github 上的提交历史记录。

(这个问题 如何从 git 存储库中完全删除文件? 显示了如何删除敏感文件,但没有显示如何从文件中编辑敏感数据,所以这不是重复的)

Von*_*onC 8

我建议使用 new git filter-repo,它取代了 BFG 和git filter-branch.

注意:如果您在运行上述命令时收到以下错误消息:

Error: need a version of `git` whose `diff-tree` command has the `--combined-all-paths` option`
Run Code Online (Sandbox Code Playgroud)

这意味着你必须更新git


第一:做一份本地仓库的副本(一个新的克隆)

参见“内容库过滤”:

最后,您可以(如果您是唯一在该存储库上工作的人)执行 git push --force

如果要修改文件内容,可以根据文件中的表达式列表进行修改,每行一个。
例如,一个名为的文件expressions.txt包含:

p455w0rd
foo==>bar
glob:*666*==>
regex:\bdriver\b==>pilot
literal:MM/DD/YYYY=>YYYY-MM-DD
regex:([0-9]{2})/([0-9]{2})/([0-9]{4})==>\3-\1-\2
Run Code Online (Sandbox Code Playgroud)

然后运行

git filter-repo --replace-text expressions.txt
Run Code Online (Sandbox Code Playgroud)

将通过并替换

  • p455w0rd***REMOVED***
  • foobar
  • 任何包含666空行的行,
  • 单词driverwith pilot(但如果它之前或之后有字母则不然;例如驱动程序将保持不变),
  • MM/DD/YYYY带有YYYY-MM-DD和的确切文本
  • 表格的日期字符串MM/DD/YYYY与形式的那些YYYY-MM-DD

  • 自我提醒:这是我在 Stack Overflow 上的**第 23000 个答案**(136 个月内),距[第 22000 个答案](/sf/answers/4017107041/) 5 个月后。在此之前:[第21000个答案](/sf/answers/3839931091/)、[第20000个答案](/sf/answers/3634087901/)、[第19000个答案](https: //stackoverflow.com/a/49421565/6309),[第18000个答案](/sf/answers/3280252181/),[第17000个答案](/sf/answers/3059276951/ 6309),[第16000个答案](http://stackoverflow.com/a/40698777/6309),[第15000个答案](http://stackoverflow.com/a/37539529/6309)... (3认同)

Cod*_*ard 0

使用BFG: https: //rtyley.github.io/bfg-repo-cleaner/

要删除文件:

$ bfg --delete-files <file to remove>  my-repo.git
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


您还可以使用此工具删除密码和蚂蚁敏感数据。

准备一个替换文件,其中包含您要替换的内容,然后使用 BFG 将其清除。

bfg --replace-text passwords.txt  my-repo.git
Run Code Online (Sandbox Code Playgroud)
# Example of the passwords.txt file: 
string1                   # Replace string ***REMOVED***' (default text)
string2==>replacementText # replace with 'replacementText' instead
string3=>                 # replace with the empty string
Run Code Online (Sandbox Code Playgroud)