diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 7661e6cc53c9d4a53a51b711138bbbfef0cada8c..f11c8f540acf70c2845fa7d964df897aa5083553 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -214,6 +214,8 @@ You can also configure this field to `"mirror:x"` where `x` is the name of a pac
 Doing so means that the `package.json` `version` field will mirror whatever the version is that `x` depended on.
 Make sure that version is a pinned version of course, as otherwise it won't be valid.
 
+## cloneSubmodules
+
 ## commitBody
 
 Configure this if you wish Renovate to add a commit body, otherwise Renovate just uses a regular single-line commit.
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index 3d50d2369e01c89df22992844c105f70bb7aa48b..4b76f936e72e923f8f424f783b6eaedf2879a43f 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -1844,6 +1844,13 @@ const options: RenovateOptions[] = [
     cli: false,
     env: false,
   },
+  {
+    name: 'cloneSubmodules',
+    description:
+      'Set to false to disable initialization of submodules during repository clone',
+    type: 'boolean',
+    default: true,
+  },
 ];
 
 export function getOptions(): RenovateOptions[] {
diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts
index 6a5311fc7d4c7a4c3c98975485ad8ec279fa5c88..65ff2307fdc53f0430f677cc2819509c4a267349 100644
--- a/lib/util/git/index.spec.ts
+++ b/lib/util/git/index.spec.ts
@@ -101,6 +101,7 @@ describe('platform/git', () => {
       await repo.submoduleAdd(base.path, 'submodule');
       await repo.commit('Add submodule');
       await git.initRepo({
+        cloneSubmodules: true,
         localDir: tmpDir.path,
         url: base.path,
       });
@@ -420,6 +421,7 @@ describe('platform/git', () => {
       ]);
       await repo.commit('Add submodule');
       await git.initRepo({
+        cloneSubmodules: true,
         localDir: tmpDir.path,
         url: base.path,
       });
diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts
index 925443be3b57ce873d21d9f71140d484d0222959..7a26df73b5822f4bb1c95157388efe81940d9ccf 100644
--- a/lib/util/git/index.ts
+++ b/lib/util/git/index.ts
@@ -39,6 +39,7 @@ interface StorageConfig {
   extraCloneOpts?: GitOptions;
   gitAuthorName?: string;
   gitAuthorEmail?: string;
+  cloneSubmodules?: boolean;
 }
 
 interface LocalConfig extends StorageConfig {
@@ -263,13 +264,15 @@ export async function syncGit(): Promise<void> {
     logger.debug({ durationMs }, 'git clone completed');
   }
   config.currentBranchSha = (await git.raw(['rev-parse', 'HEAD'])).trim();
-  const submodules = await getSubmodules();
-  for (const submodule of submodules) {
-    try {
-      logger.debug(`Cloning git submodule at ${submodule}`);
-      await git.submoduleUpdate(['--init', '--', submodule]);
-    } catch (err) {
-      logger.warn(`Unable to initialise git submodule at ${submodule}`);
+  if (config.cloneSubmodules) {
+    const submodules = await getSubmodules();
+    for (const submodule of submodules) {
+      try {
+        logger.debug(`Cloning git submodule at ${submodule}`);
+        await git.submoduleUpdate(['--init', submodule]);
+      } catch (err) {
+        logger.warn(`Unable to initialise git submodule at ${submodule}`);
+      }
     }
   }
   try {