¿Cómo puedo tener dependencias vinculadas en un repositorio de git?

148

En mis scripts, a menudo uso bibliotecas (mías u otras) que tienen sus propios repositorios. No quiero duplicarlos en mi repositorio y atascarme con la actualización cada vez que sale una nueva versión. Sin embargo, cuando alguien clona el repositorio, aún debería funcionar localmente y no tener enlaces rotos.

¿Alguna idea sobre lo que podría hacer?

Lea Verou
fuente

Respuestas:

211

Puedes hacer esto con submódulos en git. En su repositorio, haga:

git submodule add path_to_repo path_where_you_want_it

Entonces, si el repositorio de la biblioteca tenía una URL de git://github.com/example/some_lib.gity la deseabas lib/some_liben tu proyecto, ingresarías:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Tenga en cuenta que esto debe hacerse desde el directorio de nivel superior en su repositorio. Así que no cdingrese al directorio donde lo está poniendo primero.

Después de agregar un submódulo, o cada vez que alguien realice un nuevo pago de su repositorio, deberá hacer lo siguiente:

git submodule init
git submodule update

Y luego, todos los submódulos que haya agregado se retirarán en la misma revisión que usted tiene.

Cuando desee actualizar a una versión más nueva de una de las bibliotecas, cden el submódulo y tire:

cd lib/some_lib
git pull

Luego, cuando lo haga git status, debería verlo lib/someliben la sección modificada. Agregue ese archivo, confirme y estará actualizado. Cuando un colaborador extrae ese compromiso en su repositorio, lo verá lib/somelibmodificado hasta que git submodule updatevuelva a ejecutarse .

Emily
fuente
2
Gracias por tu respuesta, ¡votado! (y probablemente lo acepte mañana) ¿Hay alguna forma de agregar solo un archivo del otro repositorio como dependencia? ¿O tiene que ser una carpeta completa?
Lea Verou
2
Si desea rastrearlo como un submódulo (y, por lo tanto, poder obtener actualizaciones fácilmente), tendrá que ingresar todo el repositorio. A diferencia de muchos otros VCS, git realmente solo quiere lidiar con el repositorio de nivel superior.
Emily
77
lea esto para saber para qué sirve un submódulo y las formas de solucionar posibles problemas. y una discusión al respecto .
minghua
1
supongamos que importa como submódulo otro repositorio de su propiedad. ¿Puede realizar cambios en el repositorio original a través de sus cambios locales en el submódulo? Digamos que encontró un error y necesita actualizar el original.
andrevenancio
3
Sé que esta es una respuesta antigua, pero los submódulos de git se pueden actualizar usando git submodule update --remote. Recomiendo usar más indicadores para proyectos más complejos. Yo usogit submodule update --remote --recursive --init
Chris