วิธีการลบ Homebrew อย่างหมดจด


26

ฉันจะลบ Homebrew อย่างหมดจดได้อย่างไร ฉันอาจติดตั้งรุ่นเก่าผิดปกติและฉันต้องการเริ่มต้นใหม่


1
ดูเพิ่มเติมที่superuser.com/questions/203707/ซึ่งมีคำตอบที่อธิบายวิธี "ตอนนี้แบบบัญญัติ" เพื่อลบ homebrew
rogerdpack

@rogerdpack ความคิดเห็นอาจถูกลบได้ตลอดเวลาคุณช่วยกรุณาโพสต์คำตอบอธิบายวิธีการใหม่ได้หรือไม่?
nohillside

คำตอบ:


17

สิ่งนี้rm -rfจะไม่ถามว่าคุณแน่ใจหรือไม่เมื่อคุณลบดังนั้นให้แน่ใจว่าcdคำสั่งทำงานเพื่อนำคุณออกจาก / tmp ( cd /tmpพาคุณไปยังที่ปลอดภัยในกรณีที่คุณคัดลอก / วางทุกอย่างในครั้งเดียวดังนั้นคุณจะไม่ลบไฟล์ จากไดเรกทอรีปัจจุบันของคุณ)

ลองสิ่งนี้ในเทอร์มินัลของคุณ:

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

ข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้สามารถพบได้ในHomebrew คำถามที่พบบ่อย


1
ฉันจะตรวจสอบว่าcd `brew --prefix`ไปที่โฟลเดอร์ที่คุณไม่มีไฟล์ git ปกติเช็คอินเนื่องจากการตั้งค่าเก่า / ชำรุดอาจล้มเหลวและการลบgit ls-filesอาจลบบางอย่างที่ไม่ใช่ส่วนที่เหลือของ Brew ของคุณ
bmike

ฉันอ่านเอกสารฉันคิดว่ามันอาจจะเป็นคำถามที่มีประโยชน์สำหรับการอ้างอิงในอนาคต ฉันมีปัญหากับคำแนะนำซึ่งฉันโพสต์เป็นคำถามแยกต่างหาก: apple.stackexchange.com/questions/82863/ …
ipavlic

โปรดทราบว่าลิงก์ไปยังคำถามที่พบบ่อยของ Homebrew ควรได้รับการอัปเดตจากgithub.com/mxcl/homebrew/wiki/FAQ/…เป็นgithub.com/Homebrew/homebrew/blob/master/share/doc/homebrew/ (ฉันไม่สามารถทำได้ แก้ไขหรือเพิ่มความคิดเห็น)
cloudnthings

1
ตอนนี้มีสคริปต์สำหรับสิ่งนั้น: github.com/Homebrew/brew/blob/master/docs/FAQ.md
larkey

5

ในขณะที่การติดตั้งของ HomeBrew ตั้งอยู่อย่างเด่นชัดในหน้าแรกของรายละเอียดไม่ได้ https://brew.sh/ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" เป็นเวลานานมันยากมากที่จะค้นหาการถอนการติดตั้งที่เชื่อถือได้ ตอนนี้คลิกไปหลาย ๆ ครั้งในเอกสารตอนนี้มีวิธีการอย่างเป็นทางการ: https://docs.brew.sh/FAQ หากต้องการถอนการติดตั้ง Homebrew ให้วางคำสั่งด้านล่างในหน้าจอพร้อมท์เทอร์มินัล ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"


3

นี่เป็นทางออกที่ดีกว่าสำหรับการลบ 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
ยินดีต้อนรับสู่ถามที่แตกต่างกัน! แม้ว่าลิงก์ที่คุณระบุอาจตอบคำถามได้ แต่ก็ควรรวมคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงนั้นเปลี่ยนแปลง ฉันได้แก้ไขคำถามของคุณเพื่อรวมสิ่งที่ฉันเชื่อว่าเป็นวิธีการแก้ปัญหาที่คุณอ้างถึง แต่ถ้าไม่ใช่โปรดอ้างอิงส่วนที่เกี่ยวข้อง นอกจากนี้คุณสามารถขยายว่าทำไมโซลูชันของคุณจึงดีกว่า
grg

1
มันเป็นมากกว่าสองสามบรรทัดดังนั้นฉันคิดว่าการรวมรหัสจะยุ่งยาก แต่ฉันก็มีความสุขที่จะทำในอนาคต จะดีกว่าเพราะมีไฟล์และไดเรกทอรีที่ไม่ได้รับคำตอบที่โพสต์ซึ่งสคริปต์ของฉันจะลบ มันมียูทิลิตี้สำหรับผู้ใช้ผ่านตัวเลือก CLI ค้นหาอย่างละเอียดมากขึ้นสำหรับสถานที่ชงและถูกเข้ารหัสเพื่อให้ง่ายต่อการแก้ไขในกรณีที่คุณต้องการปรับปรุงสคริปต์
Steve Benner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.