Dateikonflikte beim Upgrade gezielt auflösen

Auf dem Gerät scheiterte das Upgrade an libmagic:

  trying to overwrite '.../include/magic.h', which is also in package file 5.47

Termux hat libmagic aus dem Paket file herausgelöst. Beide bringen dieselbe Datei
mit, und dpkg verweigert grundsätzlich, wenn zwei Pakete um eine Datei streiten.
Das ist kein Defekt, sondern der normale Zwischenzustand einer Paketaufteilung —
und er blockiert danach jede weitere Installation.

Beide Skripte erkennen den Konflikt jetzt an der Meldung und wiederholen mit
--force-overwrite. Bewusst erst dann und nicht von vornherein: pauschal
mitgegeben würde die Option jede künftige Dateikollision stillschweigend
übergehen, auch eine, die auf ein echtes Problem hinweist. Die betroffene Zeile
wird vorher angezeigt, damit nachvollziehbar bleibt, was übergangen wird.

Gegen die tatsächliche Ausgabe vom Gerät geprüft: Konflikt wird erkannt, und nach
dem Rauschfilter bleiben genau die zwei Zeilen übrig, auf die es ankommt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan
2026-08-10 21:52:20 +02:00
co-authored by Claude Opus 5
parent 7d0063278c
commit ab4432cf84
2 changed files with 57 additions and 16 deletions
+39 -11
View File
@@ -71,26 +71,54 @@ else
# --force-confold: vorhandene Konfiguration behalten, statt mitten im Lauf
# eine Rückfrage zu stellen, die niemand beantwortet.
pkg update -y 2>&1 | rauschfilter
if pkg upgrade -y -o Dpkg::Options::=--force-confold 2>&1 | rauschfilter; then
AUSGABE=$(mktemp)
pkg update -y >"$AUSGABE" 2>&1; rauschfilter <"$AUSGABE"
upgrade_lauf() {
pkg upgrade -y -o Dpkg::Options::=--force-confold "$@" >"$AUSGABE" 2>&1
local rc=$?
rauschfilter <"$AUSGABE"
return $rc
}
if upgrade_lauf; then
ok "Termux ist aktuell"
else
warn "Das Upgrade brach ab. Versuche zu reparieren …"
# Die übliche Ursache ist ein einzelnes Paket, das sich nicht auspacken
# ließ. Danach steckt dpkg halb fertig fest und blockiert alles Weitere.
dpkg --configure -a 2>&1 | rauschfilter
apt-get -f install -y 2>&1 | rauschfilter
if pkg upgrade -y -o Dpkg::Options::=--force-confold 2>&1 | rauschfilter; then
# Dateikonflikt gezielt behandeln. Er entsteht, wenn ein Paket aufgeteilt
# wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux
# etwa libmagic, herausgelöst aus file. dpkg verweigert dann grundsätzlich.
#
# --force-overwrite wird bewusst NUR hier gesetzt, nachdem der Konflikt in
# der Ausgabe nachgewiesen ist. Pauschal mitzugeben hieße, jede künftige
# Dateikollision stillschweigend zu übergehen.
if grep -q 'which is also in package' "$AUSGABE"; then
warn "Dateikonflikt zwischen zwei Paketen — typisch bei einer Paketaufteilung."
grep 'trying to overwrite' "$AUSGABE" | head -3 | sed 's/^/ /'
hinweis "Wiederhole gezielt mit --force-overwrite."
if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then
ok "Konflikt aufgelöst, Upgrade durchgelaufen"
rm -f "$AUSGABE"
AUSGABE=""
fi
fi
if [ -n "$AUSGABE" ] && ! upgrade_lauf; then
warn "Upgrade weiterhin unvollständig — versuche dpkg zu entwirren."
# Nach einem Abbruch steckt dpkg halb fertig fest und blockiert alles.
dpkg --configure -a >>"$AUSGABE" 2>&1
apt-get -f install -y >>"$AUSGABE" 2>&1
if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then
ok "Nach der Reparatur durchgelaufen"
else
warn "Bleibt unvollständig."
hinweis "Speicherplatz prüfen: df -h \$PREFIX"
hinweis "Fehler ohne Rauschen ansehen:"
hinweis " pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20"
hinweis "Speicherplatz prüfen: df -h \$PREFIX (nicht / — das ist die Systempartition)"
hinweis "Fehler ohne Rauschen: pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20"
hinweis "Weiter geht es trotzdem — aber hier ansetzen, falls später etwas klemmt."
fi
fi
fi
rm -f "$AUSGABE" 2>/dev/null || true
fi
# ── git ──────────────────────────────────────────────────────────────────────
kopf "git"
+14 -1
View File
@@ -38,11 +38,24 @@ else
ok "Termux ist aktuell"
else
warn "Upgrade brach ab — versuche zu reparieren."
# Dateikonflikt gezielt behandeln: entsteht, wenn ein Paket aufgeteilt
# wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux
# etwa libmagic, herausgelöst aus file. --force-overwrite wird bewusst nur
# dann gesetzt, wenn der Konflikt im Protokoll nachgewiesen ist; pauschal
# hieße es, jede künftige Dateikollision stillschweigend zu übergehen.
if grep -q 'which is also in package' "$LOG" 2>/dev/null; then
warn "Dateikonflikt zwischen zwei Paketen erkannt:"
grep 'trying to overwrite' "$LOG" | tail -3 | sed 's/^/ /' | tee -a "$LOG"
hint "Typisch bei einer Paketaufteilung. Wiederhole mit --force-overwrite."
try pkg upgrade -y -o Dpkg::Options::=--force-confold \
-o Dpkg::Options::=--force-overwrite
fi
# Meist scheitert ein einzelnes Paket beim Auspacken, danach steckt dpkg
# halb fertig fest und blockiert jede weitere Installation.
try dpkg --configure -a
try apt-get -f install -y
if try pkg upgrade -y -o Dpkg::Options::=--force-confold; then
if try pkg upgrade -y -o Dpkg::Options::=--force-confold \
-o Dpkg::Options::=--force-overwrite; then
ok "Nach der Reparatur durchgelaufen"
else
warn "Bleibt unvollständig."