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 initse haya ejecutado?
El git submodule foreachcomando 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 submodulecomporta 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 listno existía ygit submodule helpno ayudó (según este último, la solucióngit submoduleno es un uso válido).paths, nonamesy 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 initusa, 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 .gitmodulesimprimirá 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 .gitmodulesen la raíz del repositorio ...awkparte falla si tiene espacios en la ruta del submódulo.awkfalla 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 modernosedcon-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-dy'').Puede usar
git submodule statusu opcionalmentegit submodule status --recursivesi desea mostrar submódulos anidados.De la documentación de Git:
fuente
git submodule update --init --recursivepara inicializar todos los submódulos.gitcomando 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 submodulesin argumentos es igual quegit submodule status, por lo que puede ahorrarse escribiendo 7 caracteres ;-)git submodule status --recursivefunciona, perogit submodule --recursiveno 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 --listsi 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.pathpodrí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.gitconfigdesde cualquier lugar en un árbol de trabajo o necesita ejecutar esto en un--barerepositorio, 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 gitindexpara 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--helperUtilizar:
Enumerará todos los submódulos en el repositorio Git especificado.
fuente
git submodule [status](tenga en cuenta questatusestá 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.--recursivebandera, debe agregar explícitamente elstatuscomando:git submodule status --recursivefunciona, perogit submodule --recursiveno 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"'.gimodulesni 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 foreachpara 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 imprimemoduleomodule (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 ^160000parece producir la misma salida que lagit submodule--helper listrespuesta stackoverflow.com/a/40877379👍🏼
fuente
.urlteclas, por lo que otras entradas pueden aparecer también (por lo general, no hay ninguna, pero sucede una mierda). Debe usar--localaquí, porque no desea ver--globalni la--systemconfiguració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 configpermite especificar un archivo de configuración.Y
.gitmoduleses 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
namey 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
namesNo encontré una manera de lograr esto usando
git configo cualquier otrogitcomando. Por lo tanto, volvemos a regex on.gitmodules(super feo). Pero parece ser algo seguro ya quegitlimita 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 ''requierebashy no funcionará consh.Obtenga una lista de submódulos
pathsEn mi enfoque Intento no para procesar la salida de
git config --get-regexplaawk,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 ''requierebashy no funcionará consh.Notas al pie
[1] Versión Git
[2] Submódulo con divergencia
nameypathConfigurar el repositorio de prueba:
Mueva el submódulo para crear
nameypathdivergir:Pruebas
Configurar el repositorio de prueba:
.gitmodules:Obtener lista de submódulo
namesObtener lista de submódulo
pathsfuente
Si no hay ningún
.gitmodulesarchivo, 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