나는 달렸다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
--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
TLDR;
- 문제가 있는 파일 목록을 가져옵니다(팩맨의 출력을 파일에 복사하여 붙여넣기).
- 사용앗파일 경로를 제외한 모든 것을 새 목록으로 제거합니다.
- 사용~하는 동안목록에 따라 문제가 되는 파일을 다른 곳으로 이동합니다.
- 다시 뛰어
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
... 그리고 훨씬 더.
터미널의 출력을 복사하여 파일에 저장합니다. 나는 사용했다나노, 다음과 같이 내 이름을 "파일"로 지정했습니다.~/작업/파일.
관련 없는 정보 제거:
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"; 완료 < 파일 2
업데이트 중
pacman이 패키지가 손상되지 않았음을 인식하도록 하기 위해 수행해야 하는 --overwrite를 작동시키려면 다음 구문이 필요합니다.
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