¿Ignora un submódulo de git en su .gitignore o lo confirma en su repositorio?

94

He agregado un submódulo a mi proyecto project_dir/vendor/submodule_oneahora cada vez que ejecuto git statusI get modified: vendor/submodule_one (new commits).

Mi pregunta es ¿cuál es la mejor manera de lidiar con esto? ¿Agrego la vendor/submodule_one-carpeta a mi .gitignoreya que mi proyecto principal no debería necesitar conocer los detalles de mi submódulo?

O cuando estoy cambiando y confirmando cambios en mi submódulo, ¿necesito hacer también confirmaciones en mi proyecto principal?

Acabo de comenzar con los submódulos y parece que no puedo encontrar mucha información más allá de configurarlos.

sprysoft
fuente

Respuestas:

81

No, no es necesario que agregue su submódulo a su .gitignore: lo que el padre verá en su submódulo es un gitlink (una entrada especialmode 160000 ).

Eso significa: cualquier cambio realizado directamente en un submódulo debe ir seguido de una confirmación en el directorio principal.
De esa manera, el directorio padre registrará la confirmación correcta para el estado del submódulo: esa confirmación es el "gitlink" mencionado anteriormente;

Puede leer más sobre esa política en " actualización del submódulo git (verdadera naturaleza de los submódulos) ".
La idea principal detrás de los submódulos es un enfoque basado en componentes , donde hace referencia a otros repositorios en confirmaciones específicas. Pero si cambia algo en esos submódulos, también debe actualizar esas referencias en el repositorio principal.


Tenga en cuenta que con Git 2.13 (Q2 2017), aunque no ignora el gitlink, aún puede ignorar el submódulo con:

git config submodule.<name>.active false

Ver más en " Ignorar nuevas confirmaciones para el submódulo git ".


Nota: con Git 2.15.x / 2.16 (Q1 2018), ignorar un submódulo es más preciso.
" git status --ignored --untracked" no se detuvo en un árbol de trabajo de un proyecto separado que está incrustado en un directorio ignorado y enumera los archivos en ese otro proyecto, en lugar de simplemente mostrar el directorio como ignorado.

Consulte la confirmación fadb482 (25 de octubre de 2017) de Johannes Schindelin ( dscho) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso da7996a , 06 de noviembre de 2017)

status: no se confunda con submódulos en directorios excluidos

Pasamos meticulosamente la excludebandera a la treat_directory()función para que podamos indicar que los archivos que contiene se excluyen en lugar de no rastrear cuando se repite.

Pero todavía no tratamos los submódulos de la misma manera.

Por eso, git status --ignored --untrackedcon un submódulo submoduleen un gitignored tracked/se mostraría el submódulo en la Untracked filessección " ", por ejemplo

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

En su lugar, querríamos que mostrara el submódulo en la Ignored filessección " ":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/
VonC
fuente
1
Gracias VonC, tiene mucho sentido cuando lo pones así.
sprysoft
8
Esta respuesta es confusa porque el título de la pregunta pregunta si ignorar las carpetas del submódulo o no, y está respondiendo sí a una pregunta separada más adelante en el cuerpo de la pregunta.
SgtPooki
1
Creo que ahora tiene mucho más sentido y está proporcionando información detallada muy útil. Impresionante, gracias por actualizar :)
SgtPooki
Argumento a favor de .gitignore: ¿Por qué registrar el archivo .g
djangofan
1
@djangofan la pregunta (y mi respuesta) fue sobre ignorar la carpeta del submódulo en sí (la que representa un gitlink). No se trata de ignorar el .gitmodulesarchivo. Es cierto que este archivo (el .gitmodules) podría incluir credenciales, pero si se usa solo para clonar repositorios públicos, no es necesario que las incluya. Además, se pueden almacenar en caché de todos modos, incluso en Windows, con ayudantes de credenciales como "Git Credential Manager para Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Entonces, tener credenciales en el .gitmodulesno es una fatalidad.
VonC
8

Por alguna razón, submodule.module-name.active no funcionó para mí.

Por eso usé submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules : aquí puede encontrar una descripción de los posibles valores para el parámetro

Me funciona para (nuevas confirmaciones) y (contenido modificado) mensajes.

Vladimir
fuente
1

Para agregar a la respuesta aceptada, descubrí que agregar la carpeta del submódulo Git a .gitignore en realidad causa problemas, particularmente al intentar crear un nuevo clon del proyecto. Específicamente, al ejecutar los comandos normales de clonación del submódulo, la carpeta del submódulo estaba vacía:

git submodule init
git submodule update
git pull --recurse-submodules

Solo intentando volver a ejecutar

git submodule add <Git repo> <submodule folder>

estaba claro cuál era el problema, según el resultado:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

En lugar de agregar -f, eliminé la carpeta del submódulo Git de .gitignore y volví a ejecutar los comandos de clonación del submódulo, que ahora crearon con éxito la carpeta. Creo que puede haber un error en el sentido de que uno de los comandos de clonación del submódulo respeta .gitignore pero no advierte que se está saltando un submódulo en consecuencia.

Woodz
fuente