Come rimuovere Homebrew in modo pulito


26

Come posso rimuovere Homebrew in modo pulito. Potrei avere un'installazione precedente difettosa e vorrei ricominciare da capo.


1
Vedi anche superuser.com/questions/203707/… che ha le risposte che descrivono un modo "ora canonico" per rimuovere homebrew
rogerdpack

@rogerdpack I commenti possono essere eliminati in qualsiasi momento, puoi inviare una risposta per descrivere il nuovo metodo?
Nohillside

Risposte:


17

Questo rm -rfnon ti chiederà se sei sicuro quando elimini, quindi assicurati che il cdcomando funzioni per farti uscire da / tmp ( cd /tmpti porta in un posto sicuro nel caso in cui copi / incolli tutto in una volta, quindi non elimini i file dalla tua directory corrente)

Prova questo nel tuo Terminale:

cd /tmp
cd `brew --prefix`
rm -rf Cellar
brew prune
rm `git ls-files`
rm -r Library/Homebrew Library/Aliases Library/Formula Library/Contributions
rm -rf .git
rm -rf ~/Library/Caches/Homebrew

Maggiori informazioni su questo argomento sono disponibili nelle FAQ di Homebrew .


1
Verificherei che cd `brew --prefix`va in una cartella in cui non hai i normali file git controllati poiché un'installazione vecchia / mal funzionante potrebbe fallire e la cancellazione di git ls-filespotrebbe eliminare qualcosa di diverso dai resti della tua birra.
bmike

Ho letto la documentazione, ho pensato che potesse essere una domanda utile per chiedere riferimenti futuri. Tuttavia ho problemi con le istruzioni, che ho pubblicato come domanda separata: apple.stackexchange.com/questions/82863/…
ipavlic

Nota che il link alle FAQ di Homebrew dovrebbe essere aggiornato da github.com/mxcl/homebrew/wiki/FAQ/… a github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/… (non posso modificare o aggiungere commenti).
cloudnthings

1
Ora c'è una sceneggiatura per questo: github.com/Homebrew/brew/blob/master/docs/FAQ.md
larkey

5

Mentre l'installazione di HomeBrew si trova in primo piano nella sua prima pagina, i dettagli non lo sono. https://brew.sh/ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" Per molto tempo è stato molto difficile trovare una disinstallazione affidabile. Ora, a pochi clic di distanza nei documenti, esiste ora un metodo ufficiale: https://docs.brew.sh/FAQ Per disinstallare Homebrew, incollare il comando seguente in un prompt del terminale. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"


3

Ecco una soluzione molto migliore per rimuovere Homebrew: https://gist.github.com/SteveBenner/11254428

#!/usr/bin/env ruby
#
# Locates and removes Homebrew installation
# http://brew.sh/
#
# Author: Stephen Benner
# https://github.com/SteveBenner
#
require 'optparse'
require 'fileutils'
require 'open3'

$stdout.sync = true

# Default options
options = {
  :quiet     => false,
  :verbose   => true,
  :dry_run   => false,
  :force     => false,
  :find_path => false
}

optparser = OptionParser.new do |opts|
  opts.on('-q', '--quiet', 'Quiet mode - suppress output.') do |setting|
    options[:quiet]   = setting
    options[:verbose] = false
  end
  opts.on('-v', '--verbose', 'Verbose mode - print all operations.') { |setting| options[:verbose] = setting }
  opts.on('-d', '--dry', 'Dry run - print results, but perform no actual operations.') do |setting|
    options[:dry_run] = setting
  end
  opts.on('-f', '--force', 'Forces removal of files, bypassing prompt. USE WITH CAUTION.') do |setting|
    options[:force] = setting
  end
  opts.on('-p', '--find-path', 'Output homebrew location if found, then exit.') do |setting|
    options[:find_path] = setting
    options[:quiet]     = true
  end
  opts.on('-h', '--help', '--usage', 'Display usage info and quit.') { puts opts; exit }
end
optparser.parse!
$quiet = options[:quiet] # provides access to option value within methods

# Files installed into the Homebrew repository
BREW_LOCAL_FILES = %w[
  .git
  Cellar
  Library/brew.rb
  Library/Homebrew
  Library/Aliases
  Library/Formula
  Library/Contributions
  Library/LinkedKegs
]
# Files that Homebrew installs into other system locations
BREW_SYSTEM_FILES = %W[
  #{ENV['HOME']}/Library/Caches/Homebrew
  #{ENV['HOME']}/Library/Logs/Homebrew
  /Library/Caches/Homebrew
]
$files = []

# This function runs given command in a sub-shell, expecting the output to be the
# path of a Homebrew installation. If given a block, it passes the shell output to
# the block for processing, using the return value of the block as the new path.
# Known Homebrew files are then scanned for and added to the file list. Then the
# directory is tested for a Homebrew installation, and the git index is added if
# a valid repo is found. The function won't run once a Homebrew installation is
# found, but it will accumulate untracked Homebrew files each invocation.
#
# @param  [String] cmd       a shell command to run
# @param  [String] error_msg message to print if command fails
#
def locate_brew_path(cmd, error_msg = 'check homebrew installation and PATH.')
  return if $brew_location # stop testing if we find a valid Homebrew installation
  puts "Searching for homewbrew installation using '#{cmd}'..." unless $quiet

  # Run given shell command along with any code passed-in via block
  path = `#{cmd}`.chomp
  path = yield(path) if block_given? # pass command output to your own fancy code block

  begin
    Dir.chdir(path) do
      # Search for known Homebrew files and folders, regardless of git presence
      $files += BREW_LOCAL_FILES.select { |file| File.exist? file }.map {|file| File.expand_path file }
      $files += Dir.glob('**/{man,bin}/**/brew*')
      # Test for Homebrew git repository (use popen3 so we can suppress git error output)
      repo_name = Open3.popen3('git remote -v') do |stdin, stdout, stderr|
        stderr.close
        stdout.read
      end
      if repo_name =~ /homebrew.git|Homebrew/
        $brew_location = path
      else
        return
      end
    end
  rescue StandardError # on normal errors, continue program
    return
  end
end

# Attempt to locate homebrew installation using a command and optional code block
# for processing the command results. Locating a valid path halts searching.
locate_brew_path 'brew --prefix'
locate_brew_path('which brew') { |output| File.expand_path('../..', output) }
locate_brew_path 'brew --prefix' do |output|
  output = output.split($/).first
  File.expand_path('../..', output)
end

# Found Homebrew installation
if $brew_location
  puts "Homebrew found at: #{$brew_location}" unless options[:quiet]
  if options[:find_path]
    puts $brew_location
    exit
  end
  # Collect files indexed by git
  begin
    Dir.chdir($brew_location) do
      # Update file list (use popen3 so we can suppress git error output)
      Open3.popen3('git checkout master') { |stdin, stdout, stderr| stderr.close }
      $files += `git ls-files`.split.map {|file| File.expand_path file }
    end
  rescue StandardError => e
    puts e # Report any errors, but continue the script and collect any last files
  end
end

# Collect any files Homebrew may have installed throughout our system
$files += BREW_SYSTEM_FILES.select { |file| File.exist? file }

abort 'Failed to locate any homebrew files!' if $files.empty?

# DESTROY! DESTROY! DESTROY!
unless options[:force]
  print "Delete #{$files.count} files? "
  abort unless gets.rstrip =~ /y|yes/i
end

rm =
  if options[:dry_run]
    lambda { |entry| puts "deleting #{entry}" unless options[:quiet] }
  else
    lambda { |entry| FileUtils.rm_rf(entry, :verbose => options[:verbose]) }
  end

puts 'Deleting files...' unless options[:quiet]
$files.each(&rm)

1
Benvenuti a chiedere diverso! Sebbene il collegamento fornito possa rispondere alla domanda, è meglio includere la risposta qui e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. Ho modificato la tua domanda per includere quella che ritengo fosse la soluzione a cui ti riferivi, tuttavia se non lo fosse, ti preghiamo di citare la sezione pertinente. Inoltre, potresti espandere il motivo per cui la tua soluzione è migliore?
grg

1
Sono più di poche righe, quindi ho pensato che includere il codice sarebbe stato complicato, ma sono felice di farlo in futuro. È meglio perché ci sono file e directory non catturati dalla risposta postata che il mio script rimuoverà. Fornisce utilità all'utente tramite le opzioni della CLI, cerca in modo più esaustivo le posizioni di infusione ed è codificato in modo da facilitare la modifica nel caso in cui si desideri migliorare lo script.
Steve Benner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.