Skip to main content

推送受推送保护阻止的分支

推送保护可主动防止存储库中的机密泄露。 可以解析阻止的推送,在删除检测到的机密后,可以从命令行或 Web UI 将更改推送到工作分支。

谁可以使用此功能?

默认情况下,用户推送保护处于打开状态,可在个人帐户设置中禁用。

用户拥有的公共存储库可免费使用存储库和组织推送保护功能。 使用 GitHub Enterprise Cloud 且拥有 GitHub Advanced Security 许可证的组织也可以在其专用存储库和内部存储库上启用推送保护。

有关详细信息,请参阅 “用户的推送保护”和 “存储库和组织的推送保护”。

关于推送保护

推送保护有助于通过在将更改推送到存储库之前扫描有无机密来避免安全漏洞。

尝试将机密推送到受推送保护保护的存储库时,GitHub 会阻止推送。 在再次推送之前,必须先从分支中删除机密。 有关如何解决被阻止推送的更多信息,请参阅本文中的“解决命令行上被阻止的推送”和“解决 Web UI 中被阻止的提交”。

如果你认为允许该机密是安全的,可以选择绕过保护。 有关详细信息,请参阅“允许推送被阻止的机密”和“绕过机密的推送保护”。

有关推送保护支持的机密和服务提供商的信息,请参阅“机密扫描模式”。

解析命令行上的阻止推送

尝试将受支持的机密推送到受推送保护保护的存储库时,GitHub 将阻止推送。 可以从分支中删除该机密,或遵循提供的 URL 来允许推送。

注释

  • 如果 Git 配置支持推送到多个分支,而不仅仅是推送到当前分支,则由于附加和意外的引用被推送,你的推送可能被阻止。 有关详细信息,请参阅 Git 文档中的 push.default 选项
  • 如果在推送超时后进行 secret scanning,GitHub 仍将在推送后扫描你的提交有无机密。

删除分支上最新提交引入的机密

如果分支上的最新提交引入了阻止的机密,可以遵循以下指南进行操作。

  1. 从代码中删除机密。
  2. 若要提交更改,请运行 git commit --amend。 这会更新引入机密的原始提交,而不是创建新提交。
  3. 使用 git push 推送更改。

删除分支上先前提交引入的机密

如果机密出现在 Git 历史记录的早期提交中,还可以将其删除。 为此,需要确定哪个提交首先引入了机密,并通过交互式变基修改提交历史记录。

  1. 检查尝试推送分支时显示的错误消息,其中列出了包含该机密的所有提交。

    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
    
  2. 接下来,运行 git log 以查看分支上所有提交的完整历史记录及其对应的时间戳。

    test-repo (test-branch)]$ git log
    commit 8053f7b27 (HEAD -> main)
    Author: Octocat <1000+octocat@users.noreply.github.com
    Date:   Tue Jan 30 13:03:37 2024 +0100
    
      my fourth commit message
    
    commit 03d69e5d3
    Author: Octocat <1000+octocat@users.noreply.github.com>
    Date:   Tue Jan 30 13:02:59 2024 +0100
    
      my third commit message
    
    commit 8728dbe67
    Author: Octocat <1000+octocat@users.noreply.github.com
    Date:   Tue Jan 30 13:01:36 2024 +0100
    
      my second commit message
    
    commit 6057cbe51
    Author: Octocat <1000+octocat@users.noreply.github.com
    Date:   Tue Jan 30 12:58:24 2024 +0100
    
      my first commit message
    
    
  3. Focusing only on the commits that contain the secret, use the output of git log to identify which commit comes earliest in your Git history.

    • In the example, commit 8728dbe67 was the first commit to contain the secret.
  4. Start an interactive rebase with git rebase -i <COMMIT-ID>~1.

    • For <COMMIT-ID>, use the commit identified in step 3. For example, git rebase -i 8728dbe67~1.
  5. In the editor, choose to edit the commit identified in step 3 by changing pick to edit on the first line of the text.

    edit 8728dbe67 my second commit message
    pick 03d69e5d3 my third commit message
    pick 8053f7b27 my fourth commit message
    
  6. 保存并关闭编辑器,以开始交互式变基。

  7. 从代码中删除机密。

  8. 使用 git commit --amend 提交更改。

  9. 运行 git rebase --continue 以完成变基。

  10. 使用 git push 推送更改。

在 Web UI 中解析阻止的提交

使用 Web UI 尝试将受支持的机密提交到受推送保护保护的存储库时,GitHub 将阻止提交。

你将看到一个对话框,其中包含有关机密位置的信息,以及允许推送机密的选项。 机密还会在文件中加下划线,以便可以轻松找到它。

若要解决 Web UI 中被阻止的提交,需要从文件中删除机密。 删除机密后,即可提交更改。

或者,如果你确定允许机密是安全的,请使用对话框中显示的选项绕过推送保护。 有关绕过 Web UI 中的推送保护的详细信息,请参阅“存储库和组织的推送保护”。

延伸阅读