Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

E367: No such group "--Deleted--" in Explorer:destroy when core.init is re-entered during a git runner wait

未关闭
#3,363 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
48/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
git, lua, neovim
领域
tooling

调研方向

Start with lua/nvim-tree/explorer/init.lua around Explorer:destroy and new, then trace the reentrant initialization through lua/nvim-tree/core.lua and the git runner wait. Reproduce with the two repositories and delayed git wrapper from the issue. Done when changing the tree root to /tmp/nvt-b during the wait no longer raises E367.

由索引模型根据 Issue 内容生成。

描述

bug reproduced
Description

Opening a file in a directory that is not under the tree root can fail with:

E367: No such group: "--Deleted--" at explorer/init.lua:81 (Explorer:destroy)

The failure is intermittent. It occurs when a global :cd (e.g. from
project.nvim on BufEnter) changes the working directory to another project
while the tree is rooted elsewhere. A slow git status (large repository) makes it more likely.

Neovim version
NVIM v0.12.6
Build type: RelWithDebInfo
LuaJIT 2.1.1788856981
Operating system and version

Linux 7.2.9-arch1-1

Windows variant

No response

nvim-tree version

master 355bcc8

Clean room replication
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

vim.cmd([[set runtimepath=$VIMRUNTIME]])
vim.cmd([[set packpath=/tmp/nvt-min/site]])
local package_root = "/tmp/nvt-min/site/pack"
local install_path = package_root .. "/packer/start/packer.nvim"
local function load_plugins()
  require("packer").startup({
    {
      "wbthomason/packer.nvim",
      "nvim-tree/nvim-tree.lua",
      "nvim-tree/nvim-web-devicons",
    },
    config = {
      package_root = package_root,
      compile_path = install_path .. "/plugin/packer_compiled.lua",
      display = { non_interactive = true },
    },
  })
end
if vim.fn.isdirectory(install_path) == 0 then
  print("Installing nvim-tree and dependencies.")
  vim.fn.system({ "git", "clone", "--depth=1", "https://github.com/wbthomason/packer.nvim", install_path })
end
load_plugins()
require("packer").sync()
vim.cmd([[autocmd User PackerComplete ++once echo "Ready!" | lua setup()]])
vim.opt.termguicolors = true
vim.opt.cursorline = true

-- MODIFY NVIM-TREE SETTINGS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE
_G.setup = function()
  require("nvim-tree").setup({
    -- legacy `update_cwd = true` migrates to this
    sync_root_with_cwd = true,
    -- legacy `update_focused_file = { enable = true, update_cwd = true }` migrates to this
    update_focused_file = { enable = true, update_root = { enable = true } },
  })

  -- simulate project.nvim, which performs a global :cd to the project root on BufEnter
  vim.api.nvim_create_autocmd("BufEnter", {
    callback = function()
      if vim.bo.buftype == "" and vim.fn.filereadable(vim.fn.expand("%:p")) == 1 then
        vim.schedule(function()
          vim.cmd("cd /tmp/nvt-b")
        end)
      end
    end,
  })
end
Steps to reproduce

Two git repositories are necessary: the tree is opened in the first and a
file is edited in the second. A git wrapper delays every git invocation by
200ms to deterministically widen the race window between the 15ms debounce
and the git job; on a sufficiently large/slow repository the wrapper is not
required.

mkdir -p /tmp/nvt-a /tmp/nvt-b
cd /tmp/nvt-a && git init -q && git commit -q --allow-empty -m a
cd /tmp/nvt-b && git init -q && echo x > f.txt && git add f.txt && git commit -qm b
mkdir -p /tmp/nvt-bin
printf '#!/bin/sh\nsleep 0.2\nexec git "$@"\n' > /tmp/nvt-bin/git
chmod +x /tmp/nvt-bin/git
cd /tmp/nvt-a
PATH=/tmp/nvt-bin:$PATH nvim -nu /tmp/nvt-min.lua

In neovim,

  1. :NvimTreeOpen
  2. <C-w>p to focus the original window (tree open, not focused)
  3. :edit /tmp/nvt-b/f.txt
Expected behavior

Tree root changes to /tmp/nvt-b without error.

Actual behavior
vim.schedule callback: .../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:81: Vim:E367: No such group: "--Deleted--"
stack traceback:
	[C]: in function 'nvim_del_augroup_by_id'
	.../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:81: in function 'destroy'
	.../nvim-tree.lua/lua/nvim-tree/core.lua:19: in function 'init'
	.../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:806: in function 'force_dirchange'
	.../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:839: in function 'change_dir'
	.../nvim-tree.lua/lua/nvim-tree/actions/tree/change-root.lua:42: in function 'fn'
	.../nvim-tree.lua/lua/nvim-tree/actions/tree/find-file.lua:62: in function 'fn'
	.../nvim-tree.lua/lua/nvim-tree/autocmd.lua:68: in function 'callback'
	.../nvim-tree.lua/lua/nvim-tree/utils.lua:351: in function <.../nvim-tree.lua/lua/nvim-tree/utils.lua:350>
	[C]: in function 'wait'
	.../nvim-tree.lua/lua/nvim-tree/git/runner.lua:209: in function 'wait'
	...
	.../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:75: in function 'new'
	.../nvim-tree.lua/lua/nvim-tree/classic.lua:186: in function <.../nvim-tree.lua/lua/nvim-tree/classic.lua:184>
	.../nvim-tree.lua/lua/nvim-tree/core.lua:30: in function 'init'
	.../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:806: in function 'force_dirchange'
	.../nvim-tree.lua/lua/nvim-tree/explorer/init.lua:839: in function 'change_dir'
	.../nvim-tree.lua/lua/nvim-tree/actions/tree/change-dir.lua:11: in function 'fn'
	.../nvim-tree.lua/lua/nvim-tree/autocmd.lua:55: in function <.../nvim-tree.lua/lua/nvim-tree/autocmd.lua:54>
	[C]: in function 'nvim_exec2'
主要语言
Lua
星标
8.7k
派生
639
平均合并
8 小时 25 分钟
30 天内合并 PR
3

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

nvim-tree/nvim-tree.lua 的其他 Issue

查看 nvim-tree/nvim-tree.lua 的全部 Issue

相似的 Issue

更多 Lua Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。