Materialize LFS objects with an explicit git lfs checkout

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/checkout#270
This commit is contained in:
Andrew Klotz 2026-08-06 22:49:29 +00:00
commit 579920382a
7 changed files with 36 additions and 0 deletions

View file

@ -136,6 +136,16 @@ jobs:
run: __test__/verify-sparse-checkout-non-cone-mode.sh
# LFS
# First check out without LFS so the reused worktree is left holding LFS
# pointer files; the `lfs: true` checkout below must then materialize them
# rather than leave the stale pointers in place (#270).
- name: Checkout LFS pointers (reused worktree setup)
uses: ./
with:
repository: actions/checkout # hardcoded, otherwise doesn't work from a fork
ref: test-data/v2/lfs
path: lfs
lfs: false
- name: Checkout LFS
uses: ./
with: