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

标签 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"
}

请注意,解决方案必须检测 hg即使我们不在根目录中,也可以访问该目录。

最佳答案

我怀疑你能比你的脚本做得更好,除非你编写一个具有同等功能的编译程序。

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

如果 hg root 足够快,您可以同时运行 hg rootgit 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/

相关文章:

linux - Tmux: Pane 标题 (#T) 报告为 "fg",而不是提供更多信息的内容

ruby - 为什么 RubyMine 2018.2 检测不到我的 gem ?

version-control - 文件历史记录 : in the source or let scm handle it?

bash - 使用 pip 安装新软件包时出现 zsh 文件存在错误

svn - 将多头项目从 SVN 过渡到 HG

Mercurial 本地分支并推送到共享存储库

git - zsh : alias gco ='git checkout' 中别名子命令的 Tab 补全

terminal - 如何从终端删除 Powerlevel9k?

mercurial - Mercurial 中未添加文件夹

version-control - PCI-DSS 下的源代码存储库管理存在哪些限制(如果有)?