diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index 7e1260f4499f28d8705588ebce241862ee81edba..e0cb5a3f1f65bee592e28559a4ff3579bebba7a0 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -2,7 +2,7 @@ import { exec as _exec } from 'child_process';
 import Git from 'simple-git/promise';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { fs, mocked, platform } from '../../../test/util';
+import { fs, git, mocked } from '../../../test/util';
 import * as _datasource from '../../datasource';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
@@ -21,6 +21,7 @@ jest.mock('child_process');
 jest.mock('../../../lib/util/exec/env');
 jest.mock('../../../lib/datasource');
 jest.mock('../../../lib/util/fs');
+jest.mock('../../../lib/util/git');
 jest.mock('../../../lib/util/host-rules');
 jest.mock('./host-rules');
 
@@ -60,7 +61,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: [],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -79,7 +80,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     fs.readLocalFile.mockResolvedValueOnce(null);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -98,7 +99,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     fs.readLocalFile.mockResolvedValueOnce(null);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -132,7 +133,7 @@ describe('bundler.updateArtifacts()', () => {
         ],
       });
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -160,7 +161,7 @@ describe('bundler.updateArtifacts()', () => {
         ],
       });
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -193,7 +194,7 @@ describe('bundler.updateArtifacts()', () => {
         ],
       });
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -240,7 +241,7 @@ describe('bundler.updateArtifacts()', () => {
         'some-user:some-password'
       );
       const execSnapshots = mockExecAll(exec);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['Gemfile.lock'],
       } as Git.StatusResult);
       fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
@@ -265,7 +266,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     const execSnapshots = mockExecAll(exec, execError);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     expect(
@@ -285,7 +286,7 @@ describe('bundler.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current Gemfile.lock');
     fs.writeLocalFile.mockResolvedValueOnce(null as never);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Gemfile.lock'],
     } as Git.StatusResult);
     fs.readLocalFile.mockResolvedValueOnce('Updated Gemfile.lock' as any);
diff --git a/lib/manager/bundler/artifacts.ts b/lib/manager/bundler/artifacts.ts
index 661c7f119514b03c2df9f37642c01bd52e4e76e7..9d8389ed94bd3ffd1f90bdbd97de4dcbf3f18b72 100644
--- a/lib/manager/bundler/artifacts.ts
+++ b/lib/manager/bundler/artifacts.ts
@@ -1,7 +1,6 @@
 import { quote } from 'shlex';
 import { BUNDLER_INVALID_CREDENTIALS } from '../../constants/error-messages';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { HostRule } from '../../types';
 import * as memCache from '../../util/cache/memory';
 import { ExecOptions, exec } from '../../util/exec';
@@ -11,6 +10,7 @@ import {
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { isValid } from '../../versioning/ruby';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import {
@@ -139,7 +139,7 @@ export async function updateArtifacts(
       },
     };
     await exec(cmd, execOptions);
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     if (!status.modified.includes(lockFileName)) {
       return null;
     }
diff --git a/lib/manager/cocoapods/artifacts.spec.ts b/lib/manager/cocoapods/artifacts.spec.ts
index 0b47245645d292660b164ce78b00f99d1c41f102..d6284b75ed0f651b338def953f92d5ee39f7afb8 100644
--- a/lib/manager/cocoapods/artifacts.spec.ts
+++ b/lib/manager/cocoapods/artifacts.spec.ts
@@ -3,9 +3,8 @@ import _fs from 'fs-extra';
 import Git from 'simple-git/promise';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { mocked } from '../../../test/util';
+import { git, mocked } from '../../../test/util';
 import * as _datasource from '../../datasource';
-import { platform as _platform } from '../../platform';
 import { setExecConfig } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
 import * as _env from '../../util/exec/env';
@@ -14,13 +13,13 @@ import { updateArtifacts } from '.';
 jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
+jest.mock('../../util/git');
 jest.mock('../../platform');
 jest.mock('../../datasource');
 
 const fs: jest.Mocked<typeof _fs> = _fs as any;
 const exec: jest.Mock<typeof _exec> = _exec as any;
 const env = mocked(_env);
-const platform = mocked(_platform);
 const datasource = mocked(_datasource);
 
 delete process.env.CP_HOME_DIR;
@@ -101,7 +100,7 @@ describe('.updateArtifacts()', () => {
   it('returns null if unchanged', async () => {
     const execSnapshots = mockExecAll(exec);
     fs.readFile.mockResolvedValueOnce('Current Podfile' as any);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: [],
     } as Git.StatusResult);
     fs.readFile.mockResolvedValueOnce('Current Podfile' as any);
@@ -119,7 +118,7 @@ describe('.updateArtifacts()', () => {
     const execSnapshots = mockExecAll(exec);
     await setExecConfig({ ...config, binarySource: BinarySource.Docker });
     fs.readFile.mockResolvedValueOnce('Old Podfile' as any);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Podfile.lock'],
     } as Git.StatusResult);
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
@@ -139,7 +138,7 @@ describe('.updateArtifacts()', () => {
     fs.readFile.mockResolvedValueOnce('Old Manifest.lock' as any);
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
     fs.readFile.mockResolvedValueOnce('Pods manifest' as any);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       not_added: ['Pods/New'],
       modified: ['Podfile.lock', 'Pods/Manifest.lock'],
       deleted: ['Pods/Deleted'],
@@ -198,7 +197,7 @@ describe('.updateArtifacts()', () => {
 
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
 
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Podfile.lock'],
     } as Git.StatusResult);
 
@@ -226,7 +225,7 @@ describe('.updateArtifacts()', () => {
 
     fs.readFile.mockResolvedValueOnce('New Podfile' as any);
 
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['Podfile.lock'],
     } as Git.StatusResult);
 
diff --git a/lib/manager/cocoapods/artifacts.ts b/lib/manager/cocoapods/artifacts.ts
index 2436c02f383e97f352d3637aeba00e1c73b4a76b..4490a2cab3a34ceb1d865ff00823eed5e343abf4 100644
--- a/lib/manager/cocoapods/artifacts.ts
+++ b/lib/manager/cocoapods/artifacts.ts
@@ -1,13 +1,13 @@
 import { quote } from 'shlex';
 import { dirname, join } from 'upath';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { getCocoaPodsHome } from './utils';
 
@@ -93,7 +93,7 @@ export async function updateArtifacts({
     ];
   }
 
-  const status = await platform.getRepoStatus();
+  const status = await getRepoStatus();
   if (!status.modified.includes(lockFileName)) {
     return null;
   }
diff --git a/lib/manager/composer/artifacts.spec.ts b/lib/manager/composer/artifacts.spec.ts
index 799fa1e994061934f04a39b4498eeed1b2bf9537..150ac4955ab0ffe9047750e4927bf41f4e7e6480 100644
--- a/lib/manager/composer/artifacts.spec.ts
+++ b/lib/manager/composer/artifacts.spec.ts
@@ -1,7 +1,7 @@
 import { exec as _exec } from 'child_process';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { fs, mocked, platform } from '../../../test/util';
+import { fs, git, mocked } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
@@ -12,6 +12,7 @@ import * as composer from './artifacts';
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
 jest.mock('../../util/fs');
+jest.mock('../../util/git');
 jest.mock('../../util/host-rules');
 
 const hostRules = require('../../util/host-rules');
@@ -49,7 +50,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('Current composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
+    git.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
     expect(
       await composer.updateArtifacts({
         packageFileName: 'composer.json',
@@ -72,7 +73,7 @@ describe('.updateArtifacts()', () => {
       username: 'some-username',
       password: 'some-password',
     });
-    platform.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
+    git.getRepoStatus.mockResolvedValue({ modified: [] } as StatusResult);
     expect(
       await composer.updateArtifacts({
         packageFileName: 'composer.json',
@@ -87,7 +88,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('New composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['composer.lock'],
     } as StatusResult);
     expect(
@@ -104,7 +105,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('New composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['composer.lock'],
     } as StatusResult);
     expect(
@@ -205,7 +206,7 @@ describe('.updateArtifacts()', () => {
     fs.readLocalFile.mockResolvedValueOnce('Current composer.lock' as any);
     const execSnapshots = mockExecAll(exec);
     fs.readLocalFile.mockReturnValueOnce('New composer.lock' as any);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['composer.lock'],
     } as StatusResult);
     expect(
diff --git a/lib/manager/composer/artifacts.ts b/lib/manager/composer/artifacts.ts
index 1b1ad2286f9636068109c192210d1cd625a666f3..e3b11930ee48e9a1f06ac3bfb3babd94d5340089 100644
--- a/lib/manager/composer/artifacts.ts
+++ b/lib/manager/composer/artifacts.ts
@@ -9,7 +9,6 @@ import {
 } from '../../constants/platforms';
 import * as datasourcePackagist from '../../datasource/packagist';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import {
   deleteLocalFile,
@@ -19,6 +18,7 @@ import {
   readLocalFile,
   writeLocalFile,
 } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
@@ -131,7 +131,7 @@ export async function updateArtifacts({
     }
     logger.debug({ cmd, args }, 'composer command');
     await exec(`${cmd} ${args}`, execOptions);
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     if (!status.modified.includes(lockFileName)) {
       return null;
     }
diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts
index 2e28dade2e793dc7632c6872c5f48d10d7f68ce3..255a15ccc8d87dc8e404dad1ed6bfa7697723be0 100644
--- a/lib/manager/gomod/artifacts.spec.ts
+++ b/lib/manager/gomod/artifacts.spec.ts
@@ -2,7 +2,7 @@ import { exec as _exec } from 'child_process';
 import _fs from 'fs-extra';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { mocked, platform } from '../../../test/util';
+import { git, mocked } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
@@ -14,6 +14,7 @@ import * as gomod from './artifacts';
 jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
+jest.mock('../../util/git');
 jest.mock('../../util/host-rules');
 jest.mock('../../util/http');
 
@@ -73,7 +74,7 @@ describe('.updateArtifacts()', () => {
   it('returns null if unchanged', async () => {
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: [],
     } as StatusResult);
     expect(
@@ -89,7 +90,7 @@ describe('.updateArtifacts()', () => {
   it('returns updated go.sum', async () => {
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -108,7 +109,7 @@ describe('.updateArtifacts()', () => {
     await setUtilConfig({ ...config, binarySource: BinarySource.Docker });
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -128,7 +129,7 @@ describe('.updateArtifacts()', () => {
   it('supports global mode', async () => {
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -153,7 +154,7 @@ describe('.updateArtifacts()', () => {
     });
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New go.sum' as any);
@@ -178,7 +179,7 @@ describe('.updateArtifacts()', () => {
     });
     fs.readFile.mockResolvedValueOnce('Current go.sum' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValueOnce({
+    git.getRepoStatus.mockResolvedValueOnce({
       modified: ['go.sum'],
     } as StatusResult);
     fs.readFile.mockResolvedValueOnce('New go.sum 1' as any);
diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts
index 48f219aba92abf665ed95cda280c412b7b7babe5..899627b176f07f5e7456795deb877f444d905183 100644
--- a/lib/manager/gomod/artifacts.ts
+++ b/lib/manager/gomod/artifacts.ts
@@ -3,10 +3,10 @@ import { quote } from 'shlex';
 import { dirname, join } from 'upath';
 import { PLATFORM_TYPE_GITHUB } from '../../constants/platforms';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
 import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { find } from '../../util/host-rules';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
@@ -84,7 +84,7 @@ export async function updateArtifacts({
       await exec(`${cmd} ${args}`, execOptions);
     }
     const res = [];
-    let status = await platform.getRepoStatus();
+    let status = await getRepoStatus();
     if (!status.modified.includes(sumFileName)) {
       return null;
     }
@@ -113,7 +113,7 @@ export async function updateArtifacts({
         logger.debug({ cmd, args }, 'go mod tidy command');
         await exec(`${cmd} ${args}`, execOptions);
       }
-      status = await platform.getRepoStatus();
+      status = await getRepoStatus();
       for (const f of status.modified.concat(status.not_added)) {
         if (f.startsWith(vendorDir)) {
           res.push({
diff --git a/lib/manager/gradle-wrapper/artifacts-real.spec.ts b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
index 21791dbc8af094930d10a24372081e698a34b61c..43924275d5618e3f5e57f99d2b39966d20b13422 100644
--- a/lib/manager/gradle-wrapper/artifacts-real.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts-real.spec.ts
@@ -2,11 +2,13 @@ import { resolve } from 'path';
 import { readFile, readFileSync } from 'fs-extra';
 import Git from 'simple-git/promise';
 import * as httpMock from '../../../test/httpMock';
-import { getName, partial, platform } from '../../../test/util';
+import { getName, git, partial } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { ifSystemSupportsGradle } from '../gradle/__testutil__/gradle';
 import * as dcUpdate from '.';
 
+jest.mock('../../util/git');
+
 const fixtures = resolve(__dirname, './__fixtures__');
 const config = {
   localDir: resolve(fixtures, './testFiles'),
@@ -43,7 +45,7 @@ describe(getName(__filename), () => {
     });
 
     it('replaces existing value', async () => {
-      platform.getRepoStatus.mockResolvedValue({
+      git.getRepoStatus.mockResolvedValue({
         modified: [
           'gradle/wrapper/gradle-wrapper.properties',
           'gradle/wrapper/gradle-wrapper.jar',
@@ -88,7 +90,7 @@ describe(getName(__filename), () => {
     });
 
     it('updates from version', async () => {
-      platform.getRepoStatus.mockResolvedValueOnce(
+      git.getRepoStatus.mockResolvedValueOnce(
         partial<Git.StatusResult>({
           modified: ['gradle/wrapper/gradle-wrapper.properties'],
         })
@@ -108,7 +110,7 @@ describe(getName(__filename), () => {
     });
 
     it('up to date', async () => {
-      platform.getRepoStatus.mockResolvedValue({
+      git.getRepoStatus.mockResolvedValue({
         modified: [],
       } as Git.StatusResult);
 
@@ -132,7 +134,7 @@ describe(getName(__filename), () => {
     });
 
     it('getRepoStatus fails', async () => {
-      platform.getRepoStatus.mockImplementation(() => {
+      git.getRepoStatus.mockImplementation(() => {
         throw new Error('failed');
       });
 
@@ -203,7 +205,7 @@ describe(getName(__filename), () => {
           '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768'
         );
 
-      platform.getRepoStatus.mockResolvedValueOnce(
+      git.getRepoStatus.mockResolvedValueOnce(
         partial<Git.StatusResult>({
           modified: ['gradle/wrapper/gradle-wrapper.properties'],
         })
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index d343734a36e4ce0fca30184fc313ba11872bd780..ef72548d9697911fa2b21a1e67a7de33f4763068 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -10,8 +10,8 @@ import {
   env,
   fs,
   getName,
+  git,
   partial,
-  platform,
 } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
@@ -20,6 +20,7 @@ import * as dcUpdate from '.';
 
 jest.mock('child_process');
 jest.mock('../../util/fs');
+jest.mock('../../util/git');
 jest.mock('../../util/exec/env');
 
 const exec: jest.Mock<typeof _exec> = _exec as any;
@@ -59,7 +60,7 @@ describe(getName(__filename), () => {
   });
 
   it('replaces existing value', async () => {
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: [
         'gradle/wrapper/gradle-wrapper.properties',
         'gradlew',
@@ -110,7 +111,7 @@ describe(getName(__filename), () => {
 
   it('gradlew failed', async () => {
     const execSnapshots = mockExecAll(exec, new Error('failed'));
-    platform.getRepoStatus.mockResolvedValueOnce(
+    git.getRepoStatus.mockResolvedValueOnce(
       partial<Git.StatusResult>({
         modified: [],
       })
@@ -135,7 +136,7 @@ describe(getName(__filename), () => {
         '038794feef1f4745c6347107b6726279d1c824f3fc634b60f86ace1e9fbd1768'
       );
 
-    platform.getRepoStatus.mockResolvedValueOnce(
+    git.getRepoStatus.mockResolvedValueOnce(
       partial<Git.StatusResult>({
         modified: ['gradle/wrapper/gradle-wrapper.properties'],
       })
diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts
index 3b26dc7670f59ab0832cf2085b50801017e93b3a..6cd9bbf4189c8327b4a35ecac2dfa581bf5c214a 100644
--- a/lib/manager/gradle-wrapper/artifacts.ts
+++ b/lib/manager/gradle-wrapper/artifacts.ts
@@ -2,9 +2,9 @@ import { resolve } from 'path';
 import { stat } from 'fs-extra';
 import Git from 'simple-git/promise';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { Http } from '../../util/http';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { gradleWrapperFileName, prepareGradleCommand } from '../gradle/index';
@@ -94,7 +94,7 @@ export async function updateArtifacts({
         'Error executing gradle wrapper update command. It can be not a critical one though.'
       );
     }
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     const artifactFileNames = [
       'gradle/wrapper/gradle-wrapper.properties',
       'gradle/wrapper/gradle-wrapper.jar',
diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts
index a0494329ef7b0c5db2cda9eab065e985881820d4..e045777b4fa4b9cc5d3e83a78b15e28be3c90d3c 100644
--- a/lib/manager/npm/post-update/index.ts
+++ b/lib/manager/npm/post-update/index.ts
@@ -16,6 +16,7 @@ import { platform } from '../../../platform';
 import { ExternalHostError } from '../../../types/errors/external-host-error';
 import { getChildProcessEnv } from '../../../util/exec/env';
 import { deleteLocalFile } from '../../../util/fs';
+import { getRepoStatus } from '../../../util/git';
 import * as hostRules from '../../../util/host-rules';
 import { PackageFile, PostUpdateConfig, Upgrade } from '../../common';
 import * as lerna from './lerna';
@@ -541,7 +542,7 @@ export async function getAdditionalFiles(
                 .replace(/\/?$/, '/');
               const resolvedPath = upath.join(lockFileDir, mirrorPath);
               logger.debug('Found yarn offline  mirror: ' + resolvedPath);
-              const status = await platform.getRepoStatus();
+              const status = await getRepoStatus();
               for (const f of status.modified.concat(status.not_added)) {
                 if (f.startsWith(resolvedPath)) {
                   const localModified = upath.join(config.localDir, f);
diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts
index e806ae87cebacc642dda57cce26cb9065e297cb4..40dd136d33856e692109505fab3b2a4f109c9270 100644
--- a/lib/manager/pipenv/artifacts.spec.ts
+++ b/lib/manager/pipenv/artifacts.spec.ts
@@ -2,7 +2,7 @@ import { exec as _exec } from 'child_process';
 import _fs from 'fs-extra';
 import { join } from 'upath';
 import { envMock, mockExecAll } from '../../../test/execUtil';
-import { mocked, platform } from '../../../test/util';
+import { git, mocked } from '../../../test/util';
 import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
@@ -13,6 +13,7 @@ import * as pipenv from './artifacts';
 jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
+jest.mock('../../util/git');
 jest.mock('../../util/host-rules');
 jest.mock('../../util/http');
 
@@ -87,7 +88,7 @@ describe('.updateArtifacts()', () => {
   it('returns updated Pipfile.lock', async () => {
     fs.readFile.mockResolvedValueOnce('current pipfile.lock' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['Pipfile.lock'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New Pipfile.lock' as any);
@@ -107,7 +108,7 @@ describe('.updateArtifacts()', () => {
     pipFileLock._meta.requires.python_version = '3.7';
     fs.readFile.mockResolvedValueOnce(JSON.stringify(pipFileLock) as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['Pipfile.lock'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('new lock' as any);
@@ -138,7 +139,7 @@ describe('.updateArtifacts()', () => {
   it('returns updated Pipenv.lock when doing lockfile maintenance', async () => {
     fs.readFile.mockResolvedValueOnce('Current Pipfile.lock' as any);
     const execSnapshots = mockExecAll(exec);
-    platform.getRepoStatus.mockResolvedValue({
+    git.getRepoStatus.mockResolvedValue({
       modified: ['Pipfile.lock'],
     } as StatusResult);
     fs.readFile.mockReturnValueOnce('New Pipfile.lock' as any);
diff --git a/lib/manager/pipenv/artifacts.ts b/lib/manager/pipenv/artifacts.ts
index 8b775874344caddab04ae98252c6d964fc05888b..89e098f0f311e2fc1a54e152c6bf5aa32c2765e1 100644
--- a/lib/manager/pipenv/artifacts.ts
+++ b/lib/manager/pipenv/artifacts.ts
@@ -1,9 +1,9 @@
 import { ensureDir } from 'fs-extra';
 import { join } from 'upath';
 import { logger } from '../../logger';
-import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
 import { deleteLocalFile, readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import {
   UpdateArtifact,
   UpdateArtifactsConfig,
@@ -74,7 +74,7 @@ export async function updateArtifacts({
     };
     logger.debug({ cmd }, 'pipenv lock command');
     await exec(cmd, execOptions);
-    const status = await platform.getRepoStatus();
+    const status = await getRepoStatus();
     if (!(status && status.modified.includes(lockFileName))) {
       return null;
     }
diff --git a/lib/platform/__snapshots__/index.spec.ts.snap b/lib/platform/__snapshots__/index.spec.ts.snap
index 4c5460a19eb90f3865b2da0c5b58d16da4319a20..c14467a75f03cf60eab97edd2acde0a06505858e 100644
--- a/lib/platform/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/__snapshots__/index.spec.ts.snap
@@ -31,7 +31,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
@@ -75,7 +74,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
@@ -119,7 +117,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
@@ -163,7 +160,6 @@ Array [
   "getPrFiles",
   "getPrList",
   "getRepoForceRebase",
-  "getRepoStatus",
   "getRepos",
   "getVulnerabilityAlerts",
   "initPlatform",
diff --git a/lib/platform/azure/index.spec.ts b/lib/platform/azure/index.spec.ts
index 8646b4be1ee51567ad2e23004c8999bc38d81989..5412f3585fddb09474f4f1d8a4fda0d14de3dd8f 100644
--- a/lib/platform/azure/index.spec.ts
+++ b/lib/platform/azure/index.spec.ts
@@ -159,13 +159,6 @@ describe('platform/azure', () => {
     } as any);
   }
 
-  describe('getRepoStatus()', () => {
-    it('exists', async () => {
-      await initRepo();
-      expect(await azure.getRepoStatus()).toBeUndefined();
-    });
-  });
-
   describe('initRepo', () => {
     it(`should initialise the config for a repo`, async () => {
       const config = await initRepo({
diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 855fad559d6afe721ea532b9022a396228d379c8..14b50d0acd2629d17eee2e3cc74631d29d106c3d 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -374,12 +374,6 @@ export /* istanbul ignore next */ function getBranchLastCommitTime(
   return git.getBranchLastCommitTime(branchName);
 }
 
-export /* istanbul ignore next */ function getRepoStatus(): Promise<
-  git.StatusResult
-> {
-  return git.getRepoStatus();
-}
-
 export /* istanbul ignore next */ function mergeBranch(
   branchName: string
 ): Promise<void> {
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 6b389ec2841c2307edcd5ca2c33434fe8cf77a0f..100f159e3e1d4a2b7c12bc27bcc0162d260427f2 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -483,12 +483,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-export /* istanbul ignore next */ function getRepoStatus(): Promise<
-  git.StatusResult
-> {
-  return git.getRepoStatus();
-}
-
 async function getStatus(
   branchName: string,
   useCache = true
diff --git a/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap b/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap
index 3dd3d8aed5f32160570cbaaf232e8f074b8ec595..486fdd173b8835b4f9181b489bb8b84fbb328806 100644
--- a/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/bitbucket/__snapshots__/index.spec.ts.snap
@@ -1253,24 +1253,6 @@ Array [
 
 exports[`platform/bitbucket getPrBody() returns diff files 1`] = `"**foo**bartext"`;
 
-exports[`platform/bitbucket getRepoStatus() sends to gitFs 1`] = `undefined`;
-
-exports[`platform/bitbucket getRepoStatus() sends to gitFs 2`] = `
-Array [
-  Object {
-    "headers": Object {
-      "accept": "application/json",
-      "accept-encoding": "gzip, deflate",
-      "authorization": "Basic YWJjOjEyMw==",
-      "host": "api.bitbucket.org",
-      "user-agent": "https://github.com/renovatebot/renovate",
-    },
-    "method": "GET",
-    "url": "https://api.bitbucket.org/2.0/repositories/some/repo",
-  },
-]
-`;
-
 exports[`platform/bitbucket getRepos() returns repos 1`] = `
 Array [
   Object {
diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts
index fc81fd4002296539c0fd4cb572aaa9af481f9b5b..63059d005d57aa402b4fd78d02067902c01a4251 100644
--- a/lib/platform/bitbucket/index.spec.ts
+++ b/lib/platform/bitbucket/index.spec.ts
@@ -447,14 +447,6 @@ describe('platform/bitbucket', () => {
     });
   });
 
-  describe('getRepoStatus()', () => {
-    it('sends to gitFs', async () => {
-      await initRepoMock();
-      expect(await bitbucket.getRepoStatus()).toMatchSnapshot();
-      expect(httpMock.getTrace()).toMatchSnapshot();
-    });
-  });
-
   describe('deleteBranch()', () => {
     it('sends to gitFs', async () => {
       await initRepoMock();
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index fd695abe395a2456e5532e869f34ee23a150b2aa..4e12052e5c5863c0b1d6ef149b3c27d55e60a598 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -289,11 +289,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-// istanbul ignore next
-export function getRepoStatus(): Promise<git.StatusResult> {
-  return git.getRepoStatus();
-}
-
 export function mergeBranch(branchName: string): Promise<void> {
   return git.mergeBranch(branchName);
 }
diff --git a/lib/platform/common.ts b/lib/platform/common.ts
index e05e3f7f93768c586f0a17d343a260871bf3c174..5c13b201834e99cc86c792fa4813317904819c81 100644
--- a/lib/platform/common.ts
+++ b/lib/platform/common.ts
@@ -1,5 +1,4 @@
 import got from 'got';
-import Git from 'simple-git/promise';
 import { RenovateConfig } from '../config/common';
 import {
   BranchStatus,
@@ -232,7 +231,6 @@ export interface Platform {
     requiredStatusChecks?: string[] | null
   ): Promise<BranchStatus>;
   getBranchPr(branchName: string): Promise<Pr | null>;
-  getRepoStatus(): Promise<Git.StatusResult>;
   getFile(lockFileName: string, branchName?: string): Promise<string | null>;
   initPlatform(config: RenovateConfig): Promise<PlatformConfig>;
 }
diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts
index 101938707abf5d1289bea894f8804d058f41d734..91768cd9ad2f8fbaf6bc8e640093ed1a4d96d75f 100644
--- a/lib/platform/gitea/index.spec.ts
+++ b/lib/platform/gitea/index.spec.ts
@@ -1424,15 +1424,6 @@ describe('platform/gitea', () => {
     });
   });
 
-  describe('getRepoStatus', () => {
-    it('should propagate call to storage class', async () => {
-      await initFakeRepo();
-      await gitea.getRepoStatus();
-
-      expect(gitvcs.getRepoStatus).toHaveBeenCalledTimes(1);
-    });
-  });
-
   describe('getFileList', () => {
     it('propagates call to storage class', async () => {
       await initFakeRepo();
diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts
index 6a7c9146b67be59b2bb928fc0847bcbd0ee7b0c2..8aebee95c0455a2d55db4e2b4eda3ff8feeedc1f 100644
--- a/lib/platform/gitea/index.ts
+++ b/lib/platform/gitea/index.ts
@@ -882,10 +882,6 @@ const platform: Platform = {
     return git.getFile(lockFileName, branchName);
   },
 
-  getRepoStatus(): Promise<git.StatusResult> {
-    return git.getRepoStatus();
-  },
-
   getFileList(): Promise<string[]> {
     return git.getFileList();
   },
@@ -931,7 +927,6 @@ export const {
   getPrList,
   getPrFiles,
   getRepoForceRebase,
-  getRepoStatus,
   getRepos,
   getVulnerabilityAlerts,
   initPlatform,
diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts
index 04bdd79ad3d2df013520d11189e344be22a5a4bb..2302bf6f3dde164e17cf510d65770d6cd10a298c 100644
--- a/lib/platform/github/index.ts
+++ b/lib/platform/github/index.ts
@@ -540,11 +540,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-// istanbul ignore next
-export function getRepoStatus(): Promise<git.StatusResult> {
-  return git.getRepoStatus();
-}
-
 // istanbul ignore next
 export function mergeBranch(branchName: string): Promise<void> {
   if (config.pushProtection) {
diff --git a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
index cc5febdaceae55e402bc9603b834a13028294543..6fe7bf60c6e5a3d2a475cac9f5e5e7665e6159a9 100644
--- a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
@@ -1766,33 +1766,6 @@ Array [
 ]
 `;
 
-exports[`platform/gitlab getRepoStatus() exists 1`] = `
-Array [
-  Object {
-    "headers": Object {
-      "accept": "application/json",
-      "accept-encoding": "gzip, deflate",
-      "host": "gitlab.com",
-      "private-token": "abc123",
-      "user-agent": "https://github.com/renovatebot/renovate",
-    },
-    "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/some%2Frepo",
-  },
-  Object {
-    "headers": Object {
-      "accept": "application/json",
-      "accept-encoding": "gzip, deflate",
-      "host": "gitlab.com",
-      "private-token": "abc123",
-      "user-agent": "https://github.com/renovatebot/renovate",
-    },
-    "method": "GET",
-    "url": "https://gitlab.com/api/v4/user",
-  },
-]
-`;
-
 exports[`platform/gitlab getRepos should return an array of repos 1`] = `
 Array [
   "a/b",
diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index b109d5f89525e24e4f9a5e12abacfd0135354a19..438e1873ff3cb2ef316f0c6388d231ca24f77888 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -154,14 +154,6 @@ describe('platform/gitlab', () => {
     return scope;
   }
 
-  describe('getRepoStatus()', () => {
-    it('exists', async () => {
-      await initRepo();
-      await gitlab.getRepoStatus();
-      expect(httpMock.getTrace()).toMatchSnapshot();
-    });
-  });
-
   describe('initRepo', () => {
     it(`should throw error if disabled in renovate.json`, async () => {
       httpMock
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 93437ee303678d806b6ca1e7b3978e3e92f361e0..739b43b945affe2d1269abdd17a6d28db9d8ada0 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -661,11 +661,6 @@ export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   return git.getBranchLastCommitTime(branchName);
 }
 
-// istanbul ignore next
-export function getRepoStatus(): Promise<git.StatusResult> {
-  return git.getRepoStatus();
-}
-
 export async function getBranchStatusCheck(
   branchName: string,
   context: string
diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts
index f4d16a2f4c7864bd99b235ccfb19abd1aef37c5a..8dc9ba82e272fab7e3ef170ead930a4d8b30aabf 100644
--- a/lib/workers/branch/index.spec.ts
+++ b/lib/workers/branch/index.spec.ts
@@ -1,5 +1,5 @@
 import * as _fs from 'fs-extra';
-import { defaultConfig, mocked, platform } from '../../../test/util';
+import { defaultConfig, git, mocked, platform } from '../../../test/util';
 import {
   MANAGER_LOCKFILE_ERROR,
   REPOSITORY_CHANGED,
@@ -34,6 +34,7 @@ jest.mock('./automerge');
 jest.mock('./commit');
 jest.mock('../pr');
 jest.mock('../../util/exec');
+jest.mock('../../util/git');
 jest.mock('fs-extra');
 
 const getUpdated = mocked(_getUpdated);
@@ -638,7 +639,7 @@ describe('workers/branch', () => {
         body: `- [x] <!-- rebase-check -->`,
         isModified: true,
       } as never);
-      platform.getRepoStatus.mockResolvedValueOnce({
+      git.getRepoStatus.mockResolvedValueOnce({
         modified: ['modified_file'],
         not_added: [],
         deleted: ['deleted_file'],
diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts
index ce865f3cc70c466de415cda7821987f16ab6d386..e5c0cdcf43ad1455f57036c9e29bfbfb6e4d67c4 100644
--- a/lib/workers/branch/index.ts
+++ b/lib/workers/branch/index.ts
@@ -25,6 +25,7 @@ import { ExternalHostError } from '../../types/errors/external-host-error';
 import { emojify } from '../../util/emoji';
 import { exec } from '../../util/exec';
 import { readLocalFile, writeLocalFile } from '../../util/fs';
+import { getRepoStatus } from '../../util/git';
 import { regEx } from '../../util/regex';
 import { BranchConfig, PrResult, ProcessBranchResult } from '../common';
 import { checkAutoMerge, ensurePr } from '../pr';
@@ -380,7 +381,7 @@ export async function processBranch(
           }
         }
 
-        const status = await platform.getRepoStatus();
+        const status = await getRepoStatus();
 
         for (const relativePath of status.modified.concat(status.not_added)) {
           for (const pattern of fileFilters) {