Tengo un repositorio de Git que tiene varios submódulos. ¿Cómo enumero los nombres de todos los submódulos después de que git submodule init
se haya ejecutado?
El git submodule foreach
comando 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 inicio. Hay más pasos en la cadena que deben suceder antes de que se puedan verificar, y no quiero tener que conectar los nombres de submódulos al script.
Entonces, ¿hay un comando Git para obtener los nombres de todos los submódulos actualmente registrados, pero aún no desprotegidos?
git
git-submodules
tpg2114
fuente
fuente
git submodule
comporta como esperaba que se comportara un hipotéticogit submodule list
: simplemente nunca pensé en verificar lo que sucede sin argumentosgit submodule
. (¡Me alegro de haber probado ese enlace, ya que inicialmente cogí el enlace incorrecto 'Compartir'!)git submodule list
no existía ygit submodule help
no ayudó (según este último, la solucióngit submodule
no es un uso válido).paths
, nonames
y se rompen cuando contienen caracteres especiales. Traté de dar una respuesta para los nombres y las rutas que deberían ser seguras: stackoverflow.com/a/56912913/3215929Respuestas:
Podrías usar el mismo mecanismo que se
git submodule init
usa, es decir, mirar.gitmodules
. Estos archivos enumeran cada ruta de submódulo y la URL a la que se refiere.Por ejemplo, desde la raíz del repositorio,
cat .gitmodules
imprimirá el contenido en la pantalla (suponiendo que lo haya hechocat
).Debido a que los archivos .gitmodule tienen el formato de configuración Git, puede usar git config para analizar esos archivos:
Le mostraría todas las entradas de submódulos y con
solo obtendría la ruta del submódulo en sí.
fuente
cat .gitmodules
en la raíz del repositorio ...awk
parte falla si tiene espacios en la ruta del submódulo.awk
falla para submódulos con espacios! El comando debería leergit config -z --file .gitmodules --get-regexp '\.path$' | sed -nz 's/^[^\n]*\n//p' | tr '\0' '\n'
(necesita un modernosed
con-z
). Esto falla para las rutas con Newlines en ellas (se pueden crear congit mv
). Si desea estar a salvo de estos, deje de lado| tr '\0' '\n'
y use algo como... | while IFS='' read -d '' path; do ...
para un mayor procesamiento con bash. Esto necesita una fiesta moderna que comprendaread -d ''
(no olvide el espacio entre-d
y''
).Puede usar
git submodule status
u opcionalmentegit submodule status --recursive
si desea mostrar submódulos anidados.De la documentación de Git:
fuente
git submodule update --init --recursive
para inicializar todos los submódulos.git
comando simple y basado en nativos sin ninguna ayuda de bash. Y esta solución es elegante en la forma en que funciona bien en cualquier punto de la copia de trabajo (pero los submódulos mismos, por supuesto, para lo cual el resultado se aplica directamente a ellos).git submodule
sin argumentos es igual quegit submodule status
, por lo que puede ahorrarse escribiendo 7 caracteres ;-)git submodule status --recursive
funciona, perogit submodule --recursive
no funciona. Esos 7 personajes te compran algo. Sin embargo, depende de tus necesidades.Para devolver solo los nombres de los submódulos registrados, puede usar este comando:
Piense en ello como
git submodule --list
si no existiera.fuente
perl -ne '/^\s*path =\s*(.*)/ and push(@submods, $1); END { print(join("\n", sort(@submods)));}' "$(git rev-parse --show-toplevel)/.gitmodules"
que en comparación con esta respuesta (1) funciona desde cualquier subdirectorio (aunque no dentro de un submódulo); (2) ordena los submódulos por nombre; e (3) ignora las líneas comentadas en .gitmodules.path
podría estar presente en el nombre del submódulo (git submodule add https://github.com/commercialhaskell/path.git
). Pero probablemente ya lo sabías antes. Si desea acceder.gitconfig
desde cualquier lugar en un árbol de trabajo o necesita ejecutar esto en un--bare
repositorio, puede usar algo comogit cat-file -p HEAD:.gitmodules | ...
. Si necesita hacer referencia al archivo "en escena", puede hacerlogit cat-file -p :.gitmodules | ...
, sin embargo, esto necesita un gitindex
para estar presente.El siguiente comando enumerará los submódulos:
El resultado es algo como esto:
Nota: Requiere Git 2.7.0 o superior.
fuente
git ls-files --stage | grep ^160000
(de la Respuesta stackoverflow.com/a/29325219 ) parece producir el mismo resultado, por lo que quizás este sea un buen reemplazo si necesita ser compatible con gits anteriores.--
rayas dobles ensubmodule--helper
Utilizar:
Enumerará todos los submódulos en el repositorio Git especificado.
fuente
git submodule [status]
(tenga en cuenta questatus
está implícito si se omite, por lo que es lo mismo).fatal: no submodule mapping found in .gitmodules for path 'bla-bla/foo-bar'
. Primero debe eliminar todos los repositorios internos que aún no están submódulados.--recursive
bandera, debe agregar explícitamente elstatus
comando:git submodule status --recursive
funciona, perogit submodule --recursive
no lo hace.Yo uso esto:
fuente
Noté que el comando proporcionado en una respuesta a esta pregunta me dio la información que estaba buscando:
No se encontró asignación de submódulo en .gitmodule para una ruta que no sea un submódulo
fuente
git ls-files --stage | grep 160000 | perl -ne 'chomp;split;print "$_[3]\n"'
.gimodules
ni nada.git/config
. (No estoy seguro de cómo sucedió, obtuve el repositorio en este estado. Fue un error, así que la solución fuegit rm
)grep "^160000 "
sería un poco más robusto.Si no le importa operar solo en submódulos inicializados, puede usar
git submodule foreach
para evitar el análisis de texto.fuente
Puedes usar:
fuente
test (master)
(nombre con un espacio seguido de paréntesis), que es un nombre de submódulo válido . El comando tampoco se puede arreglar, porque git imprimemodule
omodule (branch)
. Y es aún peor, ya que este comando no es porcelánico, por lo que la salida del comando puede cambiar en el futuro sin previo aviso.Yo uso este:
Salida (ruta + versión):
fuente
Para enumerar todos los submódulos por nombre:
git submodule --quiet foreach --recursive 'echo $name'
fuente
Esto funcionó para mí:
Se basa en este gran artículo: Comprender los submódulos de Git
Se debe leer
grep ^160000
.fuente
git ls-files --stage | grep ^160000
parece producir la misma salida que lagit submodule--helper list
respuesta stackoverflow.com/a/40877379👍🏼
fuente
.url
teclas, por lo que otras entradas pueden aparecer también (por lo general, no hay ninguna, pero sucede una mierda). Debe usar--local
aquí, porque no desea ver--global
ni la--system
configuración. Y por último, porque puede pasarse por alto, solo funciona para submódulos, que ya están presentes en.git/config
(como despuésgit submodule init
, vea la pregunta).git config
permite especificar un archivo de configuración.Y
.gitmodules
es un archivo de configuración.Entonces, con la ayuda de " usar el espacio como delimitador con comando de corte ":
Eso enumerará solo las rutas, una por submódulo declarado.
Como Tino señala en los comentarios :
Como una alternativa más robusta, Tino propone:
fuente
git submodule add https://github.com/hilbix/bashy.git "sub module"; git mv 'sub module' $'sub\nmodule'
). Vea mi comentario a la respuesta aceptada que es muy similar a la suya.En mi versión de Git [1] , cada submódulo Git tiene a
name
y apath
. No necesariamente tienen que ser iguales [2] . Obtener ambos de una manera confiable, sin consultar primero los submódulos (git update --init
), es un poco complicado de hechicería.Obtenga una lista de submódulos
names
No encontré una manera de lograr esto usando
git config
o cualquier otrogit
comando. Por lo tanto, volvemos a regex on.gitmodules
(super feo). Pero parece ser algo seguro ya quegit
limita el posible espacio de código permitido para el submódulonames
. Además, dado que probablemente desee utilizar esta lista para el procesamiento posterior del shell, la solución debajo de las entradas separadas conNULL
-bytes (\0
).Y en tu guión:
Nota :
read -rd ''
requierebash
y no funcionará consh
.Obtenga una lista de submódulos
paths
En mi enfoque Intento no para procesar la salida de
git config --get-regexp
laawk
,tr
,sed
, ... sino que lo pase un byte cero separó de nuevo agit config --get
. Esto es para evitar problemas con las nuevas líneas, espacios y otros caracteres especiales (por ejemplo, Unicode) en el submódulopaths
. Además, dado que probablemente desee utilizar esta lista para el procesamiento posterior del shell, la solución debajo de las entradas separadas conNULL
-bytes (\0
).Por ejemplo, en una secuencia de comandos Bash, podría:
Nota :
read -rd ''
requierebash
y no funcionará consh
.Notas al pie
[1] Versión Git
[2] Submódulo con divergencia
name
ypath
Configurar el repositorio de prueba:
Mueva el submódulo para crear
name
ypath
divergir:Pruebas
Configurar el repositorio de prueba:
.gitmodules
:Obtener lista de submódulo
names
Obtener lista de submódulo
paths
fuente
Si no hay ningún
.gitmodules
archivo, pero existe una configuración de submódulos en.git/modules/
:fuente
Aquí hay otra forma de analizar los nombres de submódulos Git desde .gitmodules sin la necesidad de configuraciones sed o sofisticadas de IFS. :-)
fuente