commit fa3920282da007f0ea7ce37873ccb3c1db0af0ec
parent 448f15ca396aa7007eb2c5cb82dd2ea6c5c82953
Author: Evgeni Chasnovski <evgeni.chasnovski@gmail.com>
Date: Mon, 8 Sep 2025 00:42:09 +0300
fix(pack): handle Git environment variables #35626
Problem: Some environment variables which are useful when working inside
a bare repository can affect any Git operation.
Solution: Explicitly unset problematic environment variables.
Diffstat:
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/runtime/lua/vim/pack.lua b/runtime/lua/vim/pack.lua
@@ -107,7 +107,9 @@ local M = {}
local function git_cmd(cmd, cwd)
-- Use '-c gc.auto=0' to disable `stderr` "Auto packing..." messages
cmd = vim.list_extend({ 'git', '-c', 'gc.auto=0' }, cmd)
- local sys_opts = { cwd = cwd, text = true, clear_env = true }
+ local env = vim.fn.environ() --- @type table<string,string>
+ env.GIT_DIR, env.GIT_WORK_TREE = nil, nil
+ local sys_opts = { cwd = cwd, text = true, env = env, clear_env = true }
local out = async.await(3, vim.system, cmd, sys_opts) --- @type vim.SystemCompleted
async.await(1, vim.schedule)
if out.code ~= 0 then
diff --git a/test/functional/plugin/pack_spec.lua b/test/functional/plugin/pack_spec.lua
@@ -664,6 +664,19 @@ describe('vim.pack', function()
eq('basic main', exec_lua('return require("basic")'))
end)
+ it('is not affected by special environment variables', function()
+ fn.setenv('GIT_WORK_TREE', fn.getcwd())
+ fn.setenv('GIT_DIR', vim.fs.joinpath(fn.getcwd(), '.git'))
+ local ref_environ = fn.environ()
+
+ exec_lua(function()
+ vim.pack.add({ repos_src.basic })
+ end)
+ eq('basic main', exec_lua('return require("basic")'))
+
+ eq(ref_environ, fn.environ())
+ end)
+
it('validates input', function()
local validate = function(err_pat, input)
local add_input = function()
@@ -1163,6 +1176,20 @@ describe('vim.pack', function()
eq({ 'return "fetch new 2"' }, fn.readfile(fetch_lua_file))
end)
+ it('is not affected by special environment variables', function()
+ fn.setenv('GIT_WORK_TREE', fn.getcwd())
+ fn.setenv('GIT_DIR', vim.fs.joinpath(fn.getcwd(), '.git'))
+ local ref_environ = fn.environ()
+
+ exec_lua(function()
+ vim.pack.add({ repos_src.fetch })
+ vim.pack.update({ 'fetch' }, { force = true })
+ end)
+ eq({ 'return "fetch new 2"' }, fn.readfile(fetch_lua_file))
+
+ eq(ref_environ, fn.environ())
+ end)
+
it('validates input', function()
local validate = function(err_pat, input)
local update_input = function()