Reutilizar una parte de un repositorio de git
-
22-09-2019 - |
Pregunta
Tengo la siguiente configuración del proyecto:
Solution A
Project 1
(un componente liviano)Project 2
(contiene muchos archivos y depende deProject 1
)
Solution A
es un solo git repositorio. Luego creé otra solución y descubrí que podía reutilizar e incluso actualizar la funcionalidad de Project 1
. Entonces mi segunda solución probablemente se vería así:
Solution B
Project 1
(¡Debe ser compartido!)Project 3
(depende deProject 1
).
Ahora quiero Project 1
para convertirse en un componente compartido. Es decir, cada vez que cambio el código fuente de Project 1
de cualquier solución (A
o B
), Necesito el otro para actualizar en consecuencia.
Tal vez esto tenga algo que hacer el submódulo característica de git. Sin embargo, la única forma en que pude usarlo es especificar todo Solution A
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 he descrito: especifica un directorio dentro de un repositorio externo en el svn:externals
propiedad.
¿Algún consejo sobre eso? ¿O tal vez, me estoy perdiendo algo?
Solución
Esto definitivamente está relacionado con submódulos (ver el Naturaleza de los submódulos)
En su caso, la solución ideal sería extraer Project1
de SolutionA
Git Repo:
Ver ¿Cómo extraer un subdirectorio GIT y hacer un submódulo con él?.
Pero eso implica reescribir la historia de la solución, que es un problema si ya lo ha publicado y si algunas personas se están retirando de ella.
Usando rama de filtro para el proceso de extracción.
Para reescribir el repositorio para ver como si
Project1/
había sido su raíz de proyecto y descartar todas las demás historias:
git filter-branch --subdirectory-filter Project1 -- --all
Por lo tanto, puede, por ejemplo, convertir un subdirectorio de la biblioteca en un repositorio propio. Nota la
--
que se separafilter-branch
opciones de opciones de revisión y el--all
para reescribir todas las ramas y etiquetas.
Luego declarar Project1
como un submódulo en SolutionB
:
cd SolutionB
git submodule add /path/to/Project1 Project1
Nota: No use URL locales aquí si planea publicar su
SolutionB
!
git commit -m "Add submodules Project1"
Otros consejos
Dividir el proyecto 1 a su propio repositorio y hágalo un submódulo de la solución A y la solución B.