私は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を使用すると、ディレクトリをファイルで上書きしたり、ファイルとディレクトリが競合するパッケージをインストールしたりできなくなります。
競合するディレクトリを削除するだけですか? (関連付けられたパッケージはありません)
実行中のようですSudo pacman -S --force <package-name>
は機能しますが、競合するディレクトリは解決されません。このような場合は、Sudo rm -rf
競合するディレクトリ、Sudo pacman -S --force <package-name>
機能します。
今私のpacman -Syu
はうまく解決します。
tl; dr:pacman
を実行する前に、競合するアプリケーションをアンインストールします。
pacman
(および他のパッケージマネージャー)は、管理するパッケージとファイルのインデックスを保持します(pacman --query --list
)。構成などの一部のファイルは変更可能としてマークされ、アップグレード時に上書きされません(特別な状況を除き、パッケージマネージャーは通常、新しいファイルを作成する前に古いファイルを移動します)。他のファイルは変更不可としてマークされます。 別のアプリケーションがインデックスを更新せずにこれらのファイルを何らかの方法で変更した場合、パッケージマネージャーがアップグレード中にこれらのファイルをどう処理するかを知る方法はありません。
標準の./configure && make && Sudo make install
パターンを使用してインストールされた多くのアプリケーションは、Sudo make uninstall
を使用してアンインストールできます。他の方法でアプリケーションをインストールした場合は、それをアンインストールするために別の方法が必要になる場合があります。一般に、このような場合に確実にアンインストールできるように、インストールファイルのコピーを保存のどこかに(たとえば、~/install
)おくとよいでしょう。競合するファイルを削除するだけでは、おそらく他のファイルがそのまま残り、おそらく他の問題を引き起こす可能性があります。
他のパッケージマネージャーでソフトウェアをインストールする場合、システムファイルからそれらを分離する方法があります。これは、たとえばソフトウェア開発中に確立されたベストプラクティスであり、バージョンの一貫性を維持し、他のソフトウェアとの競合を回避する必要があります。例は次のとおりです。
Pacmanが最終的に--force
オプションを非推奨にし、サロゲート--overwrite
オプションを期待どおりに機能させるには、以下の使用パターンに注意する必要があります。
競合するものを盲目的に上書きする--force
オプションを再現する同等のコマンドは次のとおりです。
Sudo pacman -S --overwrite \*
または
Sudo pacman -S --overwrite "*"
トリッキーな部分は、シェルが最初に展開しないようにするために、グロブをエスケープすることです。
このため、通常はpacmanを介してpipでインストールするパッケージをインストールしていました。しかし、いくつかのパッケージはpacman reposで見つかりません。 Sudo特権とisteadでpipをインストールすることは避けるべきだと思います。
pip install pillow --user
--userフラグを指定すると、代わりにホームディレクトリにpipインストールパッケージが作成されます。特別な権限は必要ありません。 https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install -user
Sudo pacman -Syu
をもう一度実行します。私は愚かなことをしていないと確信していますが、Manjaroを使用して以来、更新しようとするたびにこの問題が発生した可能性があります。 2か月以内に3〜4回。ちなみに、これはそれを修正します。
ターミナルウィンドウで更新が失敗すると、次のようになります。
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
これにより、各行から2番目の「Word」が取得され、files2に出力されます。
それらを削除したり、移動したり、名前を変更したりできます。
何かが壊れた場合は、削除したり名前を変更したりするのではなく、移動して壊れた場合に修正するのが最も簡単です。mkdir ~/work/oldfiles while read -r file; do Sudo mv -- "$file" ~/work/oldfiles/$file; done < files2
それらを本当に削除したい場合、それを行う理由はありません(DANGER DANGER):while -r file; 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シンボリックリンクを削除しても何も機能せず、元に戻すと「exists on filesystem」エラーが発生するというかわいい問題がありました。上記の--overwriteを使用すると、私にとってうまくいきました。
最終的に:
Sudo pacman -Syu
私のように多くのファイルがある場合、
Sudo pacman --force -Syyu
すべての問題を解決します。