Skip to content

Git status not updated if the tree root is a repo subdirectory #3368

Open

Description

@ytret

Description

If I open nvim in a repo subdir, and open nvim-tree, it does not update its git status cache. In particular, untracked files stay untracked even if I track them in another terminal or nvim itself.

This is observed only if the nvim-tree is opened with a subdir as its root. If I open it in the repo root, the git status gets updated.

Neovim version

NVIM v0.12.6
Build type: Release
LuaJIT 2.1.1791988261

Operating system and version

macOS 15.7.9

Windows variant

No response

nvim-tree version

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",
      -- ADD PLUGINS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE
    },
    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({
  })
end

-- UNCOMMENT this block for diagnostics issues, substituting pattern and cmd as appropriate.
-- Requires diagnostics.enable = true in setup.
--[[
vim.api.nvim_create_autocmd("FileType", {
  pattern = "lua",
  callback = function()
    vim.lsp.start {
      name = "my-luals",
      cmd = { "lua-language-server" },
      root_dir = vim.loop.cwd(),
    }
  end,
})
]]

Steps to reproduce

  1. Create a repo with a subdir: mkdir -p /tmp/repro/subdir && git -C /tmp/repro init
  2. cd /tmp/repro/subdir && touch example.txt && nvim -nu /tmp/nvt-min.lua
  3. :NvimTreeOpen - note the star near example.txt
  4. :!git add example.txt

Expected behavior

The star near example.txt disappears

Actual behavior

The star near example.txt does not disappear

Activity

  1. alex-courtis commented on Oct 18, 2026

    @alex-courtis
    Member

    Closing as duplicate of #3366

    Please correct me if that is not the case.

  2. ytret commented on Oct 19, 2026

    @ytret
    Author

    No, this one is not a duplicate. This is the initial problem that I stumbled upon and tried to fix - the result is the one-line change in #3367. But it turns out that change fixes another problem (#3366), not this one.

    This problem is possibly caused by lua/nvim-tree/git/init.lua#L234-L237:

    local function reload_tree_at(toplevel)
      -- <...>
      local root_node = explorer:get_node_from_path(toplevel)
      if not root_node then
        return
      end
      -- <...>
    
    end

    It is called in a file watcher callback in the same file: lua/nvim-tree/git/init.lua#L295 with toplevel being the git repo root, if I understood it correctly.

    The git repo root (toplevel) is outside the tree, because the tree starts at a subdir of the repo. Due to that explorer:get_node_from_path(toplevel) returns nil, and reload_tree_at() returns prematurely, without updating the git status. Only pressing R (api.tree.reload()) causes the git update.

    I do not have a fix for this issue because I feel like this requires some architectural change with many edge cases.

  3. added and removed
    duplicateTracked via another issue
    on Oct 19, 2026
  4. alex-courtis commented on Oct 19, 2026

    @alex-courtis
    Member

    5. I do not have a fix for this issue because I feel like this requires some architectural change with many edge cases.

    Yes.

    This codepath (A) is for watched changes to the .git directory: the git status update itself.

    The regular codepath (B) e.g. reload R or a filesytem update e.g. touch example.txt or any action that results in a tree reload will correctly update the status of the file.

    This is an edge case, but still a bug. A rethink of codepath A would be needed to make it function as per B. That's quite achievable and may even be achieved by consolidating the two codepaths. As usual, contributions are most welcome.

  5. added
    PR pleasenvim-tree team does not have the bandwidth to implement; a PR will be gratefully appreciated
    on Oct 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    PR pleasenvim-tree team does not have the bandwidth to implement; a PR will be gratefully appreciatedbugSomething isn't workingreproducedIssue confirmed

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions