namespace :gitlab do namespace :import do # How to use: # # 1. copy the bare repos under the repository storage paths (commonly the default path is /home/git/repositories) # 2. run: bundle exec rake gitlab:import:repos RAILS_ENV=production # # Notes: # * The project owner will set to the first administator of the system # * Existing projects will be skipped # desc "GitLab | Import bare repositories from repositories -> storages into GitLab project instance" task repos: :environment do Gitlab.config.repositories.storages.each_value do |repository_storage| git_base_path = repository_storage['path'] repos_to_import = Dir.glob(git_base_path + '/**/*.git') repos_to_import.each do |repo_path| # strip repo base path repo_path[0..git_base_path.length] = '' path = repo_path.sub(/\.git$/, '') group_name, name = File.split(path) group_name = nil if group_name == '.' puts "Processing #{repo_path}".color(:yellow) if path.end_with?('.wiki') puts " * Skipping wiki repo" next end project = Project.find_by_full_path(path) if project puts " * #{project.name} (#{repo_path}) exists" else user = User.admins.reorder("id").first project_params = { name: name, path: name } # find group namespace if group_name group = Namespace.find_by(path: group_name) # create group namespace unless group group = Group.new(name: group_name) group.path = group_name group.owner = user if group.save puts " * Created Group #{group.name} (#{group.id})".color(:green) else puts " * Failed trying to create group #{group.name}".color(:red) end end # set project group project_params[:namespace_id] = group.id end project = Projects::CreateService.new(user, project_params).execute if project.persisted? puts " * Created #{project.name} (#{repo_path})".color(:green) ProjectCacheWorker.perform_async(project.id) else puts " * Failed trying to create #{project.name} (#{repo_path})".color(:red) puts " Errors: #{project.errors.messages}".color(:red) end end end end puts "Done!".color(:green) end end end