为啥更改我的 SSH 密钥不会使我的提交显示正确的作者?

Posted

技术标签:

【中文标题】为啥更改我的 SSH 密钥不会使我的提交显示正确的作者?【英文标题】:Why doesn't changing my SSH key make the correct author be shown for my commits?为什么更改我的 SSH 密钥不会使我的提交显示正确的作者? 【发布时间】:2021-11-29 04:00:46 【问题描述】:

我在我的机器上处理两个不同的 SSH 密钥时遇到了一些问题。我有两个具有不同用户名和 ssh 密钥的 GitHub 帐户。

我在我的 GitHub @zshap/test-push 上有一个私人目录,而且奇怪的是,当我更改自述文件并将其推送时,我看到了来自我的 zackshapiro 用户的提交,他不是合作者,也没有被邀请参与回购。

我不明白我的其他用户如何能够推送到 zshap 的私人仓库。

为了更好地衡量,这些帐户也有不同的个人资料图片,因此很容易识别 zackshapiro 已推送到 zshap 存储库。

另外,为了更好地衡量,我使用这些别名在终端中设置我的 ssh 密钥:

alias ssh-personal="ssh-add -D; ssh-add -K ~/.ssh/key1"

alias ssh-zshap="ssh-add -D; ssh-add -K ~/.ssh/key3"

另外为了防止意外将现有密钥上传到 GitHub,我删除了 SSH 密钥 key2,并使用 GitHub 的教程创建了一个新的 key3。此外,我确保 GitHub 设置的 SSH 和 GPG 密钥部分中显示的签名都是不同的。

我的~/.ssh/config

Host zackshapiro
    HostName github.com
    User git
    IdentityFile ~/.ssh/key1
    IdentitiesOnly yes

Host zshap
    HostName github.com
    User git
    IdentityFile ~/.ssh/key3
    IdentitiesOnly yes

Host *
  AddKeysToAgent yes
  UseKeychain yes

这非常令人困惑,关于如何在一台机器上使用多个 ssh 密钥的其他答案似乎并没有解决这种特殊情况。我很想在这里得到一些帮助,所以我不会越过这些电线。

谢谢!

编辑

如果我运行ssh -T,我会在这里得到一个正确的用户名,所以提交来自我的其他用户和 ssh 密钥就更加奇怪了

$ ssh -T git@github.com
Hi zshap! You've successfully authenticated, but GitHub does not provide shell access.

编辑 2

在我的foo repo 目录中,我可以运行ssh-personal,然后运行git push 来推送新的提交,我得到了错误(正确):

错误:未找到存储库。 致命:无法从远程存储库中读取。 请确保您拥有正确的访问权限 并且存储库存在。

然后当我运行ssh-zshapgit push时,我可以成功推送但是提交消息来自错误的用户!是zackshapiro GitHub用户而不是zshap用户。 p>

【问题讨论】:

不要将密钥添加到代理。无论您尝试连接到哪个主机别名,代理都会按顺序尝试密钥。 你最后一个根本没有使用ssh。它正在通过 HTTP 建立匿名、未经身份验证的连接。 Edit 2 中的git clone 命令。它根本不使用ssh,所以除非zshap/foo.git 公开可见,否则您不会看到它,因为GitHub 不知道谁在请求它。 作者与SSH认证无关。作者和提交者字段都是在提交时设置的; github 不能在不修改提交哈希的情况下更改它们。 @CharlesDuffy 该信息将是一个很好的答案,而不是在 IMO 的 cmets 中传播。 【参考方案1】:

AuthorCommitter 字段由 git 本身设置,而不是由 github,当您第一次运行 git commit 以创建提交时。该提交中的所有内容都成为该提交哈希的一部分,因此不能在不使该提交和引用它的所有其他提交无效的情况下进行更改(或至少重写所有受影响的提交以由新的和不同的哈希标识)。因此,用于向 github 进行身份验证的 SSH 密钥无法更改提交本身。

如果您想为 git 的目的设置您的身份,您可以通过以下几种方式进行设置,按优先级顺序如下所示(因此,如果设置了多个,则列表中较早的一个获胜):

通过GIT_AUTHOR_NAMEGIT_AUTHOR_EMAILGIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL 的环境。一个重要的注意事项:在执行git commit --amend 时,使用这些可以覆盖 作者和提交者的预先存在的值;通常只有提交者在修改期间更新。 通过yourproject/.git/config 中的每个项目配置,可以使用git config user.name "Your Name"; git config user.email "your.email@example.com" 进行修改 通过~/.gitconfig(或$XDG_CONFIG_HOME/git/config)中用户特定的“全局”配置,可以使用git config --global user.name "Your Name"; git config --global user.email "your.email@example.com"进行修改。可以使用环境变量 GIT_CONFIG_GLOBAL 覆盖用于检索此内容的位置。 通过/etc/gitconfig 中的系统范围配置。可以使用环境变量 GIT_CONFIG_SYSTEM 覆盖用于检索此内容的位置。

如果您希望在多个全局配置文件之间进行交换,请考虑使用GIT_CONFIG_GLOBAL 配置文件来指定~/.gitconfig 的备用位置,具体取决于您希望在给定时间激活的配置文件。

如果您想向其他人证明您的身份,这就是 签名提交 的目的,该功能需要您设置 OpenPGP 密钥对。

【讨论】:

感谢您的帮助,查尔斯。对此,我真的非常感激。我还发现 this comment 在我寻找轻松更改作者信息的方法时很有帮助,而无需记住手动设置 .git/config 文件

以上是关于为啥更改我的 SSH 密钥不会使我的提交显示正确的作者?的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚为啥我的提交按钮不会提交

为啥 sklearn 的训练/测试拆分加上 PCA 会使我的标签不正确?

为啥 Visual Studio Code 想要访问我的私有 SSH 密钥?

释放自动释放对象不会使我的应用程序崩溃,为啥?

为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]

为啥在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?