(Git 2.22, Q2 2019, ha introducido git submodule set-branch --branch aBranch -- <submodule_path>
)
Tenga en cuenta que si tiene un submódulo existente que aún no está rastreando una rama , entonces ( si tiene git 1.8.2+ ):
Asegúrese de que el repositorio principal sepa que su submódulo ahora rastrea una rama:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Asegúrese de que su submódulo sea realmente el último de esa rama:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(con 'origen' es el nombre de la distancia aguas arriba de recompra del submódulo se ha clonado a partir de.
Un git remote -v
dentro de esa sub-módulo mostrará la misma. Por lo general, es 'origen')
No olvide registrar el nuevo estado de su submódulo en su repositorio principal:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
La actualización posterior para ese submódulo tendrá que usar la --remote
opción:
# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
Tenga en cuenta que con Git 2.10+ (Q3 2016), puede usar ' .
' como nombre de sucursal:
El nombre de la rama se registra como submodule.<name>.branch
en .gitmodules
for update --remote
.
Se .
utiliza un valor especial de para indicar que el nombre de la rama en el submódulo debe ser el mismo nombre que la rama actual en el repositorio actual .
Pero, como se ha comentado por LubosD
Con git checkout
, si el nombre de la rama a seguir es " .
", ¡matará su trabajo no comprometido!
Usar en su git switch
lugar.
Eso significa Git 2.23 (agosto de 2019) o más.
Ver " Confundido porgit checkout
"
Si desea actualizar todos sus submódulos siguiendo una rama:
git submodule update --recursive --remote
Tenga en cuenta que el resultado, para cada submódulo actualizado, casi siempre será un HEAD separado , como lo nota Dan Cameron en su respuesta .
( Clintm señala en los comentarios que, si ejecuta git submodule update --remote
y el sha1 resultante es el mismo que la rama en la que se encuentra actualmente el submódulo, no hará nada y dejará el submódulo todavía "en esa rama" y no en el estado de la cabeza separada. )
Para asegurarse de que la rama esté realmente desprotegida (y eso no modificará el SHA1 de la entrada especial que representa el submódulo para el repositorio principal), sugiere:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
Cada submódulo seguirá haciendo referencia al mismo SHA1, pero si realiza nuevas confirmaciones, podrá empujarlas porque serán referenciadas por la rama a la que desea que el submódulo rastree.
Después de ese empuje dentro de un submódulo, no olvide volver al repositorio principal, agregar, confirmar y empujar el nuevo SHA1 para esos submódulos modificados.
Tenga en cuenta el uso de $toplevel
, recomendado en los comentarios de Alexander Pogrebnyak .
$toplevel
se introdujo en git1.7.2 en mayo de 2010: commit f030c96 .
contiene la ruta absoluta del directorio de nivel superior (donde .gitmodules
está).
dtmland
agrega en los comentarios :
La secuencia de comandos foreach no podrá extraer submódulos que no siguen una rama.
Sin embargo, este comando te da ambos:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
El mismo comando pero más fácil de leer:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute refina el comando de dtmland con una versión simplificada en los comentarios :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
líneas múltiples:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
Antes de Git 2.26 (Q1 2020), una búsqueda a la que se le pide que busque actualizaciones de forma recurrente en submódulos inevitablemente produce resmas de salida, y se hace difícil detectar mensajes de error.
Se le ha enseñado al comando a enumerar submódulos que tenían errores al final de la operación .
Ver commit 0222540 (16 de enero de 2020) por Emily Shaffer ( nasamuffin
) .
(Fusionada por Junio C Hamano - gitster
- en commit b5c71cc , 05 de febrero de 2020)
fetch
: enfatizar la falla durante la recuperación del submódulo
Firmado por: Emily Shaffer
En los casos en que una recuperación de submódulos falla cuando hay muchos submódulos, el error de la recuperación de submódulos que falla sola queda enterrado bajo actividad en los otros submódulos si más de una recuperación se recupera fetch-by-oid
.
Llame una falla tarde para que el usuario sepa que algo salió mal y dónde .
Porque fetch_finish()
solo se llama sincrónicamente mediante run_processes_parallel,
mutexing no se requiere alrededor submodules_with_errors
.