注意:Git 2.6+(2015 年第三季度)应该会加速 __git_ps1 状态:
参见commit dd160d7、commit 6bfab99(2015 年 7 月 19 日)SZEDER Gábor (szeder)。
(由 Junio C Hamano -- gitster -- 合并到 commit 461c119,2015 年 8 月 3 日)
bash 提示:更快的未跟踪状态指示器与未跟踪目录
如果启用了未跟踪状态指示器,__git_ps1() 通过运行“git ls-files”来查找未跟踪文件。
如果未跟踪目录包含大量文件,这可能会明显变慢,因为它列出了在未跟踪目录中找到的所有文件,只会立即重定向到 /dev/null。
这是__git_ps1()实际运行的命令:
$ ls untracked-dir/ |wc -l
100000
$ time git ls-files --others --exclude-standard --error-unmatch \
-- ':/*' >/dev/null 2>/dev/null
real 0m0.955s
user 0m0.936s
sys 0m0.016s
通过另外将“--directory --no-empty-directory”选项传递给“git ls-files”以仅显示非空未跟踪目录的名称而不是其所有内容来消除此延迟:
$ time git ls-files --others --exclude-standard --directory \
--no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null
real 0m0.010s
user 0m0.008s
sys 0m0.000s
这个效仿ea95c7b(完成:改进未跟踪目录
过滤文件名完成,2013-09-18,git 1.8.5)。
确保使用 Git 2.29(2020 年第四季度),因为在影响 git ls-files 的部分代码中提供了泄漏修复。
参见Elijah Newren (newren) 的commit eceba53、commit dad4f23(2020 年 8 月 18 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit ad00f44,2020 年 8 月 24 日)
dir:修复有问题的 API 以避免内存泄漏
签字人:Elijah Newren
dir 结构似乎存在许多漏洞和问题。
首先我注意到 parent_hashmap 和 recursive_hashmap 被泄露(尽管 Peff 在我之前注意到并提交了修复)。
然后我注意到在之前的提交中clear_directory() 只负责dir_struct, 中的一部分字段,尽管我们在内部分配了entry[] 和ignore[] 给dir.c。
当然,这导致许多调用者要么泄漏,要么随意尝试释放这些数组及其内容。
进一步挖掘,我发现尽管dir.h 顶部附近有非常清晰的文档,当用户不再需要dir_struct, 时,人们应该调用clear_directory(),但有四个调用者没有打扰完全没有。
然而,他们中的两个显然考虑到了泄漏,因为他们有一个 UNLEAK(dir) 指令,在我看来,这表明释放数据的方法太不清楚了。
我怀疑 API 的不明显性及其漏洞导致人们避免使用它,然后滚雪球般地引发entries[]、ignored[]、parent_hashmap, 和recursive_hashmap 问题的进一步问题。
将clear_directory() 重命名为dir_clear() 以更符合git 中的其他数据结构,并引入dir_init() 来处理建议的dir_struct 的memsetting 为全零。
我希望像 "dir_clear()" 这样的名字更清楚,dir_init() 的存在将为那些查看代码的人提供一个提示,他们需要寻找 dir_clear() 或 dir_free() 并引导他们找到dir_clear()。
影响:
git add
git check-ignore
git clean
git grep
git ls-files
git stash
git merge