尝试从我的计算机上处理我的实际“工作”存储库和 git hub 上的存储库。
首先设置了工作帐户,并且一切正常。
但是,我的帐户似乎无法推送到我的存储库,该存储库是在不同的帐户/电子邮件下设置的。
我尝试将我的工作密钥复制到我的帐户,但这会引发错误,因为当然密钥只能附加到一个帐户。
如何从各自的 GitHub 凭据向两个帐户推入/拉出?
ssh-add ~/.ssh/id_rsa_COMPANY
<br/>告诉 ssh-agent 包含它以供使用。<hr/>上面提到的教程对我来说休息很好。
您需要做的就是使用多个 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 在评论中告知我这一点。
使用 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
user.name
和 user.email
设置为 --global
标志,只需按照他上面所说的方法在本地为该存储库设置它。这解决了很多麻烦。现在删除旧的回购......
塑形
要在单独的 github/bitbucket/whatever 帐户下管理 git repo,您只需生成一个新的 SSH 密钥。
但在我们开始使用您的第二个身份推送/拉取 repos 之前,我们必须让您熟悉 – 假设您的系统设置有典型的 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
接下来,让我们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-mainuser
和 id_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-mainuser
和 github-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 clone github.com-otheruser:someorg/somerepo.git
必须是 git clone git@github.com-otheruser:someorg/somerepo.git
(添加 git@
)。至少,这就是我所需要的。
ssh-agent
远程提供这些身份时,它没有建议做什么。因此,我需要通过现有文件或代理的 fingerprint 选择密钥。它可以实现吗?
通过在 ~/.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
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”。
git clone https://github-COMPANY/GitUserName/projectname.git
似乎不起作用。使用 github.com 的默认密钥可以正常工作。
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 调用的方式有关。
转到 ~/.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
吗?
就我而言,我在 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 的用户名和电子邮件都不同。
--global
。我认为您的主要工作 git 帐户不应该受到影响
此答案适用于初学者(非 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 帐户与此仓库链接,并且只询问一次,本地配置将记住此链接而不是全局配置,因此您可以工作在与不同帐户链接的不同存储库上,无需每次都编辑全局配置。
我使用 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 的评论。
id_rsa
和 id_rsa.pub
密钥将被删除之前运行此脚本,他们可能会被锁定在遥控器之外。
刚刚为 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 存储一个凭证。如果包含它,那么凭证管理器将存储多个凭证,这是我真正想要的。
更简单,更容易修复以避免混淆..
供 Windows 用户为不同的项目使用多个或不同的 git 帐户。
以下步骤:转到控制面板并搜索凭据管理器。然后转到凭据管理器-> Windows 凭据
现在删除 Generic Credentials Heading 下的 git:https//github.com 节点
这将删除当前凭据。现在你可以通过 git pull 添加任何项目,它会询问用户名和密码。
当您遇到其他帐户的任何问题时,请执行相同的过程。
https://i.stack.imgur.com/rhu8g.png
有很多答案可以解释如何完成您的要求,但我想提供不同的观点。
我认为将工作和个人事物分开是有道理的。在所有操作系统上的用户帐户之间切换非常简单,因此您可以为工作和娱乐创建单独的操作系统帐户,并在每个帐户中登录不同的 github 帐户。
保持清晰的关注点分离也可以...
防止您的工作文件与您的个人文件混在一起
降低对错误资源执行操作的风险
可能将安全漏洞限制在一组帐户/凭据中
如果您不想弄乱此处提到的 ~/.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
除了为多个帐户创建多个 SSH 密钥之外,您还可以考虑使用相同的帐户电子邮件在每个项目上添加协作者并永久存储密码。
#this store the password permanently
$ git config --global credential.helper wincred
我已经使用不同的电子邮件设置了多个帐户,然后将相同的用户和电子邮件作为协作者之一放在每个帐户上。通过这种方式,我可以访问所有帐户,而无需添加 SSH 密钥,或切换到另一个用户名和电子邮件进行身份验证。
让我的私人仓库使用 SSH 密钥对工作。这是在 git for Windows 上测试的。
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
我在这里看到了很多可能的解决方法。作为一种快速解决方案,@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
ssh-keygen -t ed25519 -C "email"
将密钥存储在同一位置(Windows 为 %userprofile%\.ssh
)。
我发现这个 gem 非常有用:sshwitch
https://github.com/agush22/sshwitch
http://rubygems.org/gems/sshwitch
它有助于切换 ssh 密钥。记得先备份一切!
另外,为了确保提交具有正确的电子邮件地址,我确保 ~/.gitconfig 文件具有正确的电子邮件地址。
另一种更简单的方法是使用多个桌面应用程序,就像我正在做的那样,在 Github 桌面上使用帐户 A,同时在 Github Kraken 上使用帐户 B
最简单直接的方法(恕我直言) - 没有配置文件没有太多麻烦
只需创建另一个 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>
使用个人访问令牌的个人目录 .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
选项 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 帐户
在一台 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
无需处理 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"
希望这可以帮助。如果它对您有用,请点赞! :)
使用码头工人!
这可能并不适合所有人,但这是我最终为自己做的。
我所有的开发现在都在 docker 容器中完成。我是 vim 用户,但我知道 VSCode 有插件可以与 docker 容器一起使用。
因此,由于我对不同的项目/语言有不同的 docker 容器,所以我可以在每个容器中使用不同的 git 配置。问题解决了。
只需在您的收藏夹编辑器中添加这一行,您就可以终生完成
git remote set-url origin https://user-token-of-particular-user@github.com/profile-name/repo-name
与其他答案不同,您需要按照几个步骤从同一台机器上使用两个不同的 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_WORK
和 id_rsa_WORK.pub
文件,并且将为您创建 id_rsa_PERSONAL
和 id_rsa_PERSONAL.pub
您的个人帐户(例如 - github.com)。
创建后,从每个公共 (*.pub
) 文件中复制内容并为每个帐户执行第 2 步。
PS :如果您的两个帐户的主机名不同,则无需像其他答案中提到的那样在 ~/.ssh/config
文件下为每个 git 帐户创建主机条目。
您应该也不能使用一些通用凭据推送到项目。在新机器上启动后,使用以下步骤设置和正确使用您的 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
导航到要将更改推送到其他 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
.gitconfig
中设置的电子邮件提交。解决方案是git config user.email youremail@email.com
,它为特定的 Git 存储库在本地更改它,或者您可以使用条件自动更改您的配置电子邮件,具体取决于您所在的文件夹。来源和操作方法:stackoverflow.com/a/43654115/920920