2012-04-26 17 views
8

Así que tengo dos repositorios git. El primero es nuestro marco (piense abstracción db, funciones) y luego otro git repo para nuestro nuevo proyecto.Cómo anidar repositorios de git; buscar y fusionar

quiero incluir el repositorio marco git en el GIT proyecto, y de acuerdo con GitHub Ayuda, esto debería funcionar:

cd /project 
git remote add framework git://github.com/username/Framework.git 
git fetch framework 
git merge framework/master 

El problema es que cuando lo haga la fusión, que trae todo lo que todos los archivos de marco y simplemente los vuelca en la raíz del proyecto. En su lugar, ¿cómo podemos tener archivos de framework fusionados en un directorio secundario como /project/framework/?

Respuesta

20

Es posible que desee examinar el soporte de submodule de Git. Un submódulo le permite incrustar un repositorio git dentro de otro repositorio git. Hay alternative solutions para este tipo de cosas, pero no las he usado yo mismo.

Un ejemplo podría tener este aspecto:

$ git clone git://github.com/username/project.git 
$ cd project 
$ git submodule add git://github.com/username/framework.git framework 
$ git commit -m "added framework submodule" 

Si va a clonar un repositorio de cartuchos, es necesario utilizar la opción --recursive:

$ git clone --recursive git://<repository-with-submodules>.git 

O, alternativamente, puede clonar con regularidad y luego ejecute:

$ git submodule init 
$ git submodule update 

Lea el documento vinculado (y git submodule --help) para más información.

Si se realizan cambios en el submódulo, que traerlos así:

# first update the submodule just like any other git repository 
$ cd project/framework 
$ git pull 

# now you have to record the new commit in the parent repository 
$ cd .. 
$ git commit -m "updated framework submodule" 

El último paso es necesario porque Git mantiene un registro de la específica commit asociado con un submódulo dada (de modo que cuando alguien clona al padre que obtendrá esa versión del submódulo, en lugar de su revisión más actualizada, que podría haber sufrido cambios bruscos que impedirían que funcionara como se esperaba con el repositorio principal). Entonces, si actualiza el submódulo, necesita registrar el nuevo compromiso en el padre.

Si realiza cambios dentro del submódulo framework, volvería a simplemente git push como lo haría con cualquier otro repositorio. Entonces tendría que confirmar la nueva revisión en el módulo principal.

+0

Perfecto, así que cuando se realizan cambios en Framework, ¿cómo los incluyo en el proyecto ahora que es un módulo? Además, si realizo cambios en Framework en lugar de project, ¿cómo los vuelvo a insertar en el repositorio de git de Framework? – Justin

+0

He actualizado mi respuesta. – larsks

+0

Una pequeña nota. El submódulo HEAD está separado, por lo que debe tener cuidado al realizar cambios en el submódulo. Crea una rama (o cambia a una rama), realiza los cambios, confirma y luego presiona. – GoZoner

Cuestiones relacionadas