我试图加快我的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
目录。
答案 0 :(得分:5)
我怀疑你可以比你的脚本做得更好,除非你编写了一个相同的编译程序。
Git的测试,使用git rev-parse
,用C编码并编译成一个简单的二进制文件,因此运行得非常快。 Mercurial是用Python编写的,因此您需要支付Python启动费用。此外,您在Mercurial中加载的任何扩展都需要搜索扩展路径和额外的运行时加载,这使得Mercurial比Git更灵活,但速度更慢。
如果hg root
足够快,您可以同时运行hg root
和git rev-parse --show-toplevel
(如果需要,可以解析符号链接)并查看哪一个更接近当前目录(再次解决符号链接),如果两者都成功。大概你已经尝试过这个并且速度不够快。
您可以像在示例代码中那样使用自己的路径搜索。但是,您可以搜索.hg
和.hg
,而不是只是搜索.git
,并在找到任何一个时停止。许多shell有许多提示库,其中有几个使用这种方法。
所有方法都有点容易出错,特别是因为可能在Mercurial存储库中有一个Git存储库,反之亦然(例如,/path/to/current/working/dir
可能是current
级别的Mercurial和Git在dir
级别,反之亦然)。同时,.git
目录的存在不足以保证您在有效的Git工作树中。例如,Git认为目录只是在以下情况下才是存储库:
$GIT_DIR
; Mercurial似乎没有覆盖Git方式的环境变量;如果没有$GIT_DIR
,则从当前目录开始并爬上需要的话);和HEAD
的文件;和refs
目录;和$GIT_OBJECT_DIRECTORY
指向目录,或找到的目录包含objects/
目录。攀登到root的搜索通常会测试并停止在挂载点,因此如果$HOME/foo
是一个Git存储库,但您当前的工作目录是{{1这是一个挂载点,这是不一个Git存储库,Git不会将$HOME/foo/bar
检测为存储库。简单的shell外路径搜索会将$HOME/foo
检测为存储库。
默认情况下,Mercurial只查找每个父目录中的$HOME/foo
目录,因此您可以在此处更加坚定。
请注意,您甚至可以拥有一个同时具有.hg
和.hg
个子目录的目录,两个都是有效的存储库(我已经为了实验目的而这样做了;它有效,它只是一点点棘手:您将要忽略其他VCS的VCS控制文件)。这可能不是你需要处理的东西,这很好,因为没有明显正确的方法来处理它。 : - )
答案 1 :(得分:0)
我将使用hg id
,它也可以有效地设置返回码。