Antecedentes
Usando Git 1.8.1.1 en Linux. El repositorio tiene el siguiente aspecto:
master
book
El submódulo se creó de la siguiente manera:
$ cd /path/to/master
$ git submodule add https://[email protected]/user/repo.git book
El book
submódulo está limpio:
$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean
Problema
El maestro, por otro lado, muestra que hay "nuevas confirmaciones" para el submódulo del libro:
$ cd /path/to/master/
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
Git debería ignorar el directorio del submódulo por completo, de modo que el maestro también esté limpio:
$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean
Intento fallido # 1 - sucio
Dentro del archivo master/.gitmodules
está lo siguiente, según esta respuesta :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = dirty
Intento fallido n. ° 2: sin seguimiento
Cambiado master/.gitmodules
a lo siguiente, según esta respuesta :
[submodule "book"]
path = book
url = https://[email protected]/user/repo.git
ignore = untracked
Intento fallido n. ° 3 - showUntrackedFiles
Editado master/.git/config
a lo siguiente, según esta respuesta :
[status]
showUntrackedFiles = no
Intento fallido n. ° 4: ignorar
Se agregó el directorio del libro al archivo maestro de ignorar:
$ cd /path/to/master/
$ echo book > .gitignore
Intento fallido n. ° 5: clonar
Se agregó el directorio de libros al maestro de la siguiente manera:
$ cd /path/to/master/
$ rm -rf book
$ git clone https://[email protected]/user/repo.git book
Pregunta
¿Cómo puede el book
submódulo estar en su propio directorio de repositorio bajo el master
repositorio y hacer que git ignore el book
submódulo? Es decir, no debería aparecer lo siguiente:
#
# modified: book (new commits)
#
¿Cómo suprimir ese mensaje al ejecutar git status
en el repositorio principal?
¿Un artículo sobre las trampas del submódulo git sugiere que este es un uso inapropiado del submódulo?
fuente
git config submodule.<name>.active false
. Vea mi respuesta a continuaciónRespuestas:
Para incluir otro repositorio, que no necesita ser rastreado en su super-repositorio, intente esto:
Entonces comprometerse.
Como se indica en el artículo sobre errores del submódulo de git vinculado :
Eso significa que un submódulo no se guarda mediante su rama o etiqueta extraída, sino siempre mediante una confirmación específica; esa confirmación (SHA) se guarda en el superrepósito (el que contiene el submódulo) como un archivo de texto normal (está marcado como tal referencia, por supuesto).
Cuando verifica una confirmación diferente en el submódulo o realiza una nueva confirmación en él, el superrepósito verá que su SHA extraído ha cambiado. Ahí es cuando obtienes la
modified (new commits)
línea degit status
.Para eliminar eso, puede:
git submodule update
, que restablecerá el submódulo a la confirmación actualmente guardada en el superrepósito (para obtener más detalles, consulte la página degit submodule
manual ; ogit add book && git commit
para guardar el nuevo SHA en el superrepósito.Como se menciona en los comentarios, considere abandonar el
book
submódulo: clónelo dentro del superrepósito, si no es necesario rastrear su estado como parte del superrepósito.fuente
git add book && git commit
. No me di cuenta de que git realmente puede garantizar que los dos repositorios estén sincronizados.Solo corre:
Esto revertirá el submódulo a la confirmación anterior (especificada en parent-repo), sin actualizar el parent-repo con la última versión del submódulo.
fuente
book
repositorio? No creo que tu respuesta tenga sentido en este contexto.Hay dos tipos de avisos de cambio que puede suprimir (desde git 1.7.2).
El primero es el contenido sin seguimiento que ocurre cuando realiza cambios en su submódulo pero aún no los ha confirmado. El repositorio principal los nota y git status lo informa en consecuencia:
Puede suprimirlos con:
Sin embargo, una vez que confirme esos cambios, el repositorio principal volverá a tomar nota y los informará en consecuencia:
Si también desea suprimirlos, debe ignorar todos los cambios.
fuente
ignore = all
opciones a todos los submódulos. Finalmente, algunos módulos tienen nuevas confirmaciones que se enviaron. Si alguien luego clona el superrepósito, ¿estará en el estado anterior de los submódulos o comprobará los últimos?git clone --recursive git@...
obtendrás el estado anterior de los submódulos. Para actualizarlos, necesitará algo comogit submodule foreach "git pull"
después de la clonaciónignore = all
opción no ignora las nuevas confirmaciones del submódulo. Estoy ejecutando la versión 1.7.1 de git. ¿Alguna idea de forma?Git 2.13 (Q2 2017) agregará otra forma de incluir un submódulo que no necesita ser rastreado por su repositorio principal.
En el caso del OP:
Ver confirmar 1b614c0 , confirmar 1f8d711 , confirmar bb62e0a , confirmar 3e7eaed , confirmar a086f92 (17 de marzo de 2017) y confirmar ee92ab9 , confirmar 25b31f1 , confirmar e7849a9 , confirmar 6dc9f01 , confirmar 5c2bd8b (16 de marzo de 2017) por Brandon Williams (
mbrandonw
) .(Combinado por Junio C Hamano -
gitster
- en el compromiso a93dcb0 , 30 de marzo de 2017)fuente
<name>
para un submódulo en un proyecto existente?.git/config
->[submodule "<name>"]
La respuesta de Nevik Rehnel es ciertamente la correcta para lo que está preguntando: no quería tener un submódulo, ¿cómo diablos salgo de esa situación? .
Solo que, si su
master
proyecto requiere elbook
submódulo, es un buen gesto mantenerlo como tal porque de esa manera otros usuarios que revisan su proyecto pueden disfrutar de no tener ningúngit
comando especial para ejecutar (bueno ... hay algunos comandos especiales para usar submódulos, pero creo que aún es más sencillo de administrar).En su caso, realiza cambios en el
book
repositorio y en algún momento confirma esos cambios. Esto significa que tiene nuevas confirmaciones en ese submódulo, que tienen una nueva referencia SHA1.Lo que debe hacer en el directorio maestro es confirmar esos cambios en el repositorio maestro.
Esto actualizará la referencia SHA1
master
a la versión más reciente disponible en elbook
repositorio. Como resultado, este compromiso permite a otros verificar todos los repositoriosmaster
&book
en la punta.Entonces, en efecto, terminas con una confirmación más cada vez que realizas cambios en un submódulo. Es semitransparente si también realiza cambios en algunos archivos en el
master
repositorio, ya que confirmaría ambos al mismo tiempo.fuente
correr
en el nivel de la raíz.
fuente
git status
dice. Todavía cree que se han producido cambios.