pacman「檔案系統上存在」錯誤

pacman「檔案系統上存在」錯誤

我跑了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不會覆蓋包含檔案的目錄。來自男人:

使用 --force 將不允許使用檔案覆蓋目錄或安裝具有衝突檔案和目錄的軟體包。

我應該刪除衝突的目錄嗎? (他們沒有關聯的包)

答案1

在 pacman 最終棄用該--force選項並使代理--overwrite選項按預期工作後,應注意以下使用模式。

重現盲目覆蓋任何衝突的選項的命令--force如下:

sudo pacman -S --overwrite \* <package_name>

或者

sudo pacman -S --overwrite "*" <package_name>

棘手的部分是轉義通配符以阻止 shell 首先擴展它。

答案2

好的,看起來運作sudo pacman -S --force <package-name>正常,但它不能解決衝突的目錄。在這種情況下,sudo rm -rf在衝突的目錄上運行,然後就sudo pacman -S --force <package-name>可以了。

現在我的pacman -Syu決心很好。

答案3

tl;dr:在運行之前卸載衝突的應用程式pacman

pacman(和其他套件管理器)保留包和文件的索引他們管理的(pacman --query --list)。某些檔案(例如設定)將被標記為可修改,並且在升級過程中不會被覆寫(除非在特殊情況下,套件管理器通常會在建立新檔案之前移走舊檔案)。其他文件將被標記為不可修改。如果另一個應用程式以任何方式更改這些檔案而沒有相應地更新索引,則套件管理器無法知道在升級期間如何處理這些檔案。

許多使用標準./configure && make && sudo make install模式安裝的應用程式可以使用以下命令卸載sudo make uninstall。如果您以其他方式安裝了該應用程序,則可能需要透過其他方式來卸載它。一般來說,這是一個好主意保留安裝檔案的副本在某些地方(例如~/install)能夠在這種情況下可靠地卸載它們。僅刪除衝突的文件可能會留下其他文件,這可能會導致其他問題。

當使用其他套件管理器安裝軟體時,有一些方法可以將它們與系統檔案隔離。這是一種既定的最佳實踐,例如在軟體開發過程中,您確實希望保持版本一致並避免與其他軟體發生衝突。範例包括:

答案4

太長了;

  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

……還有更多。

  • 複製終端的輸出,並將其放入檔案中。我用了,並將我的命名為“文件”,如〜/工作/文件

  • 去除無關訊息:

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

    這將從每行中取出第二個「單字」並將其列印到 files2 中。

處理文件

  • 您可以刪除它們、移動它們或重新命名它們。

  • 如果出現問題,最容易修復的方法是移動它而不是刪除或重新命名它:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • 如果您確實想刪除它們,則沒有理由這樣做(危險 危險):當讀取-r檔案時;執行 sudo rm --“$file”;完成 < 文件2

更新中

  • 為了讓 --overwrite 運作(我們需要讓 pacman 意識到套件沒有損壞),您需要以下語法:

    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
  • 我遇到了一個可愛的問題,如果我刪除了 libidn2.so.0 符號鏈接,則沒有任何效果,當我將其放回去時,我收到“文件系統上存在”錯誤。上面的 --overwrite 是對我有用的。

  • 最後:

    sudo pacman -Syu

相關內容