运行时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的问题是一个关键线索:未跟踪的缓存要求工作树路径与索引中存储的路径匹配。 此外,来自uname
utsname
字段的系统名称保留在那里,并且也必须匹配;这会影响跨网络文件系统(如 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-cache
或core.untrackedCache = true
)之前运行git update-index --test-untracked-cache
。 另请注意,如果这是core
设置设置为true
或false
,则在更新索引时,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
分叉中提供了此更改的版本.
它一直运行良好,可以让用户进入良好状态.
是的,第一次索引写入很慢,但剩余的索引写入比没有此更改时快得多。