Key has already been taken
在使用git clone
命令部署gitlab
的托管项目文件时,需要首先在项目配置中添加deploy key
,但是也可能会遇到下列报错
Key has already been taken
Fingerprint has already been taken
这个问题是因为gitlab中已经有其他项目使用了这个部署公钥,所以无法添加到当前项目。
多个ssh密钥对的思路
Managing Multiple SSH Keys提供了一种解决思路,即如果需要对不同的git仓库使用不同的ssh key时候,可以先创建不同的密钥对:
mkdir ~/.ssh/fedoraproject
cd ~/.ssh/fedoraproject
ssh-keygen -f id_rsa
这样就可以在~/.ssh/fedoraproject
目录下创建独立的id_rsa
和id_rsa.pub
密钥对。
然后配置类似如下
Host github.com
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/git/id_rsa
Host fedoraproject.org
Hostname fedoraproject.org
PreferredAuthentications publickey
IdentityFile ~/.ssh/fedoraproject/id_rsa
Host fedorapeople.org
Hostname fedorapeople.org
PreferredAuthentications publickey
IdentityFile ~/.ssh/fedoraproject/id_rsa
再使用 git clone [email protected]:example/example_repo.git
就可以使用指定的密钥来完成。
结合ssh-agent
来使用指定私钥
上述思路中使用了多个密钥对来针对不同域名区别使用密钥,在我们这个案例中,域名是不变的,单是我们也需要使用不同的私钥。
可以参考 Specify private SSH-key to use when executing shell command with or without Ruby? 使用以下命令
ssh-agent bash -c 'ssh-add /home/christoffer/ssh_keys/theuser; git clone [email protected]:TheUser/TheProject.git'
此方法测试可用于
git 1.9
,上述方法解决了对特定项目使用指定密钥对的问题。
另一个建议方法测试没有成功:
ssh-agent $(ssh-add /home/christoffer/ssh_keys/theuser; git clone [email protected]:TheUser/TheProject.git)
使用git的GIT_SSH_COMMAND
来使用指定私钥
参考How to tell git which private key to use?,即从git 2.3.0
开始可以指定环境变量
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example
这里-i
也可能被配置文件覆盖,所以可以给予SSH一个空白配置
GIT_SSH_COMMAND
环境变量对于低于git 2.3.0
版本无效
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example