diff --git a/dist/index.js b/dist/index.js
index 765030c..c2cef21 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -4439,6 +4439,9 @@ const fshelper = __importStar(__webpack_require__(618));
 const io = __importStar(__webpack_require__(1));
 const path = __importStar(__webpack_require__(622));
 const git_version_1 = __webpack_require__(559);
+// Auth header not supported before 2.9
+// Wire protocol v2 not supported before 2.18
+exports.MinimumGitVersion = new git_version_1.GitVersion('2.18');
 function CreateCommandManager(workingDirectory, lfs) {
     return __awaiter(this, void 0, void 0, function* () {
         return yield GitCommandManager.createCommandManager(workingDirectory, lfs);
@@ -4719,12 +4722,8 @@ class GitCommandManager {
                 throw new Error('Unable to determine git version');
             }
             // Minimum git version
-            // Note:
-            // - Auth header not supported before 2.9
-            // - Wire protocol v2 not supported before 2.18
-            const minimumGitVersion = new git_version_1.GitVersion('2.18');
-            if (!gitVersion.checkMinimum(minimumGitVersion)) {
-                throw new Error(`Minimum required git version is ${minimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}`);
+            if (!gitVersion.checkMinimum(exports.MinimumGitVersion)) {
+                throw new Error(`Minimum required git version is ${exports.MinimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}`);
             }
             if (this.lfs) {
                 // Git-lfs version
@@ -4844,6 +4843,8 @@ function getSource(settings) {
             yield prepareExistingDirectory(git, settings.repositoryPath, repositoryUrl, settings.clean);
         }
         if (!git || `${1}` == '1') {
+            core.info(`Git version ${gitCommandManager.MinimumGitVersion} was not found in the PATH.`);
+            core.info(`Instead downloading the repository files using the GitHub REST API.`);
             yield githubApiHelper.downloadRepository(settings.accessToken, settings.repositoryOwner, settings.repositoryName, settings.ref, settings.repositoryPath);
         }
         else {
@@ -8087,7 +8088,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
     return result;
 };
 Object.defineProperty(exports, "__esModule", { value: true });
+const assert = __importStar(__webpack_require__(357));
+const exec = __importStar(__webpack_require__(986));
+const fs = __importStar(__webpack_require__(747));
 const github = __importStar(__webpack_require__(469));
+const path = __importStar(__webpack_require__(622));
 const IS_WINDOWS = process.platform === 'win32';
 function downloadRepository(accessToken, owner, repo, ref, repositoryPath) {
     return __awaiter(this, void 0, void 0, function* () {
@@ -8098,13 +8103,19 @@ function downloadRepository(accessToken, owner, repo, ref, repositoryPath) {
             repo: repo,
             ref: ref
         };
+        // todo: retry
         const response = yield octokit.repos.getArchiveLink(params);
         if (response.status != 200) {
-            throw new Error(`GitHub API call failed with response status '${response.status}': ${response.data}`);
+            throw new Error(`Unexpected response from GitHub API. Status: '${response.status}'; Data: '${response.data}'`);
         }
         console.log(`status=${response.status}`);
         console.log(`headers=${JSON.stringify(response.headers)}`);
         console.log(`data=${JSON.stringify(typeof response.data)}`);
+        const runnerTemp = process.env['RUNNER_TEMP'];
+        assert.ok(runnerTemp, 'RUNNER_TEMP not defined');
+        const archiveFile = path.join(runnerTemp, 'checkout.tar.gz');
+        yield fs.promises.writeFile(archiveFile, response.data);
+        yield exec.exec(`tar -xzf "${archiveFile}"`, [], { cwd: repositoryPath });
     });
 }
 exports.downloadRepository = downloadRepository;
diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts
index 6e4f22f..70dce8f 100644
--- a/src/git-command-manager.ts
+++ b/src/git-command-manager.ts
@@ -5,6 +5,10 @@ import * as io from '@actions/io'
 import * as path from 'path'
 import {GitVersion} from './git-version'
 
+// Auth header not supported before 2.9
+// Wire protocol v2 not supported before 2.18
+export const MinimumGitVersion = new GitVersion('2.18')
+
 export interface IGitCommandManager {
   branchDelete(remote: boolean, branch: string): Promise<void>
   branchExists(remote: boolean, pattern: string): Promise<boolean>
@@ -338,13 +342,9 @@ class GitCommandManager {
     }
 
     // Minimum git version
-    // Note:
-    // - Auth header not supported before 2.9
-    // - Wire protocol v2 not supported before 2.18
-    const minimumGitVersion = new GitVersion('2.18')
-    if (!gitVersion.checkMinimum(minimumGitVersion)) {
+    if (!gitVersion.checkMinimum(MinimumGitVersion)) {
       throw new Error(
-        `Minimum required git version is ${minimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}`
+        `Minimum required git version is ${MinimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}`
       )
     }
 
diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts
index f96cd5d..487a8ee 100644
--- a/src/git-source-provider.ts
+++ b/src/git-source-provider.ts
@@ -79,6 +79,12 @@ export async function getSource(settings: ISourceSettings): Promise<void> {
   }
 
   if (!git || `${1}` == '1') {
+    core.info(
+      `Git version ${gitCommandManager.MinimumGitVersion} was not found in the PATH.`
+    )
+    core.info(
+      `Instead downloading the repository files using the GitHub REST API.`
+    )
     await githubApiHelper.downloadRepository(
       settings.accessToken,
       settings.repositoryOwner,
diff --git a/src/github-api-helper.ts b/src/github-api-helper.ts
index 44fdd73..aa4ded2 100644
--- a/src/github-api-helper.ts
+++ b/src/github-api-helper.ts
@@ -1,5 +1,13 @@
+import * as assert from 'assert'
+import * as core from '@actions/core'
+import * as exec from '@actions/exec'
+import * as fs from 'fs'
 import * as github from '@actions/github'
+import * as io from '@actions/io'
+import * as path from 'path'
 import {ReposGetArchiveLinkParams} from '@octokit/rest'
+import {defaultCoreCipherList} from 'constants'
+import {ExecOptions} from '@actions/exec/lib/interfaces'
 
 const IS_WINDOWS = process.platform === 'win32'
 
@@ -17,13 +25,21 @@ export async function downloadRepository(
     repo: repo,
     ref: ref
   }
+  // todo: retry
   const response = await octokit.repos.getArchiveLink(params)
   if (response.status != 200) {
     throw new Error(
-      `GitHub API call failed with response status '${response.status}': ${response.data}`
+      `Unexpected response from GitHub API. Status: '${response.status}'; Data: '${response.data}'`
     )
   }
   console.log(`status=${response.status}`)
   console.log(`headers=${JSON.stringify(response.headers)}`)
   console.log(`data=${JSON.stringify(typeof response.data)}`)
+  const runnerTemp = process.env['RUNNER_TEMP'] as string
+  assert.ok(runnerTemp, 'RUNNER_TEMP not defined')
+  const archiveFile = path.join(runnerTemp, 'checkout.tar.gz')
+  await fs.promises.writeFile(archiveFile, response.data)
+  await exec.exec(`tar -xzf "${archiveFile}"`, [], {
+    cwd: repositoryPath
+  } as ExecOptions)
 }