Cómo eliminar limpiamente Homebrew

26

¿Cómo puedo eliminar limpiamente Homebrew? Es posible que tenga una instalación anterior defectuosa, y me gustaría tener un nuevo comienzo.

ipavlic
fuente
1
Vea también superuser.com/questions/203707/… que tiene respuestas que describen una forma "ahora canónica" de eliminar homebrew
rogerdpack
@rogerdpack Los comentarios pueden eliminarse en cualquier momento, ¿puede publicar una respuesta que describa el nuevo método?
nohillside

Respuestas:

17

Esto rm -rfno le preguntará si está seguro cuando elimina, así que asegúrese de que el cdcomando funcione para sacarlo de / tmp (lo cd /tmplleva a un lugar seguro en caso de que copie / pegue todo de una vez para que no elimine archivos de su directorio actual)

Prueba esto en tu Terminal:

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

Puede encontrar más información sobre este tema en las Preguntas frecuentes de Homebrew .

Michiel
fuente
1
Verificaría que cd `brew --prefix`vaya a una carpeta en la que no haya registrado archivos git normales, ya que una configuración antigua / que no funciona correctamente podría fallar y la eliminación git ls-filespodría eliminar algo más que los restos de su cerveza.
bmike
Leí la documentación, solo pensé que podría ser una pregunta útil para futuras referencias. Sin embargo, tengo problemas con las instrucciones, que publiqué
ipavlic
Tenga en cuenta que el enlace a las Preguntas frecuentes de Homebrew debe actualizarse desde github.com/mxcl/homebrew/wiki/FAQ/… a github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/… (No puedo editar o agregar comentarios).
cloudnthings
1
Ahora hay un script para eso: github.com/Homebrew/brew/blob/master/docs/FAQ.md
larkey
5

Si bien la instalación de HomeBrew se encuentra en un lugar destacado en su página principal, los detalles no. https://brew.sh/ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" Durante mucho tiempo fue muy difícil encontrar una desinstalación confiable. Ahora, a varios clics de distancia en los documentos, ahora hay un método oficial: https://docs.brew.sh/FAQ Para desinstalar Homebrew, pegue el siguiente comando en un indicador de terminal. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

AnneTheAgile
fuente
3

Aquí hay una solución mucho mejor para eliminar 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)
Steve Benner
fuente
1
Bienvenido a Ask Different! Si bien el enlace que proporcionó puede responder la pregunta, es mejor incluir la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. He editado su pregunta para incluir lo que creo que era la solución a la que se refería, sin embargo, si no fuera así, cite la sección correspondiente. Además, ¿podría ampliar por qué su solución es mejor?
grg
1
Son más de unas pocas líneas, así que pensé que incluir el código sería engorroso, pero estoy feliz de hacerlo en el futuro. Es mejor porque hay archivos y directorios no captados por la respuesta publicada que mi script eliminará. Proporciona una utilidad para el usuario a través de las opciones de CLI, busca de forma más exhaustiva las ubicaciones de preparación y está codificada para facilitar la modificación en caso de que desee mejorar el script.
Steve Benner