Git - 如何在 Windows 上使用 .netrc 文件保存用户名和密码

185

当我使用Git通过HTTP和用户名 - 密码克隆远程仓库时,是否可以在Windows上使用.netrc文件?

4个回答

227

有没有可能在Windows上使用.netrc文件?

可以:你需要:

  • 定义环境变量%HOME%(Git 2.0+后不再需要)
  • _netrc文件放置在%HOME%

如果您正在使用Windows 7/10,在CMD会话中输入:

setx HOME %USERPROFILE%

并且%HOME%将被设置为'C:\Users\"username"'。
进入该文件夹(cd %HOME%)并创建一个名为'_netrc'的文件

注意:对于Windows,你需要一个'_netrc'文件,而不是'.netrc'文件。

它的内容非常标准(用你的值替换<examples>):

machine <hostname1>
login <login1>
password <password1>
machine <hostname2>
login <login2>
password <password2>

Luke在评论中提到:

在Windows 7上使用最新版本的msysgit,我不需要设置HOME环境变量。只用_netrc文件就行了。

这正是我在 "Trying to “install” github, .ssh dir not there" 中提到的:
msysgit中包含的git-cmd.bat会设置%HOME%环境变量:

@if not exist "%HOME%" @set HOME=%HOMEDRIVE%%HOMEPATH%
@if not exist "%HOME%" @set HOME=%USERPROFILE%

爱国者认为评论中提到的“似乎不适用于HTTP协议”。

然而,我回答说curl使用netrc,并且适用于HTTP协议,如此示例所示(在页面中查找“netrc”): 。这里也与HTTP协议一起使用:"_netrc/.netrc alternative to cURL".


netrc 在 Windows 上的一个常见陷阱是,如果 origin https url 指定了用户名,git 将会绕过使用它。

例如,如果你的 .git/config 文件包含:

[remote "origin"]
     fetch = +refs/heads/*:refs/remotes/origin/*
     url = https://bob@code.google.com/p/my-project/

Git 将不会通过 _netrc 解析你的凭据。要解决这个问题,请移除你的用户名,像这样:

[remote "origin"]
     fetch = +refs/heads/*:refs/remotes/origin/*
     url = https://code.google.com/p/my-project/

备选方案:使用git版本1.7.9+(2012年1月):Mark Longair答案详细说明了凭证缓存机制,该机制还允许您像下面显示的那样以明文形式存储密码。


Git 1.8.3(2013年4月)起:

现在可以使用加密的 .netrc 文件(使用 gpg)。
在 Windows 上:%HOME%/_netrc_,不是 ".")

添加了一个新的只读凭据助手(位于 contrib/),用于与 .netrc/.authinfo 文件交互。

该脚本将允许您使用 gpg 加密的 netrc 文件,避免在明文文件中存储凭据的问题。

带有 .gpg 扩展名的文件将在解析之前由 GPG 解密。
多个 -f 参数是可以的。它们按顺序处理,并通过凭据助手协议返回找到的第一个匹配条目。

当没有给出 -f 选项时,将按此顺序使用您主目录中的 .authinfo.gpg.netrc.gpg.authinfo.netrc 文件。

要启用此凭据助手:

git config credential.helper '$shortname -f AUTHFILE1 -f AUTHFILE2'

(注意Git会在辅助程序名称前添加“git-credential-”,并在路径中查找它。)
# and if you want lots of debugging info:
git config credential.helper '$shortname -f AUTHFILE -d'

#or to see the files opened and data found:
git config credential.helper '$shortname -f AUTHFILE -v'

请参考完整示例: "是否有一种方法在使用https://github时跳过密码输入"


从Git 2.18+(2018年6月)开始,您现在可以自定义用于解密加密的.netrc文件的GPG程序。

请参见commit 786ef50commit f07eeed(由Luis Marsano(“”)于2018年5月12日提交)。
(由Junio C Hamano -- gitster --合并于commit 017b7c5,2018年5月30日)

git-credential-netrc:接受gpg选项

git-credential-netrc硬编码为使用“gpg”进行解密,而不考虑gpg.program选项。
这在像Debian这样的发行版中是一个问题,因为它们将现代GnuPG称为其他内容,例如“gpg2”。


你知道如何解决这个问题吗?http://programmers.stackexchange.com/questions/209140/gitshell-how-can-i-not-type-the-username-and-passwords - HyperGroups
@HyperGroups 是的:在你的 %HOME% 目录下使用一个加密的 _netrc 文件,就像 这个答案 中所描述的那样。顺便说一句,你的问题是一个 Stack Overflow 的问题,而不是程序员问答网站的问题。 - VonC
@Vonc 我试过了,好像失败了,很糟糕,我应该重启电脑吗?让我检查一下然后再试一次... - HyperGroups
@HyperGroups,你可以尝试重新启动电脑,但如果仍然失败,请在Stack Overflow上提出问题,并提供尽可能详细的信息和精确的错误消息。 - VonC
1
@AndreyS 如果您在用户环境变量中看到了HOME的定义,但在当前CMD中键入set HOME时没有看到它,那么您需要打开一个新的CMD,以便该shell会话继承您定义的变量。 - VonC
显示剩余16条评论

36

您还可以安装Git Credential Manager for Windows,将Git密码保存在Windows凭据管理器中,而不是_netrc文件中。这是一种更安全的存储密码的方式。


8
非常好的答案,这是我找到的唯一一个让我保持用户名/密码简单(并且安全)而不必处理那些SSH麻烦的答案。 - Kirk Woll
@KirkWoll,请看我的上面更新的答案:你现在可以将你的凭证存储在加密的.netrc文件中。在会话期间,您甚至不需要输入这些凭证一次。 - VonC

11

这将允许Git使用.netrc进行HTTPS身份验证:

  • 文件应命名为_netrc,位于c:\Users\<username>中。
  • 您需要设置一个名为HOME=%USERPROFILE%的环境变量(使用控制面板中的系统选项设置系统级环境变量。根据Windows的版本,您可能需要选择“高级选项”)。
  • 存储在_netrc文件中的密码不能包含空格(引用密码也不起作用)。

最简单和最好的解决方案。在Android Studio、Source Tree和Git命令行中都能完美运行。当Google推荐的Cloud SDK credential.helper选项失败时,我不得不手动生成凭据并使用net rc文件。在我的情况下,我不需要选项2和3。 - Hari

0

我正在发布一种使用_netrc从网站www.course.com下载材料的方法。

如果有人要使用coursera-dl下载www.coursera.com上的公开课材料,并且在Windows操作系统上,某人想要使用类Unix操作系统中的文件".netrc"来添加选项-n而不是-U <username> -P <password>以方便使用。他/她可以这样做:

  1. 在Windows操作系统上检查主目录:setx HOME %USERPROFILE%(参考VonC的答案)。它将把HOME环境变量保存为C:\Users\"用户名"

  2. 进入目录C:\Users\"用户名"并创建一个名为_netrc的文件。注意:没有任何后缀。内容如下:machine coursera-dl login <user> password <pass>

  3. 使用类似coursera-dl -n --path PATH <课程名称>的命令下载课程材料。更多coursera-dl选项详见此页面


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