2012-02-22 18 views
5

Soy bastante nuevo en Git: vengo de SVN y allí encontré la función externa: realmente potente. Aquí en Git no he encontrar algo similar:Empujando subárboles en un git repo

  • submódulos son perfectos para añadir módulos del proyecto, que no siempre son necesarios. Deben inicializarse después de la clonación de repo y no puede incluir solo un subdirectorio del proyecto original.
  • subtrees son realmente buenos para agregar librerías (también permiten la inclusión de subdir), pero presionarlos es un verdadero dolor.

El escenario es el siguiente: tengo un proyecto, en el que quiero incluir algunas bibliotecas. Quiero la posibilidad de cambiar todas estas bibliotecas y empujarlas en sus propios repositorios. Además, algunas de estas bibliotecas son subdirectorios de proyectos más grandes (por ejemplo, si un proyecto incluye también demostraciones o archivos Léame, no incluiré esos directorios en mi proyecto).

¿Cómo puedo hacer eso?

He intentado:

Bueno, si usted ha llegado a este punto, gracias por su paciencia, ahora me gustaría algo más que intentarlo, porque en este momento es mi conclusión : "subárbol empujando no está permitido en Git" ç_ç

+0

http://stackoverflow.com/questions/3131912/why-are-git-submodules-incompatible-with-svn-externals/3132221#3132221: los submódulos de Git y los externos son diferentes. Pero puede cambiar el contenido de un submódulo e ingresarlo a su repositorio: http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194. Básicamente, mi respuesta sería la misma que http://stackoverflow.com/questions/9394286/planning-repository-layout-for-git-migration/9395375#9395375 – VonC

+0

ok, gracias ... pero (corrígeme si Estoy equivocado) con los submódulos. ¿No puedo "incluir" solo un submódulo específico? Quiero decir: mi submódulo tiene dos directorios: Demos y Source, y quiero incluir _only_ el contenido de Source en mi proyecto principal ... espero que sea comprensible ... –

+0

correcto: un submódulo es un git repo propio: debe finalizar la compra todo. Si bien es posible realizar una extracción dispersa (http://stackoverflow.com/a/2467629/6309), no se recomiendan. Usar el enlace simbólico para vincular solo lo que quieres ver es mejor. – VonC

Respuesta

3

par de comentarios de los comentarios:

por lo que recomiendo:

  • carga (git checkout) el repositorio matriz y todas sus submódulos
  • creación de otras partes de la estructura correcta, con enlace simbólico a los submódulos (o subdirectorios de los submódulos con el fin para lograr lo que necesita.
  • regrese periódicamente al repositorio principal de Git para detectar cualquier cambio (los tonos de la estructura del otro directorio creado fuera de Git) para confirmar y enviar todos los modulos de los submódulos, y luego confirmar y empujar el repositorio padre.

git checkout

parent repo 
    + 
    +--> main project 
    + 
    +-> mainDir1 
    +-> mainDir2 
    +--> lib1 
    + 
    +-> lib1Dir1 
    +-> lib1Dir2 
    +--> lib2 
    + 
    +-> lib2Dir1 
    +-> lib2Dir2 

y su propia estructura de directorios (por ejemplo)

+--> main project (symlink to ../parent/main project) 
    + 
    +-> mainDir1 
    +-> mainDir2 
    +-> lib1Dir1 (symlink to ../parent/lib1/lib1Dir1) 
    +-> lib1Dir2 (symlink to ../parent/lib1/lib1Dir2) 
    +-> lib2Dir2 (symlink to ../parent/lib1/lib2Dir2) 

(Nota No hay ninguna lib2Dir1 (por ejemplo), ya que en su proyecto real que don' t lo necesita)

+0

gracias, tu respuesta es realmente una idea fantástica en la que nunca pensé. Pero ahora entiendo que no es lo que estoy buscando ... Quiero decir: con su solución si quiero clonar el proyecto, tengo que hacer los enlaces simbólicos, así que no es la solución llave en mano que me gustaría. proporcionar. Sí, es mucho más fácil que mi solución anterior con subárboles, pero ahora voy a pensar que esto es una "falta" de Git, ¿no es así? Por cierto, ¡muchas gracias por tu paciencia! –

1

La solución de VonC es limpia, pero tiene una desventaja: No se puede forma od de capturar una configuración de sus bibliotecas de proyecto + en un punto en el tiempo.

Si necesita volver a configurar su proyecto, tendrá que verificar su proyecto + las bibliotecas, pero pueden estar en diferentes ramas y comprometerse con lo que tenía antes.

Por lo tanto, si sigue la sugerencia de VonC, tal vez cree etiquetas en cada uno de los repos en el momento en que realice un lanzamiento de su proyecto, de modo que al menos pueda volver a verlos en el mismo punto.

De lo contrario, siempre avance y nunca vea una versión anterior.