配置Git客户端,如GitHub for Windows,以免询问身份验证。

21
我已经在 Windows 上安装了 GitHub 和 GitExtensions,并且在我的路径中有多个 git.exe 版本。

enter image description here

C:\Users\Rajat\AppData\Local\GitHub\PortableGit_93e8418133eb85e81a81e5e19c272776524496c6\cmd\git.exe
C:\Users\Rajat\AppData\Local\GitHub\PortableGit_93e8418133eb85e81a81e5e19c272776524496c6\bin\git.exe
E:\cygwin\bin\git.exe
C:\Program Files (x86)\Git\cmd\git.exe
C:\Program Files (x86)\Git\bin\git.exe
现在,当我使用最后三个git.exe之一执行“git push origin master”命令时,它会要求输入我的用户名。但是Portable Git不需要输入用户名,如下图所示: enter image description here 那么在这种情况下是如何进行身份验证的呢?最终我希望最后三个Git不需要授权。这可能吗?
我在GitHub的Git中发现了两个额外的文件,但我怀疑它们并不重要: enter image description here

请查看我的答案,了解新的GitHub双因素身份验证对缓存凭据的影响。 - VonC
3个回答

52
如果您正在使用GitHub for Windows,您需要执行以下操作:
  1. 确保至少登录过一次GUI应用程序
  2. 单击“Git Shell”链接
对于基于HTTPS和SSH的远程仓库,GitHub已经在命令行上为您解决了这个问题。

45
对于 GitHub for Windows 本身,Paul BettsGitHub 员工)温馨提示大家: G4W 已经包含了凭证助手(基于 CryptProtect,我猜测还有 CryptProtectData 函数)。请参见 他的回答
对于不使用 G4W 的人,请继续阅读。
为了补充之前的回答(通过控制台/命令行推送到GitHub时),像~/.netrc(在Unix上)或%HOME%/_netrc(在Windows上)这样的文件可以帮助您避免为每个git push到GitHub输入凭据。您可以在netrc文件中存储所需数量的凭据(适用于GitHub或其他存储库托管提供程序)。但是:
  • 您不想存储主GitHub密码帐户
  • 您不想将其放在纯文本文件中。
以下各节解决了这些问题:

在您的GitHub账户上启用双因素认证(2FA)

(2013年9月3日)

通过应用程序配置2FA,始终通过应用程序进行配置,尽量避免通过短信文本进行配置。

原因是,通过该激活过程,您可以访问双因素秘钥,该秘钥用于每30秒生成第二个身份验证因素:

two factor secret string

这样,您可以进入任何GAuth(Google Authenticator)客户端,输入相同的2FA密钥,并查看通过短信消息获取的完全相同代码。
除此之外,如果您没有电话服务,它仍然可以工作;)

当然,首选客户端是Android手机或iPhone上的GAuth

GAuth on Android

That means 意味着您无需等待短信,且可以在手机上保留2FA。但是,拥有您的秘密密钥将使您不受限于手机客户端。您可以使用任何其他客户端,例如:
- JAuth,一个漂亮的两步验证桌面客户端 (Github上的代码) - html5-google-authenticator: 一个GAuth Authenticator客户端Web页面,您可以在其中每30秒看到生成的令牌,就像您在手机或通过短信中看到的一样。 - 一个桌面系统托盘 - 浏览器扩展程序(例如FireFox的gauth-authenticator
对于所有客户(使用GAuth手机应用程序、桌面客户端或网页),您需要使用双重身份验证密钥
如果您通过短信激活了2FA:
  • 您不知道您的密钥
  • 您无法使用其他GAuth客户端
  • 您只能通过手机接收令牌(如果您有电话服务和/或您有手机)

注意:如果您在Android上的Gauth客户端中添加了密钥,而没有先记住该秘密密钥,则并非一切都失去了
(但是您需要一个已root的手机)
$ adb shell
# sqlite3 /data/data/com.google.android.apps.authenticator/databases/databases
sqlite> select * from accounts;
1|your@email.address|your2factorkey|0|0
sqlite> .quit
#exit

不要忘记获取并保存相关的恢复代码(在您的GitHub账户的帐户设置部分):

Recovery code

(还请参阅有关代码存储位置的最后一节)


加密你的_netrc文件

(参见credential helper netrc with git1.8.3+: gpg encryption)

您需要加密该文件中至少这两个凭据:

machine github.com
login username
password xxxx
protocol https

machine gist.github.com
login username
password xxxx
protocol https

你需要保留的是 ~/.netrc.gpg 或者 %HOME%/_netrc.gpg
但是,如果你启用了上面提到的新的双因素身份验证,'xxxx' 将不再是你的 GitHub 账户:请参见下一节关于“个人访问令牌”的内容。

生成个人访问令牌

如果您已启用 2FA,则无法使用 GitHub 密码进行推送。

拒绝匿名访问用户/存储库.git

以下是您将看到的内容(gpg 部分是因为我使用 netrc 凭据助手):

C:\Users\VonC\prog\git\git>git push origin
Using GPG to open %HOME%/_netrc.gpg: [gpg2 --decrypt %HOME%/_netrc.gpg]

You need a passphrase to unlock the secret key for
user: "auser <email@email.com>"
2048-bit RSA key, ID A2EF56, created 2012-09-12 (main key ID DC43D6)

remote: Anonymous access to VonC/git.git denied.                      <=====
fatal: Authentication failed for 'https://VonC@github.com/VonC/git/'  <=====

所以前往您的GitHub帐户的开发人员部分(子部分个人访问令牌),并生成一个个人访问令牌

Personal token

该令牌不需要双重身份验证:您可以将其用作_netrc文件中的密码,并且您将能够轻松地推送到GitHub。但与您的主GitHub帐户密码的区别是:
您可以撤销个人访问令牌(并生成新的),同时仍保持主密码不变。如果您已经在~/.netrc.gpg文件中加密了您的主GitHub密码,则可以使用新的个人令牌替换它。
gpg -d %HOME%\_netrc.gpg | sed "s/yourPassord/YourPersonalAccessToken/g" | gpg -e -r auser --yes -o %HOME%\_netrc.gpg

为了易读性而多行:

gpg -d %HOME%\_netrc.gpg | 
  sed "s/yourPassord/YourPersonalAccessToken/g" | 
  gpg -e -r auser --yes -o %HOME%\_netrc.gpg

那甚至在Windows上也可以运行,借助类Unix的GoW(Gnu on Windows)命令,其中包括sed

保存你的GitHub凭据

我建议使用在线凭据存储,例如lastpass.com

您需要保存以下内容:

  • 您的GitHub账户密码
  • 您的2FA密钥
  • 您的2FA恢复代码
  • 您的个人令牌

LastPass


1
@lunakid 你只需要每天保留一点时间:这是很好的训练。(我是指:每。一。天。 http://meta.stackexchange.com/q/122976/6309) - VonC
7
这个回答可能比较长,但也非常不正确。没有人应该这样做。您能否请删除这个回答? - Ana Betts
我可以在多个客户端上使用个人访问令牌吗?我使用Windows和Linux。在Linux上,它可以工作,在Windows上我得到了“异常已发生:GithubException”,并且我看到奇怪的字符在开头:“ÿþ”。这与编码有关吗?我在vscode中有“utf-16 le”。在vscode中使用“utf-8”重新打开编码会出现更多奇怪的字符。 - Timo
等一下 - 看起来将编码更改为 utf-8 可以解决问题。 - Timo
@Timo 确实应该可以使用 utf-8。ÿþ 是 UTF-16 (LE)(https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding) - VonC
显示剩余5条评论

13

https://help.github.com/articles/set-up-git

密码缓存部分说明如下:

 

如果您不想使用GitHub for Windows,则可以在此处下载适用于您的操作系统的助手:

那么,任何其他git.exe都将无需要求密码即可工作。 :)


1
这是正确的答案,所有人都说“使用_netrc”已经非常过时了。 - Ana Betts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接