ChatGPT解决这个技术问题 Extra ChatGPT

同一台计算机上有多个 GitHub 帐户?

尝试从我的计算机上处理我的实际“工作”存储库和 git hub 上的存储库。

首先设置了工作帐户,并且一切正常。

但是,我的帐户似乎无法推送到我的存储库,该存储库是在不同的帐户/电子邮件下设置的。

我尝试将我的工作密钥复制到我的帐户,但这会引发错误,因为当然密钥只能附加到一个帐户。

如何从各自的 GitHub 凭据向两个帐户推入/拉出?

链接 http://net.tutsplus.com/tutorials/tools-and-tips/how-to-work-with-github-and-multiple-accounts 中给出的步骤对我来说效果很好,你只需添加一件事,你必须添加你的个人 repo 密钥也使用<br> &nbsp; ssh-add ~/.ssh/id_rsa_COMPANY <br/>告诉 ssh-agent 包含它以供使用。<hr/>上面提到的教程对我来说休息很好。
“因为当然密钥只能附加到一个帐户”当然?为什么?
Git 2.13 及更高版本支持 .gitconfig 中的条件包含,这是管理每个文件夹层次结构身份的有用方法。 stackoverflow.com/a/36296990/901597

A
Audwin Oyong

您需要做的就是使用多个 SSH 密钥对配置您的 SSH 设置。

这个链接很容易理解(感谢 Eric):http://code.tutsplus.com/tutorials/quick-tip-how-to-work-with-github-and-multiple-accounts--net-22574

生成 SSH 密钥(Win/msysgit):https://help.github.com/articles/generating-an-ssh-key/

第一个链接的相关步骤:

生成 SSH 密钥: ssh-keygen -t ed25519 -C "john@doe.example.com" 按照提示确定名称,例如 id_ed25519_example_company。将 SSH 公钥从 ~/.ssh/id_ed25519_doe_company.pub 复制到 GitHub 并告诉 ssh 密钥: ssh-add ~/.ssh/id_ed25519_doe_company 在 ~/.ssh 中创建一个配置文件,内容如下: 主机 github- doe-company 主机名 github.com 用户 git IdentityFile ~/.ssh/id_ed25519_doe_company 添加您的远程: git remote add origin git@github-doe-company:username/repo.git 或更改使用: git remote set-url origin git@github -doe-公司:用户名/repo.git

此外,如果您使用不同的角色使用多个存储库,则需要确保您的各个存储库相应地覆盖了用户设置:

设置用户名、电子邮件和 GitHub 令牌 - 覆盖各个存储库的设置https://help.github.com/articles/setting-your-commit-email-address-in-git/

希望这可以帮助。

注意: 你们中的一些人可能需要将不同的电子邮件用于不同的存储库,从 git 2.13 开始,您可以通过编辑位于以下位置的全局配置文件以目录为基础设置电子邮件: ~/.gitconfig 使用如下条件:

[user]
    name = Pavan Kataria
    email = defaultemail@example.com

[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

然后您的工作特定配置 ~/work/.gitconfig 将如下所示:

[user]
    email = pavan.kataria@example.com

感谢@alexg 在评论中告知我这一点。


第三个链接现已断开(多个 SSH 密钥)
该第一个链接现在重定向到用户与组织帐户的页面(不确定这是否是最初的意图)。 this tutorial 易于理解并解决了我的问题。
@AlmasAdilbek 现在已经快 3 年了,链接肯定会断开并继续断开。想找一篇替代文章或再次找到原始来源,这样你就可以为我更新链接了,伙计?我不能永远修复断开的链接。
如果不总结您实际帖子中的关键步骤,这不是一个答案。这个答案已经遭受了一次链接失效,但没有使必要的更新 tob 提供对问题的实际答案。
您可能需要添加的重要警告:如果您的电子邮件不同,您推送的任何提交仍将显示为由您在 .gitconfig 中设置的电子邮件提交。解决方案是 git config user.email youremail@email.com,它为特定的 Git 存储库在本地更改它,或者您可以使用条件自动更改您的配置电子邮件,具体取决于您所在的文件夹。来源和操作方法:stackoverflow.com/a/43654115/920920
G
Greg Leszek

使用 HTTPS:

将远程 URL 更改为 https:

git remote set-url origin https://USERNAME@github.com/USERNAME/PROJECTNAME.git

你很高兴:

git push

为确保提交显示为由 USERNAME 执行,也可以为此项目设置 user.nameuser.email

git config user.name USERNAME
git config user.email USERNAME@example.com

此解决方案提供了最简单的方法,因为我不想添加更多 ssh 密钥。请注意,如果您已经将 user.nameuser.email 设置为 --global 标志,只需按照他上面所说的方法在本地为该存储库设置它。这解决了很多麻烦。现在删除旧的回购......
ssh 或 git 协议而不是 https 呢?
对密码身份验证的支持已于 2021 年 8 月 13 日移除。
M
Mulan

塑形

要在单独的 github/bitbucket/whatever 帐户下管理 git repo,您只需生成一个新的 SSH 密钥。

但在我们开始使用您的第二个身份推送/拉取 repos 之前,我们必须让您熟悉 – 假设您的系统设置有典型的 id_rsaid_rsa.pub 密钥对。现在您的 tree ~/.ssh 看起来像这样

$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── id_rsa
└── id_rsa.pub

首先,命名该密钥对 - 添加描述性名称将帮助您记住哪个密钥用于哪个用户/远程

# change to your ~/.ssh directory
$ cd ~/.ssh

# rename the private key
$ mv id_rsa github-mainuser

# rename the public key
$ mv id_rsa.pub github-mainuser.pub

接下来,让我们generate a new key pair - 这里我将新密钥命名为 github-otheruser

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-otheruser

现在,当我们查看 tree ~/.ssh 时,我们看到

$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── github-mainuser
├── github-mainuser.pub
├── github-otheruser
└── github-otheruser.pub    

接下来,我们需要设置一个 ~/.ssh/config 文件来定义我们的关键配置。我们将使用 proper owner-read/write-only permissions 创建它

$ (umask 077; touch ~/.ssh/config)

用你喜欢的编辑器打开它,然后添加以下内容

Host github.com
  User git
  IdentityFile ~/.ssh/github-mainuser

Host github.com-otheruser
  HostName github.com
  User git
  IdentityFile ~/.ssh/github-otheruser

大概,您将拥有一些与您的主要 github 身份相关联的现有存储库。因此,“默认”github.com Host 设置为使用您的 mainuser 密钥。如果您不想让一个帐户优于另一个帐户,我将向您展示如何更新系统上的现有 存储库以使用更新的 ssh 配置。

将新的 SSH 密钥添加到 github

前往 github.com/settings/keys 添加您的新 public 密钥

您可以使用以下方法获取公钥内容:将其复制/粘贴到 github

$ cat ~/.ssh/github-otheruser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBVvWNQ2nO5...

现在您的新用户身份已全部设置完毕 - 下面我们将向您展示如何使用它。

完成任务:克隆一个 repo

那么这如何与 git 和 github 一起工作呢?好吧,因为你不能有没有鸡蛋的鸡,我们将看看克隆现有的回购。如果您的工作场所有一个新的 github 帐户并且您被添加到公司项目中,则这种情况可能适用于您。

假设 github.com/someorg/somerepo 已经存在并且您被添加到其中 - 克隆就像

$ git clone github.com-otheruser:someorg/somerepo.git

粗体部分必须与我们在您的 ~/.ssh/config 文件中设置的 Host 名称匹配。正确地将 git 连接到相应的 IdentityFile 并使用 github 正确地对您进行身份验证

完成任务:创建一个新的仓库

好吧,因为您不能没有鸡蛋,所以我们将考虑在您的辅助帐户上发布一个新的回购。这种情况适用于使用辅助 github 帐户创建新内容的用户。

假设您已经在本地完成了一些工作,现在可以推送到 github。如果你愿意,可以跟我一起

$ cd ~
$ mkdir somerepo
$ cd somerepo
$ git init

现在配置此存储库以使用您的 identity

$ git config user.name "Mister Manager"
$ git config user.email "someuser@some.org"

现在进行你的第一次提交

$ echo "hello world" > readme
$ git add .
$ git commit -m "first commit"

检查提交以查看您的新身份是否已使用 git log

$ git log --pretty="%H %an <%ae>"
f397a7cfbf55d44ffdf87aa24974f0a5001e1921 Mister Manager <someuser@some.org>

好的,是时候推送到 github 了!由于 github 还不知道我们的新存储库,请先转到 github.com/new 并创建您的新存储库 - 将其命名为 somerepo

现在,要将您的存储库配置为使用正确的身份/凭据与 github “对话”,我们添加了一个远程。假设您的新帐户的 github 用户名是 someuser ...

$ git remote add origin github.com-otheruser:someuser/somerepo.git

粗体部分绝对重要,它必须与我们在您的 ~/.ssh/config 文件中定义的 Host 匹配

最后推送repo

$ git push origin master

更新现有存储库以使用新的 SSH 配置

假设您已经克隆了一些 repo,但现在您想使用新的 SSH 配置。在上面的示例中,我们通过将您之前的 id_rsa/id_rsa.pub 密钥对分配给您的 SSH 配置文件中的 Host github.com 来保持您现有的存储库完好无损。这没有什么问题,但我现在至少有 5 个 github 配置,我不喜欢将其中一个视为“默认”配置——我宁愿对每一个都明确。

在我们有这个之前

Host github.com
  User git
  IdentityFile ~/.ssh/github-mainuser

Host github.com-otheruser
  HostName github.com
  User git
  IdentityFile ~/.ssh/github-otheruser

所以我们现在将其更新为此(更改为粗体)

Host github.com-mainuser
  HostName github.com
  User git
  IdentityFile ~/.ssh/github-mainuser

Host github.com-otheruser
  HostName github.com
  User git
  IdentityFile ~/.ssh/github-otheruser

但是现在任何带有 github.com 远程的现有存储库都无法使用此身份文件。但别担心,这是一个简单的修复。

要更新任何现有存储库以使用您的新 SSH 配置,请使用 set-url 更新存储库的远程源字段 -

$ cd existingrepo
$ git remote set-url origin github.com-mainuser:someuser/existingrepo.git

而已。现在您可以随心所欲地push/pull

SSH 密钥文件权限

如果您在公钥无法正常工作时遇到问题,SSH 对您的 ~/.ssh 目录和相应密钥文件中允许的 file permissions 非常严格

根据经验,任何目录都应该是 700,任何文件都应该是 600 - 这意味着它们是所有者只读/只写的 - 没有其他组/用户可以读/写它们

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/github-mainuser
$ chmod 600 ~/.ssh/github-mainuser.pub
$ chmod 600 ~/.ssh/github-otheruser
$ chmod 600 ~/.ssh/github-otheruser.pub

我如何管理我的 SSH 密钥

我为我连接的每台主机管理单独的 SSH 密钥,这样如果任何一个密钥被泄露,我就不必在我使用过该密钥的所有其他地方更新密钥。这就像当您从 Adobe 收到通知说他们的 1.5 亿用户信息被盗时 - 现在您必须取消该信用卡并更新依赖它的所有服务 - 多么令人讨厌。

这是我的 ~/.ssh 目录的样子:我为每个用户在我连接到的每个域的文件夹中都有一个 .pem 密钥。我使用 .pem 键,因此每个键只需要 一个 文件。

$ tree ~/.ssh
/Users/myuser/.ssh
├── another.site
│   ├── myuser.pem
├── config
├── github.com
│   ├── myuser.pem
│   ├── someusername.pem
├── known_hosts
├── somedomain.com
│   ├── someuser.pem
└── someotherdomain.org
     └── root.pem

这是我对应的 /.ssh/config 文件——显然 github 的内容与回答这个关于 github 的问题有关,但这个答案旨在让您掌握在任意数量的服务/机器上管理您的 ssh 身份的知识。

Host another.site
  User muyuser
  IdentityFile ~/.ssh/another.site/muyuser.pem

Host github.com-myuser
  HostName github.com
  User git
  IdentityFile ~/.ssh/github.com/myuser.pem

Host github.com-someuser
  HostName github.com
  User git
  IdentityFile ~/.ssh/github.com/someusername.pem

Host somedomain.com
  HostName 162.10.20.30
  User someuser
  IdentityFile ~/.ssh/somedomain.com/someuser.pem

Host someotherdomain.org
  User someuser
  IdentityFile ~/.ssh/someotherdomain.org/root.pem

从 PEM 密钥获取 SSH 公钥

上面你注意到我每个键只有一个文件。当我需要提供公钥时,我只需根据需要生成它。

因此,当 github 询问您的 ssh 公钥时,运行此命令将公钥输出到标准输出 - 在需要的地方复制/粘贴

$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAA...

请注意,这也是我用于将密钥添加到任何远程机器的相同过程。 ssh-rsa AAAA... 值被复制到远程的 ~/.ssh/authorized_keys 文件

将您的 id_rsa/id_rsa.pub 密钥对转换为 PEM 格式

所以你想驯服你的关键文件并减少一些文件系统的麻烦吗?将您的密钥对转换为单个 PEM 很容易

$ cd ~/.ssh
$ openssl rsa -in id_rsa -outform pem > id_rsa.pem

或者,按照上面的示例,我们重命名了 id_rsa -> github-mainuserid_rsa.pub -> github-mainuser.pub – 所以

$ cd ~/.ssh
$ openssl rsa -in github-mainuser -outform pem > github-mainuser.pem

现在只是为了确保我们已经正确转换了这个,您需要验证生成的公钥是否与您的旧公钥匹配

# display the public key
$ cat github-mainuser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==

# generate public key from your new PEM
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==

现在您有了 github-mainuser.pem 文件,您可以安全地删除旧的 github-mainusergithub-mainuser.pub 文件 - 只需要 PEM 文件;只需在需要时生成公钥^_^

从头开始创建 PEM 密钥

您无需创建私钥/公钥对,然后转换为单个 PEM 密钥。您可以直接创建 PEM 密钥。

让我们创建一个 newuser.pem

$ openssl genrsa -out ~/.ssh/newuser.pem 4096

获取SSH公钥是一样的

$ ssh-keygen -y -f ~/.ssh/newuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACA ... FUNZvoKPRQ==

我知道这是一个老问题,但这并不能原谅这里几乎每个答案都依赖于某个教程的链接,因此会受到链接腐烂的影响。链接来源/引文很好,但如果您不总结此处发布的答案中的关键部分,则不能依赖链接。
我赞成您出色而详细的答案,因为它显然是正确的方法。我的问题是它很复杂,在使用一些帐户几年后,我得到了一个新帐户,然后不记得如何“以正确的方式”进行操作。我下面的方法非常简单——我只创建了 3 个新文件和一个新脚本,就可以开始了。多年来,它对我来说完美无缺。读者可以决定什么最适合他们。
DavidH 我很欣赏你的评论。如果你把它作为一个整体,答案确实会感觉很复杂,但是如果读者的唯一目标是添加另一个 github 身份,那么他们真的只需要关心他/她自己的一小部分答案——所有剩下的部分answer 旨在为您设置一个强大的解决方案来管理一般的 SSH 密钥,并且是完全可选的。
我认为 git clone github.com-otheruser:someorg/somerepo.git 必须是 git clone git@github.com-otheruser:someorg/somerepo.git(添加 git@)。至少,这就是我所需要的。
很酷的答案,但是当通过 ssh-agent 远程提供这些身份时,它没有建议做什么。因此,我需要通过现有文件或代理的 fingerprint 选择密钥。它可以实现吗?
m
mishaba

通过在 ~/.ssh/config 中为 github.com 创建不同的主机别名,并为每个主机别名提供自己的 ssh 密钥,您可以轻松地使用多个 github 帐户而不会混淆。那是因为 github.com 不是通过用户来区分的,它总是只是 git,而是通过你用来连接的 ssh 密钥来区分的。只需使用您自己的主机别名配置您的远程源。”

上面的摘要是对下面博客文章的评论提供的。

我发现这个解释最清楚。它对我有用,至少截至 2012 年 4 月。

http://net.tutsplus.com/tutorials/tools-and-tips/how-to-work-with-github-and-multiple-accounts/


您可能还需要运行 $ ssh-add ~/.ssh/id_rsa_COMPANY - 请参阅 Error: Permission denied (publickey) - User Documentation
M
Matthew Skelton

mishaba 链接到的 http://net.tutsplus.com/tutorials/tools-and-tips/how-to-work-with-github-and-multiple-accounts/ 的详细信息对我来说非常有用。

从该页面:

$ touch ~/.ssh/config

然后将该文件编辑为如下所示(每个帐户一个条目):

#Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

Host github-COMPANY
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_COMPANY

我还要注意,在执行 git clone git@github-COMPANY/repo/name.git 之类的克隆(可能还有其他命令)以获得正确的 ssh 密钥时,需要使用“github.com”或“github-COMPANY”。
@dtan:如果我必须通过 https 进行克隆,我将如何实现这一点? git clone https://github-COMPANY/GitUserName/projectname.git 似乎不起作用。使用 github.com 的默认密钥可以正常工作。
@IsaacRemuant,您绝对必须通过https吗?每次您想要拉/推时,您都必须输入您的用户凭据。如果你能做 git://github-COMPANY...projectname.git 会更好。 https 调用是否有任何错误消息?
@dtan:尽管显然已经为我打开了端口,但我在端口 22 上遇到了一些问题。 ssh: connect to host github.com port 22: Bad file number fatal: The remote end hung up unexpectedly。到目前为止,https是唯一的方法。 $ git clone https://github-USER/UserName/test_project_user.git Cloning into test_project_user... error: Couldn't resolve host 'github-USER' while accessing https://github-USER/N UserName/test_project_user.git/info/refs fatal: HTTP request failed 我不确定它是否与配置文件或我尝试使用 https 模拟您的 git 调用的方式有关。
最终,我将尝试一切进行深入分析,并将其作为一个问题适当地发布。
p
pvrforpranavvr

转到 ~/.ssh

创建一个名为 config 的文件(没有扩展名)

打开配置文件并添加以下代码。 (根据你的帐户更改) Account 1 # account_1 HostName gitlab.com-account_1 HostName gitlab.com User git PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_account_1 Account 2 # Account2 Host gitlab.com-Account2 HostName gitlab.com User git PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_Account2 Account 3 # Account_3 Host github.com-Account3 HostName github.com User git PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_Account_3

帐户 1 # account_1 主机 gitlab.com-account_1 主机名 gitlab.com 用户 git PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_account_1

Account 2 # Account2 Host gitlab.com-Account2 HostName gitlab.com User git PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_Account2

Account 3 # Account_3 Host github.com-Account3 HostName github.com 用户 git PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_Account_3

添加远程url如下 账户1 git remote add origin git@gitlab.com-account_1:group_name/repo_name.git 账户2 git remote add origin git@gitlab.com-Account2:group_name/repo_name.git 账户3 git remote add origin github .com-Account3:github_username/repo_name.git

账户1 git remote add origin git@gitlab.com-account_1:group_name/repo_name.git

Account 2 git remote add origin git@gitlab.com-Account2:group_name/repo_name.git

Account 3 git remote add origin github.com-Account3:github_username/repo_name.git

确保 IdentityFile 名称与您在 ssh 密钥生成期间创建的名称相同。


您能解释一下为什么使用 PreferredAuthentications publickey 吗?
@OliverPearmain 在这里我告诉 ssh 我们首选的身份验证方法是 publickey 。您可以在 PreferredAuthentications 中使用密码,但您可能必须输入密码才能进行身份验证。
M
MK.

就我而言,我在 Git-Lab 中有我的工作帐户,在 GitHub 中有我的个人帐户。我的 Git-Lab 帐户被全局配置为可以从我笔记本电脑中的所有目录访问,如下所示:

git config --global user.name WORK_USERNAME
git config --global user.email WORK_USERNAME@example.com

因此,如果您正在寻找不使用 SSL 的解决方案,您可以在一个空文件夹中使用 git init,然后在该文件夹中插入您的个人帐户凭据:

git config user.name PERSONAL_USERNAME
git config user.email PERSONAL_USERNAME@example.com

注意这里的 --global 没有设置,因为您只希望从那里访问您的个人 git,而不是在任何地方访问,因此该文件夹内的任何内容都将其 git 凭据连接到您的个人帐户,而它之外的内容将连接到您的工作帐户。

之后,您可以像 git clone your_repo_link.git 那样克隆您的存储库。然后会弹出一个新窗口并要求您使用您的 github 帐户登录。

要验证您的流程,请尝试在您创建的文件夹中使用 git config --list,您应该会看到工作和个人用户名以及电子邮件及其目录。

在该文件夹之外,如果您运行 git config --list,您应该只会看到您的工作用户名和电子邮件。

就是这样,希望这对不配置 SSL 的人有所帮助。


为我工作,但在工作目录中执行 config --list 时看不到工作用户名和电子邮件,但我可以看到正确的远程源地址。就我而言,我克隆了一个 GitLab 存储库,在克隆时,它提示我输入用户名和密码,所以我认为正确的 <url> 足以让 git 识别 GitLab 或 GitHub 存储库。就我而言,GitLab 和 GitHub 的用户名和电子邮件都不同。
只是澄清一下,我做了 git init 并配置了名称和电子邮件地址,然后我将 gitlab repo 克隆到同一目录但在一个新文件夹中。我希望我也能在这个新文件夹中看到本地名称和电子邮件地址,但我没有。另一方面,我可以在父文件夹中看到全局和本地用户名。
当您将文件推送到包含您的个人用户名和电子邮件的文件夹中时,它应该会打开一个新的 git 窗口,询问您的凭据。只要该文件夹中未使用 --global。我认为您的主要工作 git 帐户不应该受到影响
L
Lukas

此答案适用于初学者(非 git 大师)。我最近遇到了这个问题,也许只是我自己,但大多数答案似乎都需要对 git 有相当深入的了解。在阅读了包括这个线程在内的几个堆栈溢出答案之后,这里是我需要采取的步骤以便在 GitHub 帐户之间轻松切换(例如,假设有两个 GitHub 帐户,github.com/personal 和 gitHub.com/work):

检查现有的 ssh 密钥:打开终端并运行此命令以查看/列出现有的 ssh 密钥 ls -al ~/.ssh 扩展名为 .pub 的文件是您的 ssh 密钥,因此您应该有两个用于个人帐户和工作帐户。如果只有一个或没有,则生成其他明智的时间跳过此。 - 生成 ssh 密钥:登录 github(个人帐户或工作帐户),导航到设置并复制相关的电子邮件。现在回到终端并运行 ssh-keygen -t rsa -C “复制的电子邮件”,你会看到:生成公钥/私钥 rsa 密钥对。输入保存密钥的文件 (/.../.ssh/id_rsa): id_rsa 是即将生成的 ssh 密钥的默认名称,因此复制路径并重命名为默认名称,例如 /.../.ssh /id_rsa_work 如果为工作帐户生成。提供密码或直接输入忽略,您会看到类似 The key's randomart image is: 和图像。完毕。再次为您的第二个 github 帐户重复此步骤。确保使用正确的电子邮件地址和不同的 ssh 密钥名称(例如 id_rsa_personal)以避免覆盖。在这个阶段,再次运行 ls -al ~/.ssh 时,您应该会看到两个 ssh 密钥。将 ssh 密钥与 gitHub 帐户关联:下一步是复制一个 ssh 密钥,运行此命令,但替换您自己的 ssh 密钥名称:pbcopy < ~/.ssh/id_rsa_work.pub,将 id_rsa_work.pub 替换为您的名称。现在我们的 ssh 密钥已复制到剪贴板,返回 github 帐户 [如果您复制的 ssh 密钥是 id_rsa_work,请确保您已登录到工作帐户] 并导航到 Settings - SSH and GPG Keys 并单击 New SSH key按钮(不是新的 GPG 密钥 btw :D)给这个密钥一些标题,粘贴密钥并单击添加 SSH 密钥。您现在要么成功添加了 ssh 密钥,要么注意到它一直存在,这很好(或者您收到错误,因为您选择了新 GPG 密钥而不是新 SSH 密钥 :D)。将 ssh 密钥与 gitHub 帐户关联:对您的第二个帐户重复上述步骤。编辑全局 git 配置:最后一步是确保全局配置文件知道所有 github 帐户(可以这么说)。运行 git config --global --edit 来编辑这个全局文件,如果这会打开 vim 而你不知道如何使用它,按 i 进入插入模式,编辑文件如下,然后按 esc 后跟 :wq退出插入模式:[在这个方括号内为后面的 acc 命名。] name = github_username email = github_emailaddress [any other name] name = github_username email = github_email [credential] helper = osxkeychain useHttpPath = true

完成!,现在当尝试从仓库推送或拉取时,系统会询问您应该将哪个 GitHub 帐户与此仓库链接,并且只询问一次,本地配置将记住此链接而不是全局配置,因此您可以工作在与不同帐户链接的不同存储库上,无需每次都编辑全局配置。


他们应该允许为答案添加标签,这是针对 mac OS 的。
D
David H

我使用 shell 脚本将我切换到我想要“活跃”的任何帐户。本质上,您从一个全新的开始,正确配置一个帐户并使其正常工作,然后将这些文件移动到具有适当前缀的名称。从此你可以使用命令“github”或“gitxyz”进行切换:

# my github script
cd ~/.ssh

if [ -f git_dhoerl -a -f git_dhoerl.pub -a -f config_dhoerl ]
then
    ; 
else 
    echo "Error: missing new files"
    exit 1
fi 

# Save a copy in /tmp, just in case
cp id_rsa /tmp
cp id_rsa.pub /tmp
cp config /tmp
echo "Saved old files in /tmp, just in case"

rm id_rsa
rm id_rsa.pub
rm config
echo "Removed current links/files"

ln git_dhoerl id_rsa
ln git_dhoerl.pub id_rsa.pub
ln config_dhoerl config

git config --global user.email "dhoerl@<company>.com"
git config --global github.user "dhoerl"        
git config --global github.token "whatever_it_is"

ssh-add -D

我在这方面很幸运。我还在 Xcode(为 Mac 用户)中创建了一个运行脚本,因此除非我有正确的设置(因为它使用 git),否则它不会构建我的项目:

在依赖项之后运行脚本(使用 /bin/ksh 作为 shell):

if [ "$(git config --global --get user.email)" != "dhoerl@<company>.com" ]
then
    exit 1
fi

编辑:添加了对新文件存在的测试并将旧文件复制到 /tmp 以解决下面@naomik 的评论。


在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往会被社区标记为“垃圾邮件”。如果您这样做,则通常意味着问题是重复的,因此请将它们标记为:stackoverflow.com/questions/7548158stackoverflow.com/questions/3225862stackoverflow.com/questions/7924937
这是一场噩梦。如果有人在了解他们的 id_rsaid_rsa.pub 密钥将被删除之前运行此脚本,他们可能会被锁定在遥控器之外。
@naomik 更新了脚本以首先检查新文件,并将旧文件保存在 /tmp
C
Craig - MSFT

刚刚为 Windows 解决了这个问题,使用每个 repo 的凭据:

cd c:\User1\SomeRepo
git config --local credential.https://github.com.user1 user1
git config --local credential.useHttpPath true
git config --local credential.helper manager
git remote set-url origin https://USERNAME@github.com/USERNAME/PROJECTNAME.git

凭证的格式。https://github.com。告诉凭证助手凭证的 URL。 “useHttpPath”告诉凭证管理器使用凭证的路径。如果省略 useHttpPath,则凭证管理器将为 https://github.com 存储一个凭证。如果包含它,那么凭证管理器将存储多个凭证,这是我真正想要的。


N
Nimantha

更简单,更容易修复以避免混淆..

供 Windows 用户为不同的项目使用多个或不同的 git 帐户。

以下步骤:转到控制面板并搜索凭据管理器。然后转到凭据管理器-> Windows 凭据

现在删除 Generic Credentials Heading 下的 git:https//github.com 节点

这将删除当前凭据。现在你可以通过 git pull 添加任何项目,它会询问用户名和密码。

当您遇到其他帐户的任何问题时,请执行相同的过程。

https://i.stack.imgur.com/rhu8g.png


我不觉得这很有帮助和方便,因为用户每次推或拉时都必须提供 id 和 pw。
R
Roger Heathcote

有很多答案可以解释如何完成您的要求,但我想提供不同的观点。

我认为将工作和个人事物分开是有道理的。在所有操作系统上的用户帐户之间切换非常简单,因此您可以为工作和娱乐创建单独的操作系统帐户,并在每个帐户中登录不同的 github 帐户。

保持清晰的关注点分离也可以...

防止您的工作文件与您的个人文件混在一起

降低对错误资源执行操作的风险

可能将安全漏洞限制在一组帐户/凭据中


对于个人来说,这似乎是一种严厉的做法,而不是简单地使用 Git 提供的一连串用户/身份管理工具。一方面,我有几个不同的专业帐户和存储库,因为我是多个组织的成员,所以对我来说,启动 2、3、4、5 等操作系统帐户只是为了登录并没有多大意义从不同的用户名进入 git。这就是为什么 git 设置具有层次结构的原因。它是一种技术工具,理解它的工作原理可能很困难,但我们仍然应该鼓励人们以“正确的方式”去做,而不是绕开它。
t
thakis

如果您不想弄乱此处提到的 ~/.ssh/config 文件,则可以改为在要从其他帐户提交的存储库中运行 git config core.sshCommand "ssh -i ~/.ssh/custom_id_rsa"

其余设置相同:

使用 ssh-keygen -t rsa -f ~/.ssh -f ~/.ssh/custom_id_rsa 为第二个帐户创建一个新的 SSH 密钥 使用您的其他帐户登录 github,转到 https://github.com/settings /keys ,并粘贴 ~/.ssh/custom_id_rsa.pub 的内容 确保您使用 SSH 而不是 HTTPS 作为远程 url: git remote set-url origin git@github.com:upstream_project_teamname/upstream_project.git


谢谢!这比配置教程简单。在我的情况下,配置文件无论如何都不起作用,但这个直接解决方案确实起作用。点赞+评论,希望其他人在放弃阅读之前能找到这个答案。
e
eQ19

除了为多个帐户创建多个 SSH 密钥之外,您还可以考虑使用相同的帐户电子邮件在每个项目上添加协作者并永久存储密码。

#this store the password permanently
$ git config --global credential.helper wincred

我已经使用不同的电子邮件设置了多个帐户,然后将相同的用户和电子邮件作为协作者之一放在每个帐户上。通过这种方式,我可以访问所有帐户,而无需添加 SSH 密钥,或切换到另一个用户名和电子邮件进行身份验证。


这是迄今为止最容易获得的。
L
Leo Lloyd Andrade

让我的私人仓库使用 SSH 密钥对工作。这是在 git for Windows 上测试的。

来源:https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

A. 生成公钥和私钥对

启动 git bash 运行 ssh-keygen -t ed25519 -C "your_email@example.com" 当系统提示您“输入保存密钥的文件”时,按 Enter 接受默认值。按回车键输入空白密码。启动 ssh 代理: eval $(ssh-agent) 将私钥添加到 ssh 代理并存储密码: ssh-add ~/.ssh/id_ed25519

B. 将 SSH 密钥添加到 GitHub 帐户

将公钥复制到剪贴板: clip < ~/.ssh/id_ed25519.pub 在 GitHub 上,转到 Profile -> Settings -> SSH Keys -> New SSH Key 给一个标题。例如“MacBook Pro 上的 Windows” 粘贴密钥并点击“添加 SSH 密钥”。

C. 测试 SSH 连接

输入:ssh -T git@github.com 点击“yes”查看任何警告信息。它应该显示:“Hi username!...”表示测试成功。

D. 设置本地存储库以使用 SSH 密钥

更改电子邮件和用户名:

git config user.email your_email@example.com
git config user.name github_username

更新远程链接以使用 git。首先列出远程 URI:

git remote -v
git remote set-url origin git@github.com:github_username/your-repo-name.git

E. 测试

git remote show origin

A
Abu Shoeb

我在这里看到了很多可能的解决方法。作为一种快速解决方案,@Greg 的解决方案似乎相对容易。但是,从长远来看,最好为所有不同的帐户设置单独的 ssh keys。此 video 简要说明了这一点。以下是该 video blog 中提到的步骤。

第 1 步 - 为新帐户创建新的 SSH 密钥,并将其保存在单独的文件中(例如 ~/.ssh/id_rsa_new_account_name),而不是原始文件中,即 ~/.ssh/id_rsa

ssh-keygen -t rsa -C "your-email-address"

第 2 步 - 附加新密钥

接下来,登录您的第二个 GitHub 帐户

浏览到 Account Overview,并在 SSH Public Keys 部分中附加新密钥 ~/.ssh/id_rsa_new_account_name.pub。

在终端中,通过键入 ssh-add ~/.ssh/id_rsa_new_account_name 告诉 SSH 添加新身份。如果成功,您将看到已添加身份的响应。

第 3 步 - 创建配置文件

touch ~/.ssh/config

并将以下内容保存到文件中

#Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

#New Account
Host github-new-account-name
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_new_account_name

第 4 步 - 每次您想使用新帐户和关联的 repo 时立即试用,为相应的 repo 键入此内容

git remote add origin git@github-new-account-name:your-domain.com/your-repo.git

确定的答案。谢谢@Abu_Shoeb。 recommended 使用 ed25519 密钥而不是 rsa 密钥。它们要短得多。 ssh-keygen -t ed25519 -C "email" 将密钥存储在同一位置(Windows 为 %userprofile%\.ssh)。
a
agsdot

我发现这个 gem 非常有用:sshwitch

https://github.com/agush22/sshwitch
http://rubygems.org/gems/sshwitch

它有助于切换 ssh 密钥。记得先备份一切!

另外,为了确保提交具有正确的电子邮件地址,我确保 ~/.gitconfig 文件具有正确的电子邮件地址。


J
Jet Yu

另一种更简单的方法是使用多个桌面应用程序,就像我正在做的那样,在 Github 桌面上使用帐户 A,同时在 Github Kraken 上使用帐户 B


K
Kohn1001

最简单直接的方法(恕我直言) - 没有配置文件没有太多麻烦

只需创建另一个 ssh 密钥。

假设您有一个新的工作 GitHub 帐户,只需为其创建一个新密钥:

sh-keygen -t rsa -C "email@work_mail.com" -f "id_rsa_work_user1"`

现在你应该有旧的和新的,要查看它们,运行:

ls -al ~/.ssh

您只需要运行一次以上。

从现在开始,每次你想在两者之间切换时,只需运行:

ssh-add -D
ssh-add ~/.ssh/id_rsa_work_user1 #make to use this without the suffix .pub

为了切换到旧的,再次运行:

 ssh-add -D
 ssh-add ~/.ssh/<previous id_rsa>

A
Andriy Orehov

IntelliJ Idea 具有对 https://www.jetbrains.com/help/idea/github.html#da8d32ae 的内置支持


W
What Would Be Cool

使用个人访问令牌的个人目录 .gitconfig

如果您不想修改主机文件、使用 SSH 密钥或为每个 repo 设置一个 .gitconfig,那么您可以使用您基本上包含在根级别配置中的个人 .gitconfig。给定一个 OSX 目录结构,如

# root level git config
~/.gitconfig

# your personal repos under some folder like
../personal/
../home/
~/Dropbox/

在您的个人文件夹中添加 .gitconfig,例如 ~/Dropbox/.gitconfig

[user]
    email = first.last@home.com
    name = First Last
[credential]
    username = PersonalGithubUsername
    helper = osxkeychain

在您的根级别 .gitconfig 添加一个 includeIf 部分以在您位于个人目录中时获取您的个人配置。只要 includeIf 出现在您要覆盖的设置之后,那里的任何设置都会覆盖根配置。

[user]
    email = first.last@work.com
    name = "First Last"
[credential]
    helper = osxkeychain
[includeIf "gitdir:~/Dropbox/**"]
    path = ~/Dropbox/.gitconfig

尝试推送到您的个人仓库或从您的私人仓库中提取

git push
# prompts for password

出现提示时,输入您的个人密码,或者更好的是,输入您在 account developer settings 中创建的个人访问令牌。输入该令牌作为您的密码。

假设您已经在使用 git-credential-osxkeychain,您的个人凭据应该存储在您的钥匙串中,因此将显示两个 github 条目,但使用不同的帐户。

https://i.stack.imgur.com/BdObr.png


n
nphias

选项 0:您不想弄乱操作系统设置..您只想提交到具有不同公钥的不同 github 帐户用于一个 repo。

解决方案:

创建新密钥: ssh-keygen -t rsa -b 4096 -f ~/.ssh/alt_rsa 将密钥添加到密钥集中: ssh-add -K ~/.ssh/alt_rsa 复制并将发布密钥添加到 github 帐户:(参见 github 说明)使用 github 测试密钥:ssh -i ~/.ssh/alt_rsa T git@github.com 使用 git 协议(不是 HTTP)克隆 repo:git clone git@github:myaccount... in克隆的仓库: git config core.sshCommand "ssh -i ~/.ssh/alt_rsa -F /dev/null" git config user.name [myaccount] git config user.email [myaccount email] 现在你应该可以 git正确推送而不会干扰您的日常 git 帐户


D
Detoner

在一台 Windows 机器上管理多个 GitHub 帐户 (HTTPS)

假设您之前在您的机器上使用 git 并配置了 git 全局配置文件。要检查它,请打开终端并:

git config --global -e

它会打开您的编辑器,您可能会看到如下内容:

[user]
    email = yourEmail@gmail.com
    name = Your_Name
...

这很棒,因为您可以将代码推送到 GitHub 帐户,而无需每次都输入凭据。但是如果它需要从另一个账户推送回购呢?在这种情况下,git 将拒绝 403 err,并且您必须更改您的全局 git 凭据。为了让这个舒适的 lat 集在凭证管理器中存储一个 repo 名称:

git config --global credential.github.com.useHttpPath true

检查它再次打开配置 git config --global -e 你会看到新的配置行

[credential]
    useHttpPath = true
...

就是它。现在,当您第一次推送到任何帐户时,您将看到一个弹出屏幕截图_1

输入特定于此回购帐户凭据,这将为回购“绑定”该帐户。因此,在您的机器中,您可以根据需要指定任意数量的帐户/存储库。

如需更详细的说明,您可以观看我在 youtube 上找到的这个很酷的视频:https://youtu.be/2MGGJtTH0bQ


D
Damercy

无需处理 SSH 密钥对的简单方法

只需更改 user.name & user.email 本地在 repo 中。给那些你想要推送到那个 repo 的人。

示例:我在 gitlab 有一个工作帐户,有一个项目。克隆此项目/存储库后,在终端中输入:

git config user.name "my-work-username"
git config user.email "my-work-email-id"

现在,假设我在 Gitlab 中有另一个个人项目/存储库,我想将其与我的个人帐户相关联。就像上面一样,克隆后,我输入:

git config user.name "my-personal-username"
git config user.email "my-personal-email-id"

希望这可以帮助。如果它对您有用,请点赞! :)


g
greedy52

使用码头工人!

这可能并不适合所有人,但这是我最终为自己做的。

我所有的开发现在都在 docker 容器中完成。我是 vim 用户,但我知道 VSCode 有插件可以与 docker 容器一起使用。

因此,由于我对不同的项目/语言有不同的 docker 容器,所以我可以在每个容器中使用不同的 git 配置。问题解决了。


M
Muhammad Raqib

只需在您的收藏夹编辑器中添加这一行,您就可以终生完成

git remote set-url origin https://user-token-of-particular-user@github.com/profile-name/repo-name

S
Sahil Chhabra

与其他答案不同,您需要按照几个步骤从同一台机器上使用两个不同的 github 帐户,对我来说,它分两步工作。

你只需要:

1) 为您在 ~/.ssh 位置下具有不同名称的每个帐户生成 SSH 公钥和私钥对,并且

2) 将生成的 public 密钥添加到 Settings >> 下的相应帐户中SSH and GPG keys>> New SSH Key

要生成 SSH 公钥和私钥对,请使用以下命令:

cd ~/.ssh
ssh-keygen -t rsa -C "email@work.com" -f "id_rsa_WORK"
ssh-keygen -t rsa -C "email@gmail.com" -f "id_rsa_PERSONAL"

作为上述命令的结果,将为您的 work 帐户(例如 - git.work.com)创建 id_rsa_WORKid_rsa_WORK.pub 文件,并且将为您创建 id_rsa_PERSONALid_rsa_PERSONAL.pub您的个人帐户(例如 - github.com)。

创建后,从每个公共 (*.pub) 文件中复制内容并为每个帐户执行第 2 步。

PS :如果您的两个帐户的主机名不同,则无需像其他答案中提到的那样在 ~/.ssh/config 文件下为每个 git 帐户创建主机条目。


您如何在本地 PC 上的两个帐户之间切换?
无需切换。每当您在本地克隆存储库时,帐户信息将由 git 保存在本地存储库中。因此,每当您在该本地存储库中执行 git push 或 pull 时,上述配置都会检测到要考虑的帐户。
A
Almenon

如果您碰巧安装了 WSL,您可以拥有两个单独的 git 帐户 - 一个在 WSL 上,一个在 Windows 上。


Y
Yordan Georgiev

您应该也不能使用一些通用凭据推送到项目。在新机器上启动后,使用以下步骤设置和正确使用您的 gitlab 凭据:

在机器上创建公共/私有 ssh 密钥

将公钥复制粘贴到 gitlab/github ui 界面(通过 cmd 行提示如何操作的任何人都可以获得免费啤酒......)

确保通过 git 而不是 http url 克隆 repo

设置 git 别名以避免在 git 命令中不断输入相同的前缀

在 git commit 期间始终使用作者和电子邮件标志

像往常一样使用 git 你会这样做

这一切如下:

 # create the public / private key credentials on that specific machine
 ssh-keygen -t rsa -b 4096 -C "<<you>>@org.net" -f ~/.ssh/id_rsa.<<you>>.`hostname -s`

 # setup your public key in the gitlab ui 
 cat ~/.ssh/id_rsa.<<you>>.`hostname -s`

 # make sure you clone the repo via the git and not http url
 git clone git@git.in.org.net:org/some-repo.git

 # set the git alias to avoid constant typing of the repeating prefix to the git cmd
 alias git='GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.<<you>>.`hostname -s`" git'

 # during git commit ALWAYS use the author and e-mail flags
 git add --all ; git commit -nm "$git_msg" --author "YourFirstName YourLastName <you@phz.fi>"

 # use git as normal
 git fetch --all; git pull --all 

d
daemonThread

导航到要将更改推送到其他 GitHub 帐户的目录。在终端/命令行中创建一个新的 SSH 密钥。 ssh-keygen -t rsa -C “your-email-address” 然后将显示以下内容: 生成公钥/私钥 rsa 密钥对。输入保存密钥的文件 (/home/your_username/.ssh/id_rsa):

复制并粘贴路径,后跟文件的可识别名称:

/home/your_username/.ssh/id_rsa_personal

4)然后它会要求您提供以下信息:

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

5) 您现在可以输入以下命令来查看您在本地计算机上拥有的所有 SSH 密钥:

ls -al ~/.ssh

您应该能够看到新的 SSH 密钥文件。正如您在我的文章中看到的那样,我同时拥有 id_rsa_test 和 id_rsa_personal.pub。

drwx------  2 gmadmin gmadmin 4096 Nov 16 22:20 .
drwxr-xr-x 42 gmadmin gmadmin 4096 Nov 16 21:03 ..
-rw-------  1 gmadmin gmadmin 1766 Nov 16 22:20 id_rsa_personal
-rw-r--r--  1 gmadmin gmadmin  414 Nov 16 22:20 id_rsa_personal.pub
-rw-r--r--  1 gmadmin gmadmin  444 Nov  6 11:32 known_hosts

6) 接下来,您需要复制存储在 id_rsa_personal.pub 文件中的 SSH 密钥。您可以在您选择的文本编辑器中打开它。我目前正在使用 atom,所以我使用以下命令打开了文件:

atom ~/.ssh/id_rsa_personal.pub

然后你会得到类似这样的东西:

ssh-rsa AAB3HKJLKC1yc2EAAAADAQABAAABAQCgU5+ELtwsKkmcoeF3hNd7d6CjW+dWut83R/Dc01E/YzLc5ZFri18doOwuQoeTPpmIRVDGuQQsZshjDrTkFy8rwKWMlXl7va5olnGICcpg4qydEtsW+MELDmaywH1

7) 复制并导航到您的 GitHub 帐户 → 设置 → SSH 和 GPG 密钥 8) 单击新建 SSH 密钥。复制密钥,给它一个标题并添加它。 9) 从终端添加密钥

ssh-add ~/.ssh/id_rsa_personal
Enter passphrase for /home/your_username/.ssh/id_rsa_personal: 

10) 配置用户和密码。

git config --global user.name "gitusername"
git config --global user.email "gitemail"

11)我们现在准备好提交和推送。

git init
git add .
git commit 
git push