首页 > 解决方案 > 如何从 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之后,我看到了新旧电子邮件

标签: gitsecurityprivacy

解决方案


正如所评论的,您不能真正“更改”提交,只能创建一个具有相同或相似数据的新提交。因此,当您进行git filter-branch修改 git rebase或任何其他形式的修改时,您仍在创建 新的提交

而在运行时git push -f,唯一的区别就是远程 分支引用是强制更新的;它仍然会发送新的提交,而对旧提交(如果有的话)的处理取决于远程存储库。

对于GitHub ,当您进行强制推送时,它不会立即从存储库中删除那些旧提交。

来自官方GitHub 帮助

警告:一旦你将提交推送到 GitHub,你应该考虑它包含的任何数据都受到损害。如果您提交了密码,请更改密码!如果您提交了密钥,请生成一个新密钥。

本文告诉您如何使用无法从 GitHub 存储库中的任何分支或标签访问的敏感数据进行提交。但是,重要的是要注意,这些提交仍然可以在您的存储库的任何克隆或分支中访问,直接通过它们在 GitHub 上缓存视图中的 SHA-1 哈希,以及通过引用它们的任何拉取请求。您无法对存储库的现有克隆或复刻执行任何操作,但您可以通过联系 GitHub 支持永久删除 GitHub 上所有存储库的缓存视图和拉取请求。

因此,要使旧的提交在合理的时间范围内停止出现在 API 中,唯一的选择是:

警告:虽然前一个选项更快,但 它也会删除wiki问题评论


注意:这里对悬空提交的含义有更全面的解释 :

https://stackoverflow.com/a/32840254/10095231


推荐阅读