2010-02-24 25 views
10

tengo la siguiente configuración del proyecto:Reutilización una parte de un repositorio Git

  • Solution A
    • Project 1 (un componente ligero)
    • Project 2 (contiene una gran cantidad de archivos y depende de Project 1)

Solution A es un solo repositorio de git. Luego creé otra solución y descubrí que podía reutilizar e incluso actualizar la funcionalidad de Project 1. Así que mi segunda solución, probablemente se vería así:

  • Solution B
    • Project 1 (se deben compartir!)
    • Project 3 (depende de Project 1).

Ahora quiero Project 1 para convertirse en un componente compartido. Es decir, cada vez que cambio el código fuente de Project 1 desde cualquiera de las soluciones (A o B), necesito que el otro se actualice en consecuencia.

Tal vez esto tiene algo que ver la función de la submódulo de git. Sin embargo, la única forma en que pude usarlo es especificar el Solution A completo como un submódulo para Solution B. Esto no es realmente lo que quiero idealmente debido al enorme tamaño de Solution A. Solo necesito una pequeña parte para ser un submódulo.

Sé que es posible en svn y funciona exactamente como lo he descrito: especifica un directorio dentro de un repositorio externo en la propiedad svn:externals.

¿Algún consejo al respecto? O tal vez, me estoy perdiendo algo?

Respuesta

7

Este es, sin duda relacionada con submódulos (ver el nature of submodules)

En su caso, la La solución ideal sería extraer Project1 de SolutionA Git repo:
Ver How to extract a git subdirectory and make a submodule out of it?.

Pero eso implica volver a escribir el historial de SolutionA, que es un problema si ya lo ha publicado y si algunas personas lo están sacando.

Usando filter-branch para el proceso de extracción.

de reescribir el repositorio a parecer como si Project1/ había sido su raíz del proyecto, y desechar el resto de la historia:

git filter-branch --subdirectory-filter Project1 -- --all 

Así se puede, por ejemplo, convertir un subdirectorio biblioteca en una repositorio propio. Tenga en cuenta el -- que separa las opciones filter-branch de las opciones de revisión y --all para reescribir todas las ramas y etiquetas.

Entonces declarar Project1 como un submódulo en SolutionB:

cd SolutionB 
git submodule add /path/to/Project1 Project1 

NOTA: No utilice URLs locales aquí si va a publicar su SolutionB!

git commit -m "Add submodules Project1" 
0

de Split Proyecto 1 a su propio repositorio, y que sea un submódulo de ambos Solución A y Solución B.

Cuestiones relacionadas