Files
fn_registry/.claude/commands/full-git-pull.md
T
egutierrez 563c6c7677 docs(commands): full-git-pull no clona repos faltantes
Actualiza /full-git-pull para reflejar la realidad operativa: cada PC
mantiene solo el subset de sub-repos que necesita, segun la memoria
"Gitea = fuente de verdad; PCs subset".

Cambios:
- Quita la segunda pasada que clonaba automaticamente todos los
  dataforge/<name> registrados en apps/analysis. Generaba clones no
  deseados en PCs que no usan esas apps.
- Anade nota explicita de que el comando solo actualiza repos con
  .git/ ya presente y deja el clone manual como pull-on-demand.
- Documenta el snippet de clone manual con token via pass para
  cuando si haga falta traer un sub-repo nuevo.

Impacto: el comando es idempotente y predecible — no toca lo que no
existe localmente. No afecta a fn sync ni a la regeneracion de
registry.db.
2026-04-30 17:24:09 +02:00

3.2 KiB

/full-git-pull — Pull de fn_registry + todos los sub-repos + submodules + fn sync

Trae los últimos cambios del remote para el repo principal fn_registry, todos los sub-repos git anidados que ya existan localmente, y los submodules de cpp/vendor/. Después regenera registry.db y corre fn sync para tirar de la metadata del registry_api (apps, projects, analysis, vaults, pc_locations registrados desde otros PCs).

No clona repos que falten. Cada PC tiene solo el subset de apps/analyses que le interesa (ver memoria "Gitea = fuente de verdad; PCs subset"). Si en este PC necesitas un sub-repo que aún no tienes, clónalo a mano:

git clone https://<user>:<token>@<gitea-host>/dataforge/<name>.git <path>

Consulta pc_locations para ver dónde lo tiene otro PC y reproduce el path.

Argumento

$ARGUMENTS — sin uso, ignorar.

Pasos

1. Descubrir repos locales

cd /home/lucas/fn_registry  # ajustar al PC

REPOS=$(find . -name ".git" -type d \
  -not -path "./.git/*" \
  -not -path "*/node_modules/*" \
  -not -path "*/.venv/*" \
  -not -path "*/cpp/vendor/*" \
  -not -path "*/cpp/build/*" \
  -not -path "*/sources/*" \
  -not -path "*/temp/*" \
  -not -path "*/subrepos/*" 2>/dev/null | sed 's|/.git$||')
REPOS=". $REPOS"

Solo se actualizan los sub-repos que ya tengan .git/ localmente. Lo que falte se queda fuera — pull-on-demand por sub-repo.

2. Para cada repo: stash si dirty, pull --ff-only, pop

for r in $REPOS; do
  ( cd "$r" \
    && DIRTY=$(git status --porcelain | wc -l) \
    && if [ "$DIRTY" -gt 0 ]; then
         git stash push -m "auto-stash before /full-git-pull" --include-untracked >/dev/null
         STASHED=1
       else
         STASHED=0
       fi \
    && git fetch origin 2>&1 | tail -1 \
    && git pull --ff-only 2>&1 | tail -3 \
    && if [ "$STASHED" = "1" ]; then
         git stash pop 2>&1 | tail -3
       fi
  )
done
  • Si --ff-only falla por divergencia, abortar el pull de ese repo y reportar (no rebasear sin permiso).
  • Si stash pop produce conflictos, avisar y dejar el conflicto al usuario; no resolverlo automáticamente.

3. Submodules del repo principal

git submodule update --init --recursive 2>&1 | tail -10

4. Regenerar registry.db local

CGO_ENABLED=1 ./fn index 2>&1 | tail -3

5. fn sync con credenciales de pass

USER=$(pass registry/basicauth-user | head -1)
PASSWD=$(pass registry/basicauth-pass | head -1)
TOKEN=$(pass registry/api-token | head -1)
export FN_REGISTRY_API="https://${USER}:${PASSWD}@registry.organic-machine.com"
export REGISTRY_API_TOKEN="$TOKEN"
./fn sync

Si pass falla → gpg-agent locked, pedir al usuario pass show registry/api-token en su terminal real.

6. Resumen

Tabla concisa: por repo, commits pulleados o "ya estaba al día"; submodules actualizados; result de fn index; result de fn sync.

Notas

  • Pull solo es fast-forward — nunca rebase ni merge automático.
  • Si el repo principal pulleó cambios y eliminó archivos referenciados por sub-repos (raro), el usuario debe resolverlo manualmente.
  • fn index se corre antes de fn sync para que las locations locales reflejen el estado actual.