从Git历史记录中删除敏感文件及其提交

ⅰ亾dé卋堺 提交于 2020-03-12 17:21:50

我想在GitHub上放置一个Git项目,但它包含某些包含敏感数据的文件(用户名和密码,例如Capistrano的/config/deploy.rb)。

我知道我可以将这些文件名添加到.gitignore ,但这不会删除它们在Git中的历史记录。

我也不想通过删除/.git目录重新开始。

有没有一种方法可以删除您Git历史记录中特定文件的所有痕迹?


#1楼

更改密码是一个好主意,但是对于从存储库历史记录中删除密码的过程,我建议使用BFG Repo-Cleaner ,它是git-filter-branch一种更快,更简单的替代方法,明确地设计用于从Git存储库中删除私有数据。

创建一个private.txt文件,列出要删除的密码等(每行一个),然后运行以下命令:

$ java -jar bfg.jar  --replace-text private.txt  my-repo.git

存储库历史记录中所有阈值大小(默认为1MB以下)的文件都将被扫描,并且所有匹配的字符串(不在您的最新提交中)都将替换为字符串“ *** REMOVED ***”。 然后,您可以使用git gc清除失效的数据:

$ git gc --prune=now --aggressive

BFG通常比运行git-filter-branch快10至50倍,并且针对以下两种常见用例简化并定制了选项:

  • 删除疯狂的大文件
  • 删除密码,凭据和其他私人数据

完全公开:我是BFG Repo-Cleaner的作者。


#2楼

因此,它看起来像这样:

git rm --cached /config/deploy.rb
echo /config/deploy.rb >> .gitignore

从git中删除跟踪文件的缓存,然后将该文件添加到.gitignore列表中


#3楼

要明确:接受的答案是正确的。 请先尝试。 但是,对于某些用例来说,它可能会不必要地变得复杂,尤其是当您遇到令人讨厌的错误,例如“致命:错误的修订版-删节-清空”,或者真的不在乎您的回购记录时。

一种替代方法是:

  1. cd到项目的基础分支
  2. 删除敏感代码/文件
  3. rm -rf .git /#从代码中删除所有git信息
  4. 转到github并删除您的存储库
  5. 遵循本指南,将您的代码像往常一样推送至新的存储库-https: //help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/

当然,这将删除所有提交历史分支,以及来自github存储库和本地git存储库的问题。 如果这是不可接受的,则必须使用其他方法。

将此称为核选项。


#4楼

如果您推送到GitHub,则强行推送还不够,请删除存储库或联系支持部门

即使您随后强行按下一秒钟,也不足以按以下说明进行操作。

唯一有效的措施是:

  • 什么泄露了诸如密码之类的可更改凭证?

    • 是的:立即修改您的密码,并考虑使用更多的OAuth和API密钥!
    • 否(裸照):

      • 您是否关心存储库中的所有问题是否都受到影响?

        • 否:删除存储库
        • 是:

          • 联系支持
          • 如果泄漏对您来说非常关键,以至于您愿意让某些存储库停机以减少泄漏的可能性,请在等待GitHub支持答复时将其设置为私有

强行推一秒钟还不够,因为:

如果您删除存储库而不是仅仅强制推送,即使提交也会立即从API中消失并给出404,例如https://api.github.com/repos/cirosantilli/test-dangling-delete/commits/8c08448b5fbf0f891696819f3b2b2d653f7a3824即使您重新创建另一个具有相同名称的存储库。

为了测试这一点,我创建了一个仓库: https : //github.com/cirosantilli/test-dangling并做到了:

git init
git remote add origin git@github.com:cirosantilli/test-dangling.git

touch a
git add .
git commit -m 0
git push

touch b
git add .
git commit -m 1
git push

touch c
git rm b
git add .
git commit --amend --no-edit
git push -f

另请参阅: 如何从GitHub删除悬空的提交?


#5楼

这是我在Windows中的解决方案

git filter-branch --tree-filter“ rm -f'filedir / filename'”头

git push --force

确保路径正确,否则将不起作用

希望对您有所帮助

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!