diff --git a/lib/datasource/api.ts b/lib/datasource/api.ts
index 3c212ed5f03367ad7cf1fff8e823ddb200726252..c7b07b8777fed5beaea8b74ce30bb4fb1625f7a9 100644
--- a/lib/datasource/api.ts
+++ b/lib/datasource/api.ts
@@ -6,7 +6,6 @@ import * as dart from './dart';
 import * as docker from './docker';
 import * as galaxy from './galaxy';
 import * as gitRefs from './git-refs';
-import * as gitSubmodules from './git-submodules';
 import * as gitTags from './git-tags';
 import * as githubReleases from './github-releases';
 import * as githubTags from './github-tags';
@@ -43,7 +42,6 @@ api.set('dart', dart);
 api.set('docker', docker);
 api.set('galaxy', galaxy);
 api.set('git-refs', gitRefs);
-api.set('git-submodules', gitSubmodules);
 api.set('git-tags', gitTags);
 api.set('github-releases', githubReleases);
 api.set('github-tags', githubTags);
diff --git a/lib/datasource/git-submodules/index.spec.ts b/lib/datasource/git-submodules/index.spec.ts
deleted file mode 100644
index da5b3b2c4d5a5431aaa1f7215374e2141dec3858..0000000000000000000000000000000000000000
--- a/lib/datasource/git-submodules/index.spec.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import _simpleGit from 'simple-git';
-import { getPkgReleases } from '..';
-import { id as versioning } from '../../versioning/git';
-import { id as datasource, getDigest } from '.';
-
-jest.mock('simple-git');
-const simpleGit: any = _simpleGit;
-
-const depName = 'https://github.com/example/example.git';
-const registryUrls = [depName, 'master'];
-
-describe('datasource/git-submoduless', () => {
-  describe('getReleases', () => {
-    it('returns null if response is wrong', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          return Promise.resolve(null);
-        },
-      });
-      const versions = await getPkgReleases({
-        datasource,
-        versioning,
-        depName,
-        registryUrls,
-      });
-      expect(versions).toBeNull();
-    });
-    it('returns null if remote call throws exception', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          throw new Error();
-        },
-      });
-      const versions = await getPkgReleases({
-        datasource,
-        versioning,
-        depName,
-        registryUrls,
-      });
-      expect(versions).toBeNull();
-    });
-    it('returns versions filtered from tags', async () => {
-      simpleGit.mockReturnValue({
-        listRemote() {
-          return Promise.resolve('commithash1\trefs/heads/master');
-        },
-      });
-
-      const versions = await getPkgReleases({
-        datasource,
-        versioning,
-        depName,
-        registryUrls,
-      });
-      const result = versions.releases.map((x) => x.version).sort();
-      expect(result).toEqual(['commithash1']);
-    });
-  });
-  describe('getDigest', () => {
-    it('returns null if passed null', async () => {
-      const digest = await getDigest({}, null);
-      expect(digest).toBeNull();
-    });
-    it('returns value if passed value', async () => {
-      const commitHash = 'commithash1';
-      const digest = await getDigest({}, commitHash);
-      expect(digest).toEqual(commitHash);
-    });
-  });
-});
diff --git a/lib/datasource/git-submodules/index.ts b/lib/datasource/git-submodules/index.ts
deleted file mode 100644
index 93b8996e32b79296cb5a8b1dd9c1d7fee79b3ffb..0000000000000000000000000000000000000000
--- a/lib/datasource/git-submodules/index.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import { URL } from 'url';
-import Git from 'simple-git';
-
-import * as packageCache from '../../util/cache/package';
-import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types';
-
-export const id = 'git-submodules';
-
-export const defaultConfig = {
-  pinDigests: false,
-};
-
-export async function getReleases({
-  lookupName,
-  registryUrls,
-}: GetReleasesConfig): Promise<ReleaseResult | null> {
-  const cacheNamespace = 'datasource-git-submodules';
-  const cacheKey = `${registryUrls[0]}-${registryUrls[1]}`;
-  const cachedResult = await packageCache.get<ReleaseResult>(
-    cacheNamespace,
-    cacheKey
-  );
-  // istanbul ignore if
-  if (cachedResult) {
-    return cachedResult;
-  }
-
-  const git = Git();
-  const newHash = (
-    await git.listRemote(['--refs', registryUrls[0], registryUrls[1]])
-  )
-    .trim()
-    .split(/\t/)[0];
-
-  const sourceUrl = new URL(registryUrls[0]);
-  sourceUrl.username = '';
-
-  const result = {
-    sourceUrl: sourceUrl.href,
-    releases: [
-      {
-        version: newHash,
-      },
-    ],
-  };
-  const cacheMinutes = 60;
-  await packageCache.set(cacheNamespace, cacheKey, result, cacheMinutes);
-  return result;
-}
-
-export const getDigest = (
-  config: DigestConfig,
-  newValue?: string
-): Promise<string> => Promise.resolve(newValue);
diff --git a/lib/manager/git-submodules/extract.spec.ts b/lib/manager/git-submodules/extract.spec.ts
index 41243f50a2ea6b7906a0fe5e6829f5eaff7eba30..59cc242dd0621c7f60804508fb6ff14c8a7cf15e 100644
--- a/lib/manager/git-submodules/extract.spec.ts
+++ b/lib/manager/git-submodules/extract.spec.ts
@@ -50,14 +50,14 @@ describe('lib/manager/gitsubmodules/extract', () => {
       ).toBeNull();
       res = await extractPackageFile('', '.gitmodules.2', { localDir });
       expect(res.deps).toHaveLength(1);
-      expect(res.deps[0].registryUrls[1]).toEqual('main');
+      expect(res.deps[0].currentValue).toEqual('main');
       res = await extractPackageFile('', '.gitmodules.3', { localDir });
       expect(res.deps).toHaveLength(1);
       res = await extractPackageFile('', '.gitmodules.4', { localDir });
       expect(res.deps).toHaveLength(1);
       res = await extractPackageFile('', '.gitmodules.5', { localDir });
       expect(res.deps).toHaveLength(3);
-      expect(res.deps[2].registryUrls[0]).toEqual(
+      expect(res.deps[2].lookupName).toEqual(
         'https://github.com/renovatebot/renovate-config.git'
       );
     });
diff --git a/lib/manager/git-submodules/extract.ts b/lib/manager/git-submodules/extract.ts
index 1db9535bd5559d457d31673f31481d8fbb1f5265..ee53dc5c707853b1e82aaba7eb439c238de86b97 100644
--- a/lib/manager/git-submodules/extract.ts
+++ b/lib/manager/git-submodules/extract.ts
@@ -1,7 +1,7 @@
 import URL from 'url';
 import Git, { SimpleGit } from 'simple-git';
 import upath from 'upath';
-import * as datasourceGitSubmodules from '../../datasource/git-submodules';
+import * as datasourceGitRefs from '../../datasource/git-refs';
 import { logger } from '../../logger';
 import { getHttpUrl } from '../../util/git';
 import * as hostRules from '../../util/host-rules';
@@ -105,7 +105,7 @@ export default async function extractPackageFile(
     await Promise.all(
       depNames.map(async ({ name, path }) => {
         try {
-          const [currentValue] = (await git.subModule(['status', path]))
+          const [currentDigest] = (await git.subModule(['status', path]))
             .trim()
             .replace(/^[-+]/, '')
             .split(/\s/);
@@ -115,16 +115,16 @@ export default async function extractPackageFile(
           let httpSubModuleUrl = getHttpUrl(subModuleUrl);
           const hostRule = hostRules.find({ url: httpSubModuleUrl });
           httpSubModuleUrl = getHttpUrl(subModuleUrl, hostRule?.token);
-          const submoduleBranch = await getBranch(
+          const currentValue = await getBranch(
             gitModulesPath,
             name,
             httpSubModuleUrl
           );
           return {
             depName: path,
-            registryUrls: [httpSubModuleUrl, submoduleBranch],
+            lookupName: httpSubModuleUrl,
             currentValue,
-            currentDigest: currentValue,
+            currentDigest,
           };
         } catch (err) /* istanbul ignore next */ {
           logger.warn(
@@ -137,5 +137,5 @@ export default async function extractPackageFile(
     )
   ).filter(Boolean);
 
-  return { deps, datasource: datasourceGitSubmodules.id };
+  return { deps, datasource: datasourceGitRefs.id };
 }
diff --git a/lib/manager/git-submodules/update.ts b/lib/manager/git-submodules/update.ts
index b1d1104cfc51e0c8b1b33b1182b6caee0ea80920..f9694bf4684a5edb6ca5fe34fce85c9839271e40 100644
--- a/lib/manager/git-submodules/update.ts
+++ b/lib/manager/git-submodules/update.ts
@@ -11,7 +11,7 @@ export default async function updateDependency({
 
   try {
     await git.submoduleUpdate(['--init', upgrade.depName]);
-    await submoduleGit.checkout([upgrade.newVersion]);
+    await submoduleGit.checkout([upgrade.newDigest]);
     return fileContent;
   } catch (err) {
     return null;
diff --git a/lib/workers/branch/get-updated.spec.ts b/lib/workers/branch/get-updated.spec.ts
index feda05a09c79cc9d10dbe437ca5335c2a28c3e2e..c02094f945624b9f2fafb7535f370e2e3469c4c2 100644
--- a/lib/workers/branch/get-updated.spec.ts
+++ b/lib/workers/branch/get-updated.spec.ts
@@ -1,5 +1,5 @@
 import { defaultConfig, git, mocked } from '../../../test/util';
-import * as datasourceGitSubmodules from '../../datasource/git-submodules';
+import * as datasourceGitRefs from '../../datasource/git-refs';
 import * as _composer from '../../manager/composer';
 import * as _gitSubmodules from '../../manager/git-submodules';
 import * as _helmv3 from '../../manager/helmv3';
@@ -172,7 +172,7 @@ describe('workers/branch/get-updated', () => {
     it('handles git submodules', async () => {
       config.upgrades.push({
         manager: 'git-submodules',
-        datasource: datasourceGitSubmodules.id,
+        datasource: datasourceGitRefs.id,
       } as never);
       gitSubmodules.updateDependency.mockResolvedValueOnce('existing content');
       const res = await getUpdatedPackageFiles(config);
diff --git a/lib/workers/branch/get-updated.ts b/lib/workers/branch/get-updated.ts
index b3bc9d3f2dc2fb581c852d6bfb9c04942574cbb4..069ec69b0def6f247ce601909652d8a29460710e 100644
--- a/lib/workers/branch/get-updated.ts
+++ b/lib/workers/branch/get-updated.ts
@@ -1,6 +1,5 @@
 import is from '@sindresorhus/is';
 import { WORKER_FILE_UPDATE_FAILED } from '../../constants/error-messages';
-import * as datasourceGitSubmodules from '../../datasource/git-submodules';
 import { logger } from '../../logger';
 import { get } from '../../manager';
 import type { ArtifactError } from '../../manager/types';
@@ -177,7 +176,7 @@ export async function getUpdatedPackageFiles(
       }
       if (newContent === packageFileContent) {
         // istanbul ignore else
-        if (upgrade.datasource === datasourceGitSubmodules.id) {
+        if (upgrade.manager === 'git-submodules') {
           updatedFileContents[packageFile] = newContent;
         } else if (upgrade.rangeStrategy === 'update-lockfile') {
           nonUpdatedFileContents[packageFile] = newContent;
diff --git a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
index c776eb437b286c97f1efe303b2f986a3967b3b9a..4949a7f74b6b6448376afbb1dd099524ee8f58f9 100644
--- a/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
+++ b/lib/workers/repository/process/lookup/__snapshots__/index.spec.ts.snap
@@ -256,8 +256,10 @@ Object {
   "updates": Array [
     Object {
       "currentVersion": undefined,
-      "newValue": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
-      "newVersion": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
+      "newDigest": "4b825dc642cb6eb9a060e54bf8d69288fbee4904",
+      "newDigestShort": "4b825dc",
+      "newValue": undefined,
+      "newVersion": undefined,
       "updateType": "digest",
     },
   ],
diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts
index 97f1b4a5396975aec04c577570629e6a157a2da9..eb9c5d866ffa2e74d605557938eeee32b34dc069 100644
--- a/lib/workers/repository/process/lookup/index.spec.ts
+++ b/lib/workers/repository/process/lookup/index.spec.ts
@@ -10,8 +10,8 @@ import webpackJson from '../../../../config/npm/__fixtures__/webpack.json';
 import { CONFIG_VALIDATION } from '../../../../constants/error-messages';
 import * as datasourceDocker from '../../../../datasource/docker';
 import { id as datasourceDockerId } from '../../../../datasource/docker';
-import * as datasourceGitSubmodules from '../../../../datasource/git-submodules';
-import { id as datasourceGitSubmodulesId } from '../../../../datasource/git-submodules';
+import * as datasourceGitRefs from '../../../../datasource/git-refs';
+import { id as datasourceGitRefsId } from '../../../../datasource/git-refs';
 import * as datasourceGithubReleases from '../../../../datasource/github-releases';
 import { id as datasourceGithubTagsId } from '../../../../datasource/github-tags';
 import { id as datasourceNpmId } from '../../../../datasource/npm';
@@ -26,14 +26,14 @@ import type { LookupUpdateConfig } from './types';
 import * as lookup from '.';
 
 jest.mock('../../../../datasource/docker');
-jest.mock('../../../../datasource/git-submodules');
+jest.mock('../../../../datasource/git-refs');
 jest.mock('../../../../datasource/github-releases');
 
 qJson.latestVersion = '1.4.1';
 
 const docker = mocked(datasourceDocker) as any;
 docker.defaultRegistryUrls = ['https://index.docker.io'];
-const gitSubmodules = mocked(datasourceGitSubmodules);
+const gitRefs = mocked(datasourceGitRefs);
 const githubReleases = mocked(datasourceGithubReleases);
 
 Object.assign(githubReleases, { defaultRegistryUrls: ['https://github.com'] });
@@ -1125,14 +1125,18 @@ describe('workers/repository/process/lookup', () => {
     it('handles git submodule update', async () => {
       config.depName = 'some-path';
       config.versioning = gitVersioningId;
-      config.datasource = datasourceGitSubmodulesId;
-      gitSubmodules.getReleases.mockResolvedValueOnce({
+      config.datasource = datasourceGitRefsId;
+      config.currentDigest = 'some-digest';
+      gitRefs.getReleases.mockResolvedValueOnce({
         releases: [
           {
-            version: '4b825dc642cb6eb9a060e54bf8d69288fbee4904',
+            version: 'master',
           },
         ],
       });
+      gitRefs.getDigest.mockResolvedValueOnce(
+        '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
+      );
       const res = await lookup.lookupUpdates(config);
       expect(res).toMatchSnapshot();
     });
diff --git a/lib/workers/repository/process/lookup/index.ts b/lib/workers/repository/process/lookup/index.ts
index 7b3579f15c253c0270a020b876097a2a103d8239..0c5e6c69f6bdccd15dc04da4a2524d615526e3b9 100644
--- a/lib/workers/repository/process/lookup/index.ts
+++ b/lib/workers/repository/process/lookup/index.ts
@@ -7,7 +7,6 @@ import {
   isGetPkgReleasesConfig,
   supportsDigests,
 } from '../../../../datasource';
-import * as datasourceGitSubmodules from '../../../../datasource/git-submodules';
 import { logger } from '../../../../logger';
 import { getRangeStrategy } from '../../../../manager';
 import type { LookupUpdate } from '../../../../manager/types';
@@ -299,7 +298,7 @@ export async function lookupUpdates(
   }
   // Add digests if necessary
   if (supportsDigests(config)) {
-    if (currentDigest && datasource !== datasourceGitSubmodules.id) {
+    if (currentDigest) {
       if (!digestOneAndOnly || !res.updates.length) {
         // digest update
         res.updates.push({
@@ -316,14 +315,6 @@ export async function lookupUpdates(
           newValue: currentValue,
         });
       }
-    } else if (datasource === datasourceGitSubmodules.id) {
-      const dependency = clone(await getPkgReleases(config));
-      if (dependency?.releases[0]?.version) {
-        res.updates.push({
-          updateType: 'digest',
-          newValue: dependency.releases[0].version,
-        });
-      }
     }
     if (versioning.valueToVersion) {
       for (const update of res.updates || []) {