2011-02-10 19 views
9

Estoy tratando de encontrar la forma adecuada de clonar una biblioteca de terceros (engage.iphone de Janrain) en la estructura de directorios de mi propia aplicación de una manera que me permita extraer los últimos cambios y fusionarlos con cualquier cambio que realice. hacer localmente También quiero que la biblioteca de terceros (fusionada con mis cambios) se incluya en el repositorio git para mi propia aplicación cuando la presione.Git: ¿Cómo clonar una biblioteca de terceros en un subdirectorio del repositorio de mi aplicación?

estructura sería algo como esto:

myApp/ <- this is my app, which is its own git repo 
    external/ 
     engage.iphone/ <- this is the 3rd party library I want to keep up-to-date 
    mySource1.h 
    mySource2.m 
    ... 

¿Cómo puedo configurarlo de esta manera de forma segura? ¿Hay algún proceso especial para fusionar más adelante en el futuro, una vez que se haya configurado?

Respuesta

9

Los submódulos son la manera más fácil de lograr esto.

Existen dos formas comunes de trabajar con submódulos: agregar nuevos e inicializar los ya existentes.

Adición de nuevos cartuchos de

Desde la raíz de su carrera repositorio local:

git submodule add <repository> external/engage.iphone.

El comando add es para cuando inicialmente está agregando un submódulo al repositorio, a diferencia de cuando ha clonado un repositorio con los submódulos existentes). Agrega otro repositorio que puede estar en una ruta local o remota (recuerde que otros desarrolladores necesitan acceso a esto si publica su repositorio) en el archivo .gitmodules en su raíz del repositorio, luego clona el repositorio en la ubicación que especificó; external/engage.iphone en el ejemplo anterior. En esta etapa, tiene los archivos del sub-repositorio en su sistema y está listado como un submódulo en el archivo .gitmodules, la configuración de sus repositorios locales.

Sin embargo, no puede ser que la adición de los submódulos mismo ...

Inicialización submódulos existentes

cosas cambian un poco si está clonando un repositorio que ya tiene submódulos añadieron a la misma. En esta situación, el archivo .gitmodules tendrá los submódulos enumerados en él con ubicaciones para recuperarlos, pero su configuración de repositorio local no sabe nada sobre ellos y los archivos reales aún no existen en su sistema. Lo primero que necesita para inicializar los submódulos:

git submodule init

Esto ejecutará a través de los repositorios que figuran en sus .gitmodules y añadirlos a su .git/config. Git sabe ahora sobre el repositorio pero en realidad no ha clonado todavía, por lo ejecute:

git submodule update

se puede ejecutar este comando en cualquier momento para actualizar los submódulos registrados, es decir clon de los desaparecidos.

git submodule sync <submodule>

Ejecutar este para actualizar todos los submódulos de la cabeza a distancia, a menos que especifique cometer un específico cuando has añadido el submódulo! Especificar un submódulo específico solo sincronizará ese.

Al estilo de Git el comando init se puede combinar con el update para ahorrar tiempo:

git submodule update --init.

Por supuesto, siempre puede actualizar manualmente sus .gitmodules y .git/config una vez que haya aprendido el diseño que utilizan (similar a las secciones de sucursal y remotas en la configuración).

Todos los detalles se pueden encontrar en la página del manual (kernel.org version).

+0

Gracias. Me aparece este error ahora: "No se encontró ningún mapeo de submódulos en .gitmodules para el camino 'engage.iphone/Contrib/json-framework'" ... ¿alguna idea? –

+0

... esto sucede cuando ejecuto "git submodule init" –

+0

@SteveN ¿Cómo ejecutó el comando add? ¿Y qué puso en tus .gitmodules? – ghickman

Cuestiones relacionadas