首页 文章

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

提问于
浏览
321

试着从我的计算机上处理我的实际“工作”回购,以及我在git hub上的个人回购 .

工作帐户首先设置,一切都完美无瑕 .

然而,我的个人帐户似乎无法推送到我的个人仓库,这是根据不同的帐户/电子邮件设置的 .

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

如何从他们各自的github凭据中推送/拉出两个帐户?

17 回答

  • 204

    您不必为个人和工作维护两个不同的帐户 . 实际上,Github建议您维护一个帐户并帮助您合并两者 .

    如果您认为无需维护多个帐户,请按照以下链接进行合并 .

    https://help.github.com/articles/merging-multiple-user-accounts/

  • 2

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

    对于Windows用户,可以为不同的项目使用多个或不同的git帐户 .

    以下步骤:转到“控制面板”并搜索“凭据管理器” . 然后转到Credential Manager - > Windows Credentials

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

    这将删除当前凭据 . 现在你可以通过git pull it添加任何项目会要求输入用户名和密码 .

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

    谢谢

    refer to image

  • 0

    我发现这个宝石非常有用:sshwitch

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

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

    另外为了确保提交具有与之关联的正确电子邮件地址,我确保〜/ .gitconfig文件具有正确的电子邮件地址 .

  • 108

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

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

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

    希望这可以帮助 .

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

    [user]
        name = Pavan Kataria
        email = defaultemail@gmail.com
    
    [includeIf "gitdir:~/work/"]
        path = ~/work/.gitconfig
    

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

    [user]
        email = pavan.kataria@company.tld
    

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

  • 19

    使用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
    
  • 0

    Getting into shape

    要在单独的github / bitbucket /任何帐户下管理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
    

    接下来,让我们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身份相关联的现有回购 . 出于这个原因,"default" github.com Host 设置为使用您的 mainuser 键 . 如果您没有't want to favour one account over another, I'将向您展示如何更新系统上的现有存储库以使用更新的ssh配置 .


    Add your new SSH key to github

    转到github.com/settings/keys添加新的 public

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

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

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


    Getting stuff done: cloning a repo

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

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

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

    bolded 部分必须与我们在 ~/.ssh/config 文件中设置的 Host 名称相匹配 . 这正确地将git连接到相应的 IdentityFile 并使用github正确地验证你


    Getting stuff done: creating a new repo

    好吧,因为你可以在你的二级账户上发布一个新的回购 . 这种情况适用于使用其辅助github帐户创建新内容的用户 .

    让我们假设你已经在本地完成了一些工作,现在你已经准备好推向github了 . 如果你愿意,你可以跟随我

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

    现在配置此repo以使用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

    现在,使用正确的将配置文件配置为"talk"到github身份/凭证,我们添加了一个遥控器 . 假设您的新帐户的github用户名是 someuser ...

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

    bolded 部分绝对是关键的,它必须与我们在 ~/.ssh/config 文件中定义的 Host 匹配

    最后,推动回购

    $ git push origin master
    

    Update an existing repo to use a new SSH configuration

    假设您已经克隆了一些repo,但现在您想要使用新的SSH配置 . 在上面的示例中,我们通过在SSH配置文件中将之前的 id_rsa / id_rsa.pub 密钥对分配给 Host github.com 来保持现有的回购 . 有人认为他们中的一个是"default"配置 - 我宁愿明确每一个 .

    在我们这之前

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

    所以我们现在将其更新为此( bold 中的更改)

    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 遥控器的现有仓库将不再使用此身份文件 . 但是,请简单解决这个问题 .

    要更新任何现有的repo以使用新的SSH配置,只需打开repo的git配置文件并更新url!

    $ cd existingrepo
    $ nano .git/config
    

    更新远程原点字段( bold 中的更改)

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

    而已 . 现在你可以 push / pull 到你心中的内容


    SSH key file permissions

    如果您的公钥无法正常运行时遇到问题,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
    

    How I manage my SSH keys

    我为每个连接的主机管理单独的SSH密钥,这样如果任何一个密钥被破坏,我就不必在我使用该密钥的每个其他地方更新密钥 . 这就像当你从Adobe获得有关其用户信息的1.5亿被盗的通知时 - 现在你必须取消该信用卡并更新依赖它的每项服务 - 这是多么令人讨厌 .

    这是我的 ~/.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的这个问题有关,但这个答案旨在让你掌握在任意数量的服务/机器上管理你的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
    

    Getting your SSH public key from a PEM key

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

    所以当github请求你的ssh公钥时,运行这个命令将公钥输出到stdout - 在需要的地方复制/粘贴

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

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


    Converting your id_rsa/id_rsa.pub key pairs to PEM format

    所以你想驯服你的关键文件并减少一些文件系统的残缺?将密钥对转换为单个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文件;只需在需要时生成公钥^ _ ^


    Creating PEM keys from scratch

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

    让我们创建一个 newuser.pem

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

    获取SSH公钥是一样的

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

    通过在〜/ .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/

  • 11

    由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
    
  • 23

    我用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):

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

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

    编辑:添加新文件存在的测试和复制旧文件到/ tmp以通过@naomik下面的注释 .

  • 2
    • 转到〜/ .ssh

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

    • 打开配置文件并添加以下代码 . (根据您的帐户更改)

    • 帐户1

    # account_1
    Host gitlab.com-account_1
    HostName gitlab.com
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_account_1
    
    • 帐户2
    # Account2
    Host gitlab.com-Account2
    HostName gitlab.com
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_Account2
    
    • 帐户3
    # Account_3
    Host github.com-Account3
    HostName github.com
    User 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
    

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

  • 8

    这个答案适用于 beginners (none-git gurus) . 我最近有这个问题,也许它只是我,但大多数答案似乎需要相当提前了解git . 在阅读了几个堆栈溢出答案(包括此线程)后,以下是我需要采取的步骤,以便在GitHub帐户之间轻松切换(例如假设两个GitHub帐户,github.com / personal和gitHub.com/work):

    • Check for existing ssh keys: 打开终端并运行此命令以查看/列出现有的ssh密钥 ls -al ~/.ssh
      扩展名为 .pub 的文件是您的ssh密钥,因此您应该为 personalwork 帐户分配两个 . 如果只有一个或没有,那么生成其他明智的时间就跳过这个 .

    • 生成ssh密钥:登录github(个人或工作人员),导航到设置并复制相关的电子邮件 .
      现在回到终端并运行 ssh-keygen -t rsa -C "the copied email" ,你会看到:

    生成公钥/私钥rsa密钥对 .
    输入要保存密钥的文件(/.../.ssh/id_rsa):

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

    • Associate ssh key with gitHub account: 下一步是复制其中一个ssh密钥,运行此命令但替换自己的ssh密钥名称: pbcopy < ~/.ssh/id_rsa_work.pub ,将 id_rsa_work.pub 替换为您所谓的ssh密钥 .
      现在我们的ssh密钥被复制到剪贴板,返回到github帐户[如果您复制的ssh密钥是 id_rsa_work ,请确保您已登录到工作帐户]并导航到
      设置 - SSH和GPG密钥,然后单击新SSH密钥按钮(不是新的GPG密钥顺便提一下:D)
      为此密钥提供一些 Headers ,粘贴密钥并单击“添加SSH密钥” . 你现在已经成功添加了ssh密钥或者注意到它一直都在那里很好(或者你得到一个错误,因为你选择了新的GPG密钥而不是新的SSH密钥:D) .

    • Associate ssh key with gitHub account :为您的第二个帐户重复上述步骤 .

    • Edit the global git 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帐户应该与这个回购链接,并且只询问一次,本地配置会记住这个链接,而不是全局配置,这样你就可以工作了在不同的回购中,与不同的帐户链接,而不必每次都编辑全局配置 .

  • 0

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

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

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

  • 0

    与其他答案不同,您需要在同一台机器上使用 few steps 来使用 two different github 帐户,对我而言,它在 two steps 中有效 .

    你只需要:

    1)为 ~/.ssh 位置下的每个帐户生成 SSH public and private key pair ,其名称和位置不同

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

    要生成 SSH public and private key pairs ,请使用以下命令:

    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 帐户(ex-git.work.com)创建 id_rsa_WORKid_rsa_WORK.pub 文件,并为您的 personal 帐户(ex-github.com)创建 id_rsa_PERSONALid_rsa_PERSONAL.pub .

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

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

  • 8

    另一种更简单的方法是使用多个桌面应用程序,比如我在做什么,在Github桌面上使用帐户A,同时在Github Kraken上使用帐户B

  • 43

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

  • 0

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

    只需创建另一个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>
    
  • 3

    刚为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存储一个凭证 . 如果包含它,那么凭证管理器将存储多个凭证,这是我真正想要的 .

相关问题