Signierskript: ein Klon von vor dem Rewrite darf nicht pullen

Am 07.09.2026 sind drei Commits am Ende von main entfernt und der Branch per
Force-Push zurueckgesetzt worden. Ein aelterer Klon - der Mac, auf dem
signiert wird - steht damit VORAUS statt zurueck. Der Waechter sagte dort
"Erst 'git pull' ausfuehren", und genau das ist die Falle: der Merge holt die
entfernten Commits zurueck in die Historie, der naechste Push stellt sie auf
dem Server wieder her, und zwar ohne --force.

Git kann diese Lage nicht von echter ungepushter Arbeit unterscheiden. Das
Skript entscheidet deshalb nicht, sondern listet die nur lokal vorhandenen
Commits auf, nennt beide Moeglichkeiten samt richtigem Befehl und bricht ab.
Nur der schlichte Rueckstand empfiehlt weiterhin 'git pull'.

Beide Zweige gegen Wegwerf-Repos in der jeweiligen Form geprueft, nicht nur
geparst - die erste Fassung stufte die Lage als "auseinandergelaufen" ein und
haette dem Mac zum Pushen geraten.

APPLE_DEV_BACKLOG.md nennt den einmaligen Schritt im Abschnitt "Vorher".

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-07 20:58:05 +02:00
co-authored by Claude Opus 5
parent 0e84248d38
commit 185a044c5e
3 changed files with 50 additions and 1 deletions
+22 -1
View File
@@ -61,7 +61,28 @@ LOKAL="$(git rev-parse HEAD)"
FERN="$(git rev-parse origin/main)"
if [ "$LOKAL" != "$FERN" ]; then
echo "FEHLER: Lokaler Stand ($LOKAL) weicht von origin/main ($FERN) ab." >&2
echo "Erst 'git pull' ausfuehren - sonst signiert dieses Skript einen veralteten Stand." >&2
if git merge-base --is-ancestor "$LOKAL" "$FERN"; then
echo "Dieser Klon ist nur zurueck. 'git pull' holt den Rest, dann erneut versuchen." >&2
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 "" >&2
echo "Diese Commits liegen nur hier und nicht auf origin/main:" >&2
git log --oneline "$FERN..$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 "" >&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
fi
exit 1
fi
echo " HEAD == origin/main ($LOKAL), aktuell."