Skip to content

Fix unmaterialized LFS files on persistent/self-hosted runners - #2552

Open
KlotzAndrew wants to merge 1 commit into
actions:mainfrom
KlotzAndrew:fix/lfs-checkout-persistent-runners
Open

Fix unmaterialized LFS files on persistent/self-hosted runners#2552
KlotzAndrew wants to merge 1 commit into
actions:mainfrom
KlotzAndrew:fix/lfs-checkout-persistent-runners

Conversation

@KlotzAndrew

@KlotzAndrew KlotzAndrew commented Aug 6, 2026

Copy link
Copy Markdown

Problem

On persistent/self-hosted runners that reuse a working directory across jobs, LFS-tracked files can be left as pointer files instead of real content when a lfs: false checkout precedes a lfs: true checkout of the same repo.

Sequence that triggers it:

  1. A lfs: false run sets GIT_LFS_SKIP_SMUDGE=1, so git checkout writes LFS files to the working tree as pointers.
  2. A later lfs: true run on the same worktree fetches the objects into .git/lfs, but git checkout sees the tree already at the target commit and does not re-smudge the already-present pointer files.

Result: the objects are in the local cache, but the working tree still contains pointers. The action relies on the smudge filter firing during git checkout to materialize content - which holds on a clean tree (GitHub-hosted runners) but not on a reused one.

Related: #270

@KlotzAndrew KlotzAndrew changed the title Materialize LFS objects with an explicit git lfs checkout Fix unmaterialized LFS files on persistent/self-hosted runners Aug 6, 2026
Problem

On persistent/self-hosted runners that reuse a working directory across jobs, LFS-tracked files can be left as pointer files instead of real content when a lfs: false checkout precedes a lfs: true checkout of the same repo.

Sequence that triggers it:
 1. A lfs: false run sets GIT_LFS_SKIP_SMUDGE=1, so git checkout writes LFS files to the working tree as pointers.
 2. A later lfs: true run on the same worktree fetches the objects into .git/lfs, but git checkout sees the tree already at the target commit and does not re-smudge the already-present pointer files.

Result: the objects are in the local cache, but the working tree still contains pointers. The action relies on the smudge filter firing during git checkout to materialize content — which holds on a clean tree (GitHub-hosted runners) but not on a reused one.

Related: actions#270
@KlotzAndrew
KlotzAndrew force-pushed the fix/lfs-checkout-persistent-runners branch from 604bd60 to 5799203 Compare August 6, 2026 23:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant