From 25d6c12a40fe31e2e7ea716a2facc3bbae34a8a2 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 7 Jun 2023 13:37:50 +0200 Subject: [PATCH] Support sparse checkout/LFS better Instead of fetching all the LFS objects present in the current revision in a sparse checkout, whether they are needed inside the sparse cone or not, let's instead only pull the ones that are actually needed. To do that, let's avoid running that preemptive `git lfs fetch` call in case of a sparse checkout. An alternative that was considered during the development of this patch (and ultimately rejected) was to use `git lfs pull --include ...`, but it turned out to be too inflexible because it requires exact paths, not the patterns that are available via the sparse checkout definition, and that risks running into command-line length limitations. Signed-off-by: Johannes Schindelin --- dist/index.js | 3 ++- src/git-source-provider.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 766bb5544..455629582 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1267,7 +1267,8 @@ function getSource(settings) { // LFS fetch // Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time). // Explicit lfs fetch will fetch lfs objects in parallel. - if (settings.lfs) { + // For sparse checkouts, let `checkout` fetch the needed objects lazily. + if (settings.lfs && !settings.sparseCheckout) { core.startGroup('Fetching LFS objects'); yield git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref); core.endGroup(); diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index 967097d58..8f9d63f55 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -188,7 +188,8 @@ export async function getSource(settings: IGitSourceSettings): Promise { // LFS fetch // Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time). // Explicit lfs fetch will fetch lfs objects in parallel. - if (settings.lfs) { + // For sparse checkouts, let `checkout` fetch the needed objects lazily. + if (settings.lfs && !settings.sparseCheckout) { core.startGroup('Fetching LFS objects') await git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref) core.endGroup()