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
git remote set-url origin [email protected]:username/repo.git
  • 可以使用以下命令检查远程仓库的URL是HTTPS还是SSH:
1
git remote -v

2. 永久认证

2.1 使用凭证缓存

运行以下命令启用凭证缓存:

1
2
git config credential.helper store
git push https://github.com/owner/repo.git

执行上述命令后,会提示输入用户名和密码,输入后Git会将其缓存。

还可以指定缓存过期时间:

1
git config credential.helper 'cache --timeout 7200'

这将使凭证缓存7200秒(2小时)。

也可以全局配置凭证缓存:

1
2
git config --global credential.helper store
git config --global credential.helper 'cache --timeout 7200'

2.2 使用.netrc文件(适用于Linux和Mac)

~/.netrc文件中添加以下内容:

1
2
3
machine github.com
login <user>
password <password>

在Windows上,文件名为%HOME%\_netrc

3. 使用SSH密钥认证

3.1 生成SSH密钥

在Linux上使用ssh-keygen命令生成SSH密钥:

1
ssh-keygen -t ed25519 -C "[email protected]"

在Windows上,msysgit提供了类似的命令。

3.2 添加私钥到ssh-agent

启动ssh-agent:

1
eval $(ssh-agent -s)

添加私钥:

1
ssh-add ~/.ssh/id_ed25519

3.3 上传公钥到Git服务器

将公钥~/.ssh/id_ed25519.pub的内容复制到Git服务器的SSH密钥设置中。

3.4 修改远程仓库URL为SSH格式

1
git remote set-url origin [email protected]:yourname/yourrepo.git

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
2
3
git-credential-manager-core configure
git config --global credential.credentialStore cache
git config --global credential.cacheoptions "--timeout 72000"
  • 还可以进行一些美化配置:
1
2
git config --global credential.guiPrompt false
git config --global credential.gitHubAuthModes browser

核心代码

切换远程仓库URL到SSH

1
git remote set-url origin [email protected]:username/repo.git

启用凭证缓存

1
2
git config credential.helper store
git config credential.helper 'cache --timeout 7200'

生成SSH密钥

1
ssh-keygen -t ed25519 -C "[email protected]"

启动ssh-agent并添加私钥

1
2
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_ed25519

最佳实践

  • 优先使用SSH协议,因为它更安全,且避免了每次都输入用户名和密码的麻烦。
  • 如果必须使用HTTPS协议,可以使用凭证缓存或个人访问令牌来提高效率。
  • 定期更新SSH密钥和个人访问令牌,以增强安全性。

常见问题

1. 使用SSH密钥时仍提示输入密码

如果你的SSH密钥设置了密码短语,在进行网络操作(如pushpullfetch)时会提示输入密码短语。可以使用ssh-agent来避免每次都输入密码短语:

1
2
eval `ssh-agent -s`
ssh-add

2. Cygwin用户使用ssh-agent的安全风险

Cygwin的Unix域套接字存在安全风险,不建议在Cygwin中使用ssh-agent。具体风险可参考相关链接

3. Git和SSH版本过旧

如果遇到git push总是提示输入密码的问题,可能是Git和SSH版本过旧。可以更新Git和SSH版本,例如在Mac上使用MacPorts进行更新:

1
2
sudo port install git
sudo port install ssh

Git push requires username and password
https://119291.xyz/posts/git-push-requires-username-and-password/
作者
ww
发布于
2025年5月26日
许可协议