tag remote git git-submodules

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

    Source


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 .


Un poco como en esta idea , puede comenzar su sesión de trabajo en esas máquinas con un git clean :

git clean -xfdf

Use force dos veces para limpiar directorios con subdirectorios .git : git clean -xfdf .
Tuve algunos submódulos enredados que no se eliminarían con solo git clean -xfd .


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.