tag - Listar submódulos en un repositorio git
git push tag (14)
Tengo un repositorio git que tiene varios submódulos. ¿Cómo hago una lista de los nombres de todos los submódulos después de ejecutar git submodule init
?
El comando git submodule foreach
podría hacer eco de los nombres del submódulo, pero eso solo funciona una vez que se han desprotegido, lo que no sucedió después del paso de inicialización. Hay más pasos en la cadena que deben suceder antes de que puedan ser revisados y no quiero tener que codificar los nombres de los submódulos en el script.
Entonces, ¿hay un comando git para obtener los nombres de todos los submódulos actualmente registrados pero que aún no han sido procesados?
Solo los caminos de los submódulos, por favor, señora ...
git config --list | grep /^submodule | cut -f 2 -d .
Vendor/BaseModel Vendor/ObjectMatcher Vendor/OrderedDictionary Vendor/_ObjC Vendor/XCodeHelpers
👍🏼
El siguiente comando listará los submódulos:
git submodule--helper list
El resultado es algo como esto:
<mode> <sha1> <stage> <location>
Nota: Requiere git 2.7.0 o superior.
Esto funcionó para mí:
git ls-files --stage | grep ^160000
Basado en este gran artículo: http://www.speirs.org/blog/2009/5/11/understanding-git-submodules.html
Editar: debe leer grep ^160000
Noté que el comando proporcionado en una respuesta a esta pregunta me dio la información que estaba buscando:
No se encuentra ningún mapeo de submódulo en .gitmodule para una ruta que no sea un submódulo
git ls-files --stage | grep 160000
Para enumerar todos los submódulos con la ruta
git submodule --quiet foreach --recursive ''echo $name''
Podrías usar el mismo mecanismo que el git submodule init
usa, es decir, ver los .gitmodules
. Este archivo enumera cada ruta de submódulo y la url a la que se refiere.
Por ejemplo, desde la raíz del repositorio, cat .gitmodules
imprimirá los contenidos en la pantalla (suponiendo que tenga un cat
).
Editar:
Como los archivos .gitmodule tienen el formato de configuración de git, puede usar git config para analizar esos archivos:
git config --file .gitmodules --name-only --get-regexp path
Le mostraría todas las entradas del submódulo, y con
git config --file .gitmodules --get-regexp path | awk ''{ print $2 }''
solo obtendrías la ruta del submódulo.
Puede usar el git submodule status --recursive
o, opcionalmente, el git submodule status --recursive
si desea mostrar los submódulos anidados.
De los documentos de GIT SCM:
Muestra el estado de los submódulos. Esto imprimirá el SHA-1 del compromiso actualmente desprotegido para cada submódulo, junto con la ruta del submódulo y la salida de git describe para el SHA-1. Cada SHA-1 tendrá el prefijo - si el submódulo no está inicializado, + si la confirmación del submódulo actualmente desprotegido no coincide con el SHA-1 encontrado en el índice del depósito que lo contiene y con U si el submódulo tiene conflictos de fusión.
Puedes usar:
git submodule | awk ''{ print $2 }''
Si no te importa operar solo en submódulos inicializados, puedes usar git submodule foreach
para evitar el análisis de texto.
git submodule foreach --quiet ''echo $name''
Veo que la respuesta ha sido seleccionada pero, para cualquier otra persona que llegue a esta página:
$ git submodule
listará todos los submódulos en el repositorio git especificado.
Aclamaciones
Yo uso este:
git submodule status | cut -d'' '' -f3-4
Salida (ruta + versión):
tools/deploy_utils (0.2.4)
Yo uso esto:
git config --list|egrep ^submodule
para devolver solo los nombres de los submódulos registrados, puede usar este comando.
grep path .gitmodules | sed ''s/.*= //''
pensar en ello como submódulo git --list que no existe
git config
permite especificar un archivo de configuración.
Y .gitmodules
es un archivo de configuración.
Entonces, con la ayuda de " use space como delimitador con comando de corte ":
git config --file=.gitmodules --get-regexp ^^submodule.*/.path$ | cut -d " " -f 2
Eso solo mostrará una lista de las rutas, una por submódulo declarado.
Como Tino señala en los comentarios :
- Esto falla para los submódulos con espacios en él.
las rutas de los submódulos pueden contener líneas nuevas , como en
git submodule add https://github.com/hilbix/bashy.git "sub module" git mv ''sub module'' $''sub/nmodule''
Como una alternativa más robusta, Tino propone:
git config -z --file .gitmodules --get-regexp ''/.path$'' | / sed -nz ''s/^[^/n]*/n//p'' | / tr ''/0'' ''/n''
Para las rutas con nuevas líneas en ellas (se pueden crear con
git mv
), dejen de lado| tr ''/0'' ''/n''
| tr ''/0'' ''/n''
y usar algo como... | while IFS='''' read -d '''' path; do ...
... | while IFS='''' read -d '''' path; do ...
... | while IFS='''' read -d '''' path; do ...
para un procesamiento posterior con bash.
Esto necesita un bash moderno que entiendaread -d ''''
(no olvide el espacio entre-d and ''''
).