当本地电子邮件配置与 github 中的电子邮件设置不匹配时,为什么 github 协作者仍然可以推送到私人仓库?

Why github collaborator can still push to private repo when there is a mismatch between local email config and the email setup in github?

对于只对协作者开放的私有仓库,我发现即使是协作者也不使用他在 github 中的电子邮件设置,如果他将仓库克隆到本地,那么他仍然可以向仓库推送一些东西.

Git 日志显示类似 Author: username <user@MacBook-Pro.local> 的内容,并且在提交消息中,头像是灰色的。我知道这表明本地和 github 电子邮件不匹配: Why are my commits linked to the wrong user?

但是,在访问设置中,访问权限只对 Github 中的电子邮件设置开放。这样的推送是如何完成的?这是否意味着任何具有邀请电子邮件的计算机都可以将某些内容推送到存储库,换句话说,访问权限是否不仅限于唯一的电子邮件?如果这是真的,在我看来这对回购来说是危险的。

我尝试搜索诸如“link between git local repo and remote one work”之类的问题,但大多数结果都是建立连接的简单教程,并没有揭示更深层次的内容机制.

有两个不同的身份:

  1. 提交的作者和编辑者(提交者)
  2. 用于与 GitHub
  3. 通信的凭据

第一个写在你的提交历史中,当有人在他的机器上创建新提交时,从 git 配置中的 user.nameuser.email 中获取.

第二个由通过 https 推送时提供的登录名表示,或通过 ssh 推送时由 ssh 密钥表示。


如果您推送(例如:使用您的 ssh 密钥)由其他人创建的提交,推送成功,但提交链接到“其他人”。


您有理由相信 推送 是由已撤销的用户执行的吗?

如果是这样,这意味着他仍然可以访问 login/password 或允许他推送的 ssh 密钥;您可以通过更改密码或撤销涉及的 ssh 密钥并生成新密钥来解决此问题。

否则:需要检查 git 历史,并决定是否应编辑某些提交的“作者”字段。
请注意,git rebasegit cherry-pickgit commit --amend 等操作默认保留原作者。

正如 LeGEC 所提到的,这里发生了两件不同的事情。

首先,一个提交有一个作者和提交者,每个身份都有一个名字(通常是个人名字,而不是用户名)和一个电子邮件。 GitHub 根据与用户帐户匹配的电子邮件将提交与用户相关联。如果提交电子邮件与任何帐户都不匹配,您将获得一个通用头像。

其次,当你推送提交时,存储库上有某种身份验证,对于 GitHub,参与者要么是用户,要么是某种集成或机器人,要么是部署密钥。

请注意,这些并不相关。如果您拥有对存储库的推送访问权限,则可以推送来自具有任何 (well-formed) 名称和电子邮件的任何用户的提交。这很重要,因为在某些项目中,例如 Git 本身,提交由维护者收集,然后将它们推送到主存储库。其中一些贡献者可能没有 GitHub 帐户,推送仍然需要工作。

这里最有可能的答案是您的贡献者错误配置(或只是未正确配置)他们的 Git 设置,因此正在使用链接到本地​​计算机的电子邮件地址创建提交,然后他们使用他们的有效凭据推送。

如果是这样,您应该与您的贡献者交谈并告诉他们将 user.name 设置为他们的个人(人类)姓名,并将 user.email 设置为与其 GitHub 关联的有效电子邮件帐户。 GitHub 提供了无法投递的地址,如果他们不想暴露真实的电子邮件,他们可以在设置中找到这些地址。

请注意 user.name has no effect on authentication 因此通常不是用户名。