如何完全从GitHub中删除敏感提交?

3

几天前我读了一篇有关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时,每个提交记录都有新的电子邮件地址。但在调用https://api.github.com/users/(usuername)/events/public API之后,我会看到旧的和新的电子邮件地址。


4
你无法更改旧的提交记录,git filter-branch 也不会尝试去修改它们。git filter-branch 的作用是将旧的提交记录复制到新的提交记录中,并在创建新的提交记录之前执行你请求的更改。旧的提交记录将继续以其旧内容存在,直到没有任何引用它们的地方;此后,Git 最终会移除旧的提交记录,但你无法控制这个过程发生的时间,因为仓库在 GitHub 上。 - torek
@torek。您可以随时进行更改建议,克隆存储库,这不应复制旧提交,然后在GitHub上删除存储库,并使用您的克隆重新初始化。如果旧提交确实被复制,那么在本地清理它们将很容易。 - Mad Physicist
2个回答

5

正如评论所述,你实际上无法“更改”提交,只能创建一个具有相同或类似数据的新提交。因此,当你执行git filter-branchgit rebase或任何其他形式的修订时,你仍然会创建新的提交

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

GitHub的情况下,当你进行强制推送时,它不会立即从存储库中删除那些旧的提交。

来自GitHub帮助的官方说明:

警告:一旦您将提交推送到GitHub,您应该考虑其中包含的任何数据都已被泄漏。如果您提交了密码,请更改密码!如果您提交了密钥,请生成新密钥。
本文告诉您如何使包含敏感数据的提交对GitHub存储库中的任何分支或标签不可达。但是,需要注意的是,这些提交可能仍然可以在存储库的任何克隆或派生版本中通过其SHA-1哈希直接访问,在GitHub上的缓存视图中以及通过引用它们的任何拉取请求中。您无法处理存储库的现有克隆或派生版本,但是您可以通过联系GitHub支持永久删除存储库的所有缓存视图和拉取请求。
因此,要使旧的提交停止在API中出现,唯一的选择是:
警告:虽然前者选项更快,但它也会删除wiki、问题和评论。
注意:这里有一份更全面的关于“悬挂提交”的影响解释:dangling commits

https://dev59.com/73NA5IYBdhLWcg3wrPyq#32840254


1
我会使用Git BFG来完成这项任务。它非常有效并且易于使用。它可以完全从Git历史记录中删除您需要删除的内容。 Git BFG文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接