ถอนการติดตั้ง / ลบแพ็คเกจ Homebrew รวมถึงการขึ้นต่อกันทั้งหมด


339

ฉันมีสูตรHomebrewที่ฉันต้องการถอนการติดตั้ง / ลบพร้อมกับการพึ่งพาทั้งหมดของมันข้ามแพคเกจที่มีแพคเกจอื่น ๆ ขึ้นอยู่กับ ( กำจัด aka แพคเกจ Cascadingใน Parlance Package Manager)

เช่นถอนการติดตั้งแพ็คเกจaซึ่งขึ้นอยู่กับแพ็คเกจb& cในกรณีที่แพ็คเกจdนั้นขึ้นอยู่กับแพ็คเกจcด้วย ผลที่ควรจะถอนการติดตั้งทั้งในaและข้ามbc

ฉันจะทำสิ่งนั้นได้อย่างไร

จะต้องมีวิธีการที่จะถอนการติดตั้งแพคเกจโดยไม่ต้องออกไม่จำเป็นขยะที่อยู่เบื้องหลัง


3
นี่ไม่ใช่สิ่งที่ผู้จัดการแพคเกจมูลค่าชื่อนี้ควรทำนอกกรอบหรือไม่! LOL
mljrg

คำตอบ:


407

แก้ไข:

ดูเหมือนว่าปัญหาได้รับการแก้ไขในขณะนี้โดยใช้คำสั่งที่เรียกว่าภายนอกbrew rmdepsbrew rmtreeหรือ

ในการติดตั้งและใช้งานให้ใช้คำสั่งต่อไปนี้:

$ brew tap beeftornado/rmtree
$ brew rmtree <package>

ดูลิงค์ด้านบนสำหรับข้อมูลเพิ่มเติมและการสนทนา


คำตอบเดิม:

ปรากฏว่าในปัจจุบันไม่มีวิธีที่ง่ายในการทำสิ่งนี้ให้สำเร็จ

อย่างไรก็ตามฉันได้ยื่นปัญหาในหน้า GitHub ของ Homebrewและมีคนแนะนำวิธีแก้ปัญหาชั่วคราวจนกว่าพวกเขาจะเพิ่มคำสั่งพิเศษเพื่อแก้ไขปัญหานี้

มีคำสั่งภายนอกที่เรียกว่าbrew leavesซึ่งพิมพ์แพ็คเกจทั้งหมดที่ไม่ขึ้นกับแพ็คเกจอื่น

หากคุณทำโลจิคัลและบนเอาต์พุตbrew leavesและbrew deps <package>คุณอาจได้รับรายการของแพ็กเกจการพึ่งพาที่ถูกโยงถึงซึ่งคุณสามารถถอนการติดตั้งด้วยตนเองหลังจากนั้น รวมกับสิ่งนี้xargsและคุณจะได้รับสิ่งที่คุณต้องการฉันเดา (ยังไม่ทดลองไม่ต้องนับสิ่งนี้)


แก้ไข:ใครบางคนเพิ่งแนะนำวิธีการแก้ปัญหาที่คล้ายกันมากใช้joinแทนxargs:

brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))

ดูความคิดเห็นเกี่ยวกับปัญหาที่กล่าวถึงข้างต้นสำหรับข้อมูลเพิ่มเติม


4
บรรทัดที่สองให้ข้อผิดพลาด: This command requires a keg argument.
Shmidt

7
brew rmtreeสคริปต์ของบุคคลที่สามนั้นมีให้ใช้งานในการแตะ:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy

1
@ NicolasMcCurdy ฉันได้ลองและสามารถยืนยันได้ว่านี่เป็นวิธีที่น่าเชื่อถือที่สุดในปัจจุบัน
Ory Band

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))ทำงานได้ดี คุณต้องเรียกใช้มันซ้ำแล้วซ้ำอีกจนกว่าการอ้างอิงทั้งหมดจะถูกลบออก ไม่สามารถถอนการติดตั้งทุกอย่างในคราวเดียวเพราะการพึ่งพาอาศัยกันระหว่างกัน
Greg Wang

1
&& brew install brew-rmtreeไม่จำเป็น
บอริส

34

เป้าหมายที่นี่คือการลบแพคเกจที่กำหนดและการอ้างอิงโดยไม่ทำลายการอ้างอิงของแพคเกจอื่น ฉันใช้คำสั่งนี้:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install

หมายเหตุ: แก้ไขเพื่อสะท้อนความคิดเห็นที่เป็นประโยชน์ของ @ alphadogg


ต้องเพิ่ม--ignore-dependenciesเพื่อลบเพื่ออนุญาตการทำงานนี้
alphadogg

2
สิ่งนี้ทำให้การกำหนดค่าชงของฉันแตกเนื่องจากไม่ได้ติดตั้ง deps ที่ใช้ในแพ็คเกจอื่น ไม่ใช้
Marco Pappalardo

26

brew rmtree ไม่ทำงานเลย จากลิงก์ในปัญหานั้นฉันพบrmrecซึ่งใช้งานได้จริง พระเจ้ารู้ว่าทำไมbrewไม่มีสิ่งนี้เป็นคำสั่งพื้นเมือง

brew tap ggpeti/rmrec
brew rmrec pkgname

รักนี้ แต่ถ้าคุณได้เริ่มต้นแล้วลงเส้นทางของการถอนการติดตั้งตัวเองและเก็บหาแพคเกจเพิ่มเติมที่คุณต้องการที่จะลบคุณยังคงต้องรู้ว่าอะไรเป็นแพคเกจที่กว้างที่สุดสัมผัสหรือคุณสามารถเพียงแค่สั้น ๆ ติดตั้ง[FORMULA]แล้วใช้ rmrec เพื่อลบการอ้างอิงทั้งหมดซ้ำทั้งหมดอย่างถูกต้อง
dragon788

2
Caveat: นอกจากนี้ยังปรากฏว่าrmrecไม่สามารถจัดการกับแพ็คเกจเนมสเปซได้เป็นอย่างดี ฉันใช้สิ่งที่ดึงเข้ามาlinuxbrew/xorg/xorgและลบทุกอย่างยกเว้นแพ็คเกจนั้นและแม้กระทั่งตั้งชื่อแพ็คเกจอย่างชัดเจนว่ามันไม่สามารถแก้ไขได้และไม่ได้ทำอะไรเลย
dragon788

ยืนยันว่าคำแนะนำการใช้งานrmrecนั้นไม่ดี มันไม่ได้จัดการการพึ่งพาเลย
omdv

คุณหมายถึงrmtreeอะไร rmrecจัดการกับการพึ่งพา
Timmmm

1
God knows why brew doesn't have this as a native command.=> เนื่องจากผู้พัฒนาผู้ผลิตเบียร์มีทัศนคติที่ไม่ดี พวกเขาไม่อนุญาตให้คนเปิดปัญหาใด ๆ ตรวจสอบgithub.com/Homebrew/brewตอนนี้มีปัญหาน้อยกว่า 20 ฉบับเท่านั้น เช่นจำนวนน้อย นั่นเป็นสิ่งที่ดีหรือไม่? ไม่มันแย่มาก
sgon00

15

ตามคำตอบ @jfmercer (ต้องการการแก้ไขมากกว่าความคิดเห็น)

ลบการอ้างอิงของแพ็คเกจ (ไม่ได้ลบแพ็คเกจ):

brew deps [FORMULA] | xargs brew remove --ignore-dependencies

ลบแพ็คเกจ:

brew remove [FORMULA]

ติดตั้งไลบรารีที่หายไปอีกครั้ง:

brew missing | cut -d: -f2 | sort | uniq | xargs brew install

ถอนการติดตั้งการทดสอบmeldหลังจากการค้นพบเผยแพร่ MeldMerge


ฉันติดตั้ง ffmpeg ด้วยการชงซึ่งทำให้สิ่งต่าง ๆ ยุ่งมาก ทำความสะอาด ffmpeg รวมถึงรายการที่เพิ่มขึ้นของการพึ่งพาด้วยวิธีการที่อธิบายไว้ข้างต้นได้ผลสำหรับฉัน
webtweakers

13

การใช้คำตอบนี้ต้องการให้คุณสร้างและดูแลรักษาไฟล์ที่มีชื่อแพ็คเกจที่คุณต้องการติดตั้งในระบบของคุณ หากคุณยังไม่มีให้ใช้คำสั่งต่อไปนี้และลบชื่อแพ็คเกจที่คุณไม่ต้องการติดตั้งไว้

brew leaves > brew_packages

จากนั้นคุณสามารถลบการติดตั้งทั้งหมด แต่แพ็คเกจที่ไม่ต้องการและการพึ่งพาที่ไม่จำเป็นใด ๆ โดยเรียกใช้คำสั่งต่อไปนี้

brew_clean brew_packages

brew_cleanสามารถใช้ได้ที่นี่: https://gist.github.com/cskeeters/10ff1295bca93808213d

สคริปต์นี้รับแพ็กเกจทั้งหมดที่คุณระบุใน brew_packages และการอ้างอิงทั้งหมดและเปรียบเทียบกับเอาต์พุตbrew listและในที่สุดก็ลบแพ็กเกจที่ไม่ต้องการหลังจากตรวจสอบรายชื่อนี้กับผู้ใช้

ณ จุดนี้ถ้าคุณต้องการที่จะเอาแพคเกจaคุณก็เอามันออกไปจากแฟ้ม brew_packages brew_clean brew_packagesแล้วเรียกใช้อีกครั้ง มันจะลบแต่ไม่bc


ฉันคิดว่าการผลิตเบียร์ที่สะอาดมีอยู่แล้วในตอนนี้ลองbrew clean -s
Devin G Rhode

1
ความคิดเห็นข้างต้นผิดพลาดแก้ไขได้ใน 5 นาที ลองbrew cleanup -s && brew cask cleanup
Devin G Rhode

5

คุณสามารถใช้ UNIX ไปป์นี้ได้

brew deps [FORMULA] | xargs brew rm

12
นี่ไม่ใช่ทางออกที่ดี คุณสามารถทำลายการพึ่งพาแพ็คเกจอื่น ๆ ด้วยวิธีนี้
Ory Band

12
มีคำสั่งที่คุณสามารถเรียกใช้หลังจากนั้นเพื่อแจ้งให้คุณทราบหากคุณ nuked การอ้างอิงที่จำเป็นอื่น ๆbrew missingซึ่งจะบอกคุณว่าคำสั่งที่คุณต้องใช้เพื่อให้ได้พวกเขากลับมา
SeanJA

4

บันทึกสคริปต์ต่อไปนี้เป็นการล้างข้อมูลชง

#!/bin/bash
#:Usage: brew purge formula
#: 
#:Removes the package and all dependancies.
#: 
#: 
PKG="$1"
if [ -z "$PKG" ];then
   brew purge --help
   exit 1
fi
brew rm $PKG
[ $? -ne 0 ] && exit 1
while brew rm $(join <(brew leaves) <(brew deps $PKG)) 2>/dev/null
  do :
done
echo Package $PKG and its dependancies have been removed.
exit 0

ตอนนี้ติดตั้งด้วยคำสั่งดังต่อไปนี้

sudo install brew-purge /usr/local/bin

ตอนนี้เรียกใช้

brew purge package

ตัวอย่างการใช้ gpg

$ brew purge gpg
Uninstalling /usr/local/Cellar/gnupg/2.2.13... (134 files, 11.0MB)
Uninstalling /usr/local/Cellar/adns/1.5.1... (14 files, 597.5KB)
Uninstalling /usr/local/Cellar/gnutls/3.6.6... (1,200 files, 8.9MB)
Uninstalling /usr/local/Cellar/libgcrypt/1.8.4... (21 files, 2.6MB)
Uninstalling /usr/local/Cellar/libksba/1.3.5... (14 files, 344.2KB)
Uninstalling /usr/local/Cellar/libusb/1.0.22... (29 files, 508KB)
Uninstalling /usr/local/Cellar/npth/1.6... (11 files, 71.7KB)
Uninstalling /usr/local/Cellar/pinentry/1.1.0_1... (12 files, 263.9KB)
Uninstalling /usr/local/Cellar/libassuan/2.5.3... (16 files, 444.2KB)
Uninstalling /usr/local/Cellar/libtasn1/4.13... (59 files, 436KB)
Uninstalling /usr/local/Cellar/libunistring/0.9.10... (54 files, 4.4MB)
Uninstalling /usr/local/Cellar/nettle/3.4.1... (85 files, 2MB)
Uninstalling /usr/local/Cellar/p11-kit/0.23.15... (63 files, 2.9MB)
Uninstalling /usr/local/Cellar/gmp/6.1.2_2... (18 files, 3.1MB)
Uninstalling /usr/local/Cellar/libffi/3.2.1... (16 files, 296.8KB)
Uninstalling /usr/local/Cellar/libgpg-error/1.35... (27 files, 854.8KB)
Package gpg and its dependancies have been removed.
$ 

2

คำตอบอื่น ๆ ใช้งานไม่ได้สำหรับฉัน แต่สิ่งนี้ทำได้ (เป็นแบบfishเชลล์):

brew remove <package>
for p in (brew deps <package>)
    brew remove $p
end

เพราะbrew remove $pล้มเหลวเมื่อบางแพคเกจอื่น ๆ pขึ้นอยู่กับ


2

ฟังก์ชั่นของ Bourne Shell ที่สมบูรณ์ยิ่งขึ้น

มีคำตอบที่ดีจำนวนหนึ่งอยู่แล้ว แต่บางคำตอบล้าสมัยและไม่มีคำตอบที่สมบูรณ์ทั้งหมด โดยเฉพาะอย่างยิ่งพวกเขาส่วนใหญ่จะลบการอ้างอิง แต่ยังคงปล่อยให้คุณเอาสูตรดั้งเดิมที่กำหนดเป้าหมายหลังจากนั้น liners ที่โพสต์แล้วยังน่าเบื่อหากคุณต้องการถอนการติดตั้งมากกว่าหนึ่งสูตรในเวลาเดียวกัน

นี่คือฟังก์ชั่นเชลล์ที่เข้ากันได้กับบอร์น (โดยไม่มี Bashisms ใด ๆ ที่รู้จัก) ที่รับรายการสูตรลบการพึ่งพาของแต่ละคนลบสำเนาทั้งหมดของสูตรเองแล้วติดตั้งการพึ่งพาที่ขาดหายไป

unbrew () {
    local formula
    for formula in "$@"; do
        brew deps "$formula" |
        xargs brew uninstall --ignore-dependencies --force
        brew uninstall --force "$formula"
    done
    brew missing | cut -f2 -d: | sort -u | xargs brew install
}

มันได้รับการทดสอบใน Homebrew 1.7.4

คำเตือน

สิ่งนี้ใช้ได้กับสูตรมาตรฐานทั้งหมดที่ฉันทดสอบ มันไม่ได้จัดการกับถังในปัจจุบัน แต่จะไม่บ่นดังถ้าคุณพยายามที่จะปลดถังที่มีชื่อเดียวกันกับสูตรมาตรฐาน (เช่น MacVim)


1

คำตอบของ @jfmercer ต้องแก้ไขเล็กน้อยเพื่อให้ทำงานกับ Brew ปัจจุบันได้เนื่องจากเอาต์พุตของbrew missingมีการเปลี่ยนแปลง:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.