ข้อผิดพลาด pacman“ มีอยู่ในระบบแฟ้ม”


38

ฉันวิ่งsudo pacman -Syuและฉันพบข้อผิดพลาดที่น่าสนใจ:

ข้อผิดพลาด: ล้มเหลวในการส่งทรานแซกชัน (ไฟล์ที่ขัดแย้ง)

exists in filesystemและรายการยาวของไฟล์ที่ตามมาด้วย ผลลัพธ์เต็มรูปแบบอยู่ที่นี่: http://ix.io/lLw

ปรากฏว่าไฟล์เหล่านี้จำนวนมากไม่เกี่ยวข้องกับแพ็คเกจเมื่อฉันตรวจสอบด้วยpacman -Qo <path-to-file>แต่ฉันไม่ได้ตรวจสอบทั้งหมด ฉันมีการเชื่อมต่อที่อ่อนแอเมื่อฉันวิ่งpacman -Syuแต่ฉันได้รับข้อผิดพลาดเดียวกันเมื่อฉันอัปเดตในภายหลัง: http://ix.io/lLx

ฉันควรทำอย่างไร? ฉันควรตรวจสอบไฟล์ทั้งหมดและลบไฟล์ที่ไม่มีแพ็คเกจที่เกี่ยวข้องหรือไม่ ฉันควรบังคับให้อัปเดต (ด้วยsudo pacman -S --force <package-name>)

ปรับปรุง

ฉันพยายามเรียกใช้sudo pacman -S --force <package-name>และได้รับสิ่งนี้:

[my-pc]/home/average-joe$ pacman -Qo /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info
error: No package owns /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info

ดูเหมือนว่าpacman -S --force <packageจะไม่เขียนทับไดเรกทอรีที่มีไฟล์ จากคน:

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

ฉันควรลบไดเรกทอรีที่ขัดแย้งกันหรือไม่ (พวกเขาไม่มีแพ็คเกจที่เกี่ยวข้อง)


5
ทำไมคุณมีไฟล์ที่ขัดแย้งกันตั้งแต่แรก เมื่อใช้ตัวจัดการแพคเกจพยายามอย่าแตะที่นิ้วเท้าของมัน (เช่นโดยการติดตั้งซอฟต์แวร์ในตำแหน่งที่ตัวจัดการแพคเกจคิดอย่างถูกต้องเป็นของพวกเขาหากคุณต้องติดตั้งสิ่งต่าง ๆ ด้วยตนเองติดตั้ง/usr/local/แทน/usr/)
umläute

1
@ umläuteฉันไม่แน่ใจว่าไฟล์ที่ขัดแย้งมาจากที่ใด แต่ฉันคิดว่ามันเกี่ยวข้องกับการติดตั้งนักเทียบท่าที่ฉันติดตั้งโดยใช้sudo pip install -U docker-compose==1.5.0rc3 ในหน้านี้ อาจsudo pip installขัดแย้งกับ Pacman หรือ
modulitos

2
@ umläuteการรับการ-Sอัปเดตที่ไม่ถูกต้อง(การติดตั้งบางส่วน ฯลฯ ) จะช่วยให้คุณรู้สถานการณ์นั้น กรณีของฉัน--forceทำงานตลอดเวลา
erm3nda

คำตอบ:


28

ตกลงดูเหมือนว่าจะทำงานsudo pacman -S --force <package-name>ได้ แต่ก็ไม่ได้แก้ปัญหาไดเรกทอรีที่ขัดแย้งกัน ในกรณีดังกล่าวให้เรียกใช้sudo rm -rfในไดเรกทอรีที่ขัดแย้งกันตามด้วยsudo pacman -S --force <package-name>ผลงาน

ตอนนี้ฉันpacman -Syuแก้ไขได้ดี


6
- บังคับให้เลิกใช้ ใช้ - เขียนทับแทน
Ankit Balyan

6
- กำลังทำงานสำหรับฉัน แต่
เขียนทับ

2
sudo pacman -Syu --forceใช้งานได้สำหรับฉัน แต่การเขียนทับไม่ได้รับการยอมรับ
spydon

21

TL; DR: pacmanถอนการติดตั้งแอพลิเคชันที่ขัดแย้งกันก่อนที่จะใช้

pacman(และผู้จัดการแพ็คเกจอื่น ๆ ) เก็บดัชนีของแพ็คเกจและไฟล์ที่จัดการ ( pacman --query --list) ไฟล์บางไฟล์เช่นการกำหนดค่าจะถูกทำเครื่องหมายว่าสามารถแก้ไขได้และจะไม่ถูกเขียนทับในระหว่างการอัพเกรด (ยกเว้นในกรณีพิเศษที่ผู้จัดการแพคเกจจะย้ายไฟล์เก่าไปก่อนสร้างใหม่) ไฟล์อื่น ๆ จะถูกทำเครื่องหมายว่าไม่สามารถแก้ไขได้ หากแอปพลิเคชั่นอื่นเปลี่ยนไฟล์เหล่านั้นในลักษณะใด ๆ โดยไม่ต้องอัปเดตดัชนีดังนั้นจึงไม่มีวิธีใดที่ตัวจัดการแพคเกจจะรู้ว่าต้องทำอะไรกับไฟล์เหล่านั้นในระหว่างการอัพเกรด

หลายโปรแกรมที่ติดตั้งโดยใช้มาตรฐานรูปแบบสามารถถอนการติดตั้งโดยใช้./configure && make && sudo make install sudo make uninstallหากคุณติดตั้งแอปพลิเคชั่นด้วยวิธีอื่นคุณอาจต้องทำการถอนการติดตั้ง โดยทั่วไปคุณควรเก็บสำเนาไฟล์การติดตั้งไว้ที่อื่น (ตัวอย่าง~/install) เพื่อให้สามารถถอนการติดตั้งได้อย่างน่าเชื่อถือในกรณีเช่นนี้ เพียงแค่การลบไฟล์ที่ขัดแย้งอาจทำให้ไฟล์อื่น ๆ วางอยู่ซึ่งอาจทำให้เกิดปัญหาอื่น ๆ ได้

เมื่อติดตั้งซอฟต์แวร์ด้วยตัวจัดการแพคเกจอื่น ๆ มีวิธีในการแยกไฟล์เหล่านั้นออกจากไฟล์ระบบ นี่เป็นแนวทางปฏิบัติที่ดีที่สุดที่กำหนดขึ้นเช่นในระหว่างการพัฒนาซอฟต์แวร์ซึ่งคุณต้องการให้เวอร์ชันสอดคล้องกันและหลีกเลี่ยงความขัดแย้งกับซอฟต์แวร์อื่น ๆ ตัวอย่างรวมถึง:


2
ดูความคิดเห็นของฉันที่ @umlaute ด้านบน ฉันคิดว่าความขัดแย้งนั้นมาจากsudo pip installคำสั่ง บางทีฉันควรหลีกเลี่ยงการใช้ pip กับ sudo?
modulitos

2

ฉันกำลังติดตั้งแพคเกจที่ฉันมักจะติดตั้งด้วย pip ผ่าน pacman เพราะสิ่งนี้ แต่บางแพ็คเกจก็ไม่พบใน pacman repos ฉันคิดว่าเราควรหลีกเลี่ยงการติดตั้ง pip ด้วยสิทธิ์ sudo และ istead:

pip install pillow --user

- flag ผู้ใช้ทำแพ็คเกจการติดตั้ง pip ในโฮมไดเร็กตอรี่ของคุณแทน, ซึ่งไม่ต้องการสิทธิพิเศษใด ๆ https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user


2

TLDR;

  1. รับรายการไฟล์ที่ละเมิด (คัดลอกและวางเอาต์พุตของ pacman ลงในไฟล์)
  2. ใช้awkเพื่อตัดออกทุกอย่างยกเว้นไฟล์พา ธ ไปยังรายการใหม่
  3. ใช้ในขณะที่จะย้ายไฟล์ที่ละเมิดออกไปตามรายการ
  4. ทำงานsudo pacman -Syuอีกครั้ง

    แก้ไขเพื่อเพิ่ม TLDR และแก้ไขความผิดพลาด

แม้ว่าฉันค่อนข้างแน่ใจว่าฉันไม่ได้ทำอะไรโง่ แต่ฉันมีปัญหานี้ทุกครั้งที่ฉันพยายามอัปเดตตั้งแต่ฉันใช้ Manjaro; สามหรือสี่ครั้งภายในสองเดือน ชี้ว่าสิ่งนี้แก้ไขได้

รับรายการไฟล์ของคุณ

เมื่อการอัพเดทล้มเหลวในหน้าต่างเทอร์มินัลคุณจะได้รับสิ่งนี้:

error: failed to commit transaction (conflicting files)
evilfile: /usr/bin/evilfile exists in filesystem
libx000: /usr/lib/libx000.so.f.u.loser exists in filesystem
accountsservice: /usr/share/locale/ru/LC_MESSAGES/accounts-service.mo.yu.dnt.evn.spk.russian exists in filesystem

... และอีกมากมาย

  • คัดลอกเอาต์พุตจากเทอร์มินัลและวางไว้ในไฟล์ ผมใช้นาโนและชื่อฉัน "ไฟล์" ใน~ / ทำงาน / ไฟล์

  • Strip ข้อมูลภายนอก:

    cat files | awk '{print $2}' >> ~/work/files2

    สิ่งนี้จะใช้คำว่า "word" อันที่สองจากแต่ละบรรทัดแล้วพิมพ์ไปที่ files2

จัดการกับไฟล์

  • คุณสามารถลบย้ายหรือเปลี่ยนชื่อ

  • หากมีบางอย่างผิดพลาดวิธีที่ง่ายที่สุดในการแก้ไขถ้าเราทำลายโดยการย้ายแทนที่จะลบหรือเปลี่ยนชื่อ:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • หากคุณต้องการที่จะลบพวกเขาซึ่งไม่มีเหตุผลที่จะทำ ( อันตรายอันตราย ): ในขณะที่อ่านไฟล์ -r; ทำ sudo rm - "$ file"; เสร็จแล้ว <files2

อัปเดต

  • ในการรับ - เขียนทับเพื่อทำงานซึ่งเราต้องทำเพื่อให้ Pac Pac ทราบว่าแพ็คเกจไม่ได้ขาดคุณต้องใช้ไวยากรณ์ต่อไปนี้:

    sudo pacman -S package_name --overwrite /location/of/thing

    • ในกรณีของฉัน: sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • ทำตามตัวอย่าง: sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • ฉันมีปัญหาน่ารักที่ถ้าฉันลบ symlink libidn2.so.0 ไม่มีอะไรทำงานและเมื่อฉันนำมันกลับมาฉันได้รับข้อผิดพลาด "มีอยู่ในระบบแฟ้ม" ข้างต้นด้วย - เขียนทับเป็นสิ่งที่ทำงานให้ฉัน

  • สุดท้าย:

    sudo pacman -Syu


0

หากคุณมีไฟล์มากมายเช่นฉัน

sudo pacman --force -Syyu  

แก้ไขปัญหาทั้งหมด


ตัวเลือก - บังคับเลิก ใช้ --overwrite แทน
Mahmoud Khaled

- โอเวอร์ไรท์ดูเหมือนว่าจะต้องระบุสิ่งที่จะเขียนทับ ปัจจุบันใช้ - บังคับทุกอย่าง
เรียบร้อย

0

หลังจาก pacman เลิกใช้--forceตัวเลือกในที่สุดและเพื่อให้--overwriteตัวเลือกตัวแทนทำงานตามที่คาดไว้ควรใช้รูปแบบการติดตามดังต่อไปนี้

คำสั่งเทียบเท่าในการทำซ้ำ--forceตัวเลือกที่สุ่มสี่สุ่มห้าเขียนทับสิ่งที่ขัดแย้งจะ:

sudo pacman -S --overwrite \*

หรือ

sudo pacman -S --overwrite "*"

ส่วนที่ยุ่งยากนั้นกำลังหลบหนีไปยัง glob เพื่อหลีกเลี่ยงการขยายตัวของมันก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.