Actualice un submódulo a la última confirmación

269

Tengo un proyecto A que es una biblioteca y se usa en un proyecto B.

Ambos proyectos A y B tienen un repositorio separado en github PERO dentro de B tenemos un submódulo de A.

Edité algunas clases en la biblioteca, que está en el repositorio A, presioné el repositorio remoto, por lo que la biblioteca (repo A) se actualiza.

Estas actualizaciones no se reflejan en la "referencia" (el submódulo), el submódulo se refiere a una confirmación previa ... ¿qué debo hacer para actualizar el submódulo en git?

grasa
fuente

Respuestas:

358

Ingrese el directorio de submódulos:

cd projB/projA

Extraiga el repositorio de su proyecto A ( no actualizará el estado de git de su padre, proyecto B):

git pull origin master

Regrese al directorio raíz y verifique la actualización:

cd ..
git status

Si el submódulo se actualizó antes, mostrará algo como lo siguiente:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Luego, confirme la actualización:

git add projB/projA
git commit -m "projA submodule updated"

ACTUALIZAR

Como señaló @paul, desde git 1.8, podemos usar

git submodule update --remote --merge

para actualizar el submódulo a la última confirmación remota. Será conveniente en la mayoría de los casos.

Kjuly
fuente
35
Por cierto, si no eres el propietario del submódulo, puedes hacerlo git submodule updatecuando alguien más actualizó el projA (obtendrás una nueva identificación de confirmación).
Kjuly
soy dueño del repositorio principal del submódulo (proyecto A) pero soy un confirmador en el proyecto B.
gordo
@Kjuly Después de la confirmación, ¿cómo se empuja al control remoto? ¿Es justo git push?
KR29
1
@ KR29 derecha, y el cmd completo es git push <remote> <branch>, por ejemplo git push origin dev.
Kjuly
2
git submodule updatesolo funciona sin marcas cuando se ha extraído una confirmación (en el proyecto B) que actualiza las referencias a los submódulos en cuestión (proyecto A). Para actualizar el proyecto B para hacer referencia a la HEADrama de seguimiento remoto para el proyecto A, querrá hacer lo git submodule update --remote --mergeque se muestra en la respuesta de Paul Hatcher a continuación.
Ben Burns
109

Desde git 1.8 puedes hacer

git submodule update --remote --merge

Esto actualizará el submódulo a la última confirmación remota. Luego deberá confirmar el cambio para que se actualice gitlink en el repositorio principal

git commit

Y luego presione los cambios, ya que sin esto, la identidad SHA-1 que apunta al submódulo no se actualizará y, por lo tanto, el cambio no será visible para nadie más.

Paul Hatcher
fuente
Aunque lo hago, git committodos los demás todavía no lo ven. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N
1
¿Has hecho un "git push" después de tu commit? Ten en cuenta que commit solo cambia tu repositorio local, tienes que llevarlo al control remoto para que todos lo vean
Paul Hatcher
Falta esta respuesta (pero se señala en otras respuestas a continuación): los submódulos actualizados deben ser organizados git addantes de comprometerse.
joshng
1
@joshng Siento que todos los que están en el punto donde están trabajando en submódulos lo entenderían. Esta es la única publicación que me ayudó, muchas gracias.
Husk Rekoms
38

Si actualiza un submódulo y se compromete con él, debe ir al repositorio de nivel superior o que lo contiene y agregar el cambio allí.

git status

mostrará algo como:

modified:
   some/path/to/your/submodule

El hecho de que el submódulo no esté sincronizado también se puede ver con

git submodule

la salida mostrará:

+afafaffa232452362634243523 some/path/to/your/submodule

El signo más indica que el submódulo apunta hacia el lugar donde el repositorio superior espera que apunte.

simplemente agregue este cambio:

git add some/path/to/your/submodule

y comprometerlo:

git commit -m "referenced newer version of my submodule"

Cuando suba los cambios, asegúrese de subir primero el cambio en el submódulo y luego presione el cambio de referencia en el repositorio externo. De esta manera, las personas que actualicen siempre podrán ejecutar con éxito

git submodule update

Puede encontrar más información sobre submódulos aquí http://progit.org/book/ch6-6.html .

Adam Dymitruk
fuente
Si no ve un +cuando ejecuta git submodule, asegúrese de haber inicializado e importado los submódulos. Los comandos para eso son git submodule inity git submodule update, respectivamente.
fureigh
19

Versión de línea única

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
Andy Webov
fuente
2

Algunas de las otras respuestas recomiendan fusionar / confirmar dentro del directorio del submódulo, lo que IMO puede volverse un poco desordenado.

Suponiendo que se nombra el servidor remoto originy queremos la masterrama de los submódulos, tiendo a usar:

git submodule foreach "git fetch && git reset --hard origin/master"

Nota: Esto realizará un restablecimiento completo en cada submódulo; si no desea esto, puede cambiar --harda --soft.

XtraSimplicity
fuente
1

Mi proyecto debería usar el 'último' para el submódulo. En Mac OSX 10.11, git versión 2.7.1, no necesitaba 'entrar' en mi carpeta de submódulos para recopilar sus confirmaciones. Simplemente hice un regular

git pull --rebase 

en el nivel superior, y actualizó correctamente mi submódulo.

AnneTheAgile
fuente
0

La respuesta de Andy funcionó para mí escapando de $ path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
Miguel Fernandes Muldy
fuente
Probablemente la razón por la cual la respuesta de @Andy Webov no requirió escapar fue porque usaron comillas simples alrededor del camino, por ejemplo. '$path'
S0AndS0