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

试图从我的电脑上工作我的实际“工作”回购,以及我个人对git集线器的回购。

工作账号首先build立,一切都完美无瑕。

然而,我的个人帐户似乎无法推到我个人的回购,这是在不同的帐户/电子邮件下build立的。

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

我怎样才能从他们各自的github凭证上推送/从这两个账户中取出?

您只需使用多个SSH密钥对来configuration您的SSH设置即可。

另外,如果您使用不同的angular色来处理多个存储库,则需要确保您的单个存储库具有相应的用户设置:

设置用户名,电子邮件和GitHub令牌 – 覆盖个人回购设置https://help.github.com/articles/setting-your-email-in-git/

希望这可以帮助。

编辑:更新的链接

使用HTTPS:

将远程url更改为https:

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

你很好走:

 git push 

为了确保提交显示为USERNAME所执行,可以为此项目设置user.name和user.email :

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

通过在〜/ .ssh / config中为github.com创build不同的主机别名,并为每个主机别名分配自己的ssh密钥,可以轻松地使用多个github帐户而不会混淆。 这是因为github.com并不是由用户来区分的,而用户通常只是git,而是通过您用来连接的ssh密钥。 只需使用您自己的主机别名来configuration您的远程来源。“

以上总结是在下面的博客文章的评论礼貌。

我发现这个解释是最清楚的。 至less在2012年4月份,这对我很有用。

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

通过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 

正在成形

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

但是,在我们开始使用第二个身份来推送/回收回购之前,我们必须让您变得有条不紊 – 假设您的系统使用典型的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 

接下来,让我们生成一个新的密钥对 – 在这里我将命名新的密钥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文件来定义我们的关键configuration。 我们将用正确的所有者读/写权限来创build它

 $ (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密钥。 如果您不想在另一个帐户上使用一个帐户,我将向您介绍如何更新系统上的现有回购以使用更新后的sshconfiguration。


将你的新SSH密钥添加到github

转到github.com/settings/keys添加您的新公钥

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

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

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


做东西:克隆回购

那么这是怎么一起来使用git和github呢? 那么因为你不能没有鸡蛋和鸡蛋,我们会考虑克隆一个现有的回购。 这种情况可能适用于你,如果你有一个新的github帐户为你的工作场所,你被添加到公司项目。

让我们说github.com/someorg/somerepo已经存在,你已经被添加到它 – 克隆是一样简单

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

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


把东西做完:创build一个新的回购

那么因为你不能没有鸡和鸡蛋,我们会考虑在你的二级账户上发布一个新的回购。 这种情况适用于使用其次要github帐户创build内容的用户。

假设您已经在本地做了一些工作,现在您已经准备好推送到github了。 如果你愿意的话,你可以跟着我

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

现在configuration这个回购使用你的身份

 $ 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并创build您的新回购 – 将其命名somerepo

现在,为了configuration您的repo使用正确的身份/凭证“交谈”给github,我们添加了一个remote。 假设你的新帐户的github用户名是someuser

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

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

最后,推回购

 $ git push origin master 

更新现有的回购以使用新的SSHconfiguration

假设你已经有一些repo被克隆了,但是现在你想要使用一个新的SSHconfiguration。 在上面的示例中,我们通过将您以前的id_rsa / id_rsa.pub密钥对分配给您的SSHconfiguration文件中的Host github.com来保留现有的回购。 这没什么错,但是我现在至less有5个githubconfiguration,我不喜欢把其中一个configuration为“默认”configuration – 我宁愿对每个configuration都明确表示。

之前我们有这个

 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远程github.com都不能再使用这个标识文件了。 但别担心,这是一个简单的修复。

要更新任何现有的repo以使用新的SSHconfiguration,只需打开repo的gitconfiguration文件并更新url!

 $ cd existingrepo $ nano .git/config 

更新远程原点字段( 粗体更改)

 [remote "origin"] url = github.com-mainuser:someuser/existingrepo.git fetch = +refs/heads/*:refs/remotes/origin/* 

而已。 现在你可以push / pull你的内心


SSH密钥文件权限

如果你的公钥无法正常工作,你的公共密钥会遇到麻烦,SSH对~/.ssh目录和相应的密钥文件所允许的文件权限是相当严格的

作为一个经验法则,任何目录应该是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 

我如何pipe理我的SSH密钥

我为每个连接的主机pipe理单独的SSH密钥,这样,如果任何一个密钥都受到损害,我不必每隔一个地点更新密钥。 这就像当你从Adobe收到通知,他们的用户信息有一亿五千万被窃取了 – 现在你必须取消该信用卡,并更新每一个依赖于它的服务 – 这是多么令人讨厌。

以下是我的~/.ssh目录:我为每个用户在每个连接到的域的文件夹中都有一个.pem键。 我使用.pem键,所以我只需要每个键一个文件。

 $ tree ~/.ssh /Users/naomik/.ssh ├── config ├── github.com │  ├── naomik.pem │  ├── someusername.pem ├── known_hosts ├── naomi.makes.software │  ├── naomi.pem ├── somedomain.com │  ├── someuser.pem └── someotherdomain.org  └── someuser.pem 

这里是我的相应的/.ssh/config文件 – 显然github的东西是相关的回答有关github的这个问题,但这个答案旨在使您掌握知识pipe理您的ssh身份在任何数量的服务/机器。

 Host github.com-naomik HostName github.com User git IdentityFile ~/.ssh/github.com/naomik.pem Host github.com-someuser HostName github.com User git IdentityFile ~/.ssh/github.com/someusername.pem Host naomi.makes.software User naomi IdentityFile ~/.ssh/naomi.makes.software/naomi.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/someuser.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格式

所以你想驯服你的关键文件,并减less一些文件系统cruft? 将密钥对转换为单个 PEM很容易

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

或者,按照上面的例子,我们重命名为id_rsa -> github-mainuserid_rsa.pub -> github-mainuser.pub – so

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

现在为了确保我们已经把这个正确的转换了,你需要validation生成的公钥是否与旧的公钥相匹配

 # 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文件是必要的; 只要你需要的时候生成公钥就可以了^ _ ^


从头开始创buildPEM密钥

您不需要创build私钥/公钥对, 然后转换为单个PEM密钥。 您可以直接创buildPEM密钥。

我们来创build一个newuser.pem

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

获取SSH公钥是相同的

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

我使用shell脚本将我切换到任何我想要“活跃”的帐户。 本质上,你从一个新的开始,让一个帐户configuration正确,工作,然后将这些文件移动到一个正确的前缀名称。 从此,您可以使用命令“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中创build了一个运行脚本(对于你的Mac用户),所以除非我有适当的设置(因为它使用git),否则不会构build我的项目:

运行放置在Dependencies之后的脚本(使用/ bin / ksh作为shell):

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

编辑:添加testing新文件的存在和复制旧文件到/ tmp来解决评论由@naomik下面。

感谢user1107028:

使用HTTPS:

将远程url更改为https:

git远程设置url来源https://USERNAME@github.com/USERNAME/PROJECTNAME.git你很好去:

混帐推

我发现这是使用多个github帐户的最佳方式。 我不能只使用一个帐户,这是不可能的,而且无论如何,我都不能使用SSH来performance。 身份证已经投了答案,但我没有足够的分数 – 我想承认这个简单的解决scheme,像我这样的人需要一个干净简单的解决scheme。 它第一次工作,节省了我更多的时间挣扎。

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

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

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

还要确保提交具有正确的电子邮件地址与他们相关联,我确保〜/ .gitconfig文件有正确的电子邮件地址。

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

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

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

这个答案适用于初学者(none-git gurus)。 我最近有这个问题,也许只是我,但大部分的答案似乎需要相当先进的理解git。 在阅读了包括这个线程在内的几个堆栈溢出的答案后,下面是为了在GitHub帐户之间轻松切换(假设您有两个GitHub帐户, github.com/personalgitHub.com/work )需要执行的步骤:

  1. 检查现有的ssh密钥:打开terminal并运行此命令查看/列出现有的ssh密钥ls -al ~/.ssh
    扩展名为.pub文件是你的ssh密钥,所以你应该有两个personalwork账户。 如果只有一个或者没有,那么产生其他明智的时间就跳过这个。

    生成SSH密钥 :login到github(个人或工作acc),导航到设置,并复制相关的电子邮件。
    现在回到terminal并运行ssh-keygen -t rsa -C "the copied email" ,你会看到:

    生成公钥/私钥rsa密钥对。
    input保存密钥的文件(/…/.ssh/id_rsa):

    id_rsa是即将生成的ssh密钥的默认名称,因此请复制path并重命名默认值,例如/.../.ssh/id_rsa_work .ssh/ /.../.ssh/id_rsa_work如果为工作帐户生成)。 提供密码或只是input忽略,你会看到像钥匙的randomart图像是:和图像。 完成。
    重复这个步骤再次为您的第二个github帐户。 确保使用正确的电子邮件地址和不同的ssh密钥名称(例如id_rsa_personal)以避免覆盖。
    在这个阶段,当再次运行ls -al ~/.ssh时,你应该看到两个ssh密钥。

  2. 将ssh密钥与gitHub帐户相关联:下一步是复制其中一个ssh密钥,运行这个密钥,但是replace你自己的ssh密钥名称: pbcopy < ~/.ssh/id_rsa_work.pub ,用你的名字replaceid_rsa_work.pub
    现在我们的ssh密钥被复制到剪贴板,回到github账户[如果您复制的ssh密钥是id_rsa_work ,请确保您已经login到工作账户]并导航到
    设置 – SSH和GPG密钥 ,然后单击新buildSSH密钥button(不是新的GPG密钥 btw:D)
    给这个键一些标题,粘贴键,然后点击添加SSH密钥。 你现在已经成功地添加了ssh密钥,或者注意到它一直在那里(或者因为你select了新的GPG密钥而不是新的SSH密钥 :D,你得到了一个错误)。
  3. 将ssh密钥与gitHub帐户相关联 :为您的第二个帐户重复上述步骤。
  4. 编辑全局gitconfiguration:最后一步是确保全局configuration文件知道所有github帐户(可以这么说)。
    运行git config --global --edit – 编辑这个全局文件,如果这打开vim,你不知道如何使用它,按i进入插入模式,编辑文件如下,然后按esc,然后按:wq退出插入模式:

    [inside this square brackets give a name to the followed acc.] name = github_username email = github_emailaddress [any other name] name = github_username email = github_email [credential] helper = osxkeychain useHttpPath = true

完成!现在当试图从回购推或拉,你会被问到哪个GitHub帐户应该与这个回购链接和它只问一次,本地configuration将记住这个链接,而不是全局configuration,所以你可以工作在与不同帐户链接的不同回购协议上,而不必每次都编辑全局configuration。