From 3f0d1d8f4c792cc568bd43b0e355cdde116c4434 Mon Sep 17 00:00:00 2001 From: tianrking <10758833+tianrking@users.noreply.github.com> Date: Thu, 16 Jul 2026 14:19:08 +0800 Subject: [PATCH] Disable automatic Git maintenance Fixes #2437 --- __test__/git-command-manager.test.ts | 36 ++++++++++++++++++++++++++++ dist/index.js | 7 +++--- src/git-command-manager.ts | 8 +++++-- src/git-source-provider.ts | 2 +- 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/__test__/git-command-manager.test.ts b/__test__/git-command-manager.test.ts index e669c0f..d8efbe3 100644 --- a/__test__/git-command-manager.test.ts +++ b/__test__/git-command-manager.test.ts @@ -572,3 +572,39 @@ describe('git user-agent with orchestration ID', () => { ) }) }) + +describe('automatic garbage collection configuration', () => { + beforeEach(() => { + mockFileExistsSync.mockReset() + mockDirectoryExistsSync.mockReset() + mockExec.mockImplementation((path: any, args: any, options: any) => { + if (args.includes('version')) { + options.listeners.stdout(Buffer.from('git version 2.54.0')) + } + return 0 + }) + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + it('disables maintenance and legacy garbage collection', async () => { + git = await commandManager.createCommandManager('test', false, false) + + await expect(git.tryDisableAutomaticGarbageCollection()).resolves.toBe( + true + ) + + expect(mockExec).toHaveBeenCalledWith( + expect.any(String), + ['config', '--local', 'maintenance.auto', 'false'], + expect.objectContaining({ignoreReturnCode: true}) + ) + expect(mockExec).toHaveBeenCalledWith( + expect.any(String), + ['config', '--local', 'gc.auto', '0'], + expect.objectContaining({ignoreReturnCode: true}) + ) + }) +}) diff --git a/dist/index.js b/dist/index.js index b319687..f223810 100644 --- a/dist/index.js +++ b/dist/index.js @@ -35918,8 +35918,9 @@ class GitCommandManager { return output.exitCode === 0; } async tryDisableAutomaticGarbageCollection() { - const output = await this.execGit(['config', '--local', 'gc.auto', '0'], true); - return output.exitCode === 0; + const maintenanceOutput = await this.execGit(['config', '--local', 'maintenance.auto', 'false'], true); + const gcOutput = await this.execGit(['config', '--local', 'gc.auto', '0'], true); + return maintenanceOutput.exitCode === 0 && gcOutput.exitCode === 0; } async tryGetFetchUrl() { const output = await this.execGit(['config', '--local', '--get', 'remote.origin.url'], true); @@ -41889,7 +41890,7 @@ async function getSource(settings) { startGroup('Fetching submodules'); await git.submoduleSync(settings.nestedSubmodules); await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules); - await git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules); + await git.submoduleForeach('git config --local maintenance.auto false && git config --local gc.auto 0', settings.nestedSubmodules); endGroup(); // Persist credentials if (settings.persistCredentials) { diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 36cdb47..5f00dec 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -517,11 +517,15 @@ class GitCommandManager { } async tryDisableAutomaticGarbageCollection(): Promise { - const output = await this.execGit( + const maintenanceOutput = await this.execGit( + ['config', '--local', 'maintenance.auto', 'false'], + true + ) + const gcOutput = await this.execGit( ['config', '--local', 'gc.auto', '0'], true ) - return output.exitCode === 0 + return maintenanceOutput.exitCode === 0 && gcOutput.exitCode === 0 } async tryGetFetchUrl(): Promise { diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index b9c1d35..4a4b101 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -283,7 +283,7 @@ export async function getSource(settings: IGitSourceSettings): Promise { await git.submoduleSync(settings.nestedSubmodules) await git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules) await git.submoduleForeach( - 'git config --local gc.auto 0', + 'git config --local maintenance.auto false && git config --local gc.auto 0', settings.nestedSubmodules ) core.endGroup()