注意:Git 2.6+(2015 年第三季度)应该会加速这种__git_ps1
状态:
请参阅SZEDER Gábor ( )的commit dd160d7和commit 6bfab99(2015 年 7 月 19 日) 。(由Junio C Hamano 合并——在提交 461c119中,2015 年 8 月 3 日)szeder
gitster
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 ( ) 的commit eceba53和commit dad4f23(2020 年 8 月 18 日)。(由Junio C Hamano 合并 -- --在提交 ad00f44中,2020 年 8 月 24 日)newren
gitster
dir
: 修复有问题的 API 以避免内存泄漏
签字人:以利亚·纽伦
该dir
结构似乎有许多泄漏和问题。
首先我注意到了这一点parent_hashmap
并且recursive_hashmap
被泄露了(尽管 Peff 在我之前注意到并提交了修复)。
然后我注意到在之前的提交中clear_directory()
只负责其中的一个字段子集,dir_struct,
尽管我们在内部分配了 entry[] 和 ignored[] 到dir.c
.
当然,这导致许多调用者泄漏或随意尝试释放这些数组及其内容。
进一步挖掘,我发现尽管顶部附近有非常清晰的文档,当用户不再需要时dir.h
,人们应该调用,但有四个调用者根本不打扰这样做。
然而,他们中的两个人清楚地考虑了泄漏,因为他们有一个指令,这对我来说表明释放数据的方法太不清楚了。
我怀疑 API 的不明显性及其漏洞导致人们避免使用它,然后滚雪球般地引发更多问题,包括、和问题。clear_directory()
dir_struct,
UNLEAK(dir)
entries[]
ignored[]
parent_hashmap,
recursive_hashmap
重命名clear_directory()
为dir_clear()
更符合 git 中的其他数据结构,并引入 adir_init()
来处理建议的 memsettingdir_struct
到全零。
我希望像"dir_clear()
" 这样的名称更清楚,并且 的存在dir_init()
将为那些查看代码的人提供提示,他们需要查找 adir_clear()
或 adir_free()
并引导他们找到dir_clear()
.
这会影响:
git add
git check-ignore
git clean
git grep
git ls-files
git stash
git merge