Git push requires username and password
Git push requires username and password
技术背景
在使用Git进行代码管理时,当执行git push
操作时,有时会频繁要求输入用户名和密码,这会降低开发效率。常见原因是克隆仓库时使用了默认的HTTPS协议而非SSH协议。本文将介绍多种解决此问题的方法。
实现步骤
1. 从HTTPS切换到SSH协议
- 首先,在仓库页面点击“Clone or download”,然后点击URL字段上方的“Use SSH”按钮,获取SSH格式的URL。
- 使用以下命令更新远程仓库的URL:
1 |
|
- 可以使用以下命令检查远程仓库的URL是HTTPS还是SSH:
1 |
|
2. 永久认证
2.1 使用凭证缓存
运行以下命令启用凭证缓存:
1 |
|
执行上述命令后,会提示输入用户名和密码,输入后Git会将其缓存。
还可以指定缓存过期时间:
1 |
|
这将使凭证缓存7200秒(2小时)。
也可以全局配置凭证缓存:
1 |
|
2.2 使用.netrc
文件(适用于Linux和Mac)
在~/.netrc
文件中添加以下内容:
1 |
|
在Windows上,文件名为%HOME%\_netrc
。
3. 使用SSH密钥认证
3.1 生成SSH密钥
在Linux上使用ssh-keygen
命令生成SSH密钥:
1 |
|
在Windows上,msysgit
提供了类似的命令。
3.2 添加私钥到ssh-agent
启动ssh-agent:
1 |
|
添加私钥:
1 |
|
3.3 上传公钥到Git服务器
将公钥~/.ssh/id_ed25519.pub
的内容复制到Git服务器的SSH密钥设置中。
3.4 修改远程仓库URL为SSH格式
1 |
|
4. 处理2FA(双因素认证)
如果你的GitHub账户启用了2FA,普通密码将无法使用。可以生成个人访问令牌(Personal Access Token)来代替密码。
- 访问GitHub的
Settings
->Developer Settings
->Personal Access Tokens
页面(https://github.com/settings/tokens/new)。 - 生成一个具有所有Repo权限的新令牌。
- 在执行
git push
时,使用该令牌作为密码。
5. 使用Git Credential Manager
这是一个安全、用户友好的跨平台解决方案,支持无密码的浏览器OAuth认证。
- 从这里下载并安装Git Credential Manager。
- 在Linux上,进行以下配置:
1 |
|
- 还可以进行一些美化配置:
1 |
|
核心代码
切换远程仓库URL到SSH
1 |
|
启用凭证缓存
1 |
|
生成SSH密钥
1 |
|
启动ssh-agent并添加私钥
1 |
|
最佳实践
- 优先使用SSH协议,因为它更安全,且避免了每次都输入用户名和密码的麻烦。
- 如果必须使用HTTPS协议,可以使用凭证缓存或个人访问令牌来提高效率。
- 定期更新SSH密钥和个人访问令牌,以增强安全性。
常见问题
1. 使用SSH密钥时仍提示输入密码
如果你的SSH密钥设置了密码短语,在进行网络操作(如push
、pull
、fetch
)时会提示输入密码短语。可以使用ssh-agent
来避免每次都输入密码短语:
1 |
|
2. Cygwin用户使用ssh-agent的安全风险
Cygwin的Unix域套接字存在安全风险,不建议在Cygwin中使用ssh-agent
。具体风险可参考相关链接。
3. Git和SSH版本过旧
如果遇到git push
总是提示输入密码的问题,可能是Git和SSH版本过旧。可以更新Git和SSH版本,例如在Mac上使用MacPorts进行更新:
1 |
|
Git push requires username and password
https://119291.xyz/posts/git-push-requires-username-and-password/