remote - ¿Cuál es el flujo de trabajo para limpiar los submódulos de git en los clones?
git ls-remote (4)
Hay respuestas útiles sobre cómo eliminar submódulos "localmente". ¿Cómo elimino un submódulo?
Sin embargo tengo el problema que tengo clones de mi repo en varias máquinas. Dos solo trabajo una o dos veces al mes. Así que cuando actualizo las sucursales en ellas, aunque los submódulos ya no se rastrean, los archivos todavía están en la rama de trabajo también en .git/modules
. En más de una ocasión accidentalmente revisé algunos. En otros casos, las compilaciones fallaron debido a la presencia de estos archivos / directorios no deseados.
Supongo que podría mantener una lista de cosas para eliminar, pero eso no parece correcto. ¿Qué tal si otra persona haría la eliminación y no tengo información fuera de git qué debo eliminar?
Entonces, ¿cuál es la forma sugerida para limpiar los clones?
actualizar
Para mí, git --version
devuelve la git version 2.18.0
que parece ser actual (es 2018-09-01).
Añado un ejemplo reproducible.
Preparar
mkdir parent
cd parent
git init
git submodule add https://github.com/jakesgordon/javascript-tetris.git
git commit -am add
cd ..
git clone parent clone
cd clone
git submodule update --init
Ahora ambos directorios contienen el submódulo con archivos extraídos en javascript-tetris/
. .gitmodules
contiene el submódulo.
Cuando lo hago
cd parent
git rm javascript-tetris
git commit -am delete
En el directorio principal, el directorio es javascript-tetris
y la entrada en .gitmodules
elimina. Pero sigue habiendo un .git/modules/javascript-tetris
.
en el lado del clon
git pull
da la advertencia: warning: unable to rmdir ''javascript-tetris'': Directory not empty
. Y el directorio permanece, también .git/modules/javascript-tetris
sigue ahí.
¿Esto es útil para usted?
git clean -xfd
git submodule foreach --recursive git clean -xfd
git reset --hard
git submodule foreach --recursive git reset --hard
git submodule update --init --recursive
ACTUALIZAR
Para eliminar un submódulo necesitas:
- Elimine la sección correspondiente del archivo .gitmodules.
- Escenario los cambios de .gitmodules git add .gitmodules
- Eliminar la sección correspondiente de .git / config.
- Ejecute git rm --cached path_to_submodule (sin barra diagonal final).
- Ejecute rm -rf .git / modules / path_to_submodule (sin barra diagonal).
- Commit git commit -m "submódulo eliminado"
Elimine los archivos de submódulos ahora sin seguimiento rm -rf path_to_submodule
Desafortunadamente, parece que no existe un solo comando directo para eliminar por completo un submódulo Git.
Vea a continuación un extracto de la documentación de los submódulos de Git :
Submódulo eliminado: se puede eliminar un submódulo ejecutando git rm && git commit. Esto se puede deshacer usando git revert.
La eliminación elimina los datos de seguimiento del superproyecto, que son tanto la entrada de gitlink como la sección en el archivo .gitmodules. El directorio de trabajo del submódulo se elimina del sistema de archivos, pero el directorio de Git se mantiene a su alrededor para permitir la extracción de confirmaciones pasadas sin tener que buscarlas en otro repositorio.
Para eliminar completamente un submódulo, elimine manualmente $ GIT_DIR / modules / {name} /.
Sin embargo, puede crear fácilmente su propio comando git para ejecutar tales tareas como se explica en esta answer .
Por ejemplo, puede crear un archivo con el siguiente script de bash:
#!/bin/bash
echo "Running git rm ${1}"
git rm $1
echo "Running rm -rf .git/submodules/${1}"
rm -rf .git/modules/$1
exit 0
Luego, deberá colocarlo en un directorio visible en su RUTA (por ejemplo, en mi caso, podría ser C:/Program Files/Git/cmd
) y denominarlo git-{my_command_name}
(por ejemplo, git-rm-module
).
De esta manera, puedes usarlo como git rm-module {my-submodule-name}
. Y el resultado sería:
$ git rm-module my-submodule-name
Running git rm-submodule my-submodule-name
Running rm -rf .git/submodules/my-submodule-name
Para opciones complejas, puede obtener algo de inspiración de este comando de actividad git .
git rm
debe manejar todo el trabajo sucio, pero no lo hace.
Los documentos indican que querrá limpiar manualmente el directorio .git/modules
. La mejor opción que he encontrado hasta ahora se basa en la respuesta de VonC mediante el procesamiento posterior de la salida con sed
y xargs
:
git clean -xfdf | sed ''s/Removing //.git//modules///'' |xargs rm -rf
No me gusta mucho esta opción, ya que es bastante frágil y depende de que la limpieza no se haya ejecutado todavía. Probablemente sea mejor que verifique que no haya confirmaciones locales en el clon y que vuelva a clonar desde cero en las otras estaciones de trabajo.