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

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

首先设置了工作帐户,一切都完美地工作。

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

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

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

410442 次浏览

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

第一个链接的相关步骤:

  1. 生成一个SSH-key:

    ssh-keygen -t ed25519 -C "john@doe.example.com"
    

    按照提示并决定一个名称,例如id_ed25519_example_company

  2. 将SSH公钥从~/.ssh/id_ed25519_doe_company.pub复制到GitHub并告诉ssh密钥:

    ssh-add ~/.ssh/id_ed25519_doe_company
    
  3. ~/.ssh中创建一个config文件,内容如下:

    Host github-doe-company
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_doe_company
    
  4. 添加您的遥控器:

    git remote add origin git@github-doe-company:username/repo.git
    

    或更改使用:

    git remote set-url origin git@github-doe-company:username/repo.git
    

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

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

希望这有帮助。

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

[user]
name = Default Name
email = defaultemail@example.com


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

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

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

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

我使用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的评论。

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

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

我发现这个宝石是非常有用的:SSHWICH

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

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

此外,为了确保提交具有与它们关联的正确电子邮件地址,我确保~/. gitconfig文件具有正确的电子邮件地址。

使用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密钥外,您还可以考虑使用相同的帐户电子邮件在每个项目上添加合作者并永久存储密码。

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

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

进入状态

要在一个单独的github/bit的帐户下管理一个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

接下来,让我们生成新的密钥对-在这里我将命名新密钥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文件来定义我们的密钥配置。我们将使用正确的所有者只读/只写权限创建它

$ (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身份关联的现有repos。因此,Host的“默认”github.com设置为使用你的mainuser密钥。如果你不想偏爱一个帐户,我将向你展示如何在系统上更新现有 repos以使用更新的ssh配置。


将您的新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

That bolded portion must match the Host name we setup in your ~/.ssh/config file. That correctly connects git to the corresponding IdentityFile and properly authenticates you with github


Getting stuff done: creating a new repo

Well because you can't have a chicken without and egg, we'll look at publishing a new repo on your secondary account. This situation applies to users that are create new content using their secondary github account.

Let's assume you've already done a little work locally and you're now ready to push to github. You can follow along with me if you'd like

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

现在将此存储库配置为使用您的身份

$ 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日志

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

好的,是时候推送到github了!由于github还不知道我们的新仓库,首先转到github.com/new并创建你的新仓库-命名为某个存储库

现在,要将您的存储库配置为使用正确的身份/凭据与github“交谈”,我们添加了一个遥控器。假设您的新帐户的github用户名为someuser

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

That bolded portion is absolutely critical and it must match the Host that we defined in your ~/.ssh/config file

Lastly, push the repo

$ git push origin master

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

假设你已经克隆了一些仓库,但现在你想使用一个新的SSH配置。在上面的例子中,我们通过在SSH配置文件中将以前的id_rsa/id_rsa.pub密钥对分配给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目录和相应的密钥文件上允许的文件权限非常严格

根据经验,任何目录都应该是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公钥时,运行此命令将公钥输出到stdout-在需要的地方复制/粘贴

$ 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==

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

  1. 检查现有的ssh密钥:打开终端并运行此命令以查看/列出现有的ssh密钥ls -al ~/.ssh
    扩展名为.pub的ssh密钥文件,因此您应该有两个personalwork帐户。如果只有一个或没有,是时候生成其他明智的跳过此。

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

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


    id_rsa是即将生成的ssh密钥的默认名称,因此复制路径并重命名默认名称,例如/.../.ssh/id_rsa_work如果为工作帐户生成。提供密码或直接输入以忽略,您将阅读类似钥匙的随机艺术图像是:和图像。完成。
    为您的第二个github帐户再次重复此步骤。确保您使用正确的电子邮件地址和不同的ssh密钥名称(例如id_rsa_personal)以避免覆盖。
    在这个阶段,再次运行ls -al ~/.ssh时您应该会看到两个ssh密钥。
  2. 将ssh密钥与gitHub帐户关联:下一步是复制其中一个ssh密钥,运行此操作,但替换您自己的ssh密钥名称:pbcopy < ~/.ssh/id_rsa_work.pub,将id_rsa_work.pub替换为您所谓的您的。
    现在我们的ssh密钥被复制到剪贴板,回到github帐户[如果您复制的ssh密钥是id_rsa_work,请确保您已登录到工作帐户]并导航到
    设置-SSH和GPG密钥并单击新的SSH键按钮(不是新的GPG密钥 btw: D)
    为该密钥提供一些标题,粘贴密钥并单击添加SSH密钥。您现在已经成功添加了ssh密钥,或者注意到它一直在那里,这很好(或者您遇到了一个错误,因为您选择了新的GPG密钥而不是新的SSH键: D)。
  3. 将ssh密钥与gitHub帐户关联:为您的第二个帐户重复上述步骤。
  4. 编辑全局git配置:最后一步是确保全局配置文件知道所有github帐户(可以这么说)。
    运行git config --global --edit编辑此全局文件,如果这打开vim并且您不知道如何使用它,请按i进入插入模式,编辑文件如下,然后按esc然后按:wq退出插入模式:

    [在此方括号内为后面的acc命名。] name=github_username 电子邮件=github_emailaddress [任何其他名称] name=github_username 电子邮件=github_email [证书] helper=osxkeychain useHttpPath=true

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

  • 转到~/. ssh
  • 创建一个名为config的文件(没有扩展名)
  • 打开配置文件并添加以下代码。(根据您的帐户更改)

    1. 账户1

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

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

      # Account_3
      Host github.com-Account3
      HostName github.com
      User git
      PreferredAuthentications publickey
      IdentityFile ~/.ssh/id_rsa_Account_3
      
  • Add remote url as follows

    1. Account 1

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

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

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

Make sure that IdentityFile names are same as you created during ssh key generation.

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

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

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

现在删除通用凭据标题下的git: https//github.com节点

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

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

引用图片

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

如果您决定不需要维护多个帐户,请按照以下链接进行合并。

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

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

你只需要:

1)为~/.ssh位置下的每个帐户生成不同名称的SSH公钥和私钥对

2)将生成的公共密钥添加到#EYZ0>>#EYZ1>>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"

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

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

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

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

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

最简单直接的方法(IMHO)-没有配置文件不会太麻烦

只需创建另一个ssh密钥。

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

ssh-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>

刚刚为Windows解决了这个问题,为每个存储库使用凭据:

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

IntelliJ Idea内置了对该功能的支持 https://www.jetbrains.com/help/idea/github.html#da8d32ae

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

  • 在机器上创建公共/私有ssh密钥
  • 将公钥复制粘贴到gitlab/github用户界面(任何通过cmd行暗示如何做的人都可以获得免费啤酒…)
  • 确保通过git而不是超文本传输协议url克隆存储库
  • 设置git别名以避免在git命令中不断输入相同的前缀
  • 在git提交期间始终使用作者和电子邮件标志
  • 像正常一样使用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

如果您不想弄乱这里提到的~/.ssh/config文件,您可以在要从不同帐户提交的存储库中运行git config core.sshCommand "ssh -i ~/.ssh/custom_id_rsa"

其余的设置是相同的:

  1. 使用ssh-keygen -t rsa -f ~/.ssh -f ~/.ssh/custom_id_rsa为第二个帐户创建一个新的SSH密钥

  2. 使用您的其他帐户登录GitHub,转到https://github.com/settings/keys,然后粘贴~/.ssh/custom_id_rsa.pub的内容

  3. 确保使用SSH而不是HTTPS作为远程URL:git remote set-url origin git@github.com:upstream_project_teamname/upstream_project.git

  1. 导航到要将更改推送到不同GitHub帐户的目录。
  2. 在终端/命令行中创建一个新的SSH键。

    ssh-keygen-t rsa-C“你的电子邮件地址”

  3. 然后将显示以下内容:

    生成公共/私有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+MELDmayW1HHsi2xHMMGHlNv

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

如果您已经创建或克隆了另一个存储库,并且无法从originupstream提取,则可以使用以下命令在该目录中添加ssh密钥。

这是我在这里得到的错误:

Warning: Permanently added the RSA host key for IP address '61:fd9b::8c52:7203' to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.


Please make sure you have the correct access rights
and the repository exists.

我使用了以下命令,这是有效的:

ssh-add ~/.ssh/id_rsa_YOUR_COMPANY_NAME

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

如果你不想修改你的主机文件,使用SSH键,或者为每个存储库设置一个.gitconfig,那么你可以使用一个个人的.gitconfig,你基本上是从根级别配置中包含的

# 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位于您要覆盖的设置之后,那里的任何设置都将覆盖根配置。

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

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

git push
# prompts for password

当出现提示时,请输入您的个人密码,或者更好的是,输入您在账号开发者设置中创建的个人访问令牌。输入该令牌作为您的密码。

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

OSX keychain 2 entires for Github

选项0:你不想弄乱操作系统设置…你只是想为一个存储库提交一个不同的公钥的不同github帐户。

解决方案

  1. 创建新密钥:ssh-keygen-t rsa-b 4096-f~/. ssh/alt_rsa

  2. 将密钥添加到密钥集:ssh-add-K~/. ssh/alt_rsa

  3. 将pub密钥复制并添加到github帐户:(请参阅github说明)

  4. 使用github测试密钥:ssh-i~/. ssh/alt_rsaTgit@github.com

  5. 使用git协议(不是HTTP)克隆仓库:git clonegit@github: my账户…

  6. 在克隆的仓库中:

    git configcore.ssh命令"ssh-i~/. ssh/alt_rsa-F /dev/null"
    git configuser.name
    git configuser.email[我的帐户电子邮件]

  7. 现在您应该能够正确地使用git推送,而不会干扰您的日常git帐户

使用SSH密钥对使我的私人存储库工作。这在Windows的git上进行了测试。

图片来源: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.生成公钥和私钥对

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

将SSH密钥添加到GitHub帐户

  1. 将公钥复制到剪贴板:clip < ~/.ssh/id_ed25519.pub
  2. 在GitHub上,转到个人资料->设置->SSH密钥->SSH密钥
  3. 给出一个标题。例如“MacBook Pro上的Windows”
  4. 粘贴键并点击“添加SSH键”。

C.测试SSH连接

  1. 输入:ssh -T git@github.com
  2. 对于任何警告消息,点击“是”。
  3. 它应该显示:“嗨,用户名!…”表示测试成功。

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

  1. 更改电子邮件和用户名:
git config user.email your_email@example.com
git config user.name github_username
  1. 更新远程链接以使用git。首先列出远程URI:
git remote -v
git remote set-url origin git@github.com:github_username/your-repo-name.git

E.测试

git remote show origin

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

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

git config --global -e

它打开你的编辑器,你可能会看到这样的东西:

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

这很棒,因为您可以将代码推送到GitHub帐户,而无需每次输入凭据。 但是如果它需要从另一个帐户推送到仓库怎么办?在这种情况下,git将以403错误拒绝,你必须更改你的全局git凭据。为了让这个舒适的lat set在凭据管理器中存储仓库名称:

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

再次检查打开配置 git配置--全局-e 您将看到新的配置行

[credential]
useHttpPath = true
...

就是它。现在,当您第一次推送到任何帐户时,您将看到一个弹出窗口 Screenshot_1

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

关于更多的解释,你可以看到我在youtube上找到的这个很酷的视频: https://youtu.be/2MGGJtTH0bQ

将github中的身份验证方法从SSh更改为HTTP。这样,它就不会关心您是否使用您的工作github帐户登录,并且您尝试与您的个人github帐户(其凭据与您当前登录到本地机器的凭据不同)进行远程交互。

可能有多种方法可以做到这一点,但以下解决方案对我来说很简单。 我不想用SSH来做,我的步骤和解决方案基于HTTPS

  1. 在本地机器上创建项目DIR。示例d:\test_git_multiple_account

  2. 转到文件夹“test_git_multiple_account”

  3. 在DIR中添加一些文件

  4. 在此处打开Git bash并运行以下命令

    a. git init // initialization
    b. git add , // add
    c. git commit -m "initial commit"
    you will get following output : in my case i use to add one python file created
    from code.
    **[master (root-commit) d4defd9] initial commit
    2 files changed, 4 insertions(+)
    create mode 100644 .vscode/settings.json
    create mode 100644 Hello.py**
    
    
    d.  git remote add origin <HTTPS repo link>
    e.  git remote -v // check the repo version
    f.  git push origin master
    it will ask your git hub user name and password via popup screen.
    you will get the following output
    Counting objects: 100% (5/5), done.
    Delta compression using up to 4 threads
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (5/5), 411 bytes | 31.00 KiB/s, done.
    Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
    remote:
    remote: Create a pull request for 'master' on GitHub by visiting:
    remote:      https://github.com/vishvadeepaktripathi/Hello_Py/pull/new/master
    remote:
    To https://github.com/vishvadeepaktripathi/Hello_Py.git
    * [new branch]      master -> master
    

这将创建一个名为master的新分支。 你可以提交到主分支,一旦你改变了分支,在这种情况下,你现有的文件将被删除。所以我建议签出到主分支进入第一步,然后继续执行每个命令,以防你想直接签出到主分支。 注意在第一次登录时,它可能会给你一条错误消息,并再次询问登录名和密码,然后它会将你的更改发布到Git hub中。

完成后,您将收到消息到您的github帐户中的新拉取请求。 您可以将更改从主分支合并到主分支。

我在这里创建了主分支,您根据自己的选择命名您的分支。 同时附上屏幕截图。 在此输入图片描述

在我的情况下,我在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的人有所帮助。

相反,您只需将新的电子邮件ID添加到您的个人git帐户。这样您就不需要添加另一个SSH密钥。只需通过以下操作配置您的新电子邮件 git config--globaluser.emailnewemail。然后您将能够克隆该存储库。

我在这里看到了很多可能的解决方法。作为快速解决方案,@Greg的解决方案似乎相对容易。然而,从长远来看,最好为所有不同的账户设置单独的ssh keys。这篇视频简要演示了它。这是视频博客中提到的步骤。

步骤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添加新标识。如果成功,您将看到Identity Added的响应。

第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步-尝试一下 现在,每次您想使用新帐户和关联的存储库时,请为相应的存储库键入此

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

不处理SSH密钥对的简单方法

只需将user.nameuser.email本地更改为您要推送到该存储库的那些。

示例:我在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"

希望这有帮助。如果它对你有用,请投票!:)

使用docker!

这可能不适合每个人,但这是我最终为自己做的。

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

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

有很多答案解释了如何完成你所要求的,但我想提供一个不同的视角。

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

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

  • 防止您的工作文件与您的个人文件混合在一起
  • 减少在错误资源上执行操作的风险
  • 可能将安全漏洞限制在一组帐户/凭据上

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

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