我正在尝试加快我的 zsh 主题提示速度和 hg
检查比 git
慢一点的。这会导致使用 hg
时提示显示速度变慢插件。
对于git
我们使用git rev-parse --is-inside-work-tree
这是标准并且相当快。
对于hg
我试图找到类似的命令,但没有那么快:
-
hg --cwd $PWD root
-
hg summary
-
hg root
-
hg -q stat
所有这些命令都可以工作,但效率不如 git rev-parse --is-inside-work-tree
.
还尝试了这个小脚本,这是目前最好的一个。我能做些什么来加快这个脚本的速度吗?
is_dir_hg() {
local root="$(pwd -P)"
while [[ $root && ! -d $root/.hg ]]
do
root="${root%/*}"
done
echo "$root"
}
请注意,解决方案必须检测 hg
即使我们不在根目录中,也可以访问该目录。
最佳答案
我怀疑你能比你的脚本做得更好,除非你编写一个具有同等功能的编译程序。
Git 的测试使用 git rev-parse
,用 C 编码并编译为简单的二进制文件,因此运行速度非常快。 Mercurial 是用 Python 编码的,因此您需要支付 Python 启动开销。此外,您在 Mercurial 中加载的任何扩展都需要搜索扩展路径和额外的运行时加载,这使得 Mercurial 比 Git 更灵活,但速度更慢。
如果 hg root
足够快,您可以同时运行 hg root
和 git rev-parse --show-toplevel
(然后如果需要的话可以解析符号链接(symbolic link))并查看哪一个更接近当前目录(再次解析符号链接(symbolic link)),如果两者都成功。想必您已经尝试过这个,但速度不够快。
您可以使用自己的路径搜索,就像在示例代码中所做的那样。但是,您可以同时搜索 .hg
和 .hg
,而不是仅搜索 .git
,并在找到其中之一时停止。许多 shell 有许多提示库,其中一些使用这种方法。
所有方法都有点容易出错,特别是因为 Mercurial 存储库中可能有 Git 存储库,反之亦然(例如,/path/to/current/working/dir
可能是处于 current
级别的 Mercurial,而 Git 处于 dir
级别,反之亦然)。同时,.git
目录的存在不足以保证您位于有效的 Git 工作树中。例如,只有在以下情况下,Git 才认为目录是存储库:
- 它可以找到 Git 目录本身(也许使用
$GIT_DIR
;Mercurial 似乎没有像 Git 那样覆盖环境变量;如果没有$GIT_DIR
,则从当前目录开始并根据需要爬升);和 - 找到的 Git 目录包含一个名为
HEAD
的文件;和 - 找到的目录包含
refs
目录;和 -
$GIT_OBJECT_DIRECTORY
指向一个目录,或者找到的目录包含objects/
目录。
爬向根搜索通常会测试挂载点并在挂载点停止,因此如果 $HOME/foo
是 Git 存储库,但您当前的工作目录是 $HOME/foo/bar
并且这是一个挂载点这不是 Git 存储库,Git 不会将 $HOME/foo
检测为存储库。简单的 shell 内路径搜索会将 $HOME/foo
检测为存储库。
默认情况下,Mercurial 只在每个父目录中查找 .hg
目录,因此您在这里的基础更加牢固。
请注意,您甚至可以拥有一个同时包含 .hg
和 .git
子目录的目录,这两个子目录都是有效的存储库(我这样做是出于实验目的;它有效,只是有点棘手:您会想要忽略其他 VCS 的 VCS 控制文件)。这可能不是您需要处理的事情,这很好,因为没有明显正确的方法来处理它。 :-)
关于mercurial - 检查当前目录是否在 Mercurial 下的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864579/