init-phone: Archiv als Rückfallebene, wenn der Klon am Server scheitert
Auf dem Gerät schlug 'git clone' mit 'early EOF' und 'invalid index-pack output'
fehl. Die Eingrenzung zeigt: es liegt weder am Telefon noch am Skript.
· Derselbe Fehler tritt vom PC aus auf, mit jeder Variante — flach, Protokoll
v1, ohne Kompression, ein Thread, großer postBuffer.
· Die Refs liefert der Server anstandslos.
· Auf eine korrekt aufgebaute upload-pack-Anfrage antwortet er mit 'NAK' und
dann nichts mehr: 8 Bytes, keine Paketdaten, nicht einmal eine Meldung im
Fehlerkanal. Genau das sieht der Client als vorzeitiges Dateiende.
· Ein Archiv derselben Revision lässt sich dagegen fehlerfrei erzeugen.
Die Objekte sind also heil und vollständig; allein das Schnüren des Pakets
scheitert. Das ist serverseitig und von hier weder zu beheben noch zu umgehen.
Damit das Gerät nicht blockiert bleibt, holt init-phone.sh die Quellen im
Fehlerfall über den Archiv-Endpunkt. Der geht nicht über upload-pack und
funktioniert deshalb weiterhin. Das Ergebnis ist ausdrücklich ein Abzug, keine
Arbeitskopie: 'git pull' geht damit nicht, und das Skript sagt das auch so, statt
den Unterschied zu verwischen. Der Weg zurück zur Arbeitskopie steht daneben.
Gegen den echten Server getestet: Archiv gültig, 26 Dateien richtig entpackt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -60,6 +60,37 @@ fi
|
||||
# ein Push von hier wäre weder gewollt noch möglich.
|
||||
git config --global credential.helper "" 2>/dev/null || true
|
||||
|
||||
# ── Rückfallebene: Archiv statt Klon ─────────────────────────────────────────
|
||||
# Gitea, Forgejo und GitHub bieten den Baum zusätzlich als Tarball an. Der Weg
|
||||
# dorthin geht nicht über upload-pack und funktioniert deshalb auch dann noch,
|
||||
# wenn der Klon am Server scheitert. Das Ergebnis ist aber nur ein Abzug: kein
|
||||
# .git, kein 'git pull'. Es ist eine Notlösung, keine Alternative.
|
||||
archiv_holen() {
|
||||
local basis zweig="${HPOS_ZWEIG:-main}" url tmp
|
||||
basis="${REPO%.git}"
|
||||
|
||||
command -v curl >/dev/null 2>&1 || pkg install -y curl >/dev/null 2>&1
|
||||
command -v tar >/dev/null 2>&1 || pkg install -y tar >/dev/null 2>&1
|
||||
|
||||
tmp=$(mktemp -d)
|
||||
for url in "$basis/archive/$zweig.tar.gz" \
|
||||
"$basis/archive/refs/heads/$zweig.tar.gz"; do
|
||||
hinweis "Versuche Archiv: $url"
|
||||
if curl -sfL -o "$tmp/a.tar.gz" "$url" && tar tzf "$tmp/a.tar.gz" >/dev/null 2>&1; then
|
||||
mkdir -p "$ZIEL"
|
||||
# --strip-components=1: die Archive enthalten alles unter einem
|
||||
# Wurzelverzeichnis, das wir nicht mit übernehmen wollen.
|
||||
if tar xzf "$tmp/a.tar.gz" -C "$ZIEL" --strip-components=1; then
|
||||
rm -rf "$tmp"
|
||||
ok "Archiv entpackt nach $ZIEL"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
rm -rf "$tmp"
|
||||
return 1
|
||||
}
|
||||
|
||||
# ── Holen oder aktualisieren ─────────────────────────────────────────────────
|
||||
kopf "Repo"
|
||||
if [ -d "$ZIEL/.git" ]; then
|
||||
@@ -79,10 +110,22 @@ else
|
||||
else
|
||||
fehl "git clone fehlgeschlagen."
|
||||
hinweis "Adresse war: $REPO"
|
||||
echo
|
||||
# Ein scheiternder Klon bei erreichbarem Repo hat fast immer eine
|
||||
# serverseitige Ursache: upload-pack stirbt beim Schnüren des Pakets,
|
||||
# während die Objekte selbst heil sind. Erkennbar daran, dass sich ein
|
||||
# Archiv weiterhin erzeugen lässt — und genau das ist die Rückfallebene.
|
||||
if archiv_holen; then
|
||||
warn "Über ein Archiv geholt, NICHT als Arbeitskopie."
|
||||
hinweis "'git pull' funktioniert damit nicht. Sobald der Server wieder"
|
||||
hinweis "Pakete ausliefert: rm -rf ~/hpos && bash /sdcard/hpos-init.sh"
|
||||
else
|
||||
fehl "Auch die Rückfallebene über das Archiv hat nicht geklappt."
|
||||
hinweis "Ist das Repo öffentlich lesbar? Ohne das braucht es Zugangsdaten,"
|
||||
hinweis "und die gehören nicht aufs Telefon."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
chmod +x "$ZIEL"/spike/*.sh "$ZIEL"/spike/inner/*.sh 2>/dev/null || true
|
||||
|
||||
Reference in New Issue
Block a user