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:
+43
-15
@@ -71,25 +71,53 @@ else
|
|||||||
|
|
||||||
# --force-confold: vorhandene Konfiguration behalten, statt mitten im Lauf
|
# --force-confold: vorhandene Konfiguration behalten, statt mitten im Lauf
|
||||||
# eine Rückfrage zu stellen, die niemand beantwortet.
|
# eine Rückfrage zu stellen, die niemand beantwortet.
|
||||||
pkg update -y 2>&1 | rauschfilter
|
AUSGABE=$(mktemp)
|
||||||
if pkg upgrade -y -o Dpkg::Options::=--force-confold 2>&1 | rauschfilter; then
|
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"
|
ok "Termux ist aktuell"
|
||||||
else
|
else
|
||||||
warn "Das Upgrade brach ab. Versuche zu reparieren …"
|
# Dateikonflikt gezielt behandeln. Er entsteht, wenn ein Paket aufgeteilt
|
||||||
# Die übliche Ursache ist ein einzelnes Paket, das sich nicht auspacken
|
# wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux
|
||||||
# ließ. Danach steckt dpkg halb fertig fest und blockiert alles Weitere.
|
# etwa libmagic, herausgelöst aus file. dpkg verweigert dann grundsätzlich.
|
||||||
dpkg --configure -a 2>&1 | rauschfilter
|
#
|
||||||
apt-get -f install -y 2>&1 | rauschfilter
|
# --force-overwrite wird bewusst NUR hier gesetzt, nachdem der Konflikt in
|
||||||
if pkg upgrade -y -o Dpkg::Options::=--force-confold 2>&1 | rauschfilter; then
|
# der Ausgabe nachgewiesen ist. Pauschal mitzugeben hieße, jede künftige
|
||||||
ok "Nach der Reparatur durchgelaufen"
|
# Dateikollision stillschweigend zu übergehen.
|
||||||
else
|
if grep -q 'which is also in package' "$AUSGABE"; then
|
||||||
warn "Bleibt unvollständig."
|
warn "Dateikonflikt zwischen zwei Paketen — typisch bei einer Paketaufteilung."
|
||||||
hinweis "Speicherplatz prüfen: df -h \$PREFIX"
|
grep 'trying to overwrite' "$AUSGABE" | head -3 | sed 's/^/ /'
|
||||||
hinweis "Fehler ohne Rauschen ansehen:"
|
hinweis "Wiederhole gezielt mit --force-overwrite."
|
||||||
hinweis " pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20"
|
if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then
|
||||||
hinweis "Weiter geht es trotzdem — aber hier ansetzen, falls später etwas klemmt."
|
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 (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
|
||||||
fi
|
fi
|
||||||
|
rm -f "$AUSGABE" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── git ──────────────────────────────────────────────────────────────────────
|
# ── git ──────────────────────────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -38,11 +38,24 @@ else
|
|||||||
ok "Termux ist aktuell"
|
ok "Termux ist aktuell"
|
||||||
else
|
else
|
||||||
warn "Upgrade brach ab — versuche zu reparieren."
|
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
|
# Meist scheitert ein einzelnes Paket beim Auspacken, danach steckt dpkg
|
||||||
# halb fertig fest und blockiert jede weitere Installation.
|
# halb fertig fest und blockiert jede weitere Installation.
|
||||||
try dpkg --configure -a
|
try dpkg --configure -a
|
||||||
try apt-get -f install -y
|
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"
|
ok "Nach der Reparatur durchgelaufen"
|
||||||
else
|
else
|
||||||
warn "Bleibt unvollständig."
|
warn "Bleibt unvollständig."
|
||||||
|
|||||||
Reference in New Issue
Block a user