检查当前目录是否在mercurial下的最快方法?

dgu*_*uay 5 mercurial zsh

我正在尝试加快我的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"
}
Run Code Online (Sandbox Code Playgroud)

请注意,hg即使我们不在根目录中,解决方案也必须检测目录.

tor*_*rek 5

我怀疑你可以比你的脚本做得更好,除非你编写一个相同的编译程序.

使用Git的测试用git rev-parseC编码并编译成简单的二进制文件,因此运行速度非常快.Mercurial是用Python编写的,因此您需要支付Python启动费用.此外,您在Mercurial中加载的任何扩展都需要搜索扩展路径和额外的运行时加载,这使得Mercurial比Git更灵活,但速度更慢.

如果hg root是速度不够快,你可以只运行两个hg rootgit rev-parse --show-toplevel(如果需要的话,然后也许解决符号链接),看看哪一个更接近当前目录(再次用符号链接解决),如果双方成功.大概你已经尝试过这个并且速度不够快.

您可以像在示例代码中那样使用自己的路径搜索.取而代之的只是寻找.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/目录.

爬向root的搜索通常会测试和停止挂载点,因此如果$HOME/foo Git存储库,但是当前的工作目录是$HOME/foo/bar,这是一个挂载点而且这不是 Git存储库,Git将无法检测到$HOME/foo作为存储库.简单的shell内路径搜索将检测$HOME/foo为存储库.

默认情况下,Mercurial只查找.hg每个父目录中的目录,因此您在此处更加坚定.

请注意,您甚至可以拥有一个包含子目录.hg.git子目录的目录,两者都是有效的存储库(我为实验目的而这样做;它有效,它有点棘手:您将要忽略其他VCS的VCS控件文件).这可能不是你需要处理的东西,这很好,因为没有明显正确的方法来处理它.:-)