“git config --global credential.helper cache”在win7+cygwin下不缓存

问题描述 投票:0回答:2

我在安装了 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 设置的)。

git windows-7 cygwin
2个回答
0
投票

此功能使用unix域套接字进行通信,因此它根本不适用于Windows本机Git。您可以查看此项目作为替代:http://gitcredentialstore.codeplex.com/

UPD 我认为(出于某种原因)您正在使用本机 Windows Git 并同时安装了 cygwin。如果你使用 cygwin 的 git ,那么奇怪的是没有任何作用。我在这里留下一个答案,也许会对某人有所帮助。


0
投票

如果您在 2024 年仍然遇到

git credential-cache
和 Cygwin 的问题,最近有一个修复:

使用 Git 2.48(2025 年第 1 季度),第 7 批,将

ECONNABORTED
视为与 '
ECONNRESET
'
(
man) 中的 git credential-cache 相同,以解决可能的 Cygwin 回归问题。
这解决了由 Cygwin 处理套接字关闭的变化引起的竞争条件,允许客户端在遇到
ECONNABORTED
时干净地退出。

请参阅 Ramsay Jones (ramsay-jones)

commit 468a7e4(2024 年 10 月 18 日)。
(由 Taylor Blau --
ttaylorr
--
合并于 commit 787297b,2024 年 11 月 1 日)

credential-cache
:像对待 ECONNRESET 一样对待 ECONNABORTED

签署人:Jeff King
签字人:拉姆齐·琼斯
签字人:Taylor Blau

在 Cygwin 上,t0301 失败,因为“

git credential-cache
(man) exit 返回非零退出代码。
这里应该发生的是:

  1. 客户端(上面的“
    credential-cache
    ”调用)连接到先前生成的
    credential-cache--daemon
  2. 客户端向守护进程发送“
    exit
    ”命令。
  3. 守护进程取消套接字链接,然后退出,关闭返回给客户端的描述符。
  4. 客户端在描述符上看到EOF并成功退出。

适用于大多数平台,甚至用于适用于 Cygwin。
但这在 Cygwin 的

ef_95_c0_35_22
中发生了变化(Cygwin:选择:修复
FD_CLOSE
处理,2021-04-06)。
提交后,客户端会看到一个读取错误,errno 设置为
ECONNABORTED
,并且报告错误并终止。

尚不完全清楚这是否是 Cygwin 错误。
似乎在指向套接字的文件句柄上调用

fclose()
足以避免此错误返回,即使从客户端的角度来看,退出通常看起来是相同的。

但是,我们不能只在这里调用

fclose()

在上面的步骤 3 中,重要的是在关闭描述符之前取消链接套接字,以避免 7d5e9c9 提到的竞争(
credential-cache--daemon
:澄清,2016-03-18,Git v2.9.0-rc0 - 中列出的merge)批次#2)(凭证缓存--守护进程:澄清“
exit
”操作语义,2016-03-18)。
一旦看到描述符关闭,客户端就会退出,并且守护进程可能已经或可能没有实际取消链接套接字。
这使得测试代码像这样:

git credential exit &&
test_path_is_missing .git-credential-cache

活力。

所以我们可能可以通过调用来解决这个问题:

delete_tempfile(&socket_file);
fclose(in);
fclose(out);

在我们之前

exit()

或者通过将
exit()
替换为堆栈上的返回,在这种情况下,当我们展开时
fclose()
就会发生。
但在这种情况下,我们仍然需要在这里调用
delete_tempfile()
来避免竞争。

但更简单的是,我们可以注意到我们已经在客户端对

ECONNRESET
进行了特殊处理,由 1f180e5 提供(“
credential-cache
:将
ECONNRESET
解释为 EOF”,2017-07-27, Git v2.15.0-rc0 -- merge 列于 batch #1)。
我们可以在这里做同样的事情(我怀疑在引入这个问题的 Cygwin 提交之前,我们实际上只是看到
ECONNRESET
而不是
ECONNABORTED
,所以“新”问题只是 errno 值的切换).

此线程中有更多调试。

© www.soinside.com 2019 - 2024. All rights reserved.