From f997a5995de7573e5865274864d8d1171e22b31c Mon Sep 17 00:00:00 2001 From: mchen-sentry Date: Tue, 28 Apr 2026 09:49:51 -0700 Subject: [PATCH] fix: disable git auto-gc during dependency temp-dir clone+checkout We're seeing intermittent `shutil.Error` from `_checkout_dependency`'s copytree on getsentry/sentry CI now that runners ship git 2.54.0, whose geometric maintenance default writes more commit-graph chain fragments in the background. The fragments are written via create-then-rename and race with copytree's scandir-then-copy2 walk. #312 patched the related rmtree-on-cleanup race but doesn't help here since copytree doesn't go through TemporaryDirectory's cleanup. We disable auto-gc/maintenance/commit-graph writes on the two git calls that run inside the temp dir, which stops the background bookkeeping from ever touching files we're about to copy out. --- devservices/utils/dependencies.py | 18 +++++++++++++++++- tests/utils/test_dependencies.py | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/devservices/utils/dependencies.py b/devservices/utils/dependencies.py index cc1bec8..0f1e949 100644 --- a/devservices/utils/dependencies.py +++ b/devservices/utils/dependencies.py @@ -610,6 +610,12 @@ def _checkout_dependency( _run_command( [ "git", + "-c", + "gc.auto=0", + "-c", + "maintenance.auto=false", + "-c", + "fetch.writeCommitGraph=false", "clone", "--filter=blob:none", "--no-checkout", @@ -643,7 +649,17 @@ def _checkout_dependency( try: _run_command( - ["git", "checkout", dependency.branch], + [ + "git", + "-c", + "gc.auto=0", + "-c", + "maintenance.auto=false", + "-c", + "fetch.writeCommitGraph=false", + "checkout", + dependency.branch, + ], cwd=temp_dir, ) except subprocess.CalledProcessError as e: diff --git a/tests/utils/test_dependencies.py b/tests/utils/test_dependencies.py index 2e6ed24..0e0bd11 100644 --- a/tests/utils/test_dependencies.py +++ b/tests/utils/test_dependencies.py @@ -389,6 +389,12 @@ def test_install_dependency_git_clone_failure( mock_run_command.assert_called_once_with( [ "git", + "-c", + "gc.auto=0", + "-c", + "maintenance.auto=false", + "-c", + "fetch.writeCommitGraph=false", "clone", "--filter=blob:none", "--no-checkout", @@ -449,6 +455,12 @@ def test_install_dependency_git_checkout_failure( mock.call( [ "git", + "-c", + "gc.auto=0", + "-c", + "maintenance.auto=false", + "-c", + "fetch.writeCommitGraph=false", "clone", "--filter=blob:none", "--no-checkout", @@ -460,6 +472,12 @@ def test_install_dependency_git_checkout_failure( mock.call( [ "git", + "-c", + "gc.auto=0", + "-c", + "maintenance.auto=false", + "-c", + "fetch.writeCommitGraph=false", "checkout", "main", ],