Signierskript richtet den Klon selbst aus - kein Handgriff mehr noetig
Der Waechter brach bisher ab und legte dem Menschen einen Befehl vor. Jetzt bringt er den Klon selbst auf origin/main, solange das nachweislich verlustfrei ist: reiner Rueckstand wird vorgespult; Commits, die nur lokal liegen, deren Tree aber dem des gemeinsamen Vorfahren gleicht, tragen inhaltlich nichts bei und werden verworfen (Reflog haelt sie 90 Tage). Nur Commits, die auch den Inhalt aendern, fuehren weiterhin zum Abbruch mit beiden Wegen zur Wahl. Damit entfaellt die Vorbereitung vor einem Signierlauf vollstaendig - wichtig, weil die bisher dokumentierte Vorbereitung ausgerechnet `git pull` war, also genau der Befehl, der auf einem Klon von vor dem Rewrite die entfernten Commits zurueckgeholt haette. Fuenf Lagen gegen Wegwerf-Repositories geprueft: gleich, zurueck, inhaltslos voraus, echte ungepushte Arbeit, echte Divergenz. APPLE_DEV_BACKLOG.md, OFFEN.md und AGENTS.md (Abschnitt AJ) nachgezogen. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -45,10 +45,12 @@ ARCHIV="$AUSGABE/DataMetric360.xcarchive"
|
||||
cd "$APP"
|
||||
|
||||
# Ohne diese Pruefung baut/signiert das Skript zuverlaessig - aber nur den
|
||||
# Stand, der gerade lokal ausgecheckt ist. Ein vergessenes `git pull` waere
|
||||
# damit ein stiller Veraltungsfehler wie schon mehrfach an anderer Stelle in
|
||||
# diesem Projekt (Cache-Busting, OTA-Buendel-Abgleich, VERSIONIERUNG.md) - hier
|
||||
# stattdessen ein lauter Abbruch statt eines optisch/inhaltlich alten Builds.
|
||||
# Stand, der gerade lokal ausgecheckt ist. Ein vergessener Abgleich mit dem
|
||||
# Server waere damit ein stiller Veraltungsfehler wie schon mehrfach an anderer
|
||||
# Stelle in diesem Projekt (Cache-Busting, OTA-Buendel-Abgleich,
|
||||
# VERSIONIERUNG.md). Deshalb holt das Skript den Serverstand selbst und rueckt
|
||||
# den Klon zurecht, wo das verlustfrei ist - und bricht sonst laut ab, statt
|
||||
# einen optisch/inhaltlich alten Build auszuliefern.
|
||||
echo "==> Git-Stand pruefen"
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "FEHLER: Uncommittete Aenderungen im Arbeitsverzeichnis." >&2
|
||||
@@ -59,31 +61,43 @@ fi
|
||||
git fetch origin
|
||||
LOKAL="$(git rev-parse HEAD)"
|
||||
FERN="$(git rev-parse origin/main)"
|
||||
# Ziel dieses Blocks: der Klon steht danach auf origin/main - oder das Skript
|
||||
# bricht ab. Zurechtruecken darf es sich selbst, solange dabei nachweislich
|
||||
# nichts verlorengeht; der saubere Arbeitsbaum ist oben bereits Bedingung.
|
||||
if [ "$LOKAL" != "$FERN" ]; then
|
||||
echo "FEHLER: Lokaler Stand ($LOKAL) weicht von origin/main ($FERN) ab." >&2
|
||||
BASIS="$(git merge-base "$LOKAL" "$FERN")"
|
||||
if git merge-base --is-ancestor "$LOKAL" "$FERN"; then
|
||||
echo "Dieser Klon ist nur zurueck. 'git pull' holt den Rest, dann erneut versuchen." >&2
|
||||
echo " Klon war zurueck - wird vorgespult."
|
||||
git merge --ff-only "$FERN" >/dev/null
|
||||
LOKAL="$(git rev-parse HEAD)"
|
||||
elif git diff --quiet "$BASIS" "$LOKAL"; then
|
||||
# Hier liegen Commits, die origin/main nicht hat - aber ihr Tree ist derselbe
|
||||
# wie der des gemeinsamen Vorfahren, sie tragen inhaltlich also NICHTS bei.
|
||||
# Genau so sieht ein Klon aus, der noch vor einem Rewrite der Gegenseite steht
|
||||
# (am 07.09.2026 einmal geschehen). Ein 'git pull' waere hier falsch: der Merge
|
||||
# holt die entfernten Commits zurueck, und der naechste Push stellt sie auf dem
|
||||
# Server wieder her - sogar ohne --force. Verwerfen kostet dagegen keine einzige
|
||||
# Datei; das Reflog haelt sie noch 90 Tage.
|
||||
echo " Nur hier vorhanden, inhaltlich ohne Wirkung - wird verworfen:"
|
||||
git log --oneline "$BASIS..$LOKAL" | sed "s/^/ /"
|
||||
git reset --hard "$FERN" >/dev/null
|
||||
LOKAL="$(git rev-parse HEAD)"
|
||||
echo " Zurueckgesetzt auf origin/main. Rueckholbar ueber: git reflog"
|
||||
else
|
||||
# Hier liegen Commits, die origin/main nicht hat. Git kann NICHT unterscheiden,
|
||||
# ob das eigene ungepushte Arbeit ist oder ob die Gegenseite sie absichtlich aus
|
||||
# der Historie geworfen hat - beides sieht gleich aus. Am 07.09.2026 war es der
|
||||
# zweite Fall, und dort waere ein Push (er ginge sogar ohne --force durch) die
|
||||
# stille Wiederherstellung genau dessen, was entfernt werden sollte. Deshalb
|
||||
# entscheidet das Skript hier nichts, sondern legt beide Moeglichkeiten vor.
|
||||
echo "FEHLER: Lokaler Stand ($LOKAL) weicht von origin/main ($FERN) ab." >&2
|
||||
echo "" >&2
|
||||
echo "Diese Commits liegen nur hier und nicht auf origin/main:" >&2
|
||||
git log --oneline "$FERN..$LOKAL" >&2
|
||||
echo "Diese Commits liegen nur hier und aendern auch den Inhalt:" >&2
|
||||
git log --oneline "$BASIS..$LOKAL" >&2
|
||||
echo "" >&2
|
||||
echo "Dafuer gibt es zwei Gruende, und sie verlangen das Gegenteil voneinander:" >&2
|
||||
echo " a) eigene, noch ungepushte Arbeit" >&2
|
||||
echo " -> git push" >&2
|
||||
echo " b) die Gegenseite hat sie absichtlich aus der Historie entfernt" >&2
|
||||
echo " -> git fetch origin && git reset --hard origin/main" >&2
|
||||
echo "Das sieht nach eigener, noch ungepushter Arbeit aus - deshalb entscheidet" >&2
|
||||
echo "das Skript hier nichts. Entweder pushen:" >&2
|
||||
echo " git push" >&2
|
||||
echo "oder verwerfen, falls die Gegenseite sie absichtlich entfernt hat:" >&2
|
||||
echo " git fetch origin && git reset --hard origin/main" >&2
|
||||
echo "" >&2
|
||||
echo "Im Fall b) waere ein Push - und ebenso ein 'git pull' mit Merge - genau die" >&2
|
||||
echo "Wiederherstellung dessen, was dort entfernt wurde. Also erst nachsehen." >&2
|
||||
echo "Kein 'git pull': ein Merge haengt die Commits wieder in die Historie." >&2
|
||||
exit 1
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
echo " HEAD == origin/main ($LOKAL), aktuell."
|
||||
|
||||
|
||||
Reference in New Issue
Block a user