2019独角兽企业重金招聘Python工程师标准>>>
如果将敏感数据(如密码或SSH密钥)提交到Git存储库,则可以将其从历史记录中删除。 要从存储库的历史记录中完全删除不需要的文件,您可以使用git filter-branch
命令或BFG Repo-Cleaner开源工具。
该git filter-branch
命令和BFG Repo-Cleaner重写了您的存储库的历史记录,该历史记录更改了您更改的现有提交和任何依赖提交的SHA。 更改的提交SHA可能会影响存储库中的打开拉取请求。我们建议在从存储库中删除文件之前合并或关闭所有打开的拉取请求。
您可以从最新提交中删除该文件git rm
。有关删除使用最新提交添加的文件的信息,请参阅“ 从存储库的历史记录中删除文件 ”。
警告:一旦您将提交推送到GitHub,您应该考虑它包含的任何数据是否被泄露。
如果您提交了密码,请更改密码!如果您提交了密钥,请生成一个新密钥。
本文将告诉您如何使用GitHub存储库中任何分支或标记无法访问敏感数据的提交。
但是,重要的是要注意,这些提交仍然可以在存储库的任何克隆或分支中访问,直接通过GitHub上缓存视图中的SHA-1哈希,以及引用它们的任何拉取请求。
您无法对存储库的现有克隆或分支执行任何操作,但您可以通过联系GitHub支持永久删除所有存储库的缓存视图并在GitHub上提取请求。
从存储库的历史记录中清除文件
使用BFG
该[BFG回购清机]是一种建立和开源社区维护的工具。它git filter-branch
为删除不需要的数据提供了更快,更简单的替代方案。例如,要删除包含敏感数据的文件并保持最新的提交不变,请运行:
bfg --delete-files 你的文件 - 敏感数据
要替换passwords.txt
存储库历史记录中可以找到的所有文本,请运行:
bfg --replace-text passwords.txt
有关完整用法和下载说明,请参阅[BFG Repo-Cleaner]的文档。
使用filter-branch
警告:如果git filter-branch在存储更改后运行,则无法使用其他存储命令检索更改。
在运行之前git filter-branch,我们建议您取消所做的任何更改。
要解除您已经存储的最后一组更改,请运行git stash show -p | git apply -R。
有关更多信息,请参阅Git Tools Stashing。
为了说明git filter-branch
工作原理,我们将向您展示如何从存储库的历史记录中删除包含敏感数据的文件并将其添加到其中,.gitignore
以确保不会意外重新提交。
- 如果您的历史记录中还没有包含敏感数据的存储库的本地副本,请将存储库克隆到本地计算机。
$ git clone https://github.com/ YOUR-USERNAME / YOUR-REPOSITORY
在/ Users / YOUR-FILE-PATH / YOUR-REPOSITORY /.git/
remote中
初始化的空Git存储库:计数对象:1301,完成。remote:压缩对象:100%(769/769),完成。
remote:总计1301(delta 724),重用910(delta 522)
接收对象:100%(1301/1301),164.39 KiB,完成。
解决增量:100%(724/724),完成。
- 导航到存储库的工作目录。
cd 你的存储
- 运行以下命令,替换为要删除的文件PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA的路径,而不仅仅是文件名。这些论点将:
- 强制Git处理,但不检查每个分支和标记的整个历史记录
- 删除指定的文件,以及作为结果生成的任何空提交
- 覆盖现有标签
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA '\
--prune-empty --tag-name-filter cat - --all
重写48dc599c80e20527ed902928085e7861e6b3cbe6(266/266)Ref'refs
/ heads / master'被重写
注意:如果具有敏感数据的文件曾经存在于任何其他路径中(因为它已被移动或重命名),则还必须在这些路径上运行此命令。
- 添加包含敏感数据的文件,.gitignore以确保您不会意外地再次提交它。
$ echo“ YOUR-FILE-WITH-SENSITIVE-DATA ”>> .gitignore
$ git add .gitignore
$ git commit -m“将你的文件与敏感数据添加到.gitignore”
[master 051452f]添加你的文件 - SENSITIVE-DATA到.gitignore
1个文件发生了变化,1个插入(+),0个删除( - )
-
仔细检查您是否从存储库的历史记录中删除了所需的所有内容,并检查了所有分支机构。
-
一旦您对存储库的状态感到满意,强制推送您的本地更改以覆盖您的GitHub存储库,以及您推送的所有分支:
git push origin --force --all
计数对象:1074,完成。
Delta压缩使用2个线程。
压缩对象:100%(677/677),完成。
写作对象:100%(1058/1058),148.85 KiB,完成。
总计1058(delta 590),重用602(delta 378)
到https://github.com/ 你的用户名 / YOUR-REPOSITORY .git
+ 48dc599 ... 051452f master - > master(强制更新)
- 要从标记版本中删除敏感文件,您还需要强制推送Git标记:
git push origin --force --tags
计数对象:321,完成。
Delta压缩使用多达8个线程。
压缩对象:100%(166/166),完成。
书写对象:100%(321/321),331.74 KiB | 0字节/秒,完成。
总计321(delta 124),重复使用269(delta 108)
到https://github.com/ 你的用户名 / YOUR-REPOSITORY .git
+ 48dc599 ... 051452f master - > master(强制更新)
-
告诉您的协作者重新绑定,而不是合并他们创建的旧(受污染)存储库历史记录中的任何分支。 一次合并提交可以重新引入一些或者你刚刚陷入清除麻烦的污染历史。
-
经过一段时间后,您确信
git filter-branch
没有意外的副作用,您可以使用以下命令(使用Git 1.8.5或更高版本)强制取消引用本地存储库中的所有对象并进行垃圾回收:
git for-each-ref --format ='delete%(refname)'refs / original | git update-ref
--stdin git reflog expire --expire = now --all
git gc --prune = now
计数对象:2437,完成。
使用最多4个线程进行增量压缩。
压缩对象:100%(1378/1378),完成。
书写对象:100%(2437/2437),完成。
总计2437(delta 1461),重复使用1802(delta 1048)
注意:您还可以通过将过滤的历史记录推送到新的或空的存储库,然后从GitHub进行新的克隆来实现此目的。
避免将来意外提交
有一些简单的技巧可以避免提交你不想提交的东西:
- 使用[GitHub Desktop]或[gitk]等可视程序提交更改。可视程序通常可以更容易地查看每次提交时将添加,删除和修改哪些文件。
- 避免捕获所有的命令
git add .
,并git commit -a
在命令行使用git add filename
,并git rm filename
单独舞台文件,来代替。 - 用于
git add --interactive
在每个文件中单独查看和分阶段更改。 - 使用
git diff --cached
审查您已经上演提交更改。git commit
只要您不使用该-a标志,这就是产生的确切差异。