Skip to main content

sync-submodules

Safely sync/pull the superproject and update git submodules, including handling dirty submodules (e.g. a modified Cargo.lock) via stash. Triggers when user mentions: - "sync submodules" - "submodule update failed" - "local changes would be overwritten by checkout" - "not our ref"

Datos de origen

Repositorio
different-ai/the-factory
Última actividad en el origen
10 de febrero de 2026 a las 07:38
Idioma detectado de SKILL.md
inglés
Estrellas
73
Forks
10

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Explorador de archivos
4 archivos

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
sync-submodules
description
Safely sync/pull the superproject and update git submodules, including handling dirty submodules (e.g. a modified Cargo.lock) via stash. Triggers when user mentions: - "sync submodules" - "submodule update failed" - "local changes would be overwritten by checkout" - "not our ref"
## Quick Usage (Already Configured) ### 1) See what is dirty (root + submodules) ```bash date git status --porcelain git submodule foreach --recursive 'echo "--- $name ($path)"; git status --porcelain' ``` ### 2) If a submodule is dirty, stash inside that submodule Example for `_repos/openwork` when `Cargo.lock` blocks an update: ```bash git -C _repos/openwork status --porcelain git -C _repos/openwork stash push -u -m "wip: allow submodule update" ``` Notes: - Stashes are per-repo. You must run `git stash` in the submodule itself. - Use `-u` if untracked files exist. ### 3) Pull root + update submodules to the commits pinned by the root repo ```bash git pull git submodule sync --recursive git submodule update --init --recursive date ``` ### 4) Re-apply the stash (optional) Only do this if you actually want your local submodule changes back. ```bash git -C _repos/openwork stash list git -C _repos/openwork stash pop ``` ## Common Gotchas - `error: Your local changes ... would be overwritten by checkout` means the submodule has local changes and `git submodule update` is trying to move it to the commit pinned by the root repo. - Avoid `git submodule foreach --recursive 'git pull'` for normal syncing. Submodules are typically pinned to specific commits; pulling inside them can move them off the pinned commit and make the root repo look dirty. - If you *intend* to bump submodules to newer upstream commits, that is a different operation (it changes the root repo): ```bash git submodule update --remote --recursive git status ``` ## Submodule Pin Is Unreachable ("not our ref") Symptom: - `fatal: remote error: upload-pack: not our ref <sha>` while fetching a submodule. Meaning: - The root repo points at a submodule commit SHA that the submodule remote no longer advertises (history rewrite, deleted branch/tag, or missing permissions). Fix (safe, local): 1. Pull root without touching submodules: ```bash git pull --recurse-submodules=no ``` 2. Move the submodule to a reachable ref (example uses `origin/dev`): ```bash git -C _repos/<name> fetch origin --prune git -C _repos/<name> checkout dev git -C _repos/<name> pull --ff-only origin dev ``` 3. Stage the gitlink in the root repo: ```bash git add _repos/<name> git status ``` Fix (proper, shared): - Open a PR that repins the submodule to a reachable commit and avoid force-pushing branches/tags that are used as submodule pins. ## One-Liner Helper (Conservative) This prints dirty submodules without changing anything: ```bash git submodule foreach --recursive 'test -z "$(git status --porcelain)" || echo "DIRTY: $name ($path)"' ```
Ver en GitHub