diff --git a/doc/raketasks/cleanup.md b/doc/raketasks/cleanup.md
index 96d67f7b5d664fa24eaa378adc189849db2a9cf8..8fbcbb983e9edfd8f9e8b3d32c2fb0b33e15a7dd 100644
--- a/doc/raketasks/cleanup.md
+++ b/doc/raketasks/cleanup.md
@@ -12,7 +12,8 @@ sudo gitlab-rake gitlab:cleanup:dirs
 bundle exec rake gitlab:cleanup:dirs RAILS_ENV=production
 ```
 
-Remove repositories (global only for now) from `/home/git/repositories` if they don't exist in GitLab database.
+Rename repositories from `/home/git/repositories` if they don't exist in GitLab database.
+The repositories get a `+orphaned+TIMESTAMP` suffix so that they cannot block new repositories from being created.
 
 ```
 # omnibus-gitlab
diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake
index 6b1e371614706036a5aff815c2d4239037dd89a1..9f5852ac6133b967180f8efb36cb64eb956f2572 100644
--- a/lib/tasks/gitlab/cleanup.rake
+++ b/lib/tasks/gitlab/cleanup.rake
@@ -46,43 +46,24 @@ namespace :gitlab do
     desc "GitLab | Cleanup | Clean repositories"
     task repos: :environment  do
       warn_user_is_not_gitlab
-      remove_flag = ENV['REMOVE']
-
-      git_base_path = Gitlab.config.gitlab_shell.repos_path
-      all_dirs = Dir.glob(git_base_path + '/*')
-
-      global_projects = Project.in_namespace(nil).pluck(:path)
-
-      puts git_base_path.yellow
-      puts "Looking for global repos to remove... "
-
-      # skip non git repo
-      all_dirs.select! do |dir|
-        dir =~ /.git$/
-      end
-
-      # skip existing repos
-      all_dirs.reject! do |dir|
-        repo_name = File.basename dir
-        path = repo_name.gsub(/\.git$/, "")
-        global_projects.include?(path)
-      end
 
-      all_dirs.each do |dir_path|
-        if remove_flag
-          if FileUtils.rm_rf dir_path
-            puts "Removed...#{dir_path}".red
-          else
-            puts "Cannot remove #{dir_path}".red
-          end
-        else
-          puts "Can be removed: #{dir_path}".red
+      move_suffix = "+orphaned+#{Time.now.to_i}"
+      repo_root = Gitlab.config.gitlab_shell.repos_path
+      # Look for global repos (legacy, depth 1) and normal repos (depth 2)
+      IO.popen(%W(find #{repo_root} -mindepth 1 -maxdepth 2 -name *.git)) do |find|
+        find.each_line do |path|
+          path.chomp!
+          repo_with_namespace = path.
+            sub(repo_root, '').
+            sub(%r{^/*}, '').
+            chomp('.git').
+            chomp('.wiki')
+          next if Project.find_with_namespace(repo_with_namespace)
+          new_path = path + move_suffix
+          puts path.inspect + ' -> ' + new_path.inspect
+          File.rename(path, new_path)
         end
       end
-
-      unless remove_flag
-        puts "To cleanup this directories run this command with REMOVE=true".yellow
-      end
     end
 
     desc "GitLab | Cleanup | Block users that have been removed in LDAP"