Referencias de proyectos de Git y Visual Studio

Bien, entonces, la versión corta de mi pregunta sería:

¿Cuál es la mejor manera de manejar las references de proyectos en Git cuando tiene proyectos que se comparten en múltiples soluciones y cómo deben organizarse mis repositorys Git?

La versión larga es:

Somos un pequeño equipo de desarrollo (5 desarrolladores) y actualmente utilizamos TFS como nuestro server de control y compilation de código fuente y Visual Studio es nuestro IDE de elección. Siempre he querido probar cosas nuevas y tratar de mejorar nuestro entorno de desarrollo, así que decidí leer en Git para saber si sería un buen reemploop para la parte de control de fuente de TFS. Simplemente integramos a Jira en nuestro flujo de trabajo, así que decidí probar Stash como nuestro entorno Git debido a lo bien que se integra con Jira. Ahora estoy en el process de tratar de encontrar la manera de organizar los repositorys git y por eso estoy aquí. Ahora voy a describir cuántas de nuestras soluciones están organizadas.

Tenemos un montón de soluciones. Algunas son bibliotecas y otras son Progtwigs que hacen reference a estas bibliotecas a través de la reference del Proyecto en Visual Studio.

Entonces, lo principal que me confunde sería cómo manejar bibliotecas a las que se hace reference en muchas soluciones.

¿Deberíamos comenzar a versionar nuestras bibliotecas y poner cada biblioteca en un repository separado? Parece que esto implicaría mucho mantenimiento adicional cuando una biblioteca recibe una actualización que debe implementarse y esa biblioteca está siendo utilizada por más de 20 soluciones. Me equivoco ? Una desventaja más que veo es que no habría más references de proyectos en Visual Studio y la debugging sería mucho más tediosa.

¿Debo hacer un gran repo con todas nuestras soluciones y de esa manera todas nuestras references están actualizadas?

También pensé que tal vez podría hacer nuestro propio repository nuget que tiene todas las bibliotecas de tesis y de esa manera no sería tan complicado actualizar las bibliotecas referencedas cuando sea necesario. Esto es solo una idea y no he estudiado esto correctamente, así que no estoy seguro de si esto podría ser beneficioso.

Entonces, ¿hay alguna gente que pueda darme algún consejo con respecto a esto?

Esta es una de esas preguntas que lamentablemente no tiene una sola respuesta, depende.

La solución más fácil es siempre tener un único repository. Esto evita muchos de los problemas de administrar repositorys múltiples con diferentes versiones. Pero esto solo funciona si tienes una única versión de todo; es casi imposible tener diferentes ciclos de lanzamiento para dos productos en el mismo repository. De esa manera yace la locura. A medida que los repositorys crecen a cualquier tamaño no significativo, tampoco se escala realmente.

Como Till señala, una opción es Git Submodules . Esto le permitirá cargar dinámicamente el origen de un repository en otro en una confirmación o bifurcación específica. Por supuesto, esto viene con una gran cantidad de problemas , algunos submodules específicos y otros son la naturaleza de los repositorys de enlaces. *

A algunas personas les gusta Git Subtree , que es un poco engañoso y te permite extraer e importar repetidamente el historial de una carpeta a través de los repositorys, y viceversa.

Finalmente, puede confiar en una herramienta de administración de dependencies, dependiendo de su entorno de compilation. No sé lo suficiente sobre Visual Studio para comentar. En Atlassian (actualmente) usamos Maven para resolver esto. Si estabas usando JS, podría ser NPM / Bower, en Ruby son Gemas. Puede ser frustrante tener que lanzar una nueva versión de Library X solo para hacer un cambio trivial para el Progtwig Y, pero en su mayor parte funciona bastante bien.

Esto es realmente un problema continuo, y algo que sé me molesta a diario. Siento que podría haber una oportunidad para una solución mejor que combine lo mejor de los submodules y la administración de dependencies, pero aún no lo he encontrado.

¿Espero que eso ayude?

* Mi mayor queja con los submodules, aparte de los problemas relacionados con las herramientas, es que alienta a las personas a verificar en direcciones URL absolutas a otros repositorys. Esto funciona perfectamente hasta que decida migrar su server Git, o uno de los repositorys, y ahora todo está roto. El otro día descubrí que puedes usar routes relativas , lo cual es claro pero no resuelve el problema.