diff --git a/lib/gitlab/gitignore.rb b/lib/gitlab/gitignore.rb
index a2de2831e38cf60446dfd29e1026c04a07fdb2a2..f46b43b61a4e8efcb5ea777a23f3210b7eb6d614 100644
--- a/lib/gitlab/gitignore.rb
+++ b/lib/gitlab/gitignore.rb
@@ -2,15 +2,16 @@ module Gitlab
   class Gitignore
     FILTER_REGEX = /\.gitignore\z/.freeze
 
-    attr_accessor :name, :directory
+    def initialize(path)
+      @path = path
+    end
 
-    def initialize(name, directory)
-      @name       = name
-      @directory  = directory
+    def name
+      File.basename(@path, '.gitignore')
     end
 
     def content
-      File.read(path)
+      File.read(@path)
     end
 
     class << self
@@ -22,46 +23,33 @@ module Gitlab
         file_name = "#{key}.gitignore"
 
         directory = select_directory(file_name)
-        directory ? new(key, directory) : nil
+        directory ? new(File.join(directory, file_name)) : nil
       end
 
       def global
-        files_for_folder(global_dir).map { |f| new(f, global_dir) }
+        files_for_folder(global_dir).map { |file| new(File.join(global_dir, file)) }
       end
 
       def languages_frameworks
-        files_for_folder(gitignore_dir).map { |f| new(f, gitignore_dir) }
+        files_for_folder(gitignore_dir).map { |file| new(File.join(gitignore_dir, file)) }
       end
-    end
 
-    private
-
-    def path
-      File.expand_path("#{name}.gitignore", directory)
-    end
+      private
 
-    class << self
       def select_directory(file_name)
-        [self.gitignore_dir, self.global_dir].find { |dir| File.exist?(File.expand_path(file_name, dir)) }
+        [gitignore_dir, global_dir].find { |dir| File.exist?(File.join(dir, file_name)) }
       end
 
       def global_dir
-        File.expand_path('Global', gitignore_dir)
+        File.join(gitignore_dir, 'Global')
       end
 
       def gitignore_dir
-        File.expand_path('vendor/gitignore', Rails.root)
+        Rails.root.join('vendor/gitignore')
       end
 
       def files_for_folder(dir)
-        gitignores = []
-        Dir.entries(dir).each do |e|
-          next unless e.end_with?('.gitignore')
-
-          gitignores << e.gsub(FILTER_REGEX, '')
-        end
-
-        gitignores
+        Dir.glob("#{dir.to_s}/*.gitignore").map { |file| file.gsub(FILTER_REGEX, '') }
       end
     end
   end
diff --git a/lib/tasks/gitlab/update_gitignore.rake b/lib/tasks/gitlab/update_gitignore.rake
index 61cbfd6737daf3c8c35ae17966523b8d907ffd18..84aa312002b15da9672c9a513c258078cc965271 100644
--- a/lib/tasks/gitlab/update_gitignore.rake
+++ b/lib/tasks/gitlab/update_gitignore.rake
@@ -1,26 +1,46 @@
 namespace :gitlab do
   desc "GitLab | Update gitignore"
   task :update_gitignore do
-    dir = File.expand_path('vendor', Rails.root)
-    FileUtils.cd(dir)
+    unless clone_gitignores
+      puts "Cloning the gitignores failed".red
+      return
+    end
 
-    dir = File.expand_path('gitignore', dir)
-    clone_gitignores(dir)
-    remove_unneeded_files(dir)
+    remove_unneeded_files(gitignore_directory)
+    remove_unneeded_files(global_directory)
 
     puts "Done".green
   end
 
-  def clone_gitignores(dir)
-    FileUtils.rm_rf(dir) if Dir.exist?(dir)
+  def clone_gitignores
+    FileUtils.rm_rf(gitignore_directory) if Dir.exist?(gitignore_directory)
+    FileUtils.cd vendor_directory
+
     system('git clone --depth=1 --branch=master https://github.com/github/gitignore.git')
   end
 
-  def remove_unneeded_files(dir)
-    [File.expand_path('Global', dir), dir].each do |path|
-      Dir.entries(path).reject { |e| e =~ /(\.{1,2}|Global|\.gitignore)\z/ }.each do |file|
-        FileUtils.rm_rf File.expand_path(file, path)
-      end
+  # Retain only certain files:
+  # - The LICENSE, because we have to
+  # - The sub dir global
+  # - The gitignores themself
+  # - Dir.entires returns also the entries '.' and '..'
+  def remove_unneeded_files(path)
+    Dir.foreach(path) do |file|
+      FileUtils.rm_rf(File.join(path, file)) unless file =~ /(\.{1,2}|LICENSE|Global|\.gitignore)\z/
     end
   end
+
+  private
+
+  def vendor_directory
+    Rails.root.join('vendor')
+  end
+
+  def gitignore_directory
+    File.join(vendor_directory, 'gitignore')
+  end
+
+  def global_directory
+    File.join(gitignore_directory, 'Global')
+  end
 end
diff --git a/spec/lib/gitlab/gitignore_spec.rb b/spec/lib/gitlab/gitignore_spec.rb
index 5dab821a8ecdcd26aaae16be7a07f390ba23cc5f..72baa516cc4ddd289f1a77de9027aa347010d8df 100644
--- a/spec/lib/gitlab/gitignore_spec.rb
+++ b/spec/lib/gitlab/gitignore_spec.rb
@@ -2,6 +2,7 @@ require 'spec_helper'
 
 describe Gitlab::Gitignore do
   subject { Gitlab::Gitignore }
+
   describe '.all' do
     it 'strips the gitignore suffix' do
       expect(subject.all.first.name).not_to end_with('.gitignore')
@@ -24,12 +25,13 @@ describe Gitlab::Gitignore do
       ruby = subject.find('Ruby')
 
       expect(ruby).to be_a Gitlab::Gitignore
+      expect(ruby.name).to eq('Ruby')
     end
   end
 
   describe '#content' do
     it 'loads the full file' do
-      gitignore = subject.new('Ruby', File.expand_path('vendor/gitignore', Rails.root))
+      gitignore = subject.new(Rails.root.join('vendor/gitignore/Ruby.gitignore'))
 
       expect(gitignore.name).to eq 'Ruby'
       expect(gitignore.content).to start_with('*.gem')
diff --git a/spec/requests/api/gitignores_spec.rb b/spec/requests/api/gitignores_spec.rb
index d0e576e637c9cf591e987fbd8c4a011dc94f2391..aab2d8c81b997ba7b37f0e9911b7158cb7abb0f1 100644
--- a/spec/requests/api/gitignores_spec.rb
+++ b/spec/requests/api/gitignores_spec.rb
@@ -13,8 +13,8 @@ describe API::Gitignores, api: true  do
   describe 'Entity GitignoresList' do
     before { get api('/gitignores') }
 
-    it { expect(json_response.first['name']).to be_truthy }
-    it { expect(json_response.first['content']).to be_falsey }
+    it { expect(json_response.first['name']).not_to be_nil }
+    it { expect(json_response.first['content']).to be_nil }
   end
 
   describe 'GET /gitignores' do