diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index d8c4e965190702f816ca5ea5f567b9d3ce1abfc8..d4f7615c80ebc65d35783c19db45d6226170d667 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -445,7 +445,6 @@ Style/Dir:
 # Cop supports --auto-correct.
 Style/EachWithObject:
   Exclude:
-    - 'config/initializers/gollum.rb'
     - 'lib/expand_variables.rb'
     - 'lib/gitlab/ci/ansi2html.rb'
     - 'lib/gitlab/ee_compat_check.rb'
diff --git a/Gemfile b/Gemfile
index 2576eeea05df1256d7fc78c29cb3e1fa23f34e98..54042ad2b9b348328858238d0c4889e1e227377e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -83,11 +83,9 @@ gem 'gitlab_omniauth-ldap', '~> 2.0.4', require: 'omniauth-ldap'
 gem 'net-ldap'
 
 # Git Wiki
-# Required manually in config/initializers/gollum.rb to control load order
+# Only used to compute wiki page slugs
 gem 'gitlab-gollum-lib', '~> 4.2', require: false
 
-gem 'gitlab-gollum-rugged_adapter', '~> 0.4.4', require: false
-
 # Language detection
 gem 'github-linguist', '~> 5.3.3', require: 'linguist'
 
@@ -144,6 +142,7 @@ gem 'faraday_middleware-aws-signers-v4'
 gem 'html-pipeline', '~> 2.8'
 gem 'deckar01-task_list', '2.0.0'
 gem 'gitlab-markup', '~> 1.6.4'
+gem 'github-markup', '~> 1.7.0', require: 'github/markup'
 gem 'redcarpet', '~> 3.4'
 gem 'commonmarker', '~> 0.17'
 gem 'RedCloth', '~> 4.3.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index ccfe07a06b7328417f2a3b9390d4714d1843f12d..54c389c5712949c339cca33e007513f5a62a5295 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -319,9 +319,6 @@ GEM
       rouge (~> 3.1)
       sanitize (~> 4.6.4)
       stringex (~> 2.6)
-    gitlab-gollum-rugged_adapter (0.4.4.1)
-      mime-types (>= 1.15)
-      rugged (~> 0.25)
     gitlab-grit (2.8.2)
       charlock_holmes (~> 0.6)
       diff-lcs (~> 1.1)
@@ -1064,9 +1061,9 @@ DEPENDENCIES
   gettext_i18n_rails_js (~> 1.3)
   gitaly-proto (~> 0.118.1)
   github-linguist (~> 5.3.3)
+  github-markup (~> 1.7.0)
   gitlab-flowdock-git-hook (~> 1.0.1)
   gitlab-gollum-lib (~> 4.2)
-  gitlab-gollum-rugged_adapter (~> 0.4.4)
   gitlab-license (~> 1.0)
   gitlab-markup (~> 1.6.4)
   gitlab-styles (~> 2.4)
diff --git a/Gemfile.rails5.lock b/Gemfile.rails5.lock
index a5f1e57f359a6cbd038180ccb34457e933258124..564cbf5c2d92625856cce4485f79eb030070d3a7 100644
--- a/Gemfile.rails5.lock
+++ b/Gemfile.rails5.lock
@@ -322,9 +322,6 @@ GEM
       rouge (~> 3.1)
       sanitize (~> 4.6.4)
       stringex (~> 2.6)
-    gitlab-gollum-rugged_adapter (0.4.4.1)
-      mime-types (>= 1.15)
-      rugged (~> 0.25)
     gitlab-grit (2.8.2)
       charlock_holmes (~> 0.6)
       diff-lcs (~> 1.1)
@@ -1073,9 +1070,9 @@ DEPENDENCIES
   gettext_i18n_rails_js (~> 1.3)
   gitaly-proto (~> 0.118.1)
   github-linguist (~> 5.3.3)
+  github-markup (~> 1.7.0)
   gitlab-flowdock-git-hook (~> 1.0.1)
   gitlab-gollum-lib (~> 4.2)
-  gitlab-gollum-rugged_adapter (~> 0.4.4)
   gitlab-license (~> 1.0)
   gitlab-markup (~> 1.6.4)
   gitlab-styles (~> 2.4)
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 102907a8bd33401147990ac00a4b54f707fd1a1d..42fd213d03bc3e26f2d8a22312fa6cad1aae565f 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -58,7 +58,7 @@ def to_key
   attr_reader :page
 
   # The attributes Hash used for storing and validating
-  # new Page values before writing to the Gollum repository.
+  # new Page values before writing to the raw repository.
   attr_accessor :attributes
 
   def hook_attrs
@@ -111,10 +111,7 @@ def directory
 
   # The processed/formatted content of this page.
   def formatted_content
-    # Assuming @page exists, nil formatted_data means we didn't load it
-    # before hand (i.e. page was fetched by Gitaly), so we fetch it separately.
-    # If the page was fetched by Gollum, formatted_data would've been a String.
-    @attributes[:formatted_content] ||= @page&.formatted_data || @wiki.page_formatted_data(@page)
+    @attributes[:formatted_content] ||= @wiki.page_formatted_data(@page)
   end
 
   # The markup format for the page.
diff --git a/config/initializers/8_metrics.rb b/config/initializers/8_metrics.rb
index d8eeacdf9184406f844d55593360ccbd95dac6f2..2564d1c416a38db64950e28d62567f57d7fed4a4 100644
--- a/config/initializers/8_metrics.rb
+++ b/config/initializers/8_metrics.rb
@@ -48,16 +48,6 @@ def instrument_classes(instrumentation)
   instrumentation.instrument_methods(Premailer::Adapter::Nokogiri)
   instrumentation.instrument_instance_methods(Premailer::Adapter::Nokogiri)
 
-  [
-    :Blame, :Branch, :BranchCollection, :Blob, :Commit, :Diff, :Repository,
-    :Tag, :TagCollection, :Tree
-  ].each do |name|
-    const = Rugged.const_get(name)
-
-    instrumentation.instrument_methods(const)
-    instrumentation.instrument_instance_methods(const)
-  end
-
   instrumentation.instrument_methods(Banzai::Renderer)
   instrumentation.instrument_methods(Banzai::Querying)
 
diff --git a/config/initializers/gollum.rb b/config/initializers/gollum.rb
deleted file mode 100644
index ea9cc151a577ad1339f2fd64b8b558798aa5b522..0000000000000000000000000000000000000000
--- a/config/initializers/gollum.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# WARNING changes in this file must be manually propagated to gitaly-ruby.
-#
-# https://gitlab.com/gitlab-org/gitaly/blob/master/ruby/lib/gitlab/gollum.rb
-
-module Gollum
-  GIT_ADAPTER = "rugged".freeze
-end
-require "gollum-lib"
-
-module Gollum
-  class Page
-    def text_data(encoding = nil)
-      data = if raw_data.respond_to?(:encoding)
-               raw_data.force_encoding(encoding || Encoding::UTF_8)
-             else
-               raw_data
-             end
-
-      Gitlab::EncodingHelper.encode!(data)
-    end
-  end
-end
-
-Rails.application.configure do
-  config.after_initialize do
-    Gollum::Page.per_page = Kaminari.config.default_per_page
-  end
-end
diff --git a/doc/development/diffs.md b/doc/development/diffs.md
index 5e8e8cc754185416c198c89ce04e273aa600413e..c8ced445027cb5afd122ad3d0a9660bfc35973bf 100644
--- a/doc/development/diffs.md
+++ b/doc/development/diffs.md
@@ -2,13 +2,10 @@
 
 Currently we rely on different sources to present diffs, these include:
 
-- Rugged gem
 - Gitaly service
 - Database (through `merge_request_diff_files`)
 - Redis (cached highlighted diffs)
 
-We're constantly moving Rugged calls to Gitaly and the progress can be followed through [Gitaly repo](https://gitlab.com/gitlab-org/gitaly).
-
 ## Architecture overview
 
 ### Merge request diffs
diff --git a/doc/development/gitaly.md b/doc/development/gitaly.md
index f4784c19359c476310f34cc554e8b969ef3798ee..32beafad3079de43304367250430dcdf346f3f07 100644
--- a/doc/development/gitaly.md
+++ b/doc/development/gitaly.md
@@ -1,11 +1,7 @@
 # GitLab Developers Guide to Working with Gitaly
 
 [Gitaly](https://gitlab.com/gitlab-org/gitaly) is a high-level Git RPC service used by GitLab CE/EE,
-Workhorse and GitLab-Shell. All Rugged operations in GitLab CE/EE are currently being phased out to
-be replaced by Gitaly API calls.
-
-Visit the [Gitaly Migration Board](https://gitlab.com/gitlab-org/gitaly/boards/331341) for current
-status of the migration.
+Workhorse and GitLab-Shell.
 
 ## Developing new Git features
 
@@ -52,57 +48,6 @@ comfortable writing Go code.
 There is documentation for this approach in [the Gitaly
 repo](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/ruby_endpoint.md).
 
-## Modifying existing Git features
-
-If you modify existing Git features in `lib/gitlab/git` you need to make
-sure the changes also work in Gitaly. Because we are still in the
-migration process there are a number of subtle pitfalls. Features that
-have been migrated have dual implementations (Gitaly and local). The
-Gitaly implementation may or may not use a vendored (and therefore
-possibly outdated) copy of the local implementation in `lib/gitlab/git`.
-
-To avoid unexpected problems and conflicts, all changes to
-`lib/gitlab/git` need to be approved by a member of the Gitaly team.
-
-For the time being, while the Gitaly migration is still in progress,
-there should be no Enterprise Edition-only Git code in
-`lib/gitlab/git`. Also no mixins.
-
-## Feature Flags
-
-Gitaly makes heavy use of [feature flags](feature_flags.md).
-
-Each Rugged-to-Gitaly migration goes through a [series of phases](https://gitlab.com/gitlab-org/gitaly/blob/master/doc/MIGRATION_PROCESS.md):
-
-* **Opt-In**: by default the Rugged implementation is used.
-  * Production instances can choose to enable the Gitaly endpoint by enabling the feature flag.
-  * For testing purposes, you may wish to enable all feature flags by default. This can be done by exporting the following
-    environment variable: `GITALY_FEATURE_DEFAULT_ON=1`.
-  * On developer instances (ie, when `Rails.env.development?` is true), the Gitaly endpoint
-    is enabled by default, but can be _disabled_ using feature flags.
-* **Opt-Out**: by default, the Gitaly endpoint is used, but the feature can be explicitly disabled using the feature flag.
-* **Mandatory**: The migration is complete and cannot be disabled. The old codepath is removed.
-
-### Enabling and Disabling Feature
-
-In the Rails console, type:
-
-```ruby
-Feature.enable(:gitaly_feature_name)
-Feature.disable(:gitaly_feature_name)
-```
-
-Where `gitaly_feature_name` is the name of the Gitaly feature. This can be determined by finding the appropriate
-`gitaly_migrate` code block, for example:
-
-```ruby
-gitaly_migrate(:tag_names) do
-...
-end
-```
-
-Since Gitaly features are always prefixed with `gitaly_`, the name of the feature flag in this case would be `gitaly_tag_names`.
-
 ## Gitaly-Related Test Failures
 
 If your test-suite is failing with Gitaly issues, as a first step, try running:
diff --git a/doc/development/instrumentation.md b/doc/development/instrumentation.md
index a14c0752366b854d5586984dbcd10835d4edb224..7761f65d78aae833653be72759034ad3f61dcd42 100644
--- a/doc/development/instrumentation.md
+++ b/doc/development/instrumentation.md
@@ -69,7 +69,7 @@ The easiest way to check if a method has been instrumented is to check its
 source location. For example:
 
 ```ruby
-method = Rugged::TagCollection.instance_method(:[])
+method = Banzai::Renderer.method(:render)
 
 method.source_location
 ```
@@ -82,7 +82,7 @@ method (along with its source location), this is easier than running the above
 Ruby code. In case of the above snippet you'd run the following:
 
 ```
-$ Rugged::TagCollection#[]
+$ Banzai::Renderer.render
 ```
 
 This will print out something along the lines of:
diff --git a/ee/spec/lib/gitlab/checks/change_access_spec.rb b/ee/spec/lib/gitlab/checks/change_access_spec.rb
index 42cc66df264afe6f610954a843fff651d7b18008..0d0e83382015c99da31d075599fc629194f3e495 100644
--- a/ee/spec/lib/gitlab/checks/change_access_spec.rb
+++ b/ee/spec/lib/gitlab/checks/change_access_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe Gitlab::Checks::ChangeAccess do
+  include GitHelpers
+
   describe '#exec' do
     let(:user) { create(:user) }
     let(:project) { create(:project, :repository) }
@@ -424,9 +426,7 @@
         #
         # That means only the merge commit should be validated.
         let(:newrev) do
-          rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-            project.repository.raw_repository.rugged
-          end
+          rugged = rugged_repo(project.repository)
           base = oldrev
           to_merge = '2d1096e3a0ecf1d2baf6dee036cc80775d4940ba'
 
diff --git a/ee/spec/models/repository_spec.rb b/ee/spec/models/repository_spec.rb
index 252329919ea040e8dec25c6b0e39a7cedadd8e5d..ef7ad6aab8bd5a6d7f51fb37f4787f198845663d 100644
--- a/ee/spec/models/repository_spec.rb
+++ b/ee/spec/models/repository_spec.rb
@@ -3,6 +3,7 @@
 describe Repository do
   include RepoHelpers
   include ::EE::GeoHelpers
+  include GitHelpers
 
   TestBlob = Struct.new(:path)
 
@@ -13,9 +14,7 @@
   let(:repository) { project.repository }
 
   def create_remote_branch(remote_name, branch_name, target)
-    rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.rugged
-    end
+    rugged = rugged_repo(repository)
     rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
   end
 
@@ -40,11 +39,7 @@ def create_remote_branch(remote_name, branch_name, target)
   end
 
   describe '#with_config' do
-    let(:rugged) do
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        repository.rugged
-      end
-    end
+    let(:rugged) { rugged_repo(repository) }
     let(:entries) do
       {
         'test.foo1' => 'hello',
diff --git a/ee/spec/services/projects/update_mirror_service_spec.rb b/ee/spec/services/projects/update_mirror_service_spec.rb
index 6bfcc325816911e1a4f7d565d065fb810dda9eec..302aa9d21d5995a2fd8255e765a7afa804792902 100644
--- a/ee/spec/services/projects/update_mirror_service_spec.rb
+++ b/ee/spec/services/projects/update_mirror_service_spec.rb
@@ -260,9 +260,7 @@ def stub_fetch_mirror(project, repository: project.repository)
   end
 
   def fetch_mirror(repository)
-    rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.rugged
-    end
+    rugged = rugged_repo(repository)
     masterrev = repository.find_branch('master').dereferenced_target.id
 
     parentrev = repository.commit(masterrev).parent_id
diff --git a/lib/gitlab/git/commit.rb b/lib/gitlab/git/commit.rb
index 5b264868af0ebeda736dc32762fef1c4712c5893..74cdabfed9d7ab7e737dc1640f7fae0c08017d2e 100644
--- a/lib/gitlab/git/commit.rb
+++ b/lib/gitlab/git/commit.rb
@@ -53,9 +53,6 @@ def find(repo, commit_id = "HEAD")
           # Already a commit?
           return commit_id if commit_id.is_a?(Gitlab::Git::Commit)
 
-          # A rugged reference?
-          commit_id = Gitlab::Git::Ref.dereference_object(commit_id)
-
           # Some weird thing?
           return nil unless commit_id.is_a?(String)
 
@@ -127,8 +124,6 @@ def between(repo, base, head)
         #        :topo, or any combination of them (in an array). Commit ordering types
         #        are documented here:
         #        http://www.rubydoc.info/github/libgit2/rugged/Rugged#SORT_NONE-constant)
-        #
-        # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/326
         def find_all(repo, options = {})
           repo.wrapped_gitaly_errors do
             Gitlab::GitalyClient::CommitService.new(repo).find_all_commits(options)
@@ -328,7 +323,6 @@ def tree_entry(path)
         entry = @repository.gitaly_commit_client.tree_entry(id, path, 1)
         return unless entry
 
-        # To be compatible with the rugged format
         entry = entry.to_h
         entry.delete(:data)
         entry[:name] = File.basename(path)
@@ -346,8 +340,8 @@ def to_gitaly_commit
           subject: message_split[0] ? message_split[0].chomp.b : "",
           body: raw_commit.message.b,
           parent_ids: raw_commit.parent_ids,
-          author: gitaly_commit_author_from_rugged(raw_commit.author),
-          committer: gitaly_commit_author_from_rugged(raw_commit.committer)
+          author: gitaly_commit_author_from_raw(raw_commit.author),
+          committer: gitaly_commit_author_from_raw(raw_commit.committer)
         )
       end
 
@@ -381,7 +375,7 @@ def serialize_keys
         SERIALIZE_KEYS
       end
 
-      def gitaly_commit_author_from_rugged(author_or_committer)
+      def gitaly_commit_author_from_raw(author_or_committer)
         Gitaly::CommitAuthor.new(
           name: author_or_committer[:name].b,
           email: author_or_committer[:email].b,
diff --git a/lib/gitlab/git/ref.rb b/lib/gitlab/git/ref.rb
index fa71a4e7ea7668acd56dceb907533025b501c5e1..31a280155bd837b0bc02dd27ba353c6bbf7076ec 100644
--- a/lib/gitlab/git/ref.rb
+++ b/lib/gitlab/git/ref.rb
@@ -1,5 +1,3 @@
-# Gitaly note: JV: probably no RPC's here (just one interaction with Rugged).
-
 module Gitlab
   module Git
     class Ref
@@ -26,13 +24,6 @@ def self.extract_branch_name(str)
         str.gsub(%r{\Arefs/heads/}, '')
       end
 
-      # Gitaly: this method will probably be migrated indirectly via its call sites.
-      def self.dereference_object(object)
-        object = object.target while object.is_a?(Rugged::Tag::Annotation)
-
-        object
-      end
-
       def initialize(repository, name, target, dereferenced_target)
         @name = Gitlab::Git.ref_name(name)
         @dereferenced_target = dereferenced_target
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 45d42c7078f02345f06c9c167159dde370b79918..7732049b69ba883386a1862269a2c75ad68f8c5e 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -9,14 +9,6 @@ class Repository
       include Gitlab::EncodingHelper
       include Gitlab::Utils::StrongMemoize
 
-      ALLOWED_OBJECT_DIRECTORIES_VARIABLES = %w[
-        GIT_OBJECT_DIRECTORY
-        GIT_ALTERNATE_OBJECT_DIRECTORIES
-      ].freeze
-      ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES = %w[
-        GIT_OBJECT_DIRECTORY_RELATIVE
-        GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE
-      ].freeze
       SEARCH_CONTEXT_LINES = 3
       REV_LIST_COMMIT_LIMIT = 2_000
       # In https://gitlab.com/gitlab-org/gitaly/merge_requests/698
@@ -104,15 +96,6 @@ def root_ref
         raise Gitlab::Git::CommandError.new(e.message)
       end
 
-      # This method will be removed when Gitaly reaches v1.1.
-      def rugged
-        circuit_breaker.perform do
-          Rugged::Repository.new(path, alternates: alternate_object_directories)
-        end
-      rescue Rugged::RepositoryError, Rugged::OSError
-        raise NoRepository.new('no repository for such path')
-      end
-
       def circuit_breaker
         @circuit_breaker ||= Gitlab::Git::Storage::CircuitBreaker.for_storage(storage)
       end
@@ -638,20 +621,6 @@ def find_remote_root_ref(remote_name)
         end
       end
 
-      AUTOCRLF_VALUES = {
-        "true" => true,
-        "false" => false,
-        "input" => :input
-      }.freeze
-
-      def autocrlf
-        AUTOCRLF_VALUES[rugged.config['core.autocrlf']]
-      end
-
-      def autocrlf=(value)
-        rugged.config['core.autocrlf'] = AUTOCRLF_VALUES.invert[value]
-      end
-
       # Returns result like "git ls-files" , recursive and full file path
       #
       # Ex.
@@ -1024,14 +993,6 @@ def gitaly_submodule_url_for(ref, path)
         found_module && found_module['url']
       end
 
-      def alternate_object_directories
-        relative_object_directories.map { |d| File.join(path, d) }
-      end
-
-      def relative_object_directories
-        Gitlab::Git::HookEnv.all(gl_repository).values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
-      end
-
       # Returns true if the given ref name exists
       #
       # Ref names must start with `refs/`.
diff --git a/lib/gitlab/git/wiki.rb b/lib/gitlab/git/wiki.rb
index d2dc4f2e6885cccf0589fe6308a83fb1ce6b8291..072019dfb0af778de5cc33601913a69d956dd3c5 100644
--- a/lib/gitlab/git/wiki.rb
+++ b/lib/gitlab/git/wiki.rb
@@ -1,9 +1,16 @@
+# We only need Gollum::Page so let's not load all of gollum-lib.
+require 'gollum-lib/pagination'
+require 'gollum-lib/wiki'
+require 'gollum-lib/page'
+
 module Gitlab
   module Git
     class Wiki
       DuplicatePageError = Class.new(StandardError)
       OperationError = Class.new(StandardError)
 
+      DEFAULT_PAGINATION = Kaminari.config.default_per_page
+
       CommitDetails = Struct.new(:user_id, :username, :name, :email, :message) do
         def to_h
           { user_id: user_id, username: username, name: name, email: email, message: message }
@@ -74,7 +81,7 @@ def page_versions(page_path, options = {})
         # Gitaly uses gollum-lib to get the versions. Gollum defaults to 20
         # per page, but also fetches 20 if `limit` or `per_page` < 20.
         # Slicing returns an array with the expected number of items.
-        slice_bound = options[:limit] || options[:per_page] || Gollum::Page.per_page
+        slice_bound = options[:limit] || options[:per_page] || DEFAULT_PAGINATION
         versions[0..slice_bound]
       end
 
@@ -104,26 +111,6 @@ def page_formatted_data(title:, dir: nil, version: nil)
 
       private
 
-      def new_page(gollum_page)
-        Gitlab::Git::WikiPage.new(gollum_page, new_version(gollum_page, gollum_page.version.id))
-      end
-
-      def new_version(gollum_page, commit_id)
-        Gitlab::Git::WikiPageVersion.new(version(commit_id), gollum_page&.format)
-      end
-
-      def version(commit_id)
-        commit_find_proc = -> { Gitlab::Git::Commit.find(@repository, commit_id) }
-
-        Gitlab::SafeRequestStore.fetch([:wiki_version_commit, commit_id]) { commit_find_proc.call }
-      end
-
-      def assert_type!(object, klass)
-        unless object.is_a?(klass)
-          raise ArgumentError, "expected a #{klass}, got #{object.inspect}"
-        end
-      end
-
       def gitaly_wiki_client
         @gitaly_wiki_client ||= Gitlab::GitalyClient::WikiService.new(@repository)
       end
diff --git a/lib/gitlab/git/wiki_file.rb b/lib/gitlab/git/wiki_file.rb
index 84335aca4bc8f8984fb982d3d254549f625eee30..64313bb04e8ca3f1d186370a30e776ac468ea4d3 100644
--- a/lib/gitlab/git/wiki_file.rb
+++ b/lib/gitlab/git/wiki_file.rb
@@ -3,17 +3,12 @@ module Git
     class WikiFile
       attr_reader :mime_type, :raw_data, :name, :path
 
-      # This class is meant to be serializable so that it can be constructed
-      # by Gitaly and sent over the network to GitLab.
-      #
-      # Because Gollum::File is not serializable we must get all the data from
-      # 'gollum_file' during initialization, and NOT store it in an instance
-      # variable.
-      def initialize(gollum_file)
-        @mime_type = gollum_file.mime_type
-        @raw_data = gollum_file.raw_data
-        @name = gollum_file.name
-        @path = gollum_file.path
+      # This class wraps Gitlab::GitalyClient::WikiFile
+      def initialize(gitaly_file)
+        @mime_type = gitaly_file.mime_type
+        @raw_data = gitaly_file.raw_data
+        @name = gitaly_file.name
+        @path = gitaly_file.path
       end
     end
   end
diff --git a/lib/gitlab/git/wiki_page.rb b/lib/gitlab/git/wiki_page.rb
index 669ae11a423ed98cdf8f6b4ea991f931e9dfd7d7..c4087c9ebdc79d417d795a0cd46d65577e57bf9f 100644
--- a/lib/gitlab/git/wiki_page.rb
+++ b/lib/gitlab/git/wiki_page.rb
@@ -3,25 +3,15 @@ module Git
     class WikiPage
       attr_reader :url_path, :title, :format, :path, :version, :raw_data, :name, :text_data, :historical, :formatted_data
 
-      # This class is meant to be serializable so that it can be constructed
-      # by Gitaly and sent over the network to GitLab.
-      #
-      # Because Gollum::Page is not serializable we must get all the data from
-      # 'gollum_page' during initialization, and NOT store it in an instance
-      # variable.
-      #
-      # Note that 'version' is a WikiPageVersion instance which it itself
-      # serializable. That means it's OK to store 'version' in an instance
-      # variable.
-      def initialize(gollum_page, version)
-        @url_path = gollum_page.url_path
-        @title = gollum_page.title
-        @format = gollum_page.format
-        @path = gollum_page.path
-        @raw_data = gollum_page.raw_data
-        @name = gollum_page.name
-        @historical = gollum_page.historical?
-        @formatted_data = gollum_page.formatted_data if gollum_page.is_a?(Gollum::Page)
+      # This class abstracts away Gitlab::GitalyClient::WikiPage
+      def initialize(gitaly_page, version)
+        @url_path = gitaly_page.url_path
+        @title = gitaly_page.title
+        @format = gitaly_page.format
+        @path = gitaly_page.path
+        @raw_data = gitaly_page.raw_data
+        @name = gitaly_page.name
+        @historical = gitaly_page.historical?
 
         @version = version
       end
diff --git a/lib/gitlab/git/wiki_page_version.rb b/lib/gitlab/git/wiki_page_version.rb
index 55f1afedcabd9bf97a21f8e9b16dd74d13022ba5..d5e7e70fd313e9bfdce609c64414937f38634165 100644
--- a/lib/gitlab/git/wiki_page_version.rb
+++ b/lib/gitlab/git/wiki_page_version.rb
@@ -3,11 +3,6 @@ module Git
     class WikiPageVersion
       attr_reader :commit, :format
 
-      # This class is meant to be serializable so that it can be constructed
-      # by Gitaly and sent over the network to GitLab.
-      #
-      # Both 'commit' (a Gitlab::Git::Commit) and 'format' (a string) are
-      # serializable.
       def initialize(commit, format)
         @commit = commit
         @format = format
diff --git a/lib/gitlab/gitaly_client/wiki_service.rb b/lib/gitlab/gitaly_client/wiki_service.rb
index 75be7d1f5a0b7560cf18851280f14b393ed12c0d..7c2c228ad01388bf8251f96b83c73d0ca0a56ae2 100644
--- a/lib/gitlab/gitaly_client/wiki_service.rb
+++ b/lib/gitlab/gitaly_client/wiki_service.rb
@@ -110,7 +110,7 @@ def page_versions(page_path, options)
           repository: @gitaly_repo,
           page_path: encode_binary(page_path),
           page: options[:page] || 1,
-          per_page: options[:per_page] || Gollum::Page.per_page
+          per_page: options[:per_page] || Gitlab::Git::Wiki::DEFAULT_PAGINATION
         )
 
         stream = GitalyClient.call(@repository.storage, :wiki_service, :wiki_get_page_versions, request, timeout: GitalyClient.medium_timeout)
diff --git a/scripts/lint-rugged b/scripts/lint-rugged
index 8812f7a46b2b50a76d8e6eaa693b1c958cf1f4c4..6f326a272053fd6bf2ee7000beb9812254b388c9 100755
--- a/scripts/lint-rugged
+++ b/scripts/lint-rugged
@@ -4,21 +4,9 @@ ALLOWED = [
   # https://gitlab.com/gitlab-org/gitaly/issues/760
   'lib/elasticsearch/git/repository.rb',
 
-  # Can be fixed once Rugged is no longer used in production. Doesn't make Rugged calls.
-  'config/initializers/8_metrics.rb',
-
-  # Can be deleted once wiki's are fully (mandatory) migrated
-  'config/initializers/gollum.rb',
-
-  # Needs to be migrated, https://gitlab.com/gitlab-org/gitaly/issues/953
+  # Needed to handle repositories that are not in any storage
   'lib/gitlab/bare_repository_import/repository.rb',
 
-  # Needs to be migrated, https://gitlab.com/gitlab-org/gitaly/issues/954
-  'lib/tasks/gitlab/cleanup.rake',
-
-  # The only place where Rugged code is still allowed in production
-  'lib/gitlab/git/',
-
   # Needed to avoid using the git binary to validate a branch name
   'lib/gitlab/git_ref_validator.rb'
 ].freeze
diff --git a/spec/features/markdown/markdown_spec.rb b/spec/features/markdown/markdown_spec.rb
index cac8a5068ecd358d4f0d48a0ce40c4ea03ad8a0d..3b37ede8579f2d6ca15f44da64aac5ccd7f355bc 100644
--- a/spec/features/markdown/markdown_spec.rb
+++ b/spec/features/markdown/markdown_spec.rb
@@ -264,9 +264,9 @@ def doc(html = @html)
       @project_wiki = @feat.project_wiki
       @project_wiki_page = @feat.project_wiki_page
 
-      file = Gollum::File.new(@project_wiki.wiki)
-      expect(file).to receive(:path).and_return('images/example.jpg')
-      expect(@project_wiki).to receive(:find_file).with('images/example.jpg').and_return(file)
+      path = 'images/example.jpg'
+      gitaly_wiki_file = Gitlab::GitalyClient::WikiFile.new(path: path)
+      expect(@project_wiki).to receive(:find_file).with(path).and_return(Gitlab::Git::WikiFile.new(gitaly_wiki_file))
       allow(@project_wiki).to receive(:wiki_base_path) { '/namespace1/gitlabhq/wikis' }
 
       @html = markdown(@feat.raw_markdown, { pipeline: :wiki, project_wiki: @project_wiki, page_slug: @project_wiki_page.slug })
diff --git a/spec/features/projects/wiki/user_views_wiki_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_page_spec.rb
index 747406efc8ba01a66329960da1058bec64c88922..9a4ce426e69ba825c3850e08198c2a5f93a2c920 100644
--- a/spec/features/projects/wiki/user_views_wiki_page_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_page_spec.rb
@@ -83,12 +83,13 @@
       end
 
       it 'shows a file stored in a page' do
-        gollum_file_double = double('Gollum::File',
-                                    mime_type: 'image/jpeg',
-                                    name: 'images/image.jpg',
-                                    path: 'images/image.jpg',
-                                    raw_data: '')
-        wiki_file = Gitlab::Git::WikiFile.new(gollum_file_double)
+        raw_file = Gitlab::GitalyClient::WikiFile.new(
+          mime_type: 'image/jpeg',
+          name: 'images/image.jpg',
+          path: 'images/image.jpg',
+          raw_data: ''
+        )
+        wiki_file = Gitlab::Git::WikiFile.new(raw_file)
 
         allow(wiki_file).to receive(:mime_type).and_return('image/jpeg')
         allow_any_instance_of(ProjectWiki).to receive(:find_file).with('image.jpg', nil).and_return(wiki_file)
diff --git a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb
index 0735ebd6dcbc945c124407f819ebb420b6ac805c..5dce3fcbcb6767dec3b505841d1de90c3bfe5649 100644
--- a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb
+++ b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits, :migration, schema: 20171114162227 do
+  include GitHelpers
+
   let(:merge_request_diffs) { table(:merge_request_diffs) }
   let(:merge_requests) { table(:merge_requests) }
 
@@ -9,11 +11,7 @@
     let(:merge_request) { merge_requests.create!(iid: 1, target_project_id: project.id, source_project_id: project.id, target_branch: 'feature', source_branch: 'master').becomes(MergeRequest) }
     let(:merge_request_diff) { MergeRequest.find(merge_request.id).create_merge_request_diff }
     let(:updated_merge_request_diff) { MergeRequestDiff.find(merge_request_diff.id) }
-    let(:rugged) do
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        project.repository.rugged
-      end
-    end
+    let(:rugged) { rugged_repo(project.repository) }
 
     before do
       allow_any_instance_of(MergeRequestDiff)
diff --git a/spec/lib/gitlab/conflict/file_spec.rb b/spec/lib/gitlab/conflict/file_spec.rb
index 9095ffbfd528f3cca1994d7dae2b16c5534aeb9e..1bd077ddbdf348c54385db77b79715fc5744ea45 100644
--- a/spec/lib/gitlab/conflict/file_spec.rb
+++ b/spec/lib/gitlab/conflict/file_spec.rb
@@ -1,9 +1,11 @@
 require 'spec_helper'
 
 describe Gitlab::Conflict::File do
+  include GitHelpers
+
   let(:project) { create(:project, :repository) }
   let(:repository) { project.repository }
-  let(:rugged) { Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged } }
+  let(:rugged) { rugged_repo(repository) }
   let(:their_commit) { rugged.branches['conflict-start'].target }
   let(:our_commit) { rugged.branches['conflict-resolvable'].target }
   let(:merge_request) { create(:merge_request, source_branch: 'conflict-resolvable', target_branch: 'conflict-start', source_project: project) }
diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb
index ea49502ae2e254c8abc490df198b58931af1dbdf..b243f0dacaee231436d3e8401693aae784e5ac79 100644
--- a/spec/lib/gitlab/git/blob_spec.rb
+++ b/spec/lib/gitlab/git/blob_spec.rb
@@ -4,6 +4,9 @@
 
 describe Gitlab::Git::Blob, :seed_helper do
   let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
+  let(:rugged) do
+    Rugged::Repository.new(File.join(TestEnv.repos_path, TEST_REPO_PATH))
+  end
 
   describe 'initialize' do
     let(:blob) { Gitlab::Git::Blob.new(name: 'test') }
@@ -139,9 +142,7 @@
       it 'limits the size of a large file' do
         blob_size = Gitlab::Git::Blob::MAX_DATA_DISPLAY_SIZE + 1
         buffer = Array.new(blob_size, 0)
-        rugged_blob = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          Rugged::Blob.from_buffer(repository.rugged, buffer.join(''))
-        end
+        rugged_blob = Rugged::Blob.from_buffer(rugged, buffer.join(''))
         blob = Gitlab::Git::Blob.raw(repository, rugged_blob)
 
         expect(blob.size).to eq(blob_size)
@@ -156,9 +157,7 @@
 
     context 'when sha references a tree' do
       it 'returns nil' do
-        tree = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          repository.rugged.rev_parse('master^{tree}')
-        end
+        tree = rugged.rev_parse('master^{tree}')
 
         blob = Gitlab::Git::Blob.raw(repository, tree.oid)
 
@@ -262,11 +261,7 @@
   end
 
   describe '.batch_lfs_pointers' do
-    let(:tree_object) do
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        repository.rugged.rev_parse('master^{tree}')
-      end
-    end
+    let(:tree_object) { rugged.rev_parse('master^{tree}') }
 
     let(:non_lfs_blob) do
       Gitlab::Git::Blob.find(
diff --git a/spec/lib/gitlab/git/branch_spec.rb b/spec/lib/gitlab/git/branch_spec.rb
index 79ccbb79966df672293ef74b25fb0289827202cc..0df282d0ae312b7283fc22001e35007a4c422cbd 100644
--- a/spec/lib/gitlab/git/branch_spec.rb
+++ b/spec/lib/gitlab/git/branch_spec.rb
@@ -3,9 +3,7 @@
 describe Gitlab::Git::Branch, :seed_helper do
   let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
   let(:rugged) do
-    Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.rugged
-    end
+    Rugged::Repository.new(File.join(TestEnv.repos_path, repository.relative_path))
   end
 
   subject { repository.branches }
@@ -74,9 +72,7 @@
       Gitlab::Git.committer_hash(email: user.email, name: user.name)
     end
     let(:params) do
-      parents = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        [repository.rugged.head.target]
-      end
+      parents = [rugged.head.target]
       tree = parents.first.tree
 
       {
diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb
index 2718a3c5e49273212faf9547862d69d755415796..9ef27081f9827a57386e4bca04d02bdea4192bb9 100644
--- a/spec/lib/gitlab/git/commit_spec.rb
+++ b/spec/lib/gitlab/git/commit_spec.rb
@@ -1,19 +1,17 @@
 require "spec_helper"
 
 describe Gitlab::Git::Commit, :seed_helper do
+  include GitHelpers
+
   let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
-  let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
-  let(:rugged_commit) do
-    Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.rugged.lookup(SeedRepo::Commit::ID)
-    end
+  let(:rugged_repo) do
+    Rugged::Repository.new(File.join(TestEnv.repos_path, TEST_REPO_PATH))
   end
+  let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
+  let(:rugged_commit) { rugged_repo.lookup(SeedRepo::Commit::ID) }
+
   describe "Commit info" do
     before do
-      repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
-      end
-
       @committer = {
         email: 'mike@smith.com',
         name: "Mike Smith",
@@ -26,12 +24,12 @@
         time: Time.now
       }
 
-      @parents = [repo.head.target]
+      @parents = [rugged_repo.head.target]
       @gitlab_parents = @parents.map { |c| described_class.find(repository, c.oid) }
       @tree = @parents.first.tree
 
       sha = Rugged::Commit.create(
-        repo,
+        rugged_repo,
         author: @author,
         committer: @committer,
         tree: @tree,
@@ -40,7 +38,7 @@
         update_ref: "HEAD"
       )
 
-      @raw_commit = repo.lookup(sha)
+      @raw_commit = rugged_repo.lookup(sha)
       @commit = described_class.find(repository, sha)
     end
 
@@ -61,10 +59,7 @@
 
     after do
       # Erase the new commit so other tests get the original repo
-      repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
-      end
-      repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
+      rugged_repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
     end
   end
 
@@ -120,9 +115,7 @@
     describe '.find' do
       it "should return first head commit if without params" do
         expect(described_class.last(repository).id).to eq(
-          Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-            repository.rugged.head.target.oid
-          end
+          rugged_repo.head.target.oid
         )
       end
 
diff --git a/spec/lib/gitlab/git/diff_spec.rb b/spec/lib/gitlab/git/diff_spec.rb
index 27d803e0117110ec48290408050b8845f609082b..8a4415506c4dd70f88a7321ab9b94d1bfeb84dc4 100644
--- a/spec/lib/gitlab/git/diff_spec.rb
+++ b/spec/lib/gitlab/git/diff_spec.rb
@@ -64,9 +64,22 @@
       end
     end
 
-    context 'using a Rugged::Patch' do
+    context 'using a GitalyClient::Diff' do
+      let(:gitaly_diff) do
+        Gitlab::GitalyClient::Diff.new(
+          to_path: ".gitmodules",
+          from_path: ".gitmodules",
+          old_mode: 0100644,
+          new_mode: 0100644,
+          from_id: '357406f3075a57708d0163752905cc1576fceacc',
+          to_id: '8e5177d718c561d36efde08bad36b43687ee6bf0',
+          patch: raw_patch
+        )
+      end
+      let(:diff) { described_class.new(gitaly_diff) }
+
       context 'with a small diff' do
-        let(:diff) { described_class.new(gitaly_diff) }
+        let(:raw_patch) { @raw_diff_hash[:diff] }
 
         it 'initializes the diff' do
           expect(diff.to_hash).to eq(@raw_diff_hash)
@@ -78,16 +91,17 @@
       end
 
       context 'using a diff that is too large' do
-        it 'prunes the diff' do
-          gitaly_diff.too_large = true
-          diff = described_class.new(gitaly_diff)
+        let(:raw_patch) { 'a' * 204800 }
 
+        it 'prunes the diff' do
           expect(diff.diff).to be_empty
           expect(diff).to be_too_large
         end
       end
 
       context 'using a collapsable diff that is too large' do
+        let(:raw_patch) { 'a' * 204800 }
+
         it 'prunes the diff as a large diff instead of as a collapsed diff' do
           gitaly_diff.too_large = true
           diff = described_class.new(gitaly_diff, expanded: false)
@@ -97,43 +111,6 @@
           expect(diff).not_to be_collapsed
         end
       end
-    end
-
-    context 'using a GitalyClient::Diff' do
-      let(:diff) do
-        described_class.new(
-          Gitlab::GitalyClient::Diff.new(
-            to_path: ".gitmodules",
-            from_path: ".gitmodules",
-            old_mode: 0100644,
-            new_mode: 0100644,
-            from_id: '357406f3075a57708d0163752905cc1576fceacc',
-            to_id: '8e5177d718c561d36efde08bad36b43687ee6bf0',
-            patch: raw_patch
-          )
-        )
-      end
-
-      context 'with a small diff' do
-        let(:raw_patch) { @raw_diff_hash[:diff] }
-
-        it 'initializes the diff' do
-          expect(diff.to_hash).to eq(@raw_diff_hash)
-        end
-
-        it 'does not prune the diff' do
-          expect(diff).not_to be_too_large
-        end
-      end
-
-      context 'using a diff that is too large' do
-        let(:raw_patch) { 'a' * 204800 }
-
-        it 'prunes the diff' do
-          expect(diff.diff).to be_empty
-          expect(diff).to be_too_large
-        end
-      end
 
       context 'when the patch passed is not UTF-8-encoded' do
         let(:raw_patch) { @raw_diff_hash[:diff].encode(Encoding::ASCII_8BIT) }
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index d02536a2fb4ddb3f323bcea6874bcf3218d209d6..51eb997a325d6bfc07955268d831fdd09036733a 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -19,7 +19,10 @@
     end
   end
 
+  let(:mutable_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
   let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
+  let(:repository_path) { File.join(TestEnv.repos_path, repository.relative_path) }
+  let(:repository_rugged) { Rugged::Repository.new(repository_path) }
   let(:storage_path) { TestEnv.repos_path }
   let(:user) { build(:user) }
 
@@ -71,7 +74,6 @@
   describe "Respond to" do
     subject { repository }
 
-    it { is_expected.to respond_to(:rugged) }
     it { is_expected.to respond_to(:root_ref) }
     it { is_expected.to respond_to(:tags) }
   end
@@ -91,57 +93,6 @@
     end
   end
 
-  describe "#rugged" do
-    describe 'when storage is broken', :broken_storage  do
-      it 'raises a storage exception when storage is not available' do
-        broken_repo = described_class.new('broken', 'a/path.git', '')
-
-        expect { broken_repo.rugged }.to raise_error(Gitlab::Git::Storage::Inaccessible)
-      end
-    end
-
-    it 'raises a no repository exception when there is no repo' do
-      broken_repo = described_class.new('default', 'a/path.git', '')
-
-      expect do
-        Gitlab::GitalyClient::StorageSettings.allow_disk_access { broken_repo.rugged }
-      end.to raise_error(Gitlab::Git::Repository::NoRepository)
-    end
-
-    describe 'alternates keyword argument' do
-      context 'with no Git env stored' do
-        before do
-          allow(Gitlab::Git::HookEnv).to receive(:all).and_return({})
-        end
-
-        it "is passed an empty array" do
-          expect(Rugged::Repository).to receive(:new).with(repository_path, alternates: [])
-
-          repository_rugged
-        end
-      end
-
-      context 'with absolute and relative Git object dir envvars stored' do
-        before do
-          allow(Gitlab::Git::HookEnv).to receive(:all).and_return({
-            'GIT_OBJECT_DIRECTORY_RELATIVE' => './objects/foo',
-            'GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE' => ['./objects/bar', './objects/baz'],
-            'GIT_OBJECT_DIRECTORY' => 'ignored',
-            'GIT_ALTERNATE_OBJECT_DIRECTORIES' => %w[ignored ignored],
-            'GIT_OTHER' => 'another_env'
-          })
-        end
-
-        it "is passed the relative object dir envvars after being converted to absolute ones" do
-          alternates = %w[foo bar baz].map { |d| File.join(repository_path, './objects', d) }
-          expect(Rugged::Repository).to receive(:new).with(repository_path, alternates: alternates)
-
-          repository_rugged
-        end
-      end
-    end
-  end
-
   describe '#branch_names' do
     subject { repository.branch_names }
 
@@ -284,7 +235,6 @@
   end
 
   describe '#submodule_url_for' do
-    let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
     let(:ref) { 'master' }
 
     def submodule_url(path)
@@ -336,7 +286,7 @@ def submodule_url(path)
       it { expect(repository.has_local_branches?).to eq(true) }
 
       context 'mutable' do
-        let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+        let(:repository) { mutable_repository }
 
         after do
           ensure_seeds
@@ -369,7 +319,7 @@ def submodule_url(path)
   end
 
   describe "#delete_branch" do
-    let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+    let(:repository) { mutable_repository }
 
     after do
       ensure_seeds
@@ -393,7 +343,7 @@ def submodule_url(path)
   end
 
   describe "#create_branch" do
-    let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+    let(:repository) { mutable_repository }
 
     after do
       ensure_seeds
@@ -418,39 +368,33 @@ def submodule_url(path)
   end
 
   describe '#delete_refs' do
-    let(:repo) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
-
-    def repo_rugged
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        repo.rugged
-      end
-    end
+    let(:repository) { mutable_repository }
 
     after do
       ensure_seeds
     end
 
     it 'deletes the ref' do
-      repo.delete_refs('refs/heads/feature')
+      repository.delete_refs('refs/heads/feature')
 
-      expect(repo_rugged.references['refs/heads/feature']).to be_nil
+      expect(repository_rugged.references['refs/heads/feature']).to be_nil
     end
 
     it 'deletes all refs' do
       refs = %w[refs/heads/wip refs/tags/v1.1.0]
-      repo.delete_refs(*refs)
+      repository.delete_refs(*refs)
 
       refs.each do |ref|
-        expect(repo_rugged.references[ref]).to be_nil
+        expect(repository_rugged.references[ref]).to be_nil
       end
     end
 
     it 'does not fail when deleting an empty list of refs' do
-      expect { repo.delete_refs(*[]) }.not_to raise_error
+      expect { repository.delete_refs(*[]) }.not_to raise_error
     end
 
     it 'raises an error if it failed' do
-      expect { repo.delete_refs('refs\heads\fix') }.to raise_error(Gitlab::Git::Repository::GitError)
+      expect { repository.delete_refs('refs\heads\fix') }.to raise_error(Gitlab::Git::Repository::GitError)
     end
   end
 
@@ -528,9 +472,7 @@ def repo_rugged
     end
 
     def new_repository_path
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        new_repository.path
-      end
+      File.join(TestEnv.repos_path, new_repository.relative_path)
     end
   end
 
@@ -577,18 +519,16 @@ def new_repository_path
         Gitlab::Git::Commit.find(repository, @rename_commit_id)
       end
 
-      before(:context) do
+      before do
         # Add new commits so that there's a renamed file in the commit history
-        repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
-        @commit_with_old_name_id = new_commit_edit_old_file(repo).oid
-        @rename_commit_id = new_commit_move_file(repo).oid
-        @commit_with_new_name_id = new_commit_edit_new_file(repo).oid
+        @commit_with_old_name_id = new_commit_edit_old_file(repository_rugged).oid
+        @rename_commit_id = new_commit_move_file(repository_rugged).oid
+        @commit_with_new_name_id = new_commit_edit_new_file(repository_rugged).oid
       end
 
-      after(:context) do
+      after do
         # Erase our commits so other tests get the original repo
-        repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
-        repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
+        repository_rugged.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
       end
 
       context "where 'follow' == true" do
@@ -1010,12 +950,10 @@ def commit_files(commit)
     subject { repository.branches }
 
     context 'with local and remote branches' do
-      let(:repository) do
-        Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
-      end
+      let(:repository) { mutable_repository }
 
       before do
-        create_remote_branch(repository, 'joe', 'remote_branch', 'master')
+        create_remote_branch('joe', 'remote_branch', 'master')
         repository.create_branch('local_branch', 'master')
       end
 
@@ -1038,12 +976,10 @@ def commit_files(commit)
     end
 
     context 'with local and remote branches' do
-      let(:repository) do
-        Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
-      end
+      let(:repository) { mutable_repository }
 
       before do
-        create_remote_branch(repository, 'joe', 'remote_branch', 'master')
+        create_remote_branch('joe', 'remote_branch', 'master')
         repository.create_branch('local_branch', 'master')
       end
 
@@ -1303,24 +1239,24 @@ def commit_files(commit)
   end
 
   describe '#local_branches' do
-    before(:all) do
-      @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
+    let(:repository) { mutable_repository }
+
+    before do
+      create_remote_branch('joe', 'remote_branch', 'master')
+      repository.create_branch('local_branch', 'master')
     end
 
-    after(:all) do
+    after do
       ensure_seeds
     end
 
     it 'returns the local branches' do
-      create_remote_branch(@repo, 'joe', 'remote_branch', 'master')
-      @repo.create_branch('local_branch', 'master')
-
-      expect(@repo.local_branches.any? { |branch| branch.name == 'remote_branch' }).to eq(false)
-      expect(@repo.local_branches.any? { |branch| branch.name == 'local_branch' }).to eq(true)
+      expect(repository.local_branches.any? { |branch| branch.name == 'remote_branch' }).to eq(false)
+      expect(repository.local_branches.any? { |branch| branch.name == 'local_branch' }).to eq(true)
     end
 
     it 'returns a Branch with UTF-8 fields' do
-      branches = @repo.local_branches.to_a
+      branches = repository.local_branches.to_a
       expect(branches.size).to be > 0
       branches.each do |branch|
         expect(branch.name).to be_utf8
@@ -1331,11 +1267,11 @@ def commit_files(commit)
     it 'gets the branches from GitalyClient' do
       expect_any_instance_of(Gitlab::GitalyClient::RefService).to receive(:local_branches)
         .and_return([])
-      @repo.local_branches
+      repository.local_branches
     end
 
     it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::RefService, :local_branches do
-      subject { @repo.local_branches }
+      subject { repository.local_branches }
     end
   end
 
@@ -1391,8 +1327,7 @@ def commit_files(commit)
 
   describe '#fetch_source_branch!' do
     let(:local_ref) { 'refs/merge-requests/1/head' }
-    let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
-    let(:source_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
+    let(:source_repository) { mutable_repository }
 
     after do
       ensure_seeds
@@ -1401,7 +1336,8 @@ def commit_files(commit)
     context 'when the branch exists' do
       context 'when the commit does not exist locally' do
         let(:source_branch) { 'new-branch-for-fetch-source-branch' }
-        let(:source_rugged) { Gitlab::GitalyClient::StorageSettings.allow_disk_access { source_repository.rugged } }
+        let(:source_path) { File.join(TestEnv.repos_path, source_repository.relative_path) }
+        let(:source_rugged) { Rugged::Repository.new(source_path) }
         let(:new_oid) { new_commit_edit_old_file(source_rugged).oid }
 
         before do
@@ -1513,8 +1449,7 @@ def commit_files(commit)
   end
 
   describe '#set_config' do
-    let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
-    let(:rugged) { repository_rugged }
+    let(:repository) { mutable_repository }
     let(:entries) do
       {
         'test.foo1' => 'bla bla',
@@ -1526,19 +1461,18 @@ def commit_files(commit)
     it 'can set config settings' do
       expect(repository.set_config(entries)).to be_nil
 
-      expect(rugged.config['test.foo1']).to eq('bla bla')
-      expect(rugged.config['test.foo2']).to eq('1234')
-      expect(rugged.config['test.foo3']).to eq('true')
+      expect(repository_rugged.config['test.foo1']).to eq('bla bla')
+      expect(repository_rugged.config['test.foo2']).to eq('1234')
+      expect(repository_rugged.config['test.foo3']).to eq('true')
     end
 
     after do
-      entries.keys.each { |k| rugged.config.delete(k) }
+      entries.keys.each { |k| repository_rugged.config.delete(k) }
     end
   end
 
   describe '#delete_config' do
-    let(:repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
-    let(:rugged) { repository_rugged }
+    let(:repository) { mutable_repository }
     let(:entries) do
       {
         'test.foo1' => 'bla bla',
@@ -1549,21 +1483,19 @@ def commit_files(commit)
 
     it 'can delete config settings' do
       entries.each do |key, value|
-        rugged.config[key] = value
+        repository_rugged.config[key] = value
       end
 
       expect(repository.delete_config(*%w[does.not.exist test.foo1 test.foo2])).to be_nil
 
-      config_keys = rugged.config.each_key.to_a
+      config_keys = repository_rugged.config.each_key.to_a
       expect(config_keys).not_to include('test.foo1')
       expect(config_keys).not_to include('test.foo2')
     end
   end
 
   describe '#merge' do
-    let(:repository) do
-      Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
-    end
+    let(:repository) { mutable_repository }
     let(:source_sha) { '913c66a37b4a45b9769037c55c2d238bd0942d2e' }
     let(:target_branch) { 'test-merge-target-branch' }
 
@@ -1602,9 +1534,7 @@ def commit_files(commit)
   end
 
   describe '#ff_merge' do
-    let(:repository) do
-      Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
-    end
+    let(:repository) { mutable_repository }
     let(:branch_head) { '6d394385cf567f80a8fd85055db1ab4c5295806f' }
     let(:source_sha) { 'cfe32cf61b73a0d5e9f13e774abde7ff789b1660' }
     let(:target_branch) { 'test-ff-target-branch' }
@@ -1667,9 +1597,7 @@ def commit_files(commit)
   end
 
   describe '#delete_all_refs_except' do
-    let(:repository) do
-      Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
-    end
+    let(:repository) { mutable_repository }
 
     before do
       repository.write_ref("refs/delete/a", "0b4bc9a49b562e85de7cc9e834518ea6828729b9")
@@ -1693,12 +1621,7 @@ def commit_files(commit)
   end
 
   describe 'remotes' do
-    let(:repository) do
-      Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '')
-    end
-    let(:rugged) do
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged }
-    end
+    let(:repository) { mutable_repository }
     let(:remote_name) { 'my-remote' }
     let(:url) { 'http://my-repo.git' }
 
@@ -1711,26 +1634,26 @@ def commit_files(commit)
 
       it 'added the remote' do
         begin
-          rugged.remotes.delete(remote_name)
+          repository_rugged.remotes.delete(remote_name)
         rescue Rugged::ConfigError
         end
 
         repository.add_remote(remote_name, url, mirror_refmap: mirror_refmap)
 
-        expect(rugged.remotes[remote_name]).not_to be_nil
-        expect(rugged.config["remote.#{remote_name}.mirror"]).to eq('true')
-        expect(rugged.config["remote.#{remote_name}.prune"]).to eq('true')
-        expect(rugged.config["remote.#{remote_name}.fetch"]).to eq(mirror_refmap)
+        expect(repository_rugged.remotes[remote_name]).not_to be_nil
+        expect(repository_rugged.config["remote.#{remote_name}.mirror"]).to eq('true')
+        expect(repository_rugged.config["remote.#{remote_name}.prune"]).to eq('true')
+        expect(repository_rugged.config["remote.#{remote_name}.fetch"]).to eq(mirror_refmap)
       end
     end
 
     describe '#remove_remote' do
       it 'removes the remote' do
-        rugged.remotes.create(remote_name, url)
+        repository_rugged.remotes.create(remote_name, url)
 
         repository.remove_remote(remote_name)
 
-        expect(rugged.remotes[remote_name]).to be_nil
+        expect(repository_rugged.remotes[remote_name]).to be_nil
       end
     end
   end
@@ -1901,13 +1824,11 @@ def rev_list_all
       end
 
       context 'when the diff contains a rename' do
-        let(:repo) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged }
-        let(:end_sha) { new_commit_move_file(repo).oid }
+        let(:end_sha) { new_commit_move_file(repository_rugged).oid }
 
         after do
           # Erase our commits so other tests get the original repo
-          repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
-          repo.references.update('refs/heads/master', SeedRepo::LastCommit::ID)
+          repository_rugged.references.update('refs/heads/master', SeedRepo::LastCommit::ID)
         end
 
         it 'does not include the renamed file in the sparse checkout' do
@@ -1954,10 +1875,9 @@ def rev_list_all
     end
   end
 
-  def create_remote_branch(repository, remote_name, branch_name, source_branch_name)
+  def create_remote_branch(remote_name, branch_name, source_branch_name)
     source_branch = repository.branches.find { |branch| branch.name == source_branch_name }
-    rugged = repository_rugged
-    rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
+    repository_rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
   end
 
   # Build the options hash that's passed to Rugged::Commit#create
@@ -2035,16 +1955,4 @@ def refs(dir)
       line.split("\t").last
     end
   end
-
-  def repository_rugged
-    Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.rugged
-    end
-  end
-
-  def repository_path
-    Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.path
-    end
-  end
 end
diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb
index 017f30a675d924abfda10afb32ef4ac0374283e1..c20b77f14372f04718d9ab9f84731255bc5c0817 100644
--- a/spec/lib/gitlab/git_access_spec.rb
+++ b/spec/lib/gitlab/git_access_spec.rb
@@ -2,6 +2,7 @@
 
 describe Gitlab::GitAccess do
   include TermsHelper
+  include GitHelpers
 
   let(:user) { create(:user) }
 
@@ -736,21 +737,19 @@ def disable_protocol(protocol)
 
     def merge_into_protected_branch
       @protected_branch_merge_commit ||= begin
-        Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          project.repository.add_branch(user, unprotected_branch, 'feature')
-          rugged = project.repository.rugged
-          target_branch = rugged.rev_parse('feature')
-          source_branch = project.repository.create_file(
-            user,
-            'filename',
-            'This is the file content',
-            message: 'This is a good commit message',
-            branch_name: unprotected_branch)
-          author = { email: "email@example.com", time: Time.now, name: "Example Git User" }
-
-          merge_index = rugged.merge_commits(target_branch, source_branch)
-          Rugged::Commit.create(rugged, author: author, committer: author, message: "commit message", parents: [target_branch, source_branch], tree: merge_index.write_tree(rugged))
-        end
+        project.repository.add_branch(user, unprotected_branch, 'feature')
+        rugged = rugged_repo(project.repository)
+        target_branch = rugged.rev_parse('feature')
+        source_branch = project.repository.create_file(
+          user,
+          'filename',
+          'This is the file content',
+          message: 'This is a good commit message',
+          branch_name: unprotected_branch)
+        author = { email: "email@example.com", time: Time.now, name: "Example Git User" }
+
+        merge_index = rugged.merge_commits(target_branch, source_branch)
+        Rugged::Commit.create(rugged, author: author, committer: author, message: "commit message", parents: [target_branch, source_branch], tree: merge_index.write_tree(rugged))
       end
     end
 
diff --git a/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb b/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
index 5f67fe6b952625337c6ee6924907ce1c16c12b53..d82c9c28da0febbc71eb3ba2880afd36b5f913c1 100644
--- a/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
@@ -39,6 +39,10 @@
       expect(wiki_page.title).to eq('My Page')
       expect(wiki_page.raw_data).to eq('ab')
       expect(wiki_page_version.format).to eq('markdown')
+
+      expect(wiki_page.title).to be_utf8
+      expect(wiki_page.path).to be_utf8
+      expect(wiki_page.name).to be_utf8
     end
   end
 
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index 8ddc81c23097070dee13eeb19a50a3403e5922ff..a251aa2692866dbb2c17c260f60855d21533fb3a 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -2,6 +2,7 @@
 
 describe Namespace do
   include ProjectForksHelper
+  include GitHelpers
 
   let!(:namespace) { create(:namespace) }
   let(:gitlab_shell) { Gitlab::Shell.new }
@@ -339,9 +340,7 @@ def expect_project_directories_at(namespace_path)
     end
 
     def project_rugged(project)
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        project.repository.rugged
-      end
+      rugged_repo(project.repository)
     end
   end
 
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index a02c0b600fbea97226f7ee5aabcc0434e92a9025..d92b45e178197c806ce13479003052bace53c985 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -2,6 +2,7 @@
 
 describe Project do
   include ProjectForksHelper
+  include GitHelpers
 
   describe 'associations' do
     it { is_expected.to belong_to(:group) }
@@ -4311,8 +4312,6 @@ def domain_variable
   end
 
   def rugged_config
-    Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      project.repository.rugged.config
-    end
+    rugged_repo(project.repository).config
   end
 end
diff --git a/spec/models/remote_mirror_spec.rb b/spec/models/remote_mirror_spec.rb
index 269d5deca2022682ba1a34c0717eddf750b1dee6..3d316fb3c5be3575bee8fd55016044630e749b43 100644
--- a/spec/models/remote_mirror_spec.rb
+++ b/spec/models/remote_mirror_spec.rb
@@ -1,6 +1,8 @@
 require 'rails_helper'
 
 describe RemoteMirror do
+  include GitHelpers
+
   describe 'URL validation' do
     context 'with a valid URL' do
       it 'should be valid' do
@@ -74,9 +76,7 @@
 
         mirror.update_attribute(:url, 'http://foo:baz@test.com')
 
-        config = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          repo.raw_repository.rugged.config
-        end
+        config = rugged_repo(repo).config
         expect(config["remote.#{mirror.remote_name}.url"]).to eq('http://foo:baz@test.com')
       end
 
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 784d17e271e7089a6aa12b13efab0d84b734b555..77e549d9528fcd8c42af5c751d0b3d00e428c5bd 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -2,6 +2,8 @@
 
 describe Repository do
   include RepoHelpers
+  include GitHelpers
+
   TestBlob = Struct.new(:path)
 
   let(:project) { create(:project, :repository) }
@@ -137,9 +139,7 @@ def expect_to_raise_storage_error
           options = { message: 'test tag message\n',
                       tagger: { name: 'John Smith', email: 'john@gmail.com' } }
 
-          Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-            repository.rugged.tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', options)
-          end
+          rugged_repo(repository).tags.create(annotated_tag_name, 'a48e4fc218069f68ef2e769dd8dfea3991362175', options)
 
           double_first = double(committed_date: Time.now - 1.second)
           double_last = double(committed_date: Time.now)
@@ -151,9 +151,7 @@ def expect_to_raise_storage_error
         it { is_expected.to eq(['v1.1.0', 'v1.0.0', annotated_tag_name]) }
 
         after do
-          Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-            repository.rugged.tags.delete(annotated_tag_name)
-          end
+          rugged_repo(repository).tags.delete(annotated_tag_name)
         end
       end
     end
@@ -1678,10 +1676,7 @@ def merge(repository, user, merge_request, message)
     it 'returns the number of branches' do
       expect(repository.branch_count).to be_an(Integer)
 
-      # NOTE: Until rugged goes away, make sure rugged and gitaly are in sync
-      rugged_count = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        repository.raw_repository.rugged.branches.count
-      end
+      rugged_count = rugged_repo(repository).branches.count
 
       expect(repository.branch_count).to eq(rugged_count)
     end
@@ -1691,10 +1686,7 @@ def merge(repository, user, merge_request, message)
     it 'returns the number of tags' do
       expect(repository.tag_count).to be_an(Integer)
 
-      # NOTE: Until rugged goes away, make sure rugged and gitaly are in sync
-      rugged_count = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-        repository.raw_repository.rugged.tags.count
-      end
+      rugged_count = rugged_repo(repository).tags.count
 
       expect(repository.tag_count).to eq(rugged_count)
     end
@@ -2184,9 +2176,7 @@ def merge(repository, user, merge_request, message)
   end
 
   def create_remote_branch(remote_name, branch_name, target)
-    rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      repository.rugged
-    end
+    rugged = rugged_repo(repository)
     rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
   end
 
diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb
index 63850939be15ebf1066b0dbe5b85ec27907be3f9..b4732ec0cd51fe05372b82bd30b551591d6c2e59 100644
--- a/spec/models/wiki_page_spec.rb
+++ b/spec/models/wiki_page_spec.rb
@@ -77,7 +77,7 @@
   end
 
   describe "#initialize" do
-    context "when initialized with an existing gollum page" do
+    context "when initialized with an existing page" do
       before do
         create_page("test page", "test content")
         @page = wiki.wiki.page(title: "test page")
diff --git a/spec/services/git_tag_push_service_spec.rb b/spec/services/git_tag_push_service_spec.rb
index 92159e1e37219f03e46e5350d2d110b3544304e7..2699f6e7bcddcaed190858b02a15ba5f280b6a41 100644
--- a/spec/services/git_tag_push_service_spec.rb
+++ b/spec/services/git_tag_push_service_spec.rb
@@ -2,6 +2,7 @@
 
 describe GitTagPushService do
   include RepoHelpers
+  include GitHelpers
 
   let(:user) { create(:user) }
   let(:project) { create(:project, :repository) }
@@ -118,9 +119,7 @@
 
       before do
         # Create the lightweight tag
-        Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          project.repository.raw_repository.rugged.tags.create(tag_name, newrev)
-        end
+        rugged_repo(project.repository).tags.create(tag_name, newrev)
 
         # Clear tag list cache
         project.repository.expire_tags_cache
diff --git a/spec/services/merge_requests/squash_service_spec.rb b/spec/services/merge_requests/squash_service_spec.rb
index 8ab09412f55866770a8a97c1c203e657c482af23..53bce15735c4acca1e359629ee099aa8b5edbd09 100644
--- a/spec/services/merge_requests/squash_service_spec.rb
+++ b/spec/services/merge_requests/squash_service_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe MergeRequests::SquashService do
+  include GitHelpers
+
   let(:service) { described_class.new(project, user, {}) }
   let(:user) { project.owner }
   let(:project) { create(:project, :repository) }
@@ -63,9 +65,7 @@
       end
 
       it 'has the same diff as the merge request, but a different SHA' do
-        rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          project.repository.rugged
-        end
+        rugged = rugged_repo(project.repository)
         mr_diff = rugged.diff(merge_request.diff_base_sha, merge_request.diff_head_sha)
         squash_diff = rugged.diff(merge_request.diff_start_sha, squash_sha)
 
diff --git a/spec/services/projects/after_import_service_spec.rb b/spec/services/projects/after_import_service_spec.rb
index cd52bc88f4c48bd608a47f753a9ac57d09160b99..4dd6c6dab86c375dcc72f5cac0b1633c80ddf9e5 100644
--- a/spec/services/projects/after_import_service_spec.rb
+++ b/spec/services/projects/after_import_service_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe Projects::AfterImportService do
+  include GitHelpers
+
   subject { described_class.new(project) }
 
   let(:project) { create(:project, :repository) }
@@ -53,7 +55,7 @@
     end
 
     def rugged
-      Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged }
+      rugged_repo(repository)
     end
   end
 end
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index bb3f1501f0e70bc3e02feb3b216377b94f31ba2d..a80c8a7fe517f230a064264cab8841f1c04d31bd 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe Projects::CreateService, '#execute' do
+  include GitHelpers
+
   let(:gitlab_shell) { Gitlab::Shell.new }
   let(:user) { create :user }
   let(:opts) do
@@ -295,9 +297,7 @@ def wiki_repo(project)
 
   it 'writes project full path to .git/config' do
     project = create_project(user, opts)
-    rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      project.repository.rugged
-    end
+    rugged = rugged_repo(project.repository)
 
     expect(rugged.config['gitlab.fullpath']).to eq project.full_path
   end
diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
index 5f67c325223239c2871c7ece48d9f6af1777a66b..0e82194e9ee9478ed8328e5454984039c8e66c38 100644
--- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe Projects::HashedStorage::MigrateRepositoryService do
+  include GitHelpers
+
   let(:gitlab_shell) { Gitlab::Shell.new }
   let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo) }
   let(:legacy_storage) { Storage::LegacyProject.new(project) }
@@ -38,9 +40,7 @@
       it 'writes project full path to .git/config' do
         service.execute
 
-        rugged_config = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          project.repository.rugged.config['gitlab.fullpath']
-        end
+        rugged_config = rugged_repo(project.repository).config['gitlab.fullpath']
 
         expect(rugged_config).to eq project.full_path
       end
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index 92c5ac7354a3c13f251f9300b03864c31a9321a6..1411723fb9ef761746d5f26bd2f40d3fcefa05d9 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 describe Projects::TransferService do
+  include GitHelpers
+
   let(:gitlab_shell) { Gitlab::Shell.new }
   let(:user) { create(:user) }
   let(:group) { create(:group) }
@@ -291,8 +293,6 @@ def transfer_project(project, user, new_namespace)
   end
 
   def rugged_config
-    Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      project.repository.rugged.config
-    end
+    rugged_repo(project.repository).config
   end
 end
diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb
index e0fceae88de090ff61ed48460d9e64b51f845ce0..83035788a56925c0527612ea928abfd60a9cc48e 100644
--- a/spec/support/helpers/cycle_analytics_helpers.rb
+++ b/spec/support/helpers/cycle_analytics_helpers.rb
@@ -1,4 +1,6 @@
 module CycleAnalyticsHelpers
+  include GitHelpers
+
   def create_commit_referencing_issue(issue, branch_name: generate(:branch))
     project.repository.add_branch(user, branch_name, 'master')
     create_commit("Commit for ##{issue.iid}", issue.project, user, branch_name)
@@ -9,7 +11,7 @@ def create_commit(message, project, user, branch_name, count: 1, commit_time: ni
     oldrev = repository.commit(branch_name)&.sha || Gitlab::Git::BLANK_SHA
 
     if Timecop.frozen? && Gitlab::GitalyClient.feature_enabled?(:operation_user_commit_files)
-      mock_gitaly_multi_action_dates(repository.raw, commit_time)
+      mock_gitaly_multi_action_dates(repository, commit_time)
     end
 
     commit_shas = Array.new(count) do |index|
@@ -118,18 +120,15 @@ def new_dummy_job(user, project, environment)
       protected: false)
   end
 
-  def mock_gitaly_multi_action_dates(raw_repository, commit_time)
-    allow(raw_repository).to receive(:multi_action).and_wrap_original do |m, *args|
+  def mock_gitaly_multi_action_dates(repository, commit_time)
+    allow(repository.raw).to receive(:multi_action).and_wrap_original do |m, *args|
       new_date = commit_time || Time.now
       branch_update = m.call(*args)
 
       if branch_update.newrev
         _, opts = args
 
-        commit = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-          rugged = raw_repository.rugged
-          rugged.rev_parse(branch_update.newrev)
-        end
+        commit = rugged_repo(repository).rev_parse(branch_update.newrev)
 
         branch_update.newrev = commit.amend(
           update_ref: "#{Gitlab::Git::BRANCH_REF_PREFIX}#{opts[:branch_name]}",
diff --git a/spec/support/helpers/git_helpers.rb b/spec/support/helpers/git_helpers.rb
index fc92bc3856180323283f55597af2ba28b52f3f6b..99a7c39852e104d9fcfc06f4dfad919a8aa6638f 100644
--- a/spec/support/helpers/git_helpers.rb
+++ b/spec/support/helpers/git_helpers.rb
@@ -1,6 +1,12 @@
 # frozen_string_literal: true
 
 module GitHelpers
+  def rugged_repo(repository)
+    path = File.join(TestEnv.repos_path, repository.disk_path + '.git')
+
+    Rugged::Repository.new(path)
+  end
+
   def project_hook_exists?(project)
     Gitlab::GitalyClient::StorageSettings.allow_disk_access do
       project_path = project.repository.raw_repository.path
diff --git a/spec/workers/git_garbage_collect_worker_spec.rb b/spec/workers/git_garbage_collect_worker_spec.rb
index 30e67e67e0e5f628705768220aa9ab086ca3a989..a159f24f876c176d8b5bbb9b5faa93d35512cbe8 100644
--- a/spec/workers/git_garbage_collect_worker_spec.rb
+++ b/spec/workers/git_garbage_collect_worker_spec.rb
@@ -3,6 +3,8 @@
 require 'spec_helper'
 
 describe GitGarbageCollectWorker do
+  include GitHelpers
+
   let(:project) { create(:project, :repository) }
   let(:shell) { Gitlab::Shell.new }
   let!(:lease_uuid) { SecureRandom.uuid }
@@ -197,9 +199,7 @@
 
   # Create a new commit on a random new branch
   def create_objects(project)
-    rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      project.repository.rugged
-    end
+    rugged = rugged_repo(project.repository)
     old_commit = rugged.branches.first.target
     new_commit_sha = Rugged::Commit.create(
       rugged,
diff --git a/spec/workers/repository_remove_remote_worker_spec.rb b/spec/workers/repository_remove_remote_worker_spec.rb
index a653f6f926c162abdf134beaf3e5478032dd10c8..6ddb653d1421077a5f881ee9d1af9f6deeaf4e4c 100644
--- a/spec/workers/repository_remove_remote_worker_spec.rb
+++ b/spec/workers/repository_remove_remote_worker_spec.rb
@@ -2,6 +2,7 @@
 
 describe RepositoryRemoveRemoteWorker do
   include ExclusiveLeaseHelpers
+  include GitHelpers
 
   describe '#perform' do
     let!(:project) { create(:project, :repository) }
@@ -50,9 +51,7 @@
   end
 
   def create_remote_branch(remote_name, branch_name, target)
-    rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
-      project.repository.rugged
-    end
+    rugged = rugged_repo(project.repository)
 
     rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id)
   end
diff --git a/vendor/licenses.csv b/vendor/licenses.csv
index b36aabb9b3d3539474f2cedc7c67a631ef63ec90..6adcb28f73611fb05a0f8cbd02678721c28507d0 100644
--- a/vendor/licenses.csv
+++ b/vendor/licenses.csv
@@ -438,7 +438,6 @@ github-linguist,5.3.3,MIT
 github-markup,1.7.0,MIT
 gitlab-flowdock-git-hook,1.0.1,MIT
 gitlab-gollum-lib,4.2.7.5,MIT
-gitlab-gollum-rugged_adapter,0.4.4.1,MIT
 gitlab-grit,2.8.2,MIT
 gitlab-markup,1.6.4,MIT
 gitlab_omniauth-ldap,2.0.4,MIT