From 69802cde6b0665b31003a90cebf07e553a02d386 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 10 Aug 2026 17:11:19 +0200 Subject: [PATCH] =?UTF-8?q?init-phone:=20Archiv=20als=20R=C3=BCckfallebene?= =?UTF-8?q?,=20wenn=20der=20Klon=20am=20Server=20scheitert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- provision/init-phone.sh | 49 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/provision/init-phone.sh b/provision/init-phone.sh index 84d080b..44ce604 100755 --- a/provision/init-phone.sh +++ b/provision/init-phone.sh @@ -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,9 +110,21 @@ else else fehl "git clone fehlgeschlagen." hinweis "Adresse war: $REPO" - hinweis "Ist das Repo öffentlich lesbar? Ohne das braucht es Zugangsdaten," - hinweis "und die gehören nicht aufs Telefon." - exit 1 + 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