GitHub Push Protection 报错解决指南(检测到 Token / Secret)

在使用 git push 时,如果 GitHub 检测到仓库提交中包含 敏感信息(例如 GitHub Personal Access Token),就会触发 Push Protection 并拒绝推送。

常见报错:

remote: error: GH013: Repository rule violations found for refs/heads/main.
remote: Push cannot contain secrets
remote: GitHub Personal Access Token

例如:

SingleCell_Analysis_System/.Rapp.history:13679
SingleCell_Analysis_System/.Rapp.history:13692
SingleCell_Analysis_System/.Rapp.history:13695

说明 提交历史中包含 Token

注意:
GitHub 的规则是:

  • 不仅当前文件要删除
  • 历史提交中的 secret 也必须删除

否则 push 仍然会被拒绝。


一、最常见原因

最常见的情况是:

R / Python / Notebook 自动生成的历史文件,例如:

.Rapp.history
.Rhistory
.RData
.ipynb_checkpoints

这些文件可能记录:

  • API Key
  • GitHub Token
  • 密码
  • 访问地址

因此 不应该提交到 Git 仓库


二、标准解决方案(推荐)

Step 1 撤销最后一次提交(保留代码)

git reset --soft HEAD~1

作用:

  • 撤销 commit
  • 文件修改仍然保留

Step 2 删除敏感文件

删除 .Rapp.history

rm -f SingleCell_Analysis_System/.Rapp.history

Step 3 添加到 .gitignore

避免未来再次提交。

echo ".Rapp.history" >> .gitignore
echo "**/.Rapp.history" >> .gitignore

推荐同时忽略:

echo ".Rhistory" >> .gitignore
echo ".RData" >> .gitignore
echo ".Ruserdata" >> .gitignore
echo "**/.Rhistory" >> .gitignore

Step 4 从 Git 追踪中删除

如果之前已经提交过:

git rm --cached -f SingleCell_Analysis_System/.Rapp.history

Step 5 重新提交

git add .
git commit -m "Remove secret-containing history file and update gitignore"

Step 6 重新 push

git push origin main

通常这里就可以成功推送。


三、如果仍然被拦截

说明 token 出现在更早的 commit 中

需要修改历史提交。


Step 1 查看最近提交

git log --oneline -n 10

例如:

3a0ca83 update project
2d13a92 add model
e82ab10 init repo

Step 2 进入交互式 rebase

例如修改最近 5 个提交:

git rebase -i HEAD~5

会打开编辑器:

pick 3a0ca83 update project
pick 2d13a92 add model
pick e82ab10 init repo

把包含 .Rapp.history 的 commit 改为:

edit 3a0ca83 update project

Step 3 删除敏感文件

当 rebase 暂停时执行:

rm -f SingleCell_Analysis_System/.Rapp.history
git rm --cached -f SingleCell_Analysis_System/.Rapp.history

更新 .gitignore

echo ".Rapp.history" >> .gitignore
echo "**/.Rapp.history" >> .gitignore

提交修改:

git add .gitignore
git commit --amend --no-edit

继续 rebase:

git rebase --continue

Step 4 强制推送

因为历史被修改:

git push origin main --force-with-lease

四、必须做的一件事:撤销 Token

因为 GitHub 已经检测到 Personal Access Token

这个 Token 应该视为 已经泄露

建议:

  1. 打开 GitHub
  2. Settings
  3. Developer Settings
  4. Personal Access Tokens
  5. 删除或重新生成 Token

五、最佳实践(避免再次发生)

建议 .gitignore 加入:

# R
.Rhistory
.RData
.Rapp.history
.Ruserdata

# Python
__pycache__/
.ipynb_checkpoints/

# Environment
.env
.env.*

# Mac
.DS_Store

六、快速修复命令(推荐收藏)

如果再次遇到:

git reset --soft HEAD~1

rm -f SingleCell_Analysis_System/.Rapp.history

echo ".Rapp.history" >> .gitignore
echo "**/.Rapp.history" >> .gitignore
echo ".Rhistory" >> .gitignore
echo ".RData" >> .gitignore
echo ".Ruserdata" >> .gitignore

git rm --cached -f SingleCell_Analysis_System/.Rapp.history

git add .
git commit -m "Remove secret files and update gitignore"

git push origin main

七、总结

GitHub Push Protection 的目的是防止 敏感信息泄露

解决原则:

删除包含 secret 的文件
从 Git 历史中移除 secret
更新 .gitignore
撤销泄露的 Token

完成后即可正常 push。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐