diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index 408ce22fd6f10fa3c19cdb76f99fa137ea6d0f29..209d621031b1abe2d344b6e20ac8f1e8407dd23d 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -128,6 +128,14 @@ describe('platform/gitlab', () => {
           {
             path_with_namespace: 'c/d',
           },
+          {
+            path_with_namespace: 'c/e',
+            archived: true,
+          },
+          {
+            path_with_namespace: 'c/f',
+            mirror: true,
+          },
         ]);
       const repos = await gitlab.getRepos();
       expect(repos).toMatchSnapshot();
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 73d38964585161536083f86a745ac4a2d75e5fce..02e3fbf2a4d087759731a39514451c511233935d 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -44,6 +44,18 @@ import { smartTruncate } from '../utils/pr-body';
 const gitlabApi = new GitlabHttp();
 
 type MergeMethod = 'merge' | 'rebase_merge' | 'ff';
+type RepoResponse = {
+  archived: boolean;
+  mirror: boolean;
+  default_branch: string;
+  empty_repo: boolean;
+  http_url_to_repo: string;
+  forked_from_project: boolean;
+  repository_access_level: 'disabled' | 'private' | 'enabled';
+  merge_requests_access_level: 'disabled' | 'private' | 'enabled';
+  merge_method: MergeMethod;
+  path_with_namespace: string;
+};
 const defaultConfigFile = configFileNames[0];
 let config: {
   storage: GitStorage;
@@ -110,12 +122,13 @@ export async function getRepos(): Promise<string[]> {
   logger.debug('Autodiscovering GitLab repositories');
   try {
     const url = `projects?membership=true&per_page=100&with_merge_requests_enabled=true&min_access_level=30`;
-    const res = await gitlabApi.getJson<{ path_with_namespace: string }[]>(
-      url,
-      { paginate: true }
-    );
+    const res = await gitlabApi.getJson<RepoResponse[]>(url, {
+      paginate: true,
+    });
     logger.debug(`Discovered ${res.body.length} project(s)`);
-    return res.body.map((repo) => repo.path_with_namespace);
+    return res.body
+      .filter((repo) => !repo.mirror && !repo.archived)
+      .map((repo) => repo.path_with_namespace);
   } catch (err) {
     logger.error({ err }, `GitLab getRepos error`);
     throw err;
@@ -146,17 +159,6 @@ export async function initRepo({
   config.repository = urlEscape(repository);
   config.localDir = localDir;
 
-  type RepoResponse = {
-    archived: boolean;
-    mirror: boolean;
-    default_branch: string;
-    empty_repo: boolean;
-    http_url_to_repo: string;
-    forked_from_project: boolean;
-    repository_access_level: 'disabled' | 'private' | 'enabled';
-    merge_requests_access_level: 'disabled' | 'private' | 'enabled';
-    merge_method: MergeMethod;
-  };
   let res: HttpResponse<RepoResponse>;
   try {
     res = await gitlabApi.getJson<RepoResponse>(