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, не перезаписать каталоги, которые содержат файлы. От мужчины:

Использование --force не позволит перезаписать каталог с файлом или установить пакеты с конфликтующими файлами и каталогами.

Должен ли я просто удалить конфликтующие каталоги? (у них нет связанных пакетов)

modulitos
источник
5
почему у вас конфликтующие файлы в первую очередь? при использовании менеджера пакетов старайтесь не касаться его пальцами ног (например, устанавливая программное обеспечение в местах, где менеджер пакетов по праву считает, что они принадлежат; если вам нужно установить вещи вручную, установите /usr/local/вместо /usr/)
umläute
1
@ umläute Я не совсем уверен, откуда пришли конфликтующие файлы, но я подозреваю, что они связаны с моей установкой docker-compose, которую я установил с помощью sudo pip install -U docker-compose==1.5.0rc3 этой страницы . Возможно sudo pip installконфликтует с pacman?
модуль
2
@ umläute Получение неправильных -Sобновлений (частичная установка и т. д.) позволит вам этот сценарий. Дело у меня --forceсработало все время.
m3nda

Ответы:

28

Хорошо, похоже, что работает sudo pacman -S --force <package-name>работает, но он не разрешает конфликтующие каталоги. В таких случаях бегут sudo rm -rfпо конфликтующим каталогам, затем следуют sudo pacman -S --force <package-name>работы.

Теперь мой pacman -Syuразрешается хорошо.

modulitos
источник
6
- сила не рекомендуется; используйте вместо этого --overwrite.
Анкит Балян
7
--force работает на меня, но --overwrite - нет
Infernion
3
sudo pacman -Syu --forceработал для меня, но перезапись не была распознана.
Спидон
21

tl; dr: удалите конфликтующее приложение перед запуском pacman.

pacman(и другие менеджеры пакетов) хранят индекс пакетов и файлов, которыми они управляют ( pacman --query --list). Некоторые файлы, такие как конфигурация, будут помечены как изменяемые и не будут перезаписаны во время обновления (за исключением особых случаев, когда менеджер пакетов обычно удаляет старый файл перед созданием нового). Другие файлы будут помечены как неизменяемые. Если другое приложение каким-либо образом изменяет эти файлы без соответствующего обновления индекса, у менеджера пакетов нет возможности узнать, что делать с этими файлами во время обновления.

Многие приложения, установленные с использованием стандартного ./configure && make && sudo make installшаблона, могут быть удалены с помощью sudo make uninstall. Если вы установили приложение другим способом, вам может понадобиться что-то еще, чтобы удалить его. В целом, может быть хорошей идеей хранить где-нибудь копию установочных файлов (например ~/install), чтобы иметь возможность надежно удалить их в таких случаях. Простое удаление конфликтующих файлов, вероятно, приведет к тому, что другие файлы будут лежать без дела, что может вызвать другие проблемы.

При установке программного обеспечения с другими менеджерами пакетов есть способы изолировать их от системных файлов. Это установившаяся лучшая практика, например, при разработке программного обеспечения, когда вы действительно хотите поддерживать согласованность версий и избегать конфликтов с другим программным обеспечением. Примеры включают в себя:

l0b0
источник
2
Смотрите мой комментарий к @umlaute выше. Я думаю, что конфликт был из sudo pip installкоманды. Возможно, мне следует избегать использования pip с sudo?
модуль
3

Из-за этого я устанавливал пакеты, которые я обычно устанавливаю с помощью pip через pacman. Но некоторые пакеты не найдены в репозиториях pacman. Я думаю, что мы должны избегать установки pip с привилегиями sudo и istead:

pip install pillow --user

--user flag делает pip-установочные пакеты в вашем домашнем каталоге, что не требует специальных привилегий. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user

лава-лава
источник
2

TLDR;

  1. Получить список поврежденных файлов (скопировать и вставить вывод pacman в файл).
  2. Используйте awk, чтобы удалить все, кроме путей к файлам, в новый список.
  3. Используйте while, чтобы удалить оскорбительные файлы, основываясь на списке.
  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

... и многое другое.

  • Скопируйте вывод из терминала и поместите его в файл. Я использовал nano и назвал мои «файлы», как в ~ / work / files .

  • Лишить постороннюю информацию:

    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; do sudo rm - "$ file"; сделано <files2

обновление

  • Чтобы заставить работать --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

Фин Хиршофф
источник
2

После того, как pacman окончательно устарел, --forceи чтобы суррогатная --overwriteопция работала должным образом, следует отметить следующую схему использования.

Эквивалентная команда для воспроизведения --forceопции, которая слепо перезаписывает все, что конфликтует:

sudo pacman -S --overwrite \*

Или

sudo pacman -S --overwrite "*"

Сложная часть ускользает от шара, чтобы избежать его расширения.

шухер
источник
Это работает отлично, спасибо!
EkriirkE
0

Если у вас много файлов, как у меня,

sudo pacman --force -Syyu  

решает все вопросы.

Мохамед Хеди Кестоури
источник
опция --force устарела; используйте вместо этого --overwrite
Махмуд Халед
--overwrite, похоже, должен указывать, что перезаписать. в настоящее время используют --force все хорошо
xsilen T