diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 49f60983b2cb29005438dab9b8c4f281faa68774..38091b6904dfd24c2e380b898c6848ade68f2fb3 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -118,6 +118,7 @@ export async function getJsonFile(fileName: string): Promise<any | null> {
 export async function initRepo({
   repository,
   localDir,
+  cloneSubmodules,
 }: RepoParams): Promise<RepoResult> {
   logger.debug(`initRepo("${repository}")`);
   config = { repository } as Config;
@@ -161,6 +162,7 @@ export async function initRepo({
     extraCloneOpts: azureHelper.getStorageExtraCloneOpts(opts),
     gitAuthorName: global.gitAuthor?.name,
     gitAuthorEmail: global.gitAuthor?.email,
+    cloneSubmodules,
   });
   const repoConfig: RepoResult = {
     defaultBranch,
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 60263825219551693fd9b6d665ec0875a4059cf8..23a2d6cf38fe59d40701ef2e9b54ee24bfc910d7 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -132,6 +132,7 @@ export async function getJsonFile(fileName: string): Promise<any | null> {
 export async function initRepo({
   repository,
   localDir,
+  cloneSubmodules,
 }: RepoParams): Promise<RepoResult> {
   logger.debug(
     `initRepo("${JSON.stringify({ repository, localDir }, null, 2)}")`
@@ -167,6 +168,7 @@ export async function initRepo({
     url: gitUrl,
     gitAuthorName: global.gitAuthor?.name,
     gitAuthorEmail: global.gitAuthor?.email,
+    cloneSubmodules,
   });
 
   try {
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index 651454a3d243034346914e95cbb3f0c69f459a9d..7b6d8656c5b38ed903b7c4d528b4f6f9b0790bbb 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -116,6 +116,7 @@ export async function getJsonFile(fileName: string): Promise<any | null> {
 export async function initRepo({
   repository,
   localDir,
+  cloneSubmodules,
 }: RepoParams): Promise<RepoResult> {
   logger.debug(`initRepo("${repository}")`);
   const opts = hostRules.find({
@@ -172,6 +173,7 @@ export async function initRepo({
     url,
     gitAuthorName: global.gitAuthor?.name,
     gitAuthorEmail: global.gitAuthor?.email,
+    cloneSubmodules,
   });
   const repoConfig: RepoResult = {
     defaultBranch: info.mainbranch,
diff --git a/lib/platform/common.ts b/lib/platform/common.ts
index 782514eb39735d3816361791480b70e4bf9cce8f..56e23c77e311e857eac90ccfa8e8c78ecdd96a82 100644
--- a/lib/platform/common.ts
+++ b/lib/platform/common.ts
@@ -40,6 +40,7 @@ export interface RepoParams {
   forkToken?: string;
   includeForks?: boolean;
   renovateUsername?: string;
+  cloneSubmodules?: boolean;
 }
 
 /**
diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts
index a3bca1b7f834937b4613ac6797730e7584f51ba5..9205e652175de36f6abd2138ec0fe4bfe3daca49 100644
--- a/lib/platform/gitea/index.ts
+++ b/lib/platform/gitea/index.ts
@@ -45,6 +45,7 @@ interface GiteaRepoConfig {
   issueList: Promise<Issue[]> | null;
   labelList: Promise<helper.Label[]> | null;
   defaultBranch: string;
+  cloneSubmodules: boolean;
 }
 
 const defaults = {
@@ -217,12 +218,17 @@ const platform: Platform = {
     }
   },
 
-  async initRepo({ repository, localDir }: RepoParams): Promise<RepoResult> {
+  async initRepo({
+    repository,
+    localDir,
+    cloneSubmodules,
+  }: RepoParams): Promise<RepoResult> {
     let repo: helper.Repo;
 
     config = {} as any;
     config.repository = repository;
     config.localDir = localDir;
+    config.cloneSubmodules = cloneSubmodules;
 
     // Attempt to fetch information about repository
     try {
diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts
index db12e20db1ee6a08542c718c2670c3715fe44b90..6ea1da157f0db2b7fa90fe08e3e68d84a68c010a 100644
--- a/lib/platform/github/index.ts
+++ b/lib/platform/github/index.ts
@@ -168,10 +168,11 @@ export async function initRepo({
   forkToken,
   localDir,
   renovateUsername,
+  cloneSubmodules,
 }: RepoParams): Promise<RepoResult> {
   logger.debug(`initRepo("${repository}")`);
   // config is used by the platform api itself, not necessary for the app layer to know
-  config = { localDir, repository } as any;
+  config = { localDir, repository, cloneSubmodules } as any;
   // istanbul ignore if
   if (endpoint) {
     // Necessary for Renovate Pro - do not remove
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 591fa619b92c23e747ad0aba8b7a869031a77007..fa540e786497b6b6c55baef053fedb973c58787b 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -51,6 +51,7 @@ let config: {
   issueList: GitlabIssue[];
   mergeMethod: MergeMethod;
   defaultBranch: string;
+  cloneSubmodules: boolean;
 } = {} as any;
 
 const defaults = {
@@ -153,10 +154,12 @@ export async function getJsonFile(fileName: string): Promise<any | null> {
 export async function initRepo({
   repository,
   localDir,
+  cloneSubmodules,
 }: RepoParams): Promise<RepoResult> {
   config = {} as any;
   config.repository = urlEscape(repository);
   config.localDir = localDir;
+  config.cloneSubmodules = cloneSubmodules;
 
   let res: HttpResponse<RepoResponse>;
   try {