Corri sudo pacman -Syu
e recebi alguns erros interessantes ao ler:
erro: falha ao confirmar a transação (arquivos conflitantes)
e uma longa lista de arquivos seguida por exists in filesystem
. A saída completa está aqui:http://ix.io/lLw
Parece que muitos desses arquivos não estão associados a um pacote quando os verifiquei pacman -Qo <path-to-file>
, mas não verifiquei todos. Tive uma conexão fraca quando executei o pacman -Syu
, mas recebo os mesmos erros quando atualizo mais tarde:http://ix.io/lLx
O que devo fazer? Devo verificar todos os arquivos e excluir aqueles que não possuem um pacote associado? Devo forçar a atualização (com sudo pacman -S --force <package-name>
?)
Atualizar
Tentei correr sudo pacman -S --force <package-name>
e consegui isso:
[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
Parece que pacman -S --force <package
não substitui diretórios que contêm arquivos. Do homem:
Usar --force não permitirá sobrescrever um diretório por um arquivo ou instalar pacotes com arquivos e diretórios conflitantes.
Devo apenas excluir os diretórios conflitantes? (eles não possuem pacotes associados)
Responder1
Depois que o pacman finalmente descontinuou a --force
opção e fez a --overwrite
opção substituta funcionar conforme o esperado, o seguinte padrão de uso deve ser observado.
Um comando para reproduzir a --force
opção que substitui cegamente qualquer coisa que entre em conflito é este:
sudo pacman -S --overwrite \* <package_name>
Ou
sudo pacman -S --overwrite "*" <package_name>
A parte complicada é escapar do curinga para impedir que o shell o expanda primeiro.
Responder2
Ok, parece que a execução sudo pacman -S --force <package-name>
funciona, mas não resolve diretórios conflitantes. Nesses casos, a execução sudo rm -rf
nos diretórios conflitantes é sudo pacman -S --force <package-name>
executada em seguida.
Agora meu pacman -Syu
resolve bem.
Responder3
dr: Desinstale o aplicativo conflitante antes de executar o pacman
.
pacman
(e outros gerenciadores de pacotes) mantêm umíndice de pacotes e arquivosque eles administram ( pacman --query --list
). Alguns arquivos, como os de configuração, serão marcados como modificáveis e não serão substituídos durante a atualização (exceto em circunstâncias especiais, onde o gerenciador de pacotes normalmente removerá o arquivo antigo antes de criar o novo). Outros arquivos serão marcados como não modificáveis.Se outro aplicativo alterar esses arquivos de alguma forma sem atualizar o índice adequadamente, não haverá como o gerenciador de pacotes saber o que fazer com esses arquivos durante uma atualização.
Muitos aplicativos instalados usando o ./configure && make && sudo make install
padrão padrão podem ser desinstalados usandosudo make uninstall
. Se você instalou o aplicativo de alguma outra forma, talvez seja necessário fazer outra coisa para desinstalá-lo. Em geral, pode ser uma boa ideiamantenha uma cópia dos arquivos de instalaçãoem algum lugar (por exemplo ~/install
) para poder desinstalá-los com segurança nesses casos. Apenas remover os arquivos conflitantes provavelmente deixará outros arquivos espalhados, o que poderia causar outros problemas.
Ao instalar software com outros gerenciadores de pacotes, existem maneiras de isolá-los dos arquivos do sistema. Esta é uma prática recomendada estabelecida, por exemplo, durante o desenvolvimento de software, onde você realmente deseja manter as versões consistentes e evitar conflitos com outros softwares. Exemplos incluem:
Responder4
TLDR;
- Obtenha uma lista dos arquivos incorretos (copie e cole a saída do pacman em um arquivo).
- Usarestranhopara remover tudo, exceto os caminhos dos arquivos, em uma nova lista.
- Usarenquantopara remover os arquivos incorretos, com base na lista.
- Corra
sudo pacman -Syu
novamente.
editado para adicionar TLDR e corrigir erros de digitação
Embora eu tenha certeza de que não tenho feito nada estúpido, tive esse problema talvez todas as outras vezes que tentei atualizar desde que comecei a usar o Manjaro; três ou quatro vezes em dois meses. A propósito, isso resolve tudo.
Obtenha uma lista de seus arquivos.
Quando a atualização falha na janela do seu terminal, você obtém o seguinte:
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
... e muito mais.
Copie a saída do terminal e coloque-a em um arquivo. eu useinanoe nomeei meus "arquivos", como em~/trabalho/arquivos.
Remova informações estranhas:
cat files | awk '{print $2}' >> ~/work/files2
Isso pega a segunda "palavra" de cada linha e a imprime em arquivos2.
Lidar com os arquivos
Você pode excluí-los, movê-los ou renomeá-los.
Se algo quebrar, é mais fácil consertar se quebrarmos movendo-o em vez de excluí-lo ou renomeá-lo:
mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2
Se você realmente deseja excluí-los, o que não há razão para fazer (PERIGO PERIGO):enquanto lê o arquivo -r; faça sudo rm -- "$arquivo"; concluído <arquivos2
Atualizando
Para que --overwrite funcione, o que precisamos fazer para que o pacman perceba que o pacote não está quebrado, você precisa da seguinte sintaxe:
sudo pacman -S package_name --overwrite /location/of/thing
- No meu caso:
sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
- Seguindo o exemplo:
sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
- No meu caso:
Eu tive um problema fofo em que, se eu excluísse o link simbólico libidn2.so.0, nada funcionava e, quando o coloquei de volta, recebi o erro "existe no sistema de arquivos". O acima, com --overwrite, é tudo o que funcionou para mim.
Finalmente:
sudo pacman -Syu