¿Cómo deshacerse de los submódulos de Git sin seguimiento de estado?

149

Parece que no puedo deshacerme del contenido no rastreado en los submódulos de Git. Corriendogit statusRendimientos :

# En el maestro de sucursal
# Cambios no organizados para commit:
# (use "git add ..." para actualizar lo que se confirmará)
# (use "git checkout - ..." para descartar cambios en el directorio de trabajo)
# (confirmar o descartar el contenido no rastreado o modificado en submódulos)
# #
# modificado: paquete / snipmate (contenido no rastreado)
# modificado: paquete / envolvente (contenido no rastreado)
# modificado: bundle / trailing-whitespace (contenido sin seguimiento)
# modificado: paquete / zencoding (contenido no rastreado)
# #
no se agregaron cambios al commit (use "git add" y / o "git commit -a")

Agregar el --ignore-submodulesparámetro oculta estos mensajes; pero me pregunto si hay una manera de deshacerse de esta suciedad de una manera más adecuada y esencial.

Tomer Lichtash
fuente
3
Esta respuesta: stackoverflow.com/a/5127213/199649 evoca más opciones.
charlax

Respuestas:

95

Dado que el estado de git informa de contenido no rastreado, la forma real de tener un estado limpio sería ir a cada uno de esos submódulos y:

  • agregar y confirmar los contenidos no rastreados,
  • o haga referencia a los contenidos no rastreados de forma .gitignoreespecífica para cada módulo.
  • o puede agregar el mismo contenido ignorado a los submódulos .git/info/exclude, como informa peci1 en los comentarios .
  • o añadir sucio a la especificación submódulo, como se menciona en ezraspectre 's respuesta (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • o agregue un archivo global .gitignore (a menudo ~/.gitignore-global). Como por ejemplo .DS_Storeo en mi caso Carthage/Buildsegún lo informado por Marián Černý en los comentarios . Ver .gitginorepágina del manual :

Los patrones que un usuario desea que Git ignore en todas las situaciones (por ejemplo, archivos de respaldo o temporales generados por el editor de elección del usuario) generalmente entran en un archivo especificado por core.excludesFileel usuario ~/.gitconfig. Su valor predeterminado es $XDG_CONFIG_HOME/git/ignore. Si $XDG_CONFIG_HOMEno está configurado o está vacío, $HOME/.config/git/ignorese usa en su lugar.

VonC
fuente
55
+1, estaba a punto de gritar hasta que encontré esto ... luego me di cuenta de que un .DS_Storearchivo había sido creado automáticamente (por OS X) en uno de mis submódulos, lo que me impedía comprometer el proyecto principal. Arg! Hora de actualizar .gitignore...
Courtney Christensen
Usando Xcode, también he encontrado útil agregar * .xcuserdatad al archivo .gitignore-global. Esto evita que git intente rastrear las preferencias locales de Xcode.
Roy Sharon
Si no tiene derechos de inserción para el submódulo, entonces no puede compartir sus cambios en el submódulo con otros usuarios del repositorio principal. La solución de @ quincyglenn parece funcionar en tal caso.
Drew Noakes el
1
@VonC, cualquiera de las respuestas tiene sentido según la situación y la preferencia. Quería resaltar la distinción aquí como referencia para los demás. Por cierto, gracias por sus muchas respuestas con respecto a Git aquí en SO, me han ayudado muchas veces.
Drew Noakes el
2
Incluso puede hacerlo sin comprometerse y crear un .gitignore (que en sí mismo no se rastrea). Abra el submódulo .git/info/excludey agregue las líneas de ignorar allí (funciona como un .gitignore, pero no es parte del repositorio compartido).
Martin Pecka
144

Encontré que esta publicación de blog funciona en general. Al agregar la ignore = dirtyopción a cada una de las entradas en el .gitmodulesarchivo.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty
ezraspectre
fuente
Mi solución preferida, ya que se automatiza fácilmente.
guitarra letal
24
Vale la pena mencionar que ignore = untrackedtambién existe y muestra archivos rastreados modificados, pero no archivos no rastreados. Sería bueno si había una configuración global para esto para todos los submódulos ...
naught101
12

También puede ir a cada directorio de submódulo y actuar como un git separado. Por ejemplo:

cd my/project/submodule
git status

... / obtiene la lista de archivos modificados /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

También puede actualizar su repositorio de submódulo remoto con

git submodule update

después de todo

Ricardo Martins
fuente
55
Probablemente no desee hacerlo git add .sin revisar los archivos modificados. La mayoría de las veces, los cambios que se hicieron son los .DS_Storearchivos agregados ; esto probablemente debería ser captado por usted .gitignore, como mencionó zourtney en el primer comentario a la respuesta.
gregoltsov
En caso de que realmente no desee actualizar los submódulos y desee volver al estado original, es posible que desee ejecutar git submodule update --force.
Tom
4

Podría deberse a la detached HEADrama en su submódulo. Si este es el caso, vaya a la ruta de su submódulo (por ejemplo:) ./bundle/snipmate, luego ejecute git checkout master.

Browny Lin
fuente
2

Ayer me quedé estancado en este tema, en un proyecto que tenía cerca de 12 submódulos.

git status estaba mostrando salida.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Para resolver el error de contenido sin seguimiento, tuve que quitar los archivos sin seguimiento de todos los submódulos (todos eran *.pyc, *.pyolos archivos generados por el pitón) utilizando una .gitignore.

Para resolver el otro, tuve que ejecutar git submodule updateque actualizaba cada uno de los submódulos.

mu 無
fuente
1

En mi situación, clono módulos como punto de partida para un nuevo módulo en mi entorno ZF2. Lo que esto hace es poner su propia carpeta .git en el directorio.

La solución en este caso es eliminar la carpeta .git (es probable que deba mostrar archivos ocultos para verla).

HappyCoder
fuente
1

Esto probablemente ocurre cuando tiene otra .git [carpeta oculta] dentro de la carpeta en particular.

modificado: ./../ .. (contenido modificado, contenido no rastreado)

asegúrese de que su subdirectorio no contenga esta carpeta .git.

Si ese es el caso, el problema se puede resolver eliminando la carpeta .git manualmente del subdirectorio.

Subrat Kumar Palhar
fuente
1

Prefiero usar SourceTree , por lo que la solución para mí fue abrir el repositorio de submódulos en SourceTree que me muestra la lista de todos los archivos no rastreados. Luego los seleccioné en grupo y luego usé "Eliminar".

Pude hacer esto porque sabía que todos los archivos no rastreados no eran realmente necesarios.

Glenn Lawrence
fuente
1

Esto funcionó bien para mí:

git update-index --skip-worktree <path>

Si no funciona con el pathname, intente con el nombre del archivo. Avísame si esto también funcionó para ti.

DarkCrazy
fuente
-1

Si se trata de un problema temporal, puede ir a la carpeta del submódulo y ejecutarlo, git reset HEAD --hardpero perderá todos los cambios dentro del submódulo.

daigo
fuente