如何摆脱警告"Untracked cache is disabled on this system."



运行时git status我经常收到多个警告:

$ git status
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.
warning: Untracked cache is disabled on this system.

我已将其添加到我的 .gitconfig 中:

[core]
untrackedCache = true

甚至尝试运行git update-index --untracked-cache.然而,这并没有帮助。

在 Ubuntu Xenial 上使用 git v2.7.4。

是什么导致了这些警告,我如何摆脱它们(没有管道错误到/dev/null)?

(VonC的问题是一个关键线索:未跟踪的缓存要求工作树路径与索引中存储的路径匹配。 此外,来自unameutsname字段的系统名称保留在那里,并且也必须匹配;这会影响跨网络文件系统(如 NFS 或 SMB)管理的文件。

由于系统上禁用了未跟踪的缓存并导致警告,因此您可能不希望尝试启用它。换句话说,将core.untrackedCache保留为未设置,或将其设置为false。 但是,core.untrackedCache是 Git 版本 2.8.0 中的新设置;如果你的 Git 是 2.7.4,你就没有它。

运行git update-index --untracked-cache强制启用该设置(然后生成所有这些错误消息)。 您可以使用git update-index --no-untracked-cache强制关闭它。 唯一的不良影响是,当禁用未跟踪的缓存时,git status的运行速度可能会变慢(可能明显变慢)。

请注意,从 2.8.0 开始,Git 建议在启用未跟踪缓存(使用--untracked-cachecore.untrackedCache = true)之前运行git update-index --test-untracked-cache。 另请注意,如果这是core设置设置为truefalse,则在更新索引时,core.untrackedCache设置只是复制到索引(使用git update-index)。 实际上,控制事物的是索引的设置。 使用默认值(未设置)或将其设置为keep会告诉 Git 保留未跟踪缓存设置。

您还可以将环境变量GIT_DISABLE_UNTRACKED_CACHE(设置为任意值)以禁用未跟踪缓存的使用,而不考虑索引中的当前设置。 (此代码似乎也在 2.7.4 中。 这将绕过警告,并且不使用未跟踪的缓存,无论索引中的设置如何。

该如何摆脱它们

注意:至少在 Git 2.17(2018 年第 2 季度)
写出索引文件时,您应该看到更少的这些消息 是未跟踪的缓存信息通常是浪费的,而这已经 被优化出来了。

参见 commit fc9ecbe (05 Feb 2018) by Ben Peart (benpeart).
(由Junio C Hamano --gitster-- in commit cdda65a合并, 08 Mar 2018)

dir.c:不要将索引标记为脏索引以更改未跟踪的缓存

未跟踪的缓存将其当前状态保存在UNTR索引扩展中。 目前,对该状态的任何更改都会导致索引被标记为脏索引并写出到磁盘。
遗憾的是,写出索引的成本可能会超过使用未跟踪缓存所节省的成本。
因为它是一个可以从工作目录的当前状态更新的缓存, 没有功能要求为未跟踪缓存的每个更改写出索引。

更新未跟踪的缓存逻辑,使其不再强制索引 写入磁盘,除非正在打开扩展或 off.
当其他git命令要求将索引写入磁盘时, 未跟踪的缓存也将利用这一点来保存其更新状态。

当查看常见的git命令序列(即状态后跟添加、提交等)时,这将导致性能提升。


Git 2.24 阐明了core.untrackedCache设置:

请参阅提交 aaf633c、提交 c6cc4c5、提交 ad0fb65、提交 31b1de6、提交 b068d9a、提交 7211b9e (2019 年 8 月 13 日),作者 Derrick Stolee (derrickstolee).
(由 Junio C Hamano --gitster-- 合并于 提交 f4f8dfe,2019 年 9 月 9 日)

repo-settings: parse core.untrackedCache

core.untrackedCache配置设置稍微复杂, 因此,澄清其用法并将其解析集中到存储库中 设置。

默认值为"keep"(返回为 -1),它保留 未跟踪的缓存(如果存在)。

如果该值设置为"false"(返回为 0),则删除 未跟踪的缓存(如果存在)。

如果值设置为 "true"(返回为 1),则写入 未跟踪的缓存并保留它。

不要依赖魔术值 -1、0 和 1,而是将这些选项拆分为枚举.
这允许使用"-1"作为默认值.
解析配置选项后,如果未设置该值,我们可以将其初始化为UNTRACKED_CACHE_KEEP


使用 Git 2.36(2022 年第 2 季度),修复设置为 true 时无法将未跟踪的缓存扩展添加到索引的设置core.untrackedCache

参见 提交 26b8946 (2022 年 2 月 17 日) 由 德里克·斯托利 (derrickstolee).
(由 Junio C Hamano --gitster-- 合并于 提交 80f7f61,2022 年 2 月 25 日)

dir:使用 core.untrackedCache 强制进行未跟踪缓存

签名者:德里克·斯托利

GIT_FORCE_UNTRACKED_CACHE环境变量比 core.untrackedCache 配置变量更频繁地写入未跟踪的缓存。
这是由于read_directory()处理未跟踪缓存的创建的方式。

在此更改之前,Git 不会为尚未具有 .
用户的索引创建未跟踪的缓存扩展,例如 'git update-index --untracked-cache'(man),然后索引才会实际包含未跟踪的缓存。

特别是,用户注意到即使使用 .
core.untrackedCache=true也不会显示未跟踪的缓存,一些用户报告在其工程系统环境中设置了GIT_FORCE_UNTRACKED_CACHE=1,以确保创建未跟踪的缓存。

在没有环境变量的情况下不写入未跟踪缓存的决定可以追溯到 fc9ecbe("dir.c:不要将索引标记为脏以更改未跟踪的缓存", 2018-02-05, Git v2.17.0-rc0 -- 合并列在批处理 #8).
该更改的动机是写入索引的成本很高,如果未跟踪的缓存是唯一需要写入的内容, 那么它比缓存的好处更昂贵.
然而,这也意味着未跟踪的缓存永远不会被填充,因此通过配置启用它的用户实际上不会获得扩展,直到手动运行'git update-index --untracked-cache'或使用环境变量。

我们已经在几个主要版本的microsoft/git分叉中提供了此更改的版本.
它一直运行良好,可以让用户进入良好状态.
是的,第一次索引写入很慢,但剩余的索引写入比没有此更改时快得多。

相关内容

最新更新