我在安装了 cygwin 的 win7 机器上使用 git(git 版本 1.7.9,不使用 cygwin bash,而是在 Windows PATH 变量中使用 cygwin/bin 并使用普通的 Windows 命令 shell),并且为了不必键入我的凭据每个其他 git 命令,我想我应该使用凭据助手,
git config --global credential.helper cache
但是,在发出此命令并从我的 git: 存储库执行 git fetch 后(这会提示我输入密码),任何需要凭据的后续命令仍会要求我输入密码,而不是通过凭据助手使用缓存的值。
有人知道如何在 Windows 7 中使 cygwin 的 git 正确缓存凭据吗? (我在 SO 上找到的所有关于此问题的问题都是针对 msys 设置的)。
此功能使用unix域套接字进行通信,因此它根本不适用于Windows本机Git。您可以查看此项目作为替代:http://gitcredentialstore.codeplex.com/
UPD 我认为(出于某种原因)您正在使用本机 Windows Git 并同时安装了 cygwin。如果你使用 cygwin 的 git ,那么奇怪的是没有任何作用。我在这里留下一个答案,也许会对某人有所帮助。
如果您在 2024 年仍然遇到
git credential-cache
和 Cygwin 的问题,最近有一个修复:
使用 Git 2.48(2025 年第 1 季度),第 7 批,将
ECONNABORTED
视为与 'ECONNRESET
'(man) 中的
git credential-cache
相同,以解决可能的 Cygwin 回归问题。ECONNABORTED
时干净地退出。
请参阅 Ramsay Jones (ramsay-jones
)
的commit 468a7e4(2024 年 10 月 18 日)。
ttaylorr
-- 合并于 commit 787297b,2024 年 11 月 1 日)
:像对待 ECONNRESET 一样对待 ECONNABORTEDcredential-cache
签署人:Jeff King
签字人:拉姆齐·琼斯
签字人:Taylor Blau
”(man) exit 返回非零退出代码。git credential-cache
这里应该发生的是:
- 客户端(上面的“
”调用)连接到先前生成的credential-cache
。credential-cache--daemon
- 客户端向守护进程发送“
”命令。exit
- 守护进程取消套接字链接,然后退出,关闭返回给客户端的描述符。
- 客户端在描述符上看到EOF并成功退出。
适用于大多数平台,甚至用于适用于 Cygwin。
但这在 Cygwin 的中发生了变化(Cygwin:选择:修复ef_95_c0_35_22
处理,2021-04-06)。FD_CLOSE
提交后,客户端会看到一个读取错误,errno 设置为,并且报告错误并终止。ECONNABORTED
尚不完全清楚这是否是 Cygwin 错误。
似乎在指向套接字的文件句柄上调用足以避免此错误返回,即使从客户端的角度来看,退出通常看起来是相同的。fclose()
但是,我们不能只在这里调用
。fclose()
在上面的步骤 3 中,重要的是在关闭描述符之前取消链接套接字,以避免 7d5e9c9 提到的竞争(:澄清,2016-03-18,Git v2.9.0-rc0 - 中列出的merge)批次#2)(凭证缓存--守护进程:澄清“credential-cache--daemon
”操作语义,2016-03-18)。exit
一旦看到描述符关闭,客户端就会退出,并且守护进程可能已经或可能没有实际取消链接套接字。
这使得测试代码像这样:git credential exit && test_path_is_missing .git-credential-cache
活力。
所以我们可能可以通过调用来解决这个问题:
delete_tempfile(&socket_file); fclose(in); fclose(out);
在我们之前
。exit()
或者通过将替换为堆栈上的返回,在这种情况下,当我们展开时exit()
就会发生。fclose()
但在这种情况下,我们仍然需要在这里调用来避免竞争。delete_tempfile()
但更简单的是,我们可以注意到我们已经在客户端对
进行了特殊处理,由 1f180e5 提供(“ECONNRESET
:将credential-cache
解释为 EOF”,2017-07-27, Git v2.15.0-rc0 -- merge 列于 batch #1)。ECONNRESET
我们可以在这里做同样的事情(我怀疑在引入这个问题的 Cygwin 提交之前,我们实际上只是看到而不是ECONNRESET
,所以“新”问题只是 errno 值的切换).ECONNABORTED
此线程中有更多调试。