关于命令行中的推送保护
推送保护可防止您意外地将秘密提交到存储库,方法是阻止包含受支持秘密的推送。
当您尝试从命令行将受支持的秘密推送到受推送保护保护的存储库时,GitHub 将阻止该推送。
您应该:
命令行中一次最多显示五个检测到的秘密。如果某个特定秘密已在存储库中检测到并且已存在警报,则 GitHub 不会阻止该秘密。
如果您确认某个秘密是真实的,并且您打算稍后修复它,则应尽快修复该秘密。例如,您可以撤销秘密并将其从存储库的提交历史记录中删除。必须撤销已公开的真实秘密,以避免未经授权的访问。您可能需要先轮换秘密,然后再撤销它。有关更多信息,请参阅“从存储库中删除敏感数据”。
注意
- 如果您的 Git 配置支持推送到多个分支,而不仅仅是当前分支,则由于推送到其他非预期 ref,您的推送可能会被阻止。有关更多信息,请参阅 Git 文档中的
push.default
选项。 - 如果推送时的秘密扫描超时,GitHub 仍将在推送后扫描您的提交以查找秘密。
解决被阻止的推送
要解决被阻止的推送,您必须从出现该秘密的所有提交中删除该秘密。
- 如果秘密是由您最新的提交引入的,请参阅“删除分支上最新提交引入的秘密”。
- 如果秘密出现在较早的提交中,请参阅“删除分支上早期提交引入的秘密”。
注意
要了解如何在 GitHub UI 中解决被阻止的提交,请参阅“在 GitHub UI 中使用推送保护”。
删除分支上最新提交引入的秘密
如果被阻止的秘密是由分支上最新的提交引入的,您可以按照以下指南操作。
- 从代码中删除秘密。
- 要提交更改,请运行
git commit --amend --all
。这将更新引入秘密的原始提交,而不是创建新的提交。 - 使用
git push
推送您的更改。
删除分支上早期提交引入的秘密
如果秘密出现在 Git 历史记录中的早期提交中,您也可以删除它。为此,您需要确定哪个提交首先引入了秘密,并使用交互式变基修改提交历史记录。
-
检查您尝试推送分支时显示的错误消息,其中列出了包含秘密的所有提交。
remote: —— GitHub Personal Access Token —————————————————————— remote: locations: remote: - commit: 8728dbe67 remote: path: README.md:4 remote: - commit: 03d69e5d3 remote: path: README.md:4 remote: - commit: 8053f7b27 remote: path: README.md:4
-
接下来,运行
git log
以查看分支上所有提交的完整历史记录,以及它们相应的 timestamps。test-repo (test-branch)]$ git log commit 8053f7b27 (HEAD -> main) Author: Octocat <[email protected] Date: Tue Jan 30 13:03:37 2024 +0100 my fourth commit message commit 03d69e5d3 Author: Octocat <[email protected]> Date: Tue Jan 30 13:02:59 2024 +0100 my third commit message commit 8728dbe67 Author: Octocat <[email protected] Date: Tue Jan 30 13:01:36 2024 +0100 my second commit message commit 6057cbe51 Author: Octocat <[email protected] Date: Tue Jan 30 12:58:24 2024 +0100 my first commit message
-
仅关注包含密钥的提交,使用
git log
的输出结果来确定哪个提交在你的 Git 历史记录中最早出现。- 例如,提交
8728dbe67
是第一个包含密钥的提交。
- 例如,提交
-
使用
git rebase -i <COMMIT-ID>~1
启动交互式变基。- 对于
<COMMIT-ID>
,使用步骤 3 中确定的提交。例如,git rebase -i 8728dbe67~1
。
- 对于
-
在编辑器中,通过将文本第一行的
pick
更改为edit
来选择编辑步骤 3 中确定的提交。edit 8728dbe67 my second commit message pick 03d69e5d3 my third commit message pick 8053f7b27 my fourth commit message
-
保存并关闭编辑器以开始交互式变基。
-
从代码中删除秘密。
-
使用
git add .
将更改添加到暂存区。注意
完整命令为
git add .
add
和.
之间有一个空格。- 空格后的句点是命令的一部分。
-
使用
git commit --amend
提交更改。 -
运行
git rebase --continue
完成变基。 -
使用
git push
推送您的更改。
绕过推送保护
如果 GitHub 阻止了你认为安全推送的密钥,你可以通过指定允许推送密钥的原因来绕过此阻止。
当你允许推送密钥时,会在“**安全**”选项卡中创建一个警报。如果指定密钥为误报或仅用于测试,GitHub 将关闭警报且不会发送通知。如果指定密钥为真实密钥且你稍后会修复它,GitHub 将保持安全警报处于打开状态,并向提交的作者以及代码库管理员发送通知。有关更多信息,请参阅“管理来自密钥扫描的警报”。
当贡献者绕过密钥的推送保护阻止时,GitHub 还会向已选择接收电子邮件通知的组织所有者、安全管理员和代码库管理员发送电子邮件警报。
如果你没有看到绕过阻止的选项,则代码库管理员或组织所有者已针对推送保护配置了更严格的控制。相反,你应该从提交中删除密钥,或提交“绕过权限”请求以推送被阻止的密钥。有关更多信息,请参阅 GitHub Enterprise Cloud 文档中的“请求绕过权限”。
-
访问 GitHub 在你的推送被阻止时返回的 URL。
-
选择最能描述你为何应该能够推送密钥的选项。
-
如果密钥仅用于测试且不构成威胁,请点击它用于测试。
-
如果检测到的字符串不是密钥,请点击它是误报。
-
如果密钥为真实密钥,但你打算稍后修复它,请点击我稍后会修复它。
注意
如果代码库启用了密钥扫描,则需要指定绕过推送保护的原因。
当推送至公共代码库且未启用密钥扫描时,你仍然可以免受意外推送密钥的影响,这得益于用户推送保护,该功能默认情况下会为你的用户帐户启用。
使用用户推送保护,如果这些推送包含受支持的密钥,GitHub 会自动阻止对公共代码库的推送,但你无需指定允许密钥的原因,GitHub 也不会生成警报。有关更多信息,请参阅“用户推送保护”。
-
-
点击允许我推送此密钥。
-
在三小时内在命令行中重新尝试推送。如果你在三小时内未推送,则需要重复此过程。