Repository navigation
Git status not updated if the tree root is a repo subdirectory #3368
Copy link
Copy link
Open
Labels
PR pleasenvim-tree team does not have the bandwidth to implement; a PR will be gratefully appreciatednvim-tree team does not have the bandwidth to implement; a PR will be gratefully appreciatedbugSomething isn't workingSomething isn't workingreproducedIssue confirmedIssue confirmed
Description
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
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
- Create a repo with a subdir:
mkdir -p /tmp/repro/subdir && git -C /tmp/repro init cd /tmp/repro/subdir && touch example.txt && nvim -nu /tmp/nvt-min.lua:NvimTreeOpen- note the star nearexample.txt:!git add example.txt
Expected behavior
The star near example.txt disappears
Actual behavior
The star near example.txt does not disappear
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
PR pleasenvim-tree team does not have the bandwidth to implement; a PR will be gratefully appreciatednvim-tree team does not have the bandwidth to implement; a PR will be gratefully appreciatedbugSomething isn't workingSomething isn't workingreproducedIssue confirmedIssue confirmed
Activity
alex-courtis commentedon Oct 18, 2026
Closing as duplicate of #3366
Please correct me if that is not the case.
ytret commentedon Oct 19, 2026
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:
It is called in a file watcher callback in the same file: lua/nvim-tree/git/init.lua#L295 with
toplevelbeing 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 thatexplorer:get_node_from_path(toplevel)returnsnil, andreload_tree_at()returns prematurely, without updating the git status. Only pressingR(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.
alex-courtis commentedon Oct 19, 2026
Yes.
This codepath (A) is for watched changes to the
.gitdirectory: the git status update itself.The regular codepath (B) e.g. reload
Ror a filesytem update e.g.touch example.txtor 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.