diff --git a/README.md b/README.md
index 9c56a6f..90eef49 100644
--- a/README.md
+++ b/README.md
@@ -93,6 +93,11 @@ Refer [here](https://github.com/actions/checkout/blob/v1/README.md) for previous
     # Default: 1
     fetch-depth: ''
 
+    # Number of fetches to perform simultaneously when updating submodules. 0
+    # indicates default (serial updates).
+    # Default: 0
+    fetch-jobs: ''
+
     # Whether to download Git-LFS files
     # Default: false
     lfs: ''
diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts
index 2b4830c..889e2b6 100644
--- a/__test__/git-auth-helper.test.ts
+++ b/__test__/git-auth-helper.test.ts
@@ -760,6 +760,7 @@ async function setup(testName: string): Promise<void> {
     clean: true,
     commit: '',
     fetchDepth: 1,
+    fetchJobs: 0,
     lfs: false,
     submodules: false,
     nestedSubmodules: false,
diff --git a/__test__/input-helper.test.ts b/__test__/input-helper.test.ts
index 920bc8e..d9da8b9 100644
--- a/__test__/input-helper.test.ts
+++ b/__test__/input-helper.test.ts
@@ -75,6 +75,7 @@ describe('input-helper tests', () => {
     expect(settings.commit).toBeTruthy()
     expect(settings.commit).toBe('1234567890123456789012345678901234567890')
     expect(settings.fetchDepth).toBe(1)
+    expect(settings.fetchJobs).toBe(0)
     expect(settings.lfs).toBe(false)
     expect(settings.ref).toBe('refs/heads/some-ref')
     expect(settings.repositoryName).toBe('some-repo')
diff --git a/action.yml b/action.yml
index 91d3982..1abd5c8 100644
--- a/action.yml
+++ b/action.yml
@@ -56,6 +56,9 @@ inputs:
   fetch-depth:
     description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.'
     default: 1
+  fetch-jobs:
+    description: 'Number of fetches to perform simultaneously when updating submodules. 0 indicates default (serial updates).'
+    default: 0
   lfs:
     description: 'Whether to download Git-LFS files'
     default: false
diff --git a/dist/index.js b/dist/index.js
index ae64f3f..2faf9a2 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -5939,7 +5939,7 @@ class GitCommandManager {
             yield this.execGit(args);
         });
     }
-    submoduleUpdate(fetchDepth, recursive) {
+    submoduleUpdate(fetchDepth, recursive, fetchJobs) {
         return __awaiter(this, void 0, void 0, function* () {
             const args = ['-c', 'protocol.version=2'];
             args.push('submodule', 'update', '--init', '--force');
@@ -5949,6 +5949,9 @@ class GitCommandManager {
             if (recursive) {
                 args.push('--recursive');
             }
+            if (fetchJobs > 0) {
+                args.push(`--jobs=${fetchJobs}`);
+            }
             yield this.execGit(args);
         });
     }
@@ -6252,7 +6255,7 @@ function getSource(settings) {
                     // Checkout submodules
                     core.startGroup('Fetching submodules');
                     yield git.submoduleSync(settings.nestedSubmodules);
-                    yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules);
+                    yield git.submoduleUpdate(settings.fetchDepth, settings.nestedSubmodules, settings.fetchJobs);
                     yield git.submoduleForeach('git config --local gc.auto 0', settings.nestedSubmodules);
                     core.endGroup();
                     // Persist credentials
@@ -14567,6 +14570,12 @@ function getInputs() {
         result.fetchDepth = 0;
     }
     core.debug(`fetch depth = ${result.fetchDepth}`);
+    // Fetch jobs
+    result.fetchJobs = Math.floor(Number(core.getInput('fetch-jobs') || '0'));
+    if (isNaN(result.fetchJobs) || result.fetchJobs < 0) {
+        result.fetchJobs = 0;
+    }
+    core.debug(`fetch jobs = ${result.fetchJobs}`);
     // LFS
     result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE';
     core.debug(`lfs = ${result.lfs}`);
diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts
index 059e3d8..92dc3f3 100644
--- a/src/git-command-manager.ts
+++ b/src/git-command-manager.ts
@@ -39,7 +39,11 @@ export interface IGitCommandManager {
   shaExists(sha: string): Promise<boolean>
   submoduleForeach(command: string, recursive: boolean): Promise<string>
   submoduleSync(recursive: boolean): Promise<void>
-  submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void>
+  submoduleUpdate(
+    fetchDepth: number,
+    recursive: boolean,
+    fetchJobs: number
+  ): Promise<void>
   tagExists(pattern: string): Promise<boolean>
   tryClean(): Promise<boolean>
   tryConfigUnset(configKey: string, globalConfig?: boolean): Promise<boolean>
@@ -308,7 +312,11 @@ class GitCommandManager {
     await this.execGit(args)
   }
 
-  async submoduleUpdate(fetchDepth: number, recursive: boolean): Promise<void> {
+  async submoduleUpdate(
+    fetchDepth: number,
+    recursive: boolean,
+    fetchJobs: number
+  ): Promise<void> {
     const args = ['-c', 'protocol.version=2']
     args.push('submodule', 'update', '--init', '--force')
     if (fetchDepth > 0) {
@@ -319,6 +327,10 @@ class GitCommandManager {
       args.push('--recursive')
     }
 
+    if (fetchJobs > 0) {
+      args.push(`--jobs=${fetchJobs}`)
+    }
+
     await this.execGit(args)
   }
 
diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts
index 366ff33..eea6624 100644
--- a/src/git-source-provider.ts
+++ b/src/git-source-provider.ts
@@ -181,7 +181,8 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
         await git.submoduleSync(settings.nestedSubmodules)
         await git.submoduleUpdate(
           settings.fetchDepth,
-          settings.nestedSubmodules
+          settings.nestedSubmodules,
+          settings.fetchJobs
         )
         await git.submoduleForeach(
           'git config --local gc.auto 0',
diff --git a/src/git-source-settings.ts b/src/git-source-settings.ts
index 2786222..f5f529a 100644
--- a/src/git-source-settings.ts
+++ b/src/git-source-settings.ts
@@ -34,6 +34,11 @@ export interface IGitSourceSettings {
    */
   fetchDepth: number
 
+  /**
+   * The number of fetches to perform simultaneously when updating submodules
+   */
+  fetchJobs: number
+
   /**
    * Indicates whether to fetch LFS objects
    */
diff --git a/src/input-helper.ts b/src/input-helper.ts
index 4c05d6e..8767899 100644
--- a/src/input-helper.ts
+++ b/src/input-helper.ts
@@ -88,6 +88,13 @@ export function getInputs(): IGitSourceSettings {
   }
   core.debug(`fetch depth = ${result.fetchDepth}`)
 
+  // Fetch jobs
+  result.fetchJobs = Math.floor(Number(core.getInput('fetch-jobs') || '0'))
+  if (isNaN(result.fetchJobs) || result.fetchJobs < 0) {
+    result.fetchJobs = 0
+  }
+  core.debug(`fetch jobs = ${result.fetchJobs}`)
+
   // LFS
   result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE'
   core.debug(`lfs = ${result.lfs}`)