在同一台计算机上有多个github帐户?
试图从我的电脑上工作我的实际“工作”回购,以及我个人对git集线器的回购。
工作账号首先build立,一切都完美无瑕。
然而,我的个人帐户似乎无法推到我个人的回购,这是在不同的帐户/电子邮件下build立的。
我已经尝试将我的工作密钥复制到我的个人帐户,但是会引发错误,因为一个密钥只能附加到一个帐户。
我怎样才能从他们各自的github凭证上推送/从这两个账户中取出?
您只需使用多个SSH密钥对来configuration您的SSH设置即可。
-
这个链接很容易遵循(谢谢埃里克): 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/
另外,如果您使用不同的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_rsa
和id_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-mainuser
和id_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-mainuser
和github-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/personal和gitHub.com/work )需要执行的步骤:
- 检查现有的ssh密钥:打开terminal并运行此命令查看/列出现有的ssh密钥
ls -al ~/.ssh
扩展名为.pub
文件是你的ssh密钥,所以你应该有两个personal
和work
账户。 如果只有一个或者没有,那么产生其他明智的时间就跳过这个。– 生成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密钥。 - 将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,你得到了一个错误)。 - 将ssh密钥与gitHub帐户相关联 :为您的第二个帐户重复上述步骤。
-
编辑全局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。