git - 如何从 GitHub 中彻底删除敏感提交?
问题描述
几天前,我读了一篇关于 Github 隐私基础的文章,它说提交者的电子邮件可以通过简单的 Github API 请求看到。
我设置了电子邮件别名,但我想更改过去提交的电子邮件。尝试使用此站点和 .gitconfig 的此别名
change-commits = "!f() { VAR1=$1; VAR='$'$1; OLD=$2; NEW=$3;
echo \"Are you sure for replace $VAR $OLD => $NEW ?(Y/N)\";
read OK;
if [ \"$OK\" = 'Y' ] ;
then shift 3;
git filter-branch --env-filter \"if [ \\\"${VAR}\\\" = '$OLD' ];
then export $VAR1='$NEW';echo 'to $NEW'; fi\" $@; fi;};f "
在这些步骤之后,我将输入git log
并且每个提交都有新邮件,但是在 API 调用https://api.github.com/users/(usuername)/events/public之后,我看到了新旧电子邮件
解决方案
正如所评论的,您不能真正“更改”提交,只能创建一个具有相同或相似数据的新提交。因此,当您进行git filter-branch
修改
git rebase
或任何其他形式的修改时,您仍在创建
新的提交。
而在运行时git push -f
,唯一的区别就是远程
分支引用是强制更新的;它仍然会发送新的提交,而对旧提交(如果有的话)的处理取决于远程存储库。
对于GitHub ,当您进行强制推送时,它不会立即从存储库中删除那些旧提交。
来自官方GitHub 帮助:
警告:一旦你将提交推送到 GitHub,你应该考虑它包含的任何数据都受到损害。如果您提交了密码,请更改密码!如果您提交了密钥,请生成一个新密钥。
本文告诉您如何使用无法从 GitHub 存储库中的任何分支或标签访问的敏感数据进行提交。但是,重要的是要注意,这些提交仍然可以在您的存储库的任何克隆或分支中访问,直接通过它们在 GitHub 上缓存视图中的 SHA-1 哈希,以及通过引用它们的任何拉取请求。您无法对存储库的现有克隆或复刻执行任何操作,但您可以通过联系 GitHub 支持永久删除 GitHub 上所有存储库的缓存视图和拉取请求。
因此,要使旧的提交在合理的时间范围内停止出现在 API 中,唯一的选择是:
警告:虽然前一个选项更快,但 它也会删除wiki、问题和评论。
- 删除存储库并创建一个新的
- 联系 GitHub 支持
git gc
以在托管存储库上手动运行
注意:这里对悬空提交的含义有更全面的解释 :
推荐阅读
- graphviz - 点中的工具提示(graphviz)
- ubuntu - 请问如何在 ubuntu18.04 中通过 xfconf-query 制作桌面颜色?
- python - 当 Celery 检索结果时,Python 迅速泄漏内存
- javascript - Javascript功能范围,如何绕过它?
- json - 访问 dart 中的 json 元素
- visual-studio - 我正在使用 VS 社区版 macOS 和 GitHub 网页。那么我该如何执行 Git 命令呢?
- react-admin - 无法读取未定义的属性“hasOwnProperty” - 在编写我自己的 dataProvider 期间
- css - 在同一个样式表上使用两种布局方法(Floats 和 Flexbox)可以吗?
- spring-boot - SpringBoot 使用 TestRestTemplate 测试是否总是需要@SpringBootTest 注解
- mysql - SQL 运行求和两个表