如何让gitconfig的InsteadOf配置与Cargo兼容?
这个问题的核心是你的全局Git配置把所有https://github.com/的请求都强制换成了SSH地址,但Crates.io的索引仓库(https://github.com/rust-lang/crates.io-index)是公开的:HTTPS协议可以匿名访问,而SSH协议不管仓库是否公开,Git都会尝试身份认证——你的环境里没有可用的SSH凭证,所以拉取索引时触发了认证失败。
下面是几个既能保留你需要的GitHub SSH替换规则,又能解决Cargo依赖问题的可行方案:
方案1:精确匹配个人仓库(推荐)
把全局的替换规则缩小到仅针对你自己的GitHub仓库,这样既保留了个人仓库用SSH的便利,又不会影响Crates.io索引的拉取。修改你的~/.gitconfig:
# 仅替换你个人GitHub仓库的HTTPS地址为SSH [url "git@github.com:你的GitHub用户名/"] insteadOf = https://github.com/你的GitHub用户名/ # 可选:所有GitHub仓库执行push时自动用SSH(如果需要的话) [url "git@github.com:"] pushInsteadOf = https://github.com/
比如你的用户名是d33tah,配置就改成:
[url "git@github.com:d33tah/"] insteadOf = https://github.com/d33tah/ [url "git@github.com:"] pushInsteadOf = https://github.com/
这样,只有访问你自己的仓库(比如https://github.com/d33tah/hilbert-c2rust)时才会触发SSH替换,Crates.io的索引仓库会保持用HTTPS访问,不会触发认证问题。
方案2:仅在Push时替换(最简单)
如果你只需要在push代码到GitHub时用SSH,不需要pull/fetch时强制切换,直接去掉insteadOf配置,保留pushInsteadOf即可:
[url "git@github.com:"] pushInsteadOf = https://github.com/
这个配置只会在执行git push时把HTTPS地址替换成SSH,拉取Crates.io索引时依然用HTTPS,完美避开认证问题。
方案3:为Crates.io索引单独设置例外
如果你一定要保留全局的insteadOf规则,可以为Crates.io的索引仓库添加反向替换,强制它用HTTPS:
[url "https://github.com/rust-lang/crates.io-index"] insteadOf = git@github.com:rust-lang/crates.io-index
或者,你也可以直接在Cargo的配置文件(~/.cargo/config.toml)里指定索引的HTTPS地址,让Cargo忽略Git的全局替换:
[registries.crates-io] index = "https://github.com/rust-lang/crates.io-index"
内容的提问来源于stack exchange,提问作者d33tah

