Я запустил 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>
Самое сложное — обойти джокер, чтобы оболочка не успела его расширить.
решение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
Кратко;
- Получите список проблемных файлов (скопируйте и вставьте вывод pacman в файл).
- Использоватьawkчтобы удалить все, кроме путей к файлам, в новый список.
- Использоватьпокадля удаления проблемных файлов в соответствии со списком.
- Беги
sudo pacman -Syu
снова.
отредактировано для добавления краткого содержания и исправления опечаток
Хотя я почти уверен, что не делал ничего глупого, у меня эта проблема возникала, наверное, каждый второй раз, когда я пытался обновиться с тех пор, как я начал использовать 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"; сделано < 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, ничего не работало, а когда я ставил ее обратно, я получал ошибку "exists on filesystem". Вышеуказанное, с --overwrite, — это все, что сработало для меня.
Окончательно:
sudo pacman -Syu