From 2be91b0c4dcc68a6beccb20565a2698bce1a0eda Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Wed, 6 May 2026 00:13:11 +0200 Subject: [PATCH] chore(commands): auto-commit full-git-push.md Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/commands/full-git-push.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.claude/commands/full-git-push.md b/.claude/commands/full-git-push.md index daae71db..78a6466f 100644 --- a/.claude/commands/full-git-push.md +++ b/.claude/commands/full-git-push.md @@ -101,21 +101,38 @@ done `generate_auto_message` debe inspeccionar `git diff --cached --stat` y producir un subject como `feat(notebook): N cambios` cuando todos los paths comparten prefijo, o `chore: auto-commit` si están dispersos. -### 4. Push de cada repo +### 4. Push solo de repos con cambios locales (NO usar `git push` ciego) + +**Filtrar primero, pushear despues.** Sobre 30+ repos, hacer `git push` en todos (incluso "Everything up-to-date") cuesta 30-90s en handshakes SSH. Usar refs locales (sin red) para decidir si hay algo que pushear: ```bash for r in $REPOS; do ( cd "$r" \ && BRANCH=$(git rev-parse --abbrev-ref HEAD) \ - && if git rev-parse --abbrev-ref --symbolic-full-name @{u} >/dev/null 2>&1; then - git push origin "$BRANCH" 2>&1 | tail -3 - else + && UPSTREAM_OK=$(git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null) \ + && if [ -z "$UPSTREAM_OK" ]; then + echo "[push -u] $r ($BRANCH)" git push -u origin "$BRANCH" 2>&1 | tail -3 + else + AHEAD=$(git rev-list --count @{u}..HEAD 2>/dev/null) + if [ "${AHEAD:-0}" -gt 0 ]; then + echo "[push] $r ($BRANCH, $AHEAD commits ahead)" + git push origin "$BRANCH" 2>&1 | tail -3 + else + echo "[skip] $r (up-to-date local refs)" + fi fi ) done ``` +Reglas: +- Sin upstream → `git push -u` (siempre). +- Con upstream y `rev-list @{u}..HEAD` > 0 → push. +- Con upstream y 0 ahead → skip (ni siquiera intentar). + +`rev-list @{u}..HEAD` solo lee refs locales, no toca la red. Esto es seguro porque cualquier commit local hecho en este PC ya esta a partir del paso 3 (auto-commit). Si en otro PC se hizo push y aqui no se ha hecho pull, sigue siendo correcto: no tenemos nada local que pushear. + Si `push` rechaza por non-fast-forward (rama behind), no abortar el resto. Reportar ese repo concreto y sugerir `/full-git-pull` antes; seguir con los demás repos. ### 5. fn sync