diff --git a/lib/manager/bundler/artifacts.spec.ts b/lib/manager/bundler/artifacts.spec.ts
index 4cd088e938e36952727c9a8aad08574ff99e9b13..7e1260f4499f28d8705588ebce241862ee81edba 100644
--- a/lib/manager/bundler/artifacts.spec.ts
+++ b/lib/manager/bundler/artifacts.spec.ts
@@ -20,7 +20,7 @@ jest.mock('fs-extra');
 jest.mock('child_process');
 jest.mock('../../../lib/util/exec/env');
 jest.mock('../../../lib/datasource');
-jest.mock('../../../lib/util/gitfs/fs');
+jest.mock('../../../lib/util/fs');
 jest.mock('../../../lib/util/host-rules');
 jest.mock('./host-rules');
 
diff --git a/lib/manager/bundler/artifacts.ts b/lib/manager/bundler/artifacts.ts
index 780737a0f9920eb03d7679a801328981d9440e1c..661c7f119514b03c2df9f37642c01bd52e4e76e7 100644
--- a/lib/manager/bundler/artifacts.ts
+++ b/lib/manager/bundler/artifacts.ts
@@ -10,7 +10,7 @@ import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
-} from '../../util/gitfs';
+} from '../../util/fs';
 import { isValid } from '../../versioning/ruby';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import {
diff --git a/lib/manager/bundler/extract.spec.ts b/lib/manager/bundler/extract.spec.ts
index 7f4f407f0051e47c64d097e5920755bcdf143b4e..f7585134f53daf3a02ea9d63fcdd751143d88a34 100644
--- a/lib/manager/bundler/extract.spec.ts
+++ b/lib/manager/bundler/extract.spec.ts
@@ -3,7 +3,7 @@ import { fs } from '../../../test/util';
 import { isValid } from '../../versioning/ruby';
 import { extractPackageFile } from './extract';
 
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 
 const railsGemfile = readFileSync(
   'lib/manager/bundler/__fixtures__/Gemfile.rails',
diff --git a/lib/manager/bundler/extract.ts b/lib/manager/bundler/extract.ts
index 01ec422d9c628575c7de49c97ede995042c82ec3..91096269fb3776317951cdabf88f6a60be4a696a 100644
--- a/lib/manager/bundler/extract.ts
+++ b/lib/manager/bundler/extract.ts
@@ -1,7 +1,7 @@
 import * as datasourceRubygems from '../../datasource/rubygems';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import { regEx } from '../../util/regex';
 import { PackageDependency, PackageFile } from '../common';
 import { extractLockFileEntries } from './locked-version';
diff --git a/lib/manager/bundler/utils.ts b/lib/manager/bundler/utils.ts
index 070f9fa516c1ad0e4523e2a52c7fe935b3757fe7..322f5a2af1f25b8ce422c1887c6187955010e8d2 100644
--- a/lib/manager/bundler/utils.ts
+++ b/lib/manager/bundler/utils.ts
@@ -1,6 +1,6 @@
 import { join } from 'upath';
 import { logger } from '../../logger';
-import { ensureDir } from '../../util/gitfs';
+import { ensureDir } from '../../util/fs';
 import { UpdateArtifactsConfig } from '../common';
 
 export async function getGemHome(
diff --git a/lib/manager/cargo/artifacts.ts b/lib/manager/cargo/artifacts.ts
index 0efbc064425cafaeb50a7a312db017c27fd4c59f..c94ff14e40329a0b55d69f072d22bc22fc1137e9 100644
--- a/lib/manager/cargo/artifacts.ts
+++ b/lib/manager/cargo/artifacts.ts
@@ -5,7 +5,7 @@ import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
-} from '../../util/gitfs';
+} from '../../util/fs';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
 export async function updateArtifacts({
diff --git a/lib/manager/cocoapods/artifacts.ts b/lib/manager/cocoapods/artifacts.ts
index 11028be373013bb49d67f7771e594f6d63973ff9..2436c02f383e97f352d3637aeba00e1c73b4a76b 100644
--- a/lib/manager/cocoapods/artifacts.ts
+++ b/lib/manager/cocoapods/artifacts.ts
@@ -7,7 +7,7 @@ import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
-} from '../../util/gitfs';
+} from '../../util/fs';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { getCocoaPodsHome } from './utils';
 
diff --git a/lib/manager/cocoapods/utils.ts b/lib/manager/cocoapods/utils.ts
index c1f081e4fd3bc12445141d43d62f6682b124a7a0..cf2383a9788453055d12f29a1db1f29db4763319 100644
--- a/lib/manager/cocoapods/utils.ts
+++ b/lib/manager/cocoapods/utils.ts
@@ -1,6 +1,6 @@
 import { join } from 'upath';
 import { logger } from '../../logger';
-import { ensureDir } from '../../util/gitfs';
+import { ensureDir } from '../../util/fs';
 import { UpdateArtifactsConfig } from '../common';
 
 export async function getCocoaPodsHome(
diff --git a/lib/manager/composer/artifacts.spec.ts b/lib/manager/composer/artifacts.spec.ts
index 4242edb2d6be8cc2f3ae10c929b305301154f10a..799fa1e994061934f04a39b4498eeed1b2bf9537 100644
--- a/lib/manager/composer/artifacts.spec.ts
+++ b/lib/manager/composer/artifacts.spec.ts
@@ -6,12 +6,12 @@ import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
 import * as _env from '../../util/exec/env';
-import { StatusResult } from '../../util/gitfs';
+import { StatusResult } from '../../util/git';
 import * as composer from './artifacts';
 
 jest.mock('child_process');
 jest.mock('../../util/exec/env');
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 jest.mock('../../util/host-rules');
 
 const hostRules = require('../../util/host-rules');
diff --git a/lib/manager/composer/artifacts.ts b/lib/manager/composer/artifacts.ts
index 557e51f63db1247b8042fecec6e8727fe6f63915..1b1ad2286f9636068109c192210d1cd625a666f3 100644
--- a/lib/manager/composer/artifacts.ts
+++ b/lib/manager/composer/artifacts.ts
@@ -18,7 +18,7 @@ import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
-} from '../../util/gitfs';
+} from '../../util/fs';
 import * as hostRules from '../../util/host-rules';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
diff --git a/lib/manager/composer/extract.spec.ts b/lib/manager/composer/extract.spec.ts
index 1a740d2f8c6de11b4849058de4204a0d8718c3ef..17a4f4807118e4287f78329ca7d47c14480bf09d 100644
--- a/lib/manager/composer/extract.spec.ts
+++ b/lib/manager/composer/extract.spec.ts
@@ -2,7 +2,7 @@ import { readFileSync } from 'fs';
 import { fs } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 
 const requirements1 = readFileSync(
   'lib/manager/composer/__fixtures__/composer1.json',
diff --git a/lib/manager/composer/extract.ts b/lib/manager/composer/extract.ts
index fbe806e7953b2ea67dc3db1449987df363e96e2b..1a53277532d68dca7f0bc338726436046217aa06 100644
--- a/lib/manager/composer/extract.ts
+++ b/lib/manager/composer/extract.ts
@@ -3,7 +3,7 @@ import * as datasourceGitTags from '../../datasource/git-tags';
 import * as datasourcePackagist from '../../datasource/packagist';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import { api as semverComposer } from '../../versioning/composer';
 import { PackageDependency, PackageFile } from '../common';
 
diff --git a/lib/manager/gitlabci-include/extract.ts b/lib/manager/gitlabci-include/extract.ts
index 0dd2d75d38f6e8828817238d0e4d9d88929fcb47..b683a5a445e6cc819561aa391cd4d6a77de16e41 100644
--- a/lib/manager/gitlabci-include/extract.ts
+++ b/lib/manager/gitlabci-include/extract.ts
@@ -3,7 +3,7 @@ import yaml from 'js-yaml';
 import * as datasourceGitlabTags from '../../datasource/gitlab-tags';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import { ExtractConfig, PackageDependency, PackageFile } from '../common';
 import * as gitlabci from '../gitlabci/extract';
 
diff --git a/lib/manager/gomod/artifacts.spec.ts b/lib/manager/gomod/artifacts.spec.ts
index 3bb563100d6e83964754af2bbde9232718512f7b..2e28dade2e793dc7632c6872c5f48d10d7f68ce3 100644
--- a/lib/manager/gomod/artifacts.spec.ts
+++ b/lib/manager/gomod/artifacts.spec.ts
@@ -7,7 +7,7 @@ import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
 import * as _env from '../../util/exec/env';
-import { StatusResult } from '../../util/gitfs';
+import { StatusResult } from '../../util/git';
 import * as _hostRules from '../../util/host-rules';
 import * as gomod from './artifacts';
 
diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts
index 24c37169233809a246902d284af4a2f96cd18ac9..48f219aba92abf665ed95cda280c412b7b7babe5 100644
--- a/lib/manager/gomod/artifacts.ts
+++ b/lib/manager/gomod/artifacts.ts
@@ -6,7 +6,7 @@ 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/gitfs';
+import { readLocalFile, writeLocalFile } from '../../util/fs';
 import { find } from '../../util/host-rules';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
diff --git a/lib/manager/gradle-wrapper/artifacts.spec.ts b/lib/manager/gradle-wrapper/artifacts.spec.ts
index 609439fd8f82e3ffa66e9673011067b7ef8030e5..d343734a36e4ce0fca30184fc313ba11872bd780 100644
--- a/lib/manager/gradle-wrapper/artifacts.spec.ts
+++ b/lib/manager/gradle-wrapper/artifacts.spec.ts
@@ -19,7 +19,7 @@ import { resetPrefetchedImages } from '../../util/exec/docker';
 import * as dcUpdate from '.';
 
 jest.mock('child_process');
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 jest.mock('../../util/exec/env');
 
 const exec: jest.Mock<typeof _exec> = _exec as any;
diff --git a/lib/manager/gradle-wrapper/artifacts.ts b/lib/manager/gradle-wrapper/artifacts.ts
index f20fb0d6414bb10c011c988266c3cf9092d0f06f..dc020ce7e44a69e46af5250a554042404969b8ce 100644
--- a/lib/manager/gradle-wrapper/artifacts.ts
+++ b/lib/manager/gradle-wrapper/artifacts.ts
@@ -4,7 +4,7 @@ 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/gitfs';
+import { readLocalFile, writeLocalFile } from '../../util/fs';
 import { Http } from '../../util/http';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 import { gradleWrapperFileName, prepareGradleCommand } from '../gradle/index';
diff --git a/lib/manager/gradle/index.spec.ts b/lib/manager/gradle/index.spec.ts
index fe19ad34f6dad67640bb54d09147a06b10b12368..a3cc67e177eaa9dc4d36592b0061c69c4a08444e 100644
--- a/lib/manager/gradle/index.spec.ts
+++ b/lib/manager/gradle/index.spec.ts
@@ -9,7 +9,7 @@ import * as _util from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as _docker from '../../util/exec/docker';
 import * as _env from '../../util/exec/env';
-import * as _fs from '../../util/gitfs/fs';
+import * as _fs from '../../util/fs';
 import { ExtractConfig } from '../common';
 import { ifSystemSupportsGradle } from './__testutil__/gradle';
 import { GRADLE_DEPENDENCY_REPORT_FILENAME } from './gradle-updates-report';
@@ -44,11 +44,11 @@ async function setupMocks() {
 
   jest.mock('child_process');
   jest.mock('../../util/exec/env');
-  jest.mock('../../util/gitfs/fs');
+  jest.mock('../../util/fs');
   jest.mock('os');
 
   const os: jest.Mocked<typeof _os> = require('os');
-  const fs: jest.Mocked<typeof _fs> = require('../../util/gitfs/fs');
+  const fs: jest.Mocked<typeof _fs> = require('../../util/fs');
   const env: jest.Mocked<typeof _env> = require('../../util/exec/env');
   const exec: jest.Mock<typeof _exec> = require('child_process').exec;
   const util: jest.Mocked<typeof _util> = require('../../util');
diff --git a/lib/manager/gradle/index.ts b/lib/manager/gradle/index.ts
index 06613990dd52eba3afcfb58c49fe78c40db90f85..2af2a8e97e54927eebfa317217bb2547641b1572 100644
--- a/lib/manager/gradle/index.ts
+++ b/lib/manager/gradle/index.ts
@@ -8,7 +8,7 @@ import { logger } from '../../logger';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import { ExecOptions, exec } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import * as gradleVersioning from '../../versioning/gradle';
 import {
   ExtractConfig,
diff --git a/lib/manager/helm-requirements/extract.spec.ts b/lib/manager/helm-requirements/extract.spec.ts
index 02aa1cff9e4dd1cd54282d5693475b107497c17d..ec06ca950e6836f8a100db8005a9bcd5c39c20db 100644
--- a/lib/manager/helm-requirements/extract.spec.ts
+++ b/lib/manager/helm-requirements/extract.spec.ts
@@ -1,7 +1,7 @@
 import { fs } from '../../../test/util';
 import { extractPackageFile } from './extract';
 
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 
 describe('lib/manager/helm-requirements/extract', () => {
   describe('extractPackageFile()', () => {
diff --git a/lib/manager/helm-requirements/extract.ts b/lib/manager/helm-requirements/extract.ts
index 7f9105e7c2863194d77c7ec7310e59dbfd65047a..ad3b0472a5668eb2818c22e2c0c3061aaf0ab7cd 100644
--- a/lib/manager/helm-requirements/extract.ts
+++ b/lib/manager/helm-requirements/extract.ts
@@ -3,7 +3,7 @@ import yaml from 'js-yaml';
 import * as datasourceHelm from '../../datasource/helm';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { getSiblingFileName, readLocalFile } from '../../util/gitfs';
+import { getSiblingFileName, readLocalFile } from '../../util/fs';
 import { ExtractConfig, PackageDependency, PackageFile } from '../common';
 
 export async function extractPackageFile(
diff --git a/lib/manager/maven/extract.ts b/lib/manager/maven/extract.ts
index 948ae5022f5175eca6c6e196d4a20d97d8a7e030..f10dda6210330859efe45a1709c760492bb62b2a 100644
--- a/lib/manager/maven/extract.ts
+++ b/lib/manager/maven/extract.ts
@@ -5,7 +5,7 @@ import * as datasourceMaven from '../../datasource/maven';
 import { MAVEN_REPO } from '../../datasource/maven/common';
 import { logger } from '../../logger';
 import { SkipReason } from '../../types';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import { ExtractConfig, PackageDependency, PackageFile } from '../common';
 
 export function parsePom(raw: string): XmlDocument | null {
diff --git a/lib/manager/maven/index.spec.ts b/lib/manager/maven/index.spec.ts
index 7b0f30493565b4f96e2c629716dbfbbbefe0595d..99d518d38359b4e6c6c836f1133ed9ba662a3f2b 100644
--- a/lib/manager/maven/index.spec.ts
+++ b/lib/manager/maven/index.spec.ts
@@ -4,7 +4,7 @@ import { PackageDependency, PackageFile } from '../common';
 import { extractPackage, resolveParents } from './extract';
 import { extractAllPackageFiles, updateDependency } from './index';
 
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 
 const pomContent = readFileSync(
   'lib/manager/maven/__fixtures__/simple.pom.xml',
diff --git a/lib/manager/mix/artifacts.ts b/lib/manager/mix/artifacts.ts
index cb5972c91b3d24d3ff6e89bb3046a7bfce29338a..c037f01da1896f18f5fac16c3331baf22b96a799 100644
--- a/lib/manager/mix/artifacts.ts
+++ b/lib/manager/mix/artifacts.ts
@@ -4,7 +4,7 @@ import upath from 'upath';
 import { logger } from '../../logger';
 import { exec } from '../../util/exec';
 import { BinarySource } from '../../util/exec/common';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
 export async function updateArtifacts({
diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts
index 7d7ac8a6596beb994035e8441b9671fffc33be77..fd0b9ec959193497eafe2297e3eb91f36f40dbe7 100644
--- a/lib/manager/npm/extract/index.spec.ts
+++ b/lib/manager/npm/extract/index.spec.ts
@@ -1,7 +1,7 @@
 import { readFileSync } from 'fs';
 import path from 'path';
 import { getConfig } from '../../../config/defaults';
-import * as _fs from '../../../util/gitfs/fs';
+import * as _fs from '../../../util/fs';
 import * as npmExtract from '.';
 
 const fs: any = _fs;
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 5142e8c5c35b8e1d7fd46c558eabadc829b0216e..514fc773482a70f3d76a933e1ae0839bc19e048b 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -10,7 +10,7 @@ import {
   deleteLocalFile,
   getSiblingFileName,
   readLocalFile,
-} from '../../../util/gitfs';
+} from '../../../util/fs';
 import * as nodeVersioning from '../../../versioning/node';
 import { isValid, isVersion } from '../../../versioning/npm';
 import {
diff --git a/lib/manager/npm/extract/npm.spec.ts b/lib/manager/npm/extract/npm.spec.ts
index 0d79fa64da442e0c3232ca9520435b50bd2408ce..31562404105e4f9ab696c0d036cfe97bd09ee918 100644
--- a/lib/manager/npm/extract/npm.spec.ts
+++ b/lib/manager/npm/extract/npm.spec.ts
@@ -2,7 +2,7 @@ import { readFileSync } from 'fs';
 import { fs } from '../../../../test/util';
 import { getNpmLock } from './npm';
 
-jest.mock('../../../util/gitfs/fs');
+jest.mock('../../../util/fs');
 
 describe('manager/npm/extract/npm', () => {
   describe('.getNpmLock()', () => {
diff --git a/lib/manager/npm/extract/npm.ts b/lib/manager/npm/extract/npm.ts
index 99da47163c96fd2c57b27c6ffc7f862506dd5c9a..bfabceffa2c0ee85b1eff5f85a544c5b13a11f6f 100644
--- a/lib/manager/npm/extract/npm.ts
+++ b/lib/manager/npm/extract/npm.ts
@@ -1,5 +1,5 @@
 import { logger } from '../../../logger';
-import { readLocalFile } from '../../../util/gitfs';
+import { readLocalFile } from '../../../util/fs';
 import { LockFileEntry } from './common';
 
 export async function getNpmLock(
diff --git a/lib/manager/npm/extract/yarn.spec.ts b/lib/manager/npm/extract/yarn.spec.ts
index 7bb289dab4368edd1e8b8e61da97fc7294c814e1..155621af575af74bcddceb7d85bc2c4c8eab3f5c 100644
--- a/lib/manager/npm/extract/yarn.spec.ts
+++ b/lib/manager/npm/extract/yarn.spec.ts
@@ -2,7 +2,7 @@ import { readFileSync } from 'fs';
 import { fs } from '../../../../test/util';
 import { getYarnLock } from './yarn';
 
-jest.mock('../../../util/gitfs/fs');
+jest.mock('../../../util/fs');
 
 describe('manager/npm/extract/yarn', () => {
   describe('.getYarnLock()', () => {
diff --git a/lib/manager/npm/extract/yarn.ts b/lib/manager/npm/extract/yarn.ts
index b40f8636efea86c99e3c2e746e2d2f290c6520c0..5af375e6c219061211f109cc6accf57012971697 100644
--- a/lib/manager/npm/extract/yarn.ts
+++ b/lib/manager/npm/extract/yarn.ts
@@ -1,6 +1,6 @@
 import { parse } from '@yarnpkg/lockfile';
 import { logger } from '../../../logger';
-import { readLocalFile } from '../../../util/gitfs';
+import { readLocalFile } from '../../../util/fs';
 import { LockFileEntry } from './common';
 
 export type YarnLock = Record<string, string>;
diff --git a/lib/manager/npm/post-update/index.ts b/lib/manager/npm/post-update/index.ts
index 86e542d8b55f9715f471708fe44fa47d906106f1..f380fb289096ca03760291a50f38ded3cb6e811f 100644
--- a/lib/manager/npm/post-update/index.ts
+++ b/lib/manager/npm/post-update/index.ts
@@ -8,7 +8,7 @@ import { logger } from '../../../logger';
 import { platform } from '../../../platform';
 import { ExternalHostError } from '../../../types/errors/external-host-error';
 import { getChildProcessEnv } from '../../../util/exec/env';
-import { deleteLocalFile } from '../../../util/gitfs';
+import { deleteLocalFile } from '../../../util/fs';
 import * as hostRules from '../../../util/host-rules';
 import { PackageFile, PostUpdateConfig, Upgrade } from '../../common';
 import * as lerna from './lerna';
diff --git a/lib/manager/npm/post-update/node-version.spec.ts b/lib/manager/npm/post-update/node-version.spec.ts
index 01519fa9efc72d40f889a1945de3e18c1131ebb8..06622fec821d82f48d281e6f5e63a72d137ef76c 100644
--- a/lib/manager/npm/post-update/node-version.spec.ts
+++ b/lib/manager/npm/post-update/node-version.spec.ts
@@ -1,7 +1,7 @@
 import { fs } from '../../../../test/util';
 import { getNodeConstraint } from './node-version';
 
-jest.mock('../../../util/gitfs/fs');
+jest.mock('../../../util/fs');
 
 describe('getNodeConstraint', () => {
   const config = {
diff --git a/lib/manager/npm/post-update/node-version.ts b/lib/manager/npm/post-update/node-version.ts
index aa0be56fbf3759799d076d5580fc7a6c9059b900..b929499b63137e88f8dc17426cdbfcab2bdb9106 100644
--- a/lib/manager/npm/post-update/node-version.ts
+++ b/lib/manager/npm/post-update/node-version.ts
@@ -1,6 +1,6 @@
 import { validRange } from 'semver';
 import { logger } from '../../../logger';
-import { getSiblingFileName, readLocalFile } from '../../../util/gitfs';
+import { getSiblingFileName, readLocalFile } from '../../../util/fs';
 import { PostUpdateConfig } from '../../common';
 
 async function getNodeFile(filename: string): Promise<string> | null {
diff --git a/lib/manager/pip_requirements/artifacts.ts b/lib/manager/pip_requirements/artifacts.ts
index f0f175a622237850f5c3cb4525bfb4dba0f2f962..98a3bfeb82bce808e192cb3c2cc39f22416e2c2a 100644
--- a/lib/manager/pip_requirements/artifacts.ts
+++ b/lib/manager/pip_requirements/artifacts.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
 import { logger } from '../../logger';
 import { ExecOptions, exec } from '../../util/exec';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import { UpdateArtifact, UpdateArtifactsResult } from '../common';
 
 export async function updateArtifacts({
diff --git a/lib/manager/pipenv/artifacts.spec.ts b/lib/manager/pipenv/artifacts.spec.ts
index 9e6f5a42c6b7a52f7c5cb0dfcb81fddba957ef47..e806ae87cebacc642dda57cce26cb9065e297cb4 100644
--- a/lib/manager/pipenv/artifacts.spec.ts
+++ b/lib/manager/pipenv/artifacts.spec.ts
@@ -7,7 +7,7 @@ import { setUtilConfig } from '../../util';
 import { BinarySource } from '../../util/exec/common';
 import * as docker from '../../util/exec/docker';
 import * as _env from '../../util/exec/env';
-import { StatusResult } from '../../util/gitfs';
+import { StatusResult } from '../../util/git';
 import * as pipenv from './artifacts';
 
 jest.mock('fs-extra');
diff --git a/lib/manager/pipenv/artifacts.ts b/lib/manager/pipenv/artifacts.ts
index a82a43471132f20ae6de4de9e9ca45d306e3c8f8..9e33a4dd91b4d709a390cc3c826361ffd7dfe271 100644
--- a/lib/manager/pipenv/artifacts.ts
+++ b/lib/manager/pipenv/artifacts.ts
@@ -3,7 +3,7 @@ import { join } from 'upath';
 import { logger } from '../../logger';
 import { platform } from '../../platform';
 import { ExecOptions, exec } from '../../util/exec';
-import { readLocalFile } from '../../util/gitfs';
+import { readLocalFile } from '../../util/fs';
 import {
   UpdateArtifact,
   UpdateArtifactsConfig,
diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts
index 0da8632431b770f61a5dd679d2cebc6b18b69284..9c6c87c508a9e0cce7290e1b5dab3dfc4eaaabc2 100644
--- a/lib/manager/poetry/artifacts.ts
+++ b/lib/manager/poetry/artifacts.ts
@@ -8,7 +8,7 @@ import {
   getSiblingFileName,
   readLocalFile,
   writeLocalFile,
-} from '../../util/gitfs';
+} from '../../util/fs';
 import {
   UpdateArtifact,
   UpdateArtifactsConfig,
diff --git a/lib/platform/azure/index.spec.ts b/lib/platform/azure/index.spec.ts
index 32906620c2ac5f5ce734d97602c9e475f3a96f95..20d9b7d8d4115d254fbe334ac9e52b8a9bb4f739 100644
--- a/lib/platform/azure/index.spec.ts
+++ b/lib/platform/azure/index.spec.ts
@@ -1,7 +1,7 @@
 import is from '@sindresorhus/is';
 import { REPOSITORY_DISABLED } from '../../constants/error-messages';
 import { BranchStatus } from '../../types';
-import * as _git from '../../util/gitfs/git';
+import * as _git from '../../util/git';
 import * as _hostRules from '../../util/host-rules';
 import { Platform, RepoParams } from '../common';
 
@@ -16,14 +16,14 @@ describe('platform/azure', () => {
     jest.resetModules();
     jest.mock('./azure-got-wrapper');
     jest.mock('./azure-helper');
-    jest.mock('../../util/gitfs/git');
+    jest.mock('../../util/git');
     jest.mock('../../util/host-rules');
     hostRules = require('../../util/host-rules');
     require('../../util/sanitize').sanitize = jest.fn((input) => input);
     azure = await import('.');
     azureApi = require('./azure-got-wrapper');
     azureHelper = require('./azure-helper');
-    git = require('../../util/gitfs/git');
+    git = require('../../util/git');
     git.branchExists.mockResolvedValue(true);
     git.isBranchStale.mockResolvedValue(false);
     hostRules.find.mockReturnValue({
diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts
index 399e0f294dcad711d275f32c2c0dd42f36d30ae8..acc2608ec3ac426d53281ebce0cd2ec6835b48ea 100644
--- a/lib/platform/azure/index.ts
+++ b/lib/platform/azure/index.ts
@@ -13,7 +13,7 @@ import {
 } from '../../constants/pull-requests';
 import { logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as gitfs from '../../util/gitfs';
+import * as git from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { sanitize } from '../../util/sanitize';
 import { ensureTrailingSlash } from '../../util/url';
@@ -163,7 +163,7 @@ export async function initRepo({
   const url =
     defaults.endpoint +
     `${encodeURIComponent(projectName)}/_git/${encodeURIComponent(repoName)}`;
-  await gitfs.initRepo({
+  await git.initRepo({
     ...config,
     localDir,
     url,
@@ -185,7 +185,7 @@ export function getRepoForceRebase(): Promise<boolean> {
 // Search
 
 export /* istanbul ignore next */ function getFileList(): Promise<string[]> {
-  return gitfs.getFileList();
+  return git.getFileList();
 }
 
 export /* istanbul ignore next */ async function setBaseBranch(
@@ -194,14 +194,14 @@ export /* istanbul ignore next */ async function setBaseBranch(
   logger.debug(`Setting baseBranch to ${branchName}`);
   config.baseBranch = branchName;
   delete config.baseCommitSHA;
-  const baseBranchSha = await gitfs.setBaseBranch(branchName);
+  const baseBranchSha = await git.setBaseBranch(branchName);
   return baseBranchSha;
 }
 
 export /* istanbul ignore next */ function setBranchPrefix(
   branchPrefix: string
 ): Promise<void> {
-  return gitfs.setBranchPrefix(branchPrefix);
+  return git.setBranchPrefix(branchPrefix);
 }
 
 // Branch
@@ -209,26 +209,26 @@ export /* istanbul ignore next */ function setBranchPrefix(
 export /* istanbul ignore next */ function branchExists(
   branchName: string
 ): Promise<boolean> {
-  return gitfs.branchExists(branchName);
+  return git.branchExists(branchName);
 }
 
 export /* istanbul ignore next */ function getAllRenovateBranches(
   branchPrefix: string
 ): Promise<string[]> {
-  return gitfs.getAllRenovateBranches(branchPrefix);
+  return git.getAllRenovateBranches(branchPrefix);
 }
 
 export /* istanbul ignore next */ function isBranchStale(
   branchName: string
 ): Promise<boolean> {
-  return gitfs.isBranchStale(branchName);
+  return git.isBranchStale(branchName);
 }
 
 export /* istanbul ignore next */ function getFile(
   filePath: string,
   branchName: string
 ): Promise<string> {
-  return gitfs.getFile(filePath, branchName);
+  return git.getFile(filePath, branchName);
 }
 
 // istanbul ignore next
@@ -272,7 +272,7 @@ export async function getPrList(): Promise<AzurePr[]> {
 
 /* istanbul ignore next */
 export async function getPrFiles(pr: Pr): Promise<string[]> {
-  return gitfs.getBranchFiles(pr.branchName, pr.targetBranch);
+  return git.getBranchFiles(pr.branchName, pr.targetBranch);
 }
 
 export async function getPr(pullRequestId: number): Promise<Pr | null> {
@@ -361,7 +361,7 @@ export /* istanbul ignore next */ async function deleteBranch(
   branchName: string,
   abandonAssociatedPr = false
 ): Promise<void> {
-  await gitfs.deleteBranch(branchName);
+  await git.deleteBranch(branchName);
   if (abandonAssociatedPr) {
     const pr = await getBranchPr(branchName);
     await abandonPr(pr.number);
@@ -371,19 +371,19 @@ export /* istanbul ignore next */ async function deleteBranch(
 export /* istanbul ignore next */ function getBranchLastCommitTime(
   branchName: string
 ): Promise<Date> {
-  return gitfs.getBranchLastCommitTime(branchName);
+  return git.getBranchLastCommitTime(branchName);
 }
 
 export /* istanbul ignore next */ function getRepoStatus(): Promise<
-  gitfs.StatusResult
+  git.StatusResult
 > {
-  return gitfs.getRepoStatus();
+  return git.getRepoStatus();
 }
 
 export /* istanbul ignore next */ function mergeBranch(
   branchName: string
 ): Promise<void> {
-  return gitfs.mergeBranch(branchName);
+  return git.mergeBranch(branchName);
 }
 
 export /* istanbul ignore next */ function commitFiles({
@@ -391,7 +391,7 @@ export /* istanbul ignore next */ function commitFiles({
   files,
   message,
 }: CommitFilesConfig): Promise<string | null> {
-  return gitfs.commitFiles({
+  return git.commitFiles({
     branchName,
     files,
     message,
@@ -401,7 +401,7 @@ export /* istanbul ignore next */ function commitFiles({
 export /* istanbul ignore next */ function getCommitMessages(): Promise<
   string[]
 > {
-  return gitfs.getCommitMessages();
+  return git.getCommitMessages();
 }
 
 export async function getBranchStatusCheck(
@@ -769,7 +769,7 @@ export function getVulnerabilityAlerts(): Promise<VulnerabilityAlert[]> {
 }
 
 export function cleanRepo(): Promise<void> {
-  gitfs.cleanRepo();
+  git.cleanRepo();
   config = {} as any;
   return Promise.resolve();
 }
diff --git a/lib/platform/bitbucket-server/index.spec.ts b/lib/platform/bitbucket-server/index.spec.ts
index 1e9857fb3c891009bef83716a86ba8b2a7ea264b..97415f7103192d5101d940d40cf2a8126f6041af 100644
--- a/lib/platform/bitbucket-server/index.spec.ts
+++ b/lib/platform/bitbucket-server/index.spec.ts
@@ -7,7 +7,7 @@ import {
 } from '../../constants/error-messages';
 import { PR_STATE_CLOSED, PR_STATE_OPEN } from '../../constants/pull-requests';
 import { BranchStatus } from '../../types';
-import * as _git from '../../util/gitfs/git';
+import * as _git from '../../util/git';
 import { Platform } from '../common';
 
 function repoMock(
@@ -172,11 +172,11 @@ describe('platform/bitbucket-server', () => {
         httpMock.reset();
         httpMock.setup();
         jest.mock('delay');
-        jest.mock('../../util/gitfs/git');
+        jest.mock('../../util/git');
         jest.mock('../../util/host-rules');
         hostRules = require('../../util/host-rules');
         bitbucket = await import('.');
-        git = require('../../util/gitfs/git');
+        git = require('../../util/git');
         git.branchExists.mockResolvedValue(true);
         git.isBranchStale.mockResolvedValue(false);
         git.getBranchCommit.mockResolvedValue(
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index ec8ab9d98e3a817194139d504febac3d4122e216..b6df5da0bd2b399e85a05dc92806a35000857d54 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -10,7 +10,7 @@ import { PLATFORM_TYPE_BITBUCKET_SERVER } from '../../constants/platforms';
 import { PR_STATE_ALL, PR_STATE_OPEN } from '../../constants/pull-requests';
 import { logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as gitfs from '../../util/gitfs';
+import * as git from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { HttpResponse } from '../../util/http';
 import {
@@ -107,7 +107,7 @@ export async function getRepos(): Promise<string[]> {
 
 export function cleanRepo(): Promise<void> {
   logger.debug(`cleanRepo()`);
-  gitfs.cleanRepo();
+  git.cleanRepo();
   config = {} as any;
   return Promise.resolve();
 }
@@ -175,7 +175,7 @@ export async function initRepo({
   }
 
   const { host, pathname } = url.parse(defaults.endpoint!);
-  const gitUrl = gitfs.getUrl({
+  const gitUrl = git.getUrl({
     protocol: defaults.endpoint!.split(':')[0],
     auth: `${opts.username}:${opts.password}`,
     host: `${host}${pathname}${
@@ -184,7 +184,7 @@ export async function initRepo({
     repository,
   });
 
-  await gitfs.initRepo({
+  await git.initRepo({
     ...config,
     localDir,
     url: gitUrl,
@@ -250,21 +250,21 @@ export async function setBaseBranch(
   branchName: string = config.defaultBranch
 ): Promise<string> {
   config.baseBranch = branchName;
-  const baseBranchSha = await gitfs.setBaseBranch(branchName);
+  const baseBranchSha = await git.setBaseBranch(branchName);
   return baseBranchSha;
 }
 
 export /* istanbul ignore next */ function setBranchPrefix(
   branchPrefix: string
 ): Promise<void> {
-  return gitfs.setBranchPrefix(branchPrefix);
+  return git.setBranchPrefix(branchPrefix);
 }
 
 // Search
 
 // Get full file list
 export function getFileList(): Promise<string[]> {
-  return gitfs.getFileList();
+  return git.getFileList();
 }
 
 // Branch
@@ -272,12 +272,12 @@ export function getFileList(): Promise<string[]> {
 // Returns true if branch exists, otherwise false
 export function branchExists(branchName: string): Promise<boolean> {
   logger.debug(`branchExists(${branchName})`);
-  return gitfs.branchExists(branchName);
+  return git.branchExists(branchName);
 }
 
 export function isBranchStale(branchName: string): Promise<boolean> {
   logger.debug(`isBranchStale(${branchName})`);
-  return gitfs.isBranchStale(branchName);
+  return git.isBranchStale(branchName);
 }
 
 // Gets details for a PR
@@ -400,7 +400,7 @@ export async function getPrList(_args?: any): Promise<Pr[]> {
 
 /* istanbul ignore next */
 export async function getPrFiles(pr: Pr): Promise<string[]> {
-  return gitfs.getBranchFiles(pr.branchName, pr.targetBranch);
+  return git.getBranchFiles(pr.branchName, pr.targetBranch);
 }
 
 // TODO: coverage
@@ -439,13 +439,13 @@ export function getAllRenovateBranches(
   branchPrefix: string
 ): Promise<string[]> {
   logger.debug('getAllRenovateBranches');
-  return gitfs.getAllRenovateBranches(branchPrefix);
+  return git.getAllRenovateBranches(branchPrefix);
 }
 
 export async function commitFiles(
   commitFilesConfig: CommitFilesConfig
 ): Promise<string | null> {
-  const commit = gitfs.commitFiles(commitFilesConfig);
+  const commit = git.commitFiles(commitFilesConfig);
 
   // wait for pr change propagation
   await delay(1000);
@@ -456,7 +456,7 @@ export async function commitFiles(
 
 export function getFile(filePath: string, branchName: string): Promise<string> {
   logger.debug(`getFile(${filePath}, ${branchName})`);
-  return gitfs.getFile(filePath, branchName);
+  return git.getFile(filePath, branchName);
 }
 
 export async function deleteBranch(
@@ -477,30 +477,30 @@ export async function deleteBranch(
       updatePrVersion(pr.number, body.version);
     }
   }
-  return gitfs.deleteBranch(branchName);
+  return git.deleteBranch(branchName);
 }
 
 export function mergeBranch(branchName: string): Promise<void> {
   logger.debug(`mergeBranch(${branchName})`);
-  return gitfs.mergeBranch(branchName);
+  return git.mergeBranch(branchName);
 }
 
 export function getBranchLastCommitTime(branchName: string): Promise<Date> {
   logger.debug(`getBranchLastCommitTime(${branchName})`);
-  return gitfs.getBranchLastCommitTime(branchName);
+  return git.getBranchLastCommitTime(branchName);
 }
 
 export /* istanbul ignore next */ function getRepoStatus(): Promise<
-  gitfs.StatusResult
+  git.StatusResult
 > {
-  return gitfs.getRepoStatus();
+  return git.getRepoStatus();
 }
 
 async function getStatus(
   branchName: string,
   useCache = true
 ): Promise<utils.BitbucketCommitStatus> {
-  const branchCommit = await gitfs.getBranchCommit(branchName);
+  const branchCommit = await git.getBranchCommit(branchName);
 
   return (
     await bitbucketServerHttp.getJson<utils.BitbucketCommitStatus>(
@@ -557,7 +557,7 @@ async function getStatusCheck(
   branchName: string,
   useCache = true
 ): Promise<utils.BitbucketStatus[]> {
-  const branchCommit = await gitfs.getBranchCommit(branchName);
+  const branchCommit = await git.getBranchCommit(branchName);
 
   return utils.accumulateValues(
     `./rest/build-status/1.0/commits/${branchCommit}`,
@@ -610,7 +610,7 @@ export async function setBranchStatus({
   }
   logger.debug({ branch: branchName, context, state }, 'Setting branch status');
 
-  const branchCommit = await gitfs.getBranchCommit(branchName);
+  const branchCommit = await git.getBranchCommit(branchName);
 
   try {
     const body: any = {
@@ -1077,7 +1077,7 @@ export function getPrBody(input: string): string {
 
 export function getCommitMessages(): Promise<string[]> {
   logger.debug(`getCommitMessages()`);
-  return gitfs.getCommitMessages();
+  return git.getCommitMessages();
 }
 
 export function getVulnerabilityAlerts(): Promise<VulnerabilityAlert[]> {
diff --git a/lib/platform/bitbucket/index.spec.ts b/lib/platform/bitbucket/index.spec.ts
index 1dbb5740c8d3804242339172791a95c0556808a4..cb0946e5841d275f98ec97ef5e7a17914f08be85 100644
--- a/lib/platform/bitbucket/index.spec.ts
+++ b/lib/platform/bitbucket/index.spec.ts
@@ -3,7 +3,7 @@ import * as httpMock from '../../../test/httpMock';
 import { REPOSITORY_DISABLED } from '../../constants/error-messages';
 import { logger as _logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as _git from '../../util/gitfs/git';
+import * as _git from '../../util/git';
 import { setBaseUrl } from '../../util/http/bitbucket';
 import { Platform, RepoParams } from '../common';
 
@@ -55,13 +55,13 @@ describe('platform/bitbucket', () => {
     jest.resetModules();
     httpMock.reset();
     httpMock.setup();
-    jest.mock('../../util/gitfs/git');
+    jest.mock('../../util/git');
     jest.mock('../../util/host-rules');
     jest.mock('../../logger');
     hostRules = require('../../util/host-rules');
     bitbucket = await import('.');
     logger = (await import('../../logger')).logger as any;
-    git = require('../../util/gitfs/git');
+    git = require('../../util/git');
     git.branchExists.mockResolvedValue(true);
     git.isBranchStale.mockResolvedValue(false);
     // clean up hostRules
diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts
index 3e1b0d07bbbf8f5bc9895cd402a741459b75cb76..f1bc34f24483c5cfb946039214c4dc5ea7478c12 100644
--- a/lib/platform/bitbucket/index.ts
+++ b/lib/platform/bitbucket/index.ts
@@ -10,7 +10,7 @@ import { PLATFORM_TYPE_BITBUCKET } from '../../constants/platforms';
 import { PR_STATE_ALL, PR_STATE_OPEN } from '../../constants/pull-requests';
 import { logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as gitfs from '../../util/gitfs';
+import * as git from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { BitbucketHttp, setBaseUrl } from '../../util/http/bitbucket';
 import { sanitize } from '../../util/sanitize';
@@ -148,14 +148,14 @@ export async function initRepo({
   // `api-staging.<host>` to `staging.<host>`
   const hostnameWithoutApiPrefix = /api[.|-](.+)/.exec(hostname)[1];
 
-  const url = gitfs.getUrl({
+  const url = git.getUrl({
     protocol: 'https',
     auth: `${opts.username}:${opts.password}`,
     hostname: hostnameWithoutApiPrefix,
     repository,
   });
 
-  await gitfs.initRepo({
+  await git.initRepo({
     ...config,
     localDir,
     url,
@@ -179,7 +179,7 @@ export function getRepoForceRebase(): Promise<boolean> {
 
 // Get full file list
 export function getFileList(): Promise<string[]> {
-  return gitfs.getFileList();
+  return git.getFileList();
 }
 
 export async function setBaseBranch(
@@ -188,38 +188,38 @@ export async function setBaseBranch(
   logger.debug(`Setting baseBranch to ${branchName}`);
   config.baseBranch = branchName;
   delete config.baseCommitSHA;
-  const baseBranchSha = await gitfs.setBaseBranch(branchName);
+  const baseBranchSha = await git.setBaseBranch(branchName);
   return baseBranchSha;
 }
 
 export /* istanbul ignore next */ function setBranchPrefix(
   branchPrefix: string
 ): Promise<void> {
-  return gitfs.setBranchPrefix(branchPrefix);
+  return git.setBranchPrefix(branchPrefix);
 }
 
 // Branch
 
 // Returns true if branch exists, otherwise false
 export function branchExists(branchName: string): Promise<boolean> {
-  return gitfs.branchExists(branchName);
+  return git.branchExists(branchName);
 }
 
 export function getAllRenovateBranches(
   branchPrefix: string
 ): Promise<string[]> {
-  return gitfs.getAllRenovateBranches(branchPrefix);
+  return git.getAllRenovateBranches(branchPrefix);
 }
 
 export function isBranchStale(branchName: string): Promise<boolean> {
-  return gitfs.isBranchStale(branchName);
+  return git.isBranchStale(branchName);
 }
 
 export function getFile(
   filePath: string,
   branchName?: string
 ): Promise<string> {
-  return gitfs.getFile(filePath, branchName);
+  return git.getFile(filePath, branchName);
 }
 
 // istanbul ignore next
@@ -248,7 +248,7 @@ export async function getPrList(): Promise<Pr[]> {
 
 /* istanbul ignore next */
 export async function getPrFiles(pr: Pr): Promise<string[]> {
-  return gitfs.getBranchFiles(pr.branchName, pr.targetBranch);
+  return git.getBranchFiles(pr.branchName, pr.targetBranch);
 }
 
 export async function findPr({
@@ -282,31 +282,31 @@ export async function deleteBranch(
       );
     }
   }
-  return gitfs.deleteBranch(branchName);
+  return git.deleteBranch(branchName);
 }
 
 export function getBranchLastCommitTime(branchName: string): Promise<Date> {
-  return gitfs.getBranchLastCommitTime(branchName);
+  return git.getBranchLastCommitTime(branchName);
 }
 
 // istanbul ignore next
-export function getRepoStatus(): Promise<gitfs.StatusResult> {
-  return gitfs.getRepoStatus();
+export function getRepoStatus(): Promise<git.StatusResult> {
+  return git.getRepoStatus();
 }
 
 export function mergeBranch(branchName: string): Promise<void> {
-  return gitfs.mergeBranch(branchName);
+  return git.mergeBranch(branchName);
 }
 
 // istanbul ignore next
 export function commitFiles(
   commitFilesConfig: CommitFilesConfig
 ): Promise<string | null> {
-  return gitfs.commitFiles(commitFilesConfig);
+  return git.commitFiles(commitFilesConfig);
 }
 
 export function getCommitMessages(): Promise<string[]> {
-  return gitfs.getCommitMessages();
+  return git.getCommitMessages();
 }
 
 async function isPrConflicted(prNo: number): Promise<boolean> {
@@ -873,7 +873,7 @@ export async function mergePr(
 // Pull Request
 
 export function cleanRepo(): Promise<void> {
-  gitfs.cleanRepo();
+  git.cleanRepo();
   config = {} as any;
   return Promise.resolve();
 }
diff --git a/lib/platform/gitea/index.spec.ts b/lib/platform/gitea/index.spec.ts
index 5388932ae225c976a7e3f3435531d8711aeaf2f8..10f801e7253ae9629ed63fed54039768e15e77d6 100644
--- a/lib/platform/gitea/index.spec.ts
+++ b/lib/platform/gitea/index.spec.ts
@@ -18,7 +18,7 @@ import {
 } from '../../constants/error-messages';
 import { logger as _logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as _git from '../../util/gitfs/git';
+import * as _git from '../../util/git';
 import { setBaseUrl } from '../../util/http/gitea';
 import * as ght from './gitea-helper';
 
@@ -157,13 +157,13 @@ describe('platform/gitea', () => {
     jest.resetModules();
     jest.clearAllMocks();
     jest.mock('./gitea-helper');
-    jest.mock('../../util/gitfs/git');
+    jest.mock('../../util/git');
     jest.mock('../../logger');
 
     gitea = await import('.');
     helper = (await import('./gitea-helper')) as any;
     logger = (await import('../../logger')).logger as any;
-    gitvcs = require('../../util/gitfs/git');
+    gitvcs = require('../../util/git');
     gitvcs.isBranchStale.mockResolvedValue(false);
     gitvcs.getBranchCommit.mockResolvedValue(mockCommitHash);
 
diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts
index c96e8ca5c4dcad12a39cdbd69ea1a18dd52a4dcc..ca6cca3f807c3ac8bbb7356456c6916f8e99d511 100644
--- a/lib/platform/gitea/index.ts
+++ b/lib/platform/gitea/index.ts
@@ -14,7 +14,7 @@ import { PLATFORM_TYPE_GITEA } from '../../constants/platforms';
 import { PR_STATE_ALL, PR_STATE_OPEN } from '../../constants/pull-requests';
 import { logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as gitfs from '../../util/gitfs';
+import * as git from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { setBaseUrl } from '../../util/http/gitea';
 import { sanitize } from '../../util/sanitize';
@@ -333,7 +333,7 @@ const platform: Platform = {
     gitEndpoint.auth = opts.token;
 
     // Initialize Git storage
-    await gitfs.initRepo({
+    await git.initRepo({
       ...config,
       url: URL.format(gitEndpoint),
       gitAuthorName: global.gitAuthor?.name,
@@ -363,7 +363,7 @@ const platform: Platform = {
   },
 
   cleanRepo(): Promise<void> {
-    gitfs.cleanRepo();
+    git.cleanRepo();
     config = {} as any;
     return Promise.resolve();
   },
@@ -377,7 +377,7 @@ const platform: Platform = {
   }: BranchStatusConfig): Promise<void> {
     try {
       // Create new status for branch commit
-      const branchCommit = await gitfs.getBranchCommit(branchName);
+      const branchCommit = await git.getBranchCommit(branchName);
       await helper.createCommitStatus(config.repository, branchCommit, {
         state: helper.renovateToGiteaStatusMapping[state] || 'pending',
         context,
@@ -456,7 +456,7 @@ const platform: Platform = {
     baseBranch: string = config.defaultBranch
   ): Promise<string> {
     config.baseBranch = baseBranch;
-    const baseBranchSha = await gitfs.setBaseBranch(baseBranch);
+    const baseBranchSha = await git.setBaseBranch(baseBranch);
     return baseBranchSha;
   },
 
@@ -476,7 +476,7 @@ const platform: Platform = {
 
   /* istanbul ignore next */
   async getPrFiles(pr: Pr): Promise<string[]> {
-    return gitfs.getBranchFiles(pr.branchName, pr.targetBranch);
+    return git.getBranchFiles(pr.branchName, pr.targetBranch);
   },
 
   async getPr(number: number): Promise<Pr | null> {
@@ -838,7 +838,7 @@ const platform: Platform = {
       }
     }
 
-    return gitfs.deleteBranch(branchName);
+    return git.deleteBranch(branchName);
   },
 
   async addAssignees(number: number, assignees: string[]): Promise<void> {
@@ -857,7 +857,7 @@ const platform: Platform = {
   },
 
   commitFiles(commitFilesConfig: CommitFilesConfig): Promise<string | null> {
-    return gitfs.commitFiles(commitFilesConfig);
+    return git.commitFiles(commitFilesConfig);
   },
 
   getPrBody(prBody: string): string {
@@ -865,43 +865,43 @@ const platform: Platform = {
   },
 
   isBranchStale(branchName: string): Promise<boolean> {
-    return gitfs.isBranchStale(branchName);
+    return git.isBranchStale(branchName);
   },
 
   setBranchPrefix(branchPrefix: string): Promise<void> {
-    return gitfs.setBranchPrefix(branchPrefix);
+    return git.setBranchPrefix(branchPrefix);
   },
 
   branchExists(branchName: string): Promise<boolean> {
-    return gitfs.branchExists(branchName);
+    return git.branchExists(branchName);
   },
 
   mergeBranch(branchName: string): Promise<void> {
-    return gitfs.mergeBranch(branchName);
+    return git.mergeBranch(branchName);
   },
 
   getBranchLastCommitTime(branchName: string): Promise<Date> {
-    return gitfs.getBranchLastCommitTime(branchName);
+    return git.getBranchLastCommitTime(branchName);
   },
 
   getFile(lockFileName: string, branchName?: string): Promise<string> {
-    return gitfs.getFile(lockFileName, branchName);
+    return git.getFile(lockFileName, branchName);
   },
 
-  getRepoStatus(): Promise<gitfs.StatusResult> {
-    return gitfs.getRepoStatus();
+  getRepoStatus(): Promise<git.StatusResult> {
+    return git.getRepoStatus();
   },
 
   getFileList(): Promise<string[]> {
-    return gitfs.getFileList();
+    return git.getFileList();
   },
 
   getAllRenovateBranches(branchPrefix: string): Promise<string[]> {
-    return gitfs.getAllRenovateBranches(branchPrefix);
+    return git.getAllRenovateBranches(branchPrefix);
   },
 
   getCommitMessages(): Promise<string[]> {
-    return gitfs.getCommitMessages();
+    return git.getCommitMessages();
   },
 
   getVulnerabilityAlerts(): Promise<VulnerabilityAlert[]> {
diff --git a/lib/platform/github/index.spec.ts b/lib/platform/github/index.spec.ts
index 7834a77cbb7a7a6746ca549ce8d722592ec030f4..32c6f656d0fe973c86adb500a7c5e9a82f9450ce 100644
--- a/lib/platform/github/index.spec.ts
+++ b/lib/platform/github/index.spec.ts
@@ -7,7 +7,7 @@ import {
   REPOSITORY_RENAMED,
 } from '../../constants/error-messages';
 import { BranchStatus } from '../../types';
-import * as _git from '../../util/gitfs/git';
+import * as _git from '../../util/git';
 import { Platform } from '../common';
 
 const githubApiHost = 'https://api.github.com';
@@ -24,8 +24,8 @@ describe('platform/github', () => {
     jest.mock('../../util/host-rules');
     github = await import('.');
     hostRules = mocked(await import('../../util/host-rules'));
-    jest.mock('../../util/gitfs/git');
-    git = mocked(await import('../../util/gitfs/git'));
+    jest.mock('../../util/git');
+    git = mocked(await import('../../util/git'));
     git.branchExists.mockResolvedValue(true);
     git.isBranchStale.mockResolvedValue(true);
     git.getBranchCommit.mockResolvedValue(
diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts
index 1e0403ee822258967273b0f62bb3b9891715f465..773291d2935439fcf9f0c3854e972092cf43cd94 100644
--- a/lib/platform/github/index.ts
+++ b/lib/platform/github/index.ts
@@ -24,7 +24,7 @@ import {
 import { logger } from '../../logger';
 import { BranchStatus } from '../../types';
 import { ExternalHostError } from '../../types/errors/external-host-error';
-import * as gitfs from '../../util/gitfs';
+import * as git from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import * as githubHttp from '../../util/http/github';
 import { sanitize } from '../../util/sanitize';
@@ -150,7 +150,7 @@ export async function getRepos(): Promise<string[]> {
 }
 
 export function cleanRepo(): Promise<void> {
-  gitfs.cleanRepo();
+  git.cleanRepo();
   // In theory most of this isn't necessary. In practice..
   config = {} as any;
   return Promise.resolve();
@@ -429,7 +429,7 @@ export async function initRepo({
   );
   parsedEndpoint.pathname = config.repository + '.git';
   const url = URL.format(parsedEndpoint);
-  await gitfs.initRepo({
+  await git.initRepo({
     ...config,
     url,
     gitAuthorName: global.gitAuthor?.name,
@@ -493,39 +493,39 @@ export async function setBaseBranch(
 ): Promise<string> {
   config.baseBranch = branchName;
   config.baseCommitSHA = null;
-  const baseBranchSha = await gitfs.setBaseBranch(branchName);
+  const baseBranchSha = await git.setBaseBranch(branchName);
   return baseBranchSha;
 }
 
 // istanbul ignore next
 export function setBranchPrefix(branchPrefix: string): Promise<void> {
-  return gitfs.setBranchPrefix(branchPrefix);
+  return git.setBranchPrefix(branchPrefix);
 }
 
 // Search
 
 // istanbul ignore next
 export function getFileList(): Promise<string[]> {
-  return gitfs.getFileList();
+  return git.getFileList();
 }
 
 // Branch
 
 // istanbul ignore next
 export function branchExists(branchName: string): Promise<boolean> {
-  return gitfs.branchExists(branchName);
+  return git.branchExists(branchName);
 }
 
 // istanbul ignore next
 export function getAllRenovateBranches(
   branchPrefix: string
 ): Promise<string[]> {
-  return gitfs.getAllRenovateBranches(branchPrefix);
+  return git.getAllRenovateBranches(branchPrefix);
 }
 
 // istanbul ignore next
 export function isBranchStale(branchName: string): Promise<boolean> {
-  return gitfs.isBranchStale(branchName);
+  return git.isBranchStale(branchName);
 }
 
 // istanbul ignore next
@@ -533,7 +533,7 @@ export function getFile(
   filePath: string,
   branchName?: string
 ): Promise<string> {
-  return gitfs.getFile(filePath, branchName);
+  return git.getFile(filePath, branchName);
 }
 
 // istanbul ignore next
@@ -541,17 +541,17 @@ export function deleteBranch(
   branchName: string,
   closePr?: boolean
 ): Promise<void> {
-  return gitfs.deleteBranch(branchName);
+  return git.deleteBranch(branchName);
 }
 
 // istanbul ignore next
 export function getBranchLastCommitTime(branchName: string): Promise<Date> {
-  return gitfs.getBranchLastCommitTime(branchName);
+  return git.getBranchLastCommitTime(branchName);
 }
 
 // istanbul ignore next
-export function getRepoStatus(): Promise<gitfs.StatusResult> {
-  return gitfs.getRepoStatus();
+export function getRepoStatus(): Promise<git.StatusResult> {
+  return git.getRepoStatus();
 }
 
 // istanbul ignore next
@@ -562,19 +562,19 @@ export function mergeBranch(branchName: string): Promise<void> {
       'Branch protection: Attempting to merge branch when push protection is enabled'
     );
   }
-  return gitfs.mergeBranch(branchName);
+  return git.mergeBranch(branchName);
 }
 
 // istanbul ignore next
 export function commitFiles(
   commitFilesConfig: CommitFilesConfig
 ): Promise<string | null> {
-  return gitfs.commitFiles(commitFilesConfig);
+  return git.commitFiles(commitFilesConfig);
 }
 
 // istanbul ignore next
 export function getCommitMessages(): Promise<string[]> {
-  return gitfs.getCommitMessages();
+  return git.getCommitMessages();
 }
 
 async function getClosedPrs(): Promise<PrList> {
@@ -985,7 +985,7 @@ export async function getPrList(): Promise<Pr[]> {
 
 /* istanbul ignore next */
 export async function getPrFiles(pr: Pr): Promise<string[]> {
-  return gitfs.getBranchFiles(pr.branchName, pr.targetBranch);
+  return git.getBranchFiles(pr.branchName, pr.targetBranch);
 }
 
 export async function findPr({
@@ -1135,7 +1135,7 @@ async function getStatusCheck(
   branchName: string,
   useCache = true
 ): Promise<GhBranchStatus[]> {
-  const branchCommit = await gitfs.getBranchCommit(branchName);
+  const branchCommit = await git.getBranchCommit(branchName);
 
   const url = `repos/${config.repository}/commits/${branchCommit}/statuses`;
 
@@ -1190,7 +1190,7 @@ export async function setBranchStatus({
   }
   logger.debug({ branch: branchName, context, state }, 'Setting branch status');
   try {
-    const branchCommit = await gitfs.getBranchCommit(branchName);
+    const branchCommit = await git.getBranchCommit(branchName);
     const url = `repos/${config.repository}/statuses/${branchCommit}`;
     const renovateToGitHubStateMapping = {
       green: 'success',
diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index 05d5975cf43b5a52af5d2a4cec79af8a1710ee7d..edab97df8ea009466b51a6c3a58e10dc6f571ef6 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -14,7 +14,7 @@ import {
   PR_STATE_OPEN,
 } from '../../constants/pull-requests';
 import { BranchStatus } from '../../types';
-import * as _git from '../../util/gitfs/git';
+import * as _git from '../../util/git';
 import * as _hostRules from '../../util/host-rules';
 
 const gitlabApiHost = 'https://gitlab.com';
@@ -31,8 +31,8 @@ describe('platform/gitlab', () => {
     jest.mock('../../util/host-rules');
     jest.mock('delay');
     hostRules = require('../../util/host-rules');
-    jest.mock('../../util/gitfs/git');
-    git = require('../../util/gitfs/git');
+    jest.mock('../../util/git');
+    git = require('../../util/git');
     git.branchExists.mockResolvedValue(true);
     git.isBranchStale.mockResolvedValue(true);
     git.getBranchCommit.mockResolvedValue(
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 0451d9a75e4191446d856a9dd3a3cef9b97b35e3..d91a6eb0e7178fdf6b3fe99fa0e25fd01522d1c8 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -18,7 +18,7 @@ import { PLATFORM_TYPE_GITLAB } from '../../constants/platforms';
 import { PR_STATE_ALL, PR_STATE_OPEN } from '../../constants/pull-requests';
 import { logger } from '../../logger';
 import { BranchStatus } from '../../types';
-import * as gitfs from '../../util/gitfs';
+import * as git from '../../util/git';
 import * as hostRules from '../../util/host-rules';
 import { HttpResponse } from '../../util/http';
 import { GitlabHttp, setBaseUrl } from '../../util/http/gitlab';
@@ -139,7 +139,7 @@ function urlEscape(str: string): string {
 }
 
 export function cleanRepo(): Promise<void> {
-  gitfs.cleanRepo();
+  git.cleanRepo();
   // In theory most of this isn't necessary. In practice..
   config = {} as any;
   return Promise.resolve();
@@ -229,7 +229,7 @@ export async function initRepo({
     ) {
       logger.debug('no http_url_to_repo found. Falling back to old behaviour.');
       const { host, protocol } = URL.parse(defaults.endpoint);
-      url = gitfs.getUrl({
+      url = git.getUrl({
         protocol: protocol.slice(0, -1) as any,
         auth: 'oauth2:' + opts.token,
         host,
@@ -241,7 +241,7 @@ export async function initRepo({
       repoUrl.auth = 'oauth2:' + opts.token;
       url = URL.format(repoUrl);
     }
-    await gitfs.initRepo({
+    await git.initRepo({
       ...config,
       url,
       gitAuthorName: global.gitAuthor?.name,
@@ -283,26 +283,26 @@ export async function setBaseBranch(
 ): Promise<string> {
   logger.debug(`Setting baseBranch to ${branchName}`);
   config.baseBranch = branchName;
-  const baseBranchSha = await gitfs.setBaseBranch(branchName);
+  const baseBranchSha = await git.setBaseBranch(branchName);
   return baseBranchSha;
 }
 
 export /* istanbul ignore next */ function setBranchPrefix(
   branchPrefix: string
 ): Promise<void> {
-  return gitfs.setBranchPrefix(branchPrefix);
+  return git.setBranchPrefix(branchPrefix);
 }
 
 // Search
 
 // Get full file list
 export function getFileList(): Promise<string[]> {
-  return gitfs.getFileList();
+  return git.getFileList();
 }
 
 // Returns true if branch exists, otherwise false
 export function branchExists(branchName: string): Promise<boolean> {
-  return gitfs.branchExists(branchName);
+  return git.branchExists(branchName);
 }
 
 type BranchState = 'pending' | 'running' | 'success' | 'failed' | 'canceled';
@@ -317,7 +317,7 @@ async function getStatus(
   branchName: string,
   useCache = true
 ): Promise<GitlabBranchStatus[]> {
-  const branchSha = await gitfs.getBranchCommit(branchName);
+  const branchSha = await git.getBranchCommit(branchName);
   const url = `projects/${config.repository}/repository/commits/${branchSha}/statuses`;
 
   return (
@@ -624,25 +624,25 @@ export async function getBranchPr(branchName: string): Promise<Pr> {
 export function getAllRenovateBranches(
   branchPrefix: string
 ): Promise<string[]> {
-  return gitfs.getAllRenovateBranches(branchPrefix);
+  return git.getAllRenovateBranches(branchPrefix);
 }
 
 export function isBranchStale(branchName: string): Promise<boolean> {
-  return gitfs.isBranchStale(branchName);
+  return git.isBranchStale(branchName);
 }
 
 // istanbul ignore next
 export function commitFiles(
   commitFilesConfig: CommitFilesConfig
 ): Promise<string | null> {
-  return gitfs.commitFiles(commitFilesConfig);
+  return git.commitFiles(commitFilesConfig);
 }
 
 export function getFile(
   filePath: string,
   branchName?: string
 ): Promise<string> {
-  return gitfs.getFile(filePath, branchName);
+  return git.getFile(filePath, branchName);
 }
 
 export async function deleteBranch(
@@ -657,20 +657,20 @@ export async function deleteBranch(
       await closePr(pr.number);
     }
   }
-  return gitfs.deleteBranch(branchName);
+  return git.deleteBranch(branchName);
 }
 
 export function mergeBranch(branchName: string): Promise<void> {
-  return gitfs.mergeBranch(branchName);
+  return git.mergeBranch(branchName);
 }
 
 export function getBranchLastCommitTime(branchName: string): Promise<Date> {
-  return gitfs.getBranchLastCommitTime(branchName);
+  return git.getBranchLastCommitTime(branchName);
 }
 
 // istanbul ignore next
-export function getRepoStatus(): Promise<gitfs.StatusResult> {
-  return gitfs.getRepoStatus();
+export function getRepoStatus(): Promise<git.StatusResult> {
+  return git.getRepoStatus();
 }
 
 export async function getBranchStatusCheck(
@@ -696,7 +696,7 @@ export async function setBranchStatus({
   url: targetUrl,
 }: BranchStatusConfig): Promise<void> {
   // First, get the branch commit SHA
-  const branchSha = await gitfs.getBranchCommit(branchName);
+  const branchSha = await git.getBranchCommit(branchName);
   // Now, check the statuses for that commit
   const url = `projects/${config.repository}/statuses/${branchSha}`;
   let state = 'success';
@@ -1080,7 +1080,7 @@ export async function getPrList(): Promise<Pr[]> {
 
 /* istanbul ignore next */
 export async function getPrFiles(pr: Pr): Promise<string[]> {
-  return gitfs.getBranchFiles(pr.branchName, pr.targetBranch);
+  return git.getBranchFiles(pr.branchName, pr.targetBranch);
 }
 
 function matchesState(state: string, desiredState: string): boolean {
@@ -1109,7 +1109,7 @@ export async function findPr({
 }
 
 export function getCommitMessages(): Promise<string[]> {
-  return gitfs.getCommitMessages();
+  return git.getCommitMessages();
 }
 
 export function getVulnerabilityAlerts(): Promise<VulnerabilityAlert[]> {
diff --git a/lib/platform/index.ts b/lib/platform/index.ts
index a9f4a6d265b7b0a187a88ae85aedcfa72b084b38..7aafff9c7b1e01a5ba27a40b4477b566d7f72da1 100644
--- a/lib/platform/index.ts
+++ b/lib/platform/index.ts
@@ -3,7 +3,7 @@ import addrs from 'email-addresses';
 import { RenovateConfig } from '../config/common';
 import { PLATFORM_NOT_FOUND } from '../constants/error-messages';
 import { logger } from '../logger';
-import { setPrivateKey } from '../util/gitfs';
+import { setPrivateKey } from '../util/git';
 import * as hostRules from '../util/host-rules';
 import platforms from './api.generated';
 import { Platform } from './common';
diff --git a/lib/util/gitfs/fs/index.spec.ts b/lib/util/fs/index.spec.ts
similarity index 86%
rename from lib/util/gitfs/fs/index.spec.ts
rename to lib/util/fs/index.spec.ts
index 331eafaae3329afc1d44e085f6c37ed55df0c93c..f987ad83bb4b4a9860ae2a9e995ee59ed5e510f8 100644
--- a/lib/util/gitfs/fs/index.spec.ts
+++ b/lib/util/fs/index.spec.ts
@@ -1,5 +1,5 @@
-import { getName } from '../../../../test/util';
-import { readLocalFile } from '.';
+import { getName } from '../../../test/util';
+import { readLocalFile } from './index';
 
 describe(getName(__filename), () => {
   describe('readLocalFile', () => {
diff --git a/lib/util/gitfs/fs/index.ts b/lib/util/fs/index.ts
similarity index 94%
rename from lib/util/gitfs/fs/index.ts
rename to lib/util/fs/index.ts
index d68fe20ce91e36845d38d7f9191dae9569d9a826..602b810a1e5e7578554dada84f9e269ef009199d 100644
--- a/lib/util/gitfs/fs/index.ts
+++ b/lib/util/fs/index.ts
@@ -1,7 +1,7 @@
 import * as fs from 'fs-extra';
 import { join, parse } from 'upath';
-import { RenovateConfig } from '../../../config/common';
-import { logger } from '../../../logger';
+import { RenovateConfig } from '../../config/common';
+import { logger } from '../../logger';
 
 let localDir = '';
 
diff --git a/lib/util/gitfs/git/__snapshots__/index.spec.ts.snap b/lib/util/git/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from lib/util/gitfs/git/__snapshots__/index.spec.ts.snap
rename to lib/util/git/__snapshots__/index.spec.ts.snap
diff --git a/lib/util/gitfs/git/index.spec.ts b/lib/util/git/index.spec.ts
similarity index 99%
rename from lib/util/gitfs/git/index.spec.ts
rename to lib/util/git/index.spec.ts
index 156ac77652e3441bd6c2f226a6bdce078eb1a424..32beeb01a3de9a4bca087f562707624c893c14b2 100644
--- a/lib/util/gitfs/git/index.spec.ts
+++ b/lib/util/git/index.spec.ts
@@ -1,7 +1,7 @@
 import fs from 'fs-extra';
 import Git from 'simple-git/promise';
 import tmp from 'tmp-promise';
-import * as git from '.';
+import * as git from './index';
 
 describe('platform/git', () => {
   jest.setTimeout(15000);
diff --git a/lib/util/gitfs/git/index.ts b/lib/util/git/index.ts
similarity index 98%
rename from lib/util/gitfs/git/index.ts
rename to lib/util/git/index.ts
index c08b3caa82195364ea245d74d86d15e020b46903..9ca9185e90d1b7f753017dc3b84609743ebfd214 100644
--- a/lib/util/gitfs/git/index.ts
+++ b/lib/util/git/index.ts
@@ -8,11 +8,11 @@ import {
   REPOSITORY_EMPTY,
   REPOSITORY_TEMPORARY_ERROR,
   SYSTEM_INSUFFICIENT_DISK_SPACE,
-} from '../../../constants/error-messages';
-import { logger } from '../../../logger';
-import { CommitFilesConfig } from '../../../platform/common';
-import { ExternalHostError } from '../../../types/errors/external-host-error';
-import * as limits from '../../../workers/global/limits';
+} from '../../constants/error-messages';
+import { logger } from '../../logger';
+import { CommitFilesConfig } from '../../platform/common';
+import { ExternalHostError } from '../../types/errors/external-host-error';
+import * as limits from '../../workers/global/limits';
 import { writePrivateKey } from './private-key';
 
 export * from './private-key';
diff --git a/lib/util/gitfs/git/private-key.spec.ts b/lib/util/git/private-key.spec.ts
similarity index 89%
rename from lib/util/gitfs/git/private-key.spec.ts
rename to lib/util/git/private-key.spec.ts
index e99061784d5228b516d535f1df15eac19cff5cc6..61a9a32b03b7e7235a0bcd22d1c5c7ab38843211 100644
--- a/lib/util/gitfs/git/private-key.spec.ts
+++ b/lib/util/git/private-key.spec.ts
@@ -1,9 +1,9 @@
-import { getName, mocked } from '../../../../test/util';
-import * as exec_ from '../../exec';
+import { getName, mocked } from '../../../test/util';
+import * as exec_ from '../exec';
 import { setPrivateKey, writePrivateKey } from './private-key';
 
 jest.mock('fs-extra');
-jest.mock('../../exec');
+jest.mock('../exec');
 
 const exec = mocked(exec_);
 
diff --git a/lib/util/gitfs/git/private-key.ts b/lib/util/git/private-key.ts
similarity index 88%
rename from lib/util/gitfs/git/private-key.ts
rename to lib/util/git/private-key.ts
index f4f6ecd6a76579af66e31e4bb3cfac1dc4154df2..9490d40c29c6da87e41b1468811cbb700604ebdc 100644
--- a/lib/util/gitfs/git/private-key.ts
+++ b/lib/util/git/private-key.ts
@@ -1,9 +1,9 @@
 import os from 'os';
 import path from 'path';
 import fs from 'fs-extra';
-import { PLATFORM_GPG_FAILED } from '../../../constants/error-messages';
-import { logger } from '../../../logger';
-import { exec } from '../../exec';
+import { PLATFORM_GPG_FAILED } from '../../constants/error-messages';
+import { logger } from '../../logger';
+import { exec } from '../exec';
 
 let gitPrivateKey: string;
 let keyId: string;
diff --git a/lib/util/gitfs/index.ts b/lib/util/gitfs/index.ts
deleted file mode 100644
index c4924195be6872b1697a30a45a68ea84fe659fb0..0000000000000000000000000000000000000000
--- a/lib/util/gitfs/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './fs';
-export * from './git';
diff --git a/lib/util/index.ts b/lib/util/index.ts
index c72f151a0a852ba70aad528f23f5dd1194dbd1af..58b1c8631c67884d7eb1e5669c3f3f613b7453bc 100644
--- a/lib/util/index.ts
+++ b/lib/util/index.ts
@@ -2,7 +2,7 @@ import findUp from 'find-up';
 import { join } from 'upath';
 import { RenovateConfig } from '../config/common';
 import { setExecConfig } from './exec';
-import { setFsConfig } from './gitfs';
+import { setFsConfig } from './fs';
 
 export async function setUtilConfig(
   config: Partial<RenovateConfig>
diff --git a/lib/workers/branch/auto-replace.spec.ts b/lib/workers/branch/auto-replace.spec.ts
index 0d669c138148d93e353592c80723f3a954b81c43..3ab53b7745e040313c803f8116c7d090701badc2 100644
--- a/lib/workers/branch/auto-replace.spec.ts
+++ b/lib/workers/branch/auto-replace.spec.ts
@@ -10,7 +10,7 @@ const sampleHtml = readFileSync(
   'utf8'
 );
 
-jest.mock('../../util/gitfs/fs');
+jest.mock('../../util/fs');
 
 describe('workers/branch/auto-replace', () => {
   describe('doAutoReplace', () => {
diff --git a/lib/workers/branch/auto-replace.ts b/lib/workers/branch/auto-replace.ts
index 6d17fa28e45e77492a5f07d49bbcf84863bea67c..0cd88d02e3912b626dc1e9cea8c850c83f79af5a 100644
--- a/lib/workers/branch/auto-replace.ts
+++ b/lib/workers/branch/auto-replace.ts
@@ -2,7 +2,7 @@ import { WORKER_FILE_UPDATE_FAILED } from '../../constants/error-messages';
 import { logger } from '../../logger';
 import { get } from '../../manager';
 import { PackageDependency } from '../../manager/common';
-import { writeLocalFile } from '../../util/gitfs';
+import { writeLocalFile } from '../../util/fs';
 import { escapeRegExp, regEx } from '../../util/regex';
 import { matchAt, replaceAt } from '../../util/string';
 import { compile } from '../../util/template';
diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts
index 85bd692ee0b0e86f688e1c38acc92216b871c558..f4d16a2f4c7864bd99b235ccfb19abd1aef37c5a 100644
--- a/lib/workers/branch/index.spec.ts
+++ b/lib/workers/branch/index.spec.ts
@@ -12,7 +12,7 @@ import {
 import * as _npmPostExtract from '../../manager/npm/post-update';
 import { File } from '../../platform';
 import * as _exec from '../../util/exec';
-import { StatusResult } from '../../util/gitfs';
+import { StatusResult } from '../../util/git';
 import { BranchConfig, PrResult } from '../common';
 import * as _prWorker from '../pr';
 import * as _automerge from './automerge';
diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts
index f5f4521e180abc282c8be37963d32fcb4d8db76f..ce865f3cc70c466de415cda7821987f16ab6d386 100644
--- a/lib/workers/branch/index.ts
+++ b/lib/workers/branch/index.ts
@@ -24,7 +24,7 @@ import { BranchStatus } from '../../types';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import { emojify } from '../../util/emoji';
 import { exec } from '../../util/exec';
-import { readLocalFile, writeLocalFile } from '../../util/gitfs';
+import { readLocalFile, writeLocalFile } from '../../util/fs';
 import { regEx } from '../../util/regex';
 import { BranchConfig, PrResult, ProcessBranchResult } from '../common';
 import { checkAutoMerge, ensurePr } from '../pr';
diff --git a/lib/workers/repository/extract/manager-files.spec.ts b/lib/workers/repository/extract/manager-files.spec.ts
index c447596b4516fe93ebba556514da48bd5d961b24..85e4814cb2a7b910879db445d659b3c668b672a8 100644
--- a/lib/workers/repository/extract/manager-files.spec.ts
+++ b/lib/workers/repository/extract/manager-files.spec.ts
@@ -6,7 +6,7 @@ import { getManagerPackageFiles } from './manager-files';
 
 jest.mock('./file-match');
 jest.mock('../../../manager/html');
-jest.mock('../../../util/gitfs/fs');
+jest.mock('../../../util/fs');
 
 const fileMatch = mocked(_fileMatch);
 const html = mocked(_html);
diff --git a/lib/workers/repository/extract/manager-files.ts b/lib/workers/repository/extract/manager-files.ts
index 374b7974f3285574e5e2a5a1c4edcfb7010fd6c6..c3e8880ffccc0c8ca74f20bdb13482d5493d8b53 100644
--- a/lib/workers/repository/extract/manager-files.ts
+++ b/lib/workers/repository/extract/manager-files.ts
@@ -7,7 +7,7 @@ import {
   get,
 } from '../../../manager';
 import { PackageFile } from '../../../manager/common';
-import { readLocalFile } from '../../../util/gitfs';
+import { readLocalFile } from '../../../util/fs';
 
 export async function getManagerPackageFiles(
   config: RenovateConfig
diff --git a/lib/workers/repository/init/config.spec.ts b/lib/workers/repository/init/config.spec.ts
index 4fe7364f228f9c5f595912c61538cb358ff0eb19..38a3c5e8809cb0240704e383c0861e2ef5a7b4ab 100644
--- a/lib/workers/repository/init/config.spec.ts
+++ b/lib/workers/repository/init/config.spec.ts
@@ -8,7 +8,7 @@ import {
 import * as _migrateAndValidate from '../../../config/migrate-validate';
 import { mergeRenovateConfig } from './config';
 
-jest.mock('../../../util/gitfs/fs');
+jest.mock('../../../util/fs');
 
 const migrateAndValidate = mocked(_migrateAndValidate);
 
diff --git a/lib/workers/repository/init/config.ts b/lib/workers/repository/init/config.ts
index c67276686c57fedfb5981fd42828615cbf2de83d..68bce6f6bc45990bc5ed6d2c3a107cabb047b1d5 100644
--- a/lib/workers/repository/init/config.ts
+++ b/lib/workers/repository/init/config.ts
@@ -14,7 +14,7 @@ import { platform } from '../../../platform';
 import { ExternalHostError } from '../../../types/errors/external-host-error';
 import { getCache } from '../../../util/cache/repository';
 import { clone } from '../../../util/clone';
-import { readLocalFile } from '../../../util/gitfs';
+import { readLocalFile } from '../../../util/fs';
 import * as hostRules from '../../../util/host-rules';
 import { flattenPackageRules } from './flatten';
 
diff --git a/lib/workers/repository/onboarding/branch/check.ts b/lib/workers/repository/onboarding/branch/check.ts
index bf6baab0aedd0a490657582c78b0b169b923bc72..363c697cec7548f3c84a65069b5f67342b5d95ca 100644
--- a/lib/workers/repository/onboarding/branch/check.ts
+++ b/lib/workers/repository/onboarding/branch/check.ts
@@ -4,7 +4,7 @@ import { REPOSITORY_DISABLED } from '../../../../constants/error-messages';
 import { PR_STATE_NOT_OPEN } from '../../../../constants/pull-requests';
 import { logger } from '../../../../logger';
 import { platform } from '../../../../platform';
-import { readLocalFile } from '../../../../util/gitfs';
+import { readLocalFile } from '../../../../util/fs';
 
 const findFile = async (fileName: string): Promise<boolean> => {
   logger.debug(`findFile(${fileName})`);
diff --git a/lib/workers/repository/onboarding/branch/config.ts b/lib/workers/repository/onboarding/branch/config.ts
index 5ebfb796df02d302d6d0299a65fa8771091ed65b..45cee4492b8ebde0151fa621dfbda41b2e6b99c8 100644
--- a/lib/workers/repository/onboarding/branch/config.ts
+++ b/lib/workers/repository/onboarding/branch/config.ts
@@ -2,7 +2,7 @@ import is from '@sindresorhus/is';
 import { RenovateConfig } from '../../../../config';
 import { logger } from '../../../../logger';
 import { clone } from '../../../../util/clone';
-import { readLocalFile } from '../../../../util/gitfs';
+import { readLocalFile } from '../../../../util/fs';
 
 export async function getOnboardingConfig(
   config: RenovateConfig
diff --git a/lib/workers/repository/onboarding/branch/index.spec.ts b/lib/workers/repository/onboarding/branch/index.spec.ts
index b1b966b4c7ffba9cbfcce7c0287a7d883517cc73..a9d53d2703ac9eb08b4e4f39a05b77973fef14eb 100644
--- a/lib/workers/repository/onboarding/branch/index.spec.ts
+++ b/lib/workers/repository/onboarding/branch/index.spec.ts
@@ -13,7 +13,7 @@ import { checkOnboardingBranch } from '.';
 const rebase: any = _rebase;
 
 jest.mock('../../../../workers/repository/onboarding/branch/rebase');
-jest.mock('../../../../util/gitfs/fs');
+jest.mock('../../../../util/fs');
 
 describe('workers/repository/onboarding/branch', () => {
   describe('checkOnboardingBranch', () => {
diff --git a/test/util.ts b/test/util.ts
index 4d662f001f4b70e1ade154758f9cce0134f0817d..8b4b2170345ea5d2e6525b7a247cdf7bc1438f05 100644
--- a/test/util.ts
+++ b/test/util.ts
@@ -4,8 +4,8 @@ import { RenovateConfig as _RenovateConfig } from '../lib/config';
 import { getConfig } from '../lib/config/defaults';
 import { platform as _platform } from '../lib/platform';
 import * as _env from '../lib/util/exec/env';
-import * as _fs from '../lib/util/gitfs/fs';
-import * as _git from '../lib/util/gitfs/git';
+import * as _fs from '../lib/util/fs';
+import * as _git from '../lib/util/git';
 import * as _hostRules from '../lib/util/host-rules';
 
 /**