erro pacman "existe no sistema de arquivos"

38

Corri sudo pacman -Syue 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 eu os verifiquei pacman -Qo <path-to-file>, mas não os verifiquei todos. Eu tive uma conexão fraca quando executei pacman -Syu, mas recebo os mesmos erros quando atualizei mais tarde: http://ix.io/lLx

O que devo fazer? Devo verificar todos os arquivos e excluir os que não possuem um pacote associado? Devo forçar a atualização (com sudo pacman -S --force <package-name>?)

Atualizar

Eu 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 pacman -S --force <packageque não substitui diretórios que contêm arquivos. Do homem:

Usar --force não permitirá substituir 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 têm pacotes associados)

modulitos
fonte
5
por que você tem arquivos conflitantes em primeiro lugar? ao usar um gerenciador de pacotes, tente não toque em seus dedos (por exemplo, através da instalação de software em lugares o gerenciador de pacotes pensa justamente é deles; se você deve instalar as coisas manualmente, instale a /usr/local/vez de /usr/)
trema
11
@ umläute Não sei exatamente de onde vieram os arquivos conflitantes, mas suspeito que estejam relacionados à minha instalação do docker-compose que eu instalei usando sudo pip install -U docker-compose==1.5.0rc3 nesta página . Talvez sudo pip installconflitos com pacman?
Modulitos 3/11
2
@ umläute Obter -Satualizações incorretas (instalações parciais, etc) permitirá esse cenário. Caso de mim --forcetrabalhou o tempo todo.
M3nda 23/05

Respostas:

28

Ok, parece que sudo pacman -S --force <package-name>funciona, mas não resolve diretórios conflitantes. Nesses casos, executando sudo rm -rfnos diretórios conflitantes, seguidos de sudo pacman -S --force <package-name>obras.

Agora meu pacman -Syuresolve bem.

modulitos
fonte
6
--force está obsoleto; use --overwrite.
Ankit Balyan
7
--force está trabalhando para mim, mas --overwrite não é
Infernion
3
sudo pacman -Syu --forcefuncionou para mim, mas a substituição não foi reconhecida.
spydon
21

tl; dr: Desinstale o aplicativo conflitante antes de executar pacman.

pacman(e outros gerenciadores de pacotes) mantêm um índice de pacotes e arquivos que eles gerenciam ( pacman --query --list). Alguns arquivos, como configuração, serão marcados como modificáveis ​​e não serão substituídos durante a atualização (exceto em circunstâncias especiais, em que o gerenciador de pacotes normalmente afasta o arquivo antigo antes de criar o novo). Outros arquivos serão marcados como inalteráveis. Se outro aplicativo alterar esses arquivos de qualquer maneira sem atualizar o índice de acordo, não há como o gerenciador de pacotes saber o que fazer com esses arquivos durante uma atualização.

Muitos aplicativos instalados usando o padrão ./configure && make && sudo make installpadrão podem ser desinstalados usando sudo make uninstall. Se você instalou o aplicativo de alguma outra maneira, talvez seja necessário fazer outra coisa para desinstalá-lo. Em geral, pode ser uma boa idéia manter uma cópia dos arquivos de instalação em algum lugar (por exemplo ~/install) para poder desinstalá-los com segurança nesses casos. Apenas remover os arquivos conflitantes provavelmente deixará outros arquivos por aí, o que pode causar outros problemas.

Ao instalar o software com outros gerenciadores de pacotes, há maneiras de isolá-los dos arquivos do sistema. Essa é uma prática recomendada estabelecida, por exemplo, durante o desenvolvimento de software, em que você realmente deseja manter as versões consistentes e evitar conflitos com outros softwares. Exemplos incluem:

l0b0
fonte
2
Veja meu comentário para @umlaute acima. Eu acho que o conflito foi de um sudo pip installcomando. Talvez eu deva evitar usar pip com sudo?
Modulitos 3/11
3

Eu estava instalando pacotes que eu costumo instalar com o pip via pacman por causa disso. Mas alguns pacotes não são encontrados nos repositórios pacman. Acho que devemos evitar instalar o pip com privilégios de sudo e istead:

pip install pillow --user

O sinalizador --user cria pacotes de instalação do pip no seu diretório pessoal, o que não requer privilégios especiais. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user

lava-lava
fonte
2

TLDR;

  1. Obtenha uma lista dos arquivos incorretos (copie e cole a saída do pacman em um arquivo).
  2. Use o awk para remover tudo, menos os caminhos do arquivo, para uma nova lista.
  3. Use while para mover os arquivos incorretos para fora do caminho, com base na lista.
  4. Corra sudo pacman -Syunovamente.

    editado para adicionar TLDR e corrigir erros de digitação

Embora eu tenha certeza de que não fiz nada estúpido, tive esse problema talvez em todas as vezes que tentei atualizar desde que usei o Manjaro; três ou quatro vezes dentro de dois meses. Aponte ser, isso corrige.

Obtenha uma lista dos seus arquivos.

Quando a atualização falha na janela do 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 usei nano e nomeei meus "arquivos", como em ~ / work / files .

  • Tira 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 de corrigir se o movermos, 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 - "$ file"; done <arquivos2

Atualizando

  • Para que o --overwrite funcione, o que precisamos fazer para que o pacman perceba que o pacote não está quebrado, é necessário a 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
  • Eu tive um problema fofo, onde se eu excluísse o link simbólico libidn2.so.0, nada funcionasse 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

Fin Hirschoff
fonte
2

Após o pacman finalmente descontinuar a --forceopção e fazer com que a --overwriteopção substituta funcione conforme o esperado, o padrão de uso a seguir deve ser observado.

Um comando equivalente para reproduzir a --forceopção que sobrescreve cegamente qualquer conflito que seja:

sudo pacman -S --overwrite \*

Ou

sudo pacman -S --overwrite "*"

A parte complicada é escapar do globo para evitar que a casca o expanda primeiro.

nix
fonte
Isso funciona perfeitamente, obrigado!
EkriirkE
0

Se você tem muitos arquivos como eu,

sudo pacman --force -Syyu  

resolve todos os problemas.

Mohamed Hedi Kestouri
fonte
opção --force está obsoleta; use --overwrite
Mahmoud Khaled
- overwrite parece precisar especificar o que sobrescrever. uso atualmente --force tudo está bem
xsilen T 29/09/13