我最近遇到了一个问题,在使用git时,我无法将更改推送到一个我从第一个用户克隆下来的存储库中。
基本上是这样的:
1. 第一次使用git要求输入github凭据,以便在将更改推送到存储库时进行验证。不管如何克隆存储库(使用哪个ssh密钥、用户等),这些凭证都会被用于所有推送操作。
2. 为两个github帐户生成SSH密钥,并添加条目到ssh配置文件中以定位这些身份文件。密钥也被添加到每个github帐户中。
3. 使用ssh配置文件中原始帐户对应的Host条目克隆存储库 git clone :/.git。
4. 尝试将更改推送到存储库并成功克隆存储库,使用ssh配置文件中第二个帐户对应的Host条目 git clone <2nd Host>:<2nd username>/.git。
5. 尝试将更改推送到存储库,但收到错误消息,指出原始用户名没有权限,尽管使用的是第二个用户并且具体使用了一个ssh密钥。
6. 清除Windows凭据管理器中的git条目未能解决此问题。
7. 清除全局用户名和电子邮件地址也无法解决此问题。
最终,我通过以下方式成功推送了我的更改:
我发布这篇文章,一方面是为了帮助其他遇到同样问题的人,另一方面也是想提出几个问题:
基本上是这样的:
1. 第一次使用git要求输入github凭据,以便在将更改推送到存储库时进行验证。不管如何克隆存储库(使用哪个ssh密钥、用户等),这些凭证都会被用于所有推送操作。
2. 为两个github帐户生成SSH密钥,并添加条目到ssh配置文件中以定位这些身份文件。密钥也被添加到每个github帐户中。
3. 使用ssh配置文件中原始帐户对应的Host条目克隆存储库 git clone :/.git。
4. 尝试将更改推送到存储库并成功克隆存储库,使用ssh配置文件中第二个帐户对应的Host条目 git clone <2nd Host>:<2nd username>/.git。
5. 尝试将更改推送到存储库,但收到错误消息,指出原始用户名没有权限,尽管使用的是第二个用户并且具体使用了一个ssh密钥。
6. 清除Windows凭据管理器中的git条目未能解决此问题。
7. 清除全局用户名和电子邮件地址也无法解决此问题。
最终,我通过以下方式成功推送了我的更改:
GIT_SSH_COMMAND="ssh -i <path to private ssh key for second user>" git push
我发布这篇文章,一方面是为了帮助其他遇到同样问题的人,另一方面也是想提出几个问题:
我知道该命令实质上是指定用于 ssh 连接时进行推送的密钥,但如果使用相同的身份文件克隆,则为什么不会自动选择此密钥?
是否有其他替代方法或更好的方法,而不像手动更改配置值或从 Windows 凭据管理器中删除条目那样繁琐?
HTTP 路径
https://github.com/schwaggs/testssh
https://github.com/jjschweigert/testrepo
SSH 路径
git@github.com:schwaggs/testssh.git
git@github.com:jjschweigert/testrepo.git
SSH 配置文件
$ cat ~/.ssh/config
Host jjschweigert
HostName github.com
User git
IdentityFile ~/.ssh/jjschweigert_key
Host schwaggs
HostName github.com
User git
IdentityFile ~/.ssh/jjschweigert_key
使用原始账户克隆
$ git clone jjschweigert:jjschweigert/testrepo.git
Cloning into 'testrepo'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 28 (delta 0), reused 28 (delta 0), pack-reused 0
Receiving objects: 100% (28/28), done.
将代码推送至原始账户 (jjschweigert)
$ git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 261 bytes | 43.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To jjschweigert:jjschweigert/testrepo.git
c082e38..31b7830 master -> master
从第二个账户(schwaggs)进行克隆
$ git clone schwaggs:schwaggs/testssh.git
Cloning into 'testssh'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 21 (delta 0), reused 18 (delta 0), pack-reused 0
Receiving objects: 100% (21/21), done.
推送到辅助账户
$ git push
ERROR: Permission to schwaggs/testssh.git denied to jjschweigert.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
SSH -T 输出
$ ssh -T jjschweigert
Hi jjschweigert! You've successfully authenticated, but GitHub does not provide shell access.
$ ssh -T schwaggs
Hi jjschweigert! You've successfully authenticated, but GitHub does not provide shell access.
git
不会存储用于克隆的密钥。你必须自己进行配置,可以通过设置$GIT_SSH_COMMAND
环境变量或配置git config core.sshCommand "ssh -i <path to private ssh key for second user>"
或通过操作主机名来实现。 - phd