¿Cómo administrar varios proyectos dependientes de Visual Studio para un equipo pequeño usando git?

Somos un pequeño equipo de desarrolladores (<5) que trabajan principalmente conectados a la intranet.

Tenemos varios proyectos C # utilizados en varias soluciones, algunas de ellas dependen de otras y soluciones que las utilizan.

Un pequeño ejemplo:

We have projects P, Q, R. P depends on Q and R, Q depends on R. There are two solutions using these: A and B. A uses P, Q, R, B uses Q and R. The dependencies should also include the versions(commit), eg P V3.7 requires Q V2.4 and R V1.3 

Hasta ahora no hemos encontrado una manera fácil y segura de lograr todo lo siguiente:

  1. queueborar (es decir, no solo repositorys personales)
  2. poner proyectos / soluciones bajo control de versiones (actualmente git; esto podría cambiar si es realmente necesario)
  3. hazlo fácilmente sin el temor permanente de romper cosas si algo no se hace de la manera correcta (es decir, sin git submodule )
  4. una solución / proyecto debería "recordar" la versión de sus proyectos dependientes de alguna manera.

En este momento incluimos proyectos que una solución depende de "por fuente", ya que es la forma más cómoda de corregir un error en este proyecto. Pero este no es un requisito difícil.

Hemos intentado usar el git submodule , pero nos resultó difícil de usar (especialmente desde Visual Studio) y queueborar (el origin submodules puede apuntar a un repository incorrecto). Además, si una solución incluye dos proyectos A , B que requieren el mismo otro proyecto C , esto debería ser a) la misma versión de C yb) no incluida dos veces.

También hemos intentado poner todos los proyectos en "destinos conocidos", por ejemplo, poner todas las carpetas de proyectos en una carpeta de "proyectos de estudio visuales y soluciones" y proyectos de reference con routes relativas. Pero esto solo funciona si siempre quieres include la última versión de un proyecto.

También traté de usar un almacenamiento NuGet personal pero no pude hacerlo funcionar.

La búsqueda de este tema no produjo ningún resultado (debe haber estado buscando las palabras key incorrectas), aunque estoy seguro de que debería ser una prioridad para muchos equipos.

Estaría agradecido si alguien pudiera darme una pista sobre cómo configurar los repositorys y / o un set de herramientas para lograr esto.

Creo que deberías echar un vistazo a los submodules de git. Puede hacer todo lo que ha pedido. Es probable que desee pasar unas horas para sentirse cómodo con él. Intenta configurar algunos repositorys de testing y experimentando. Haz todo desde la línea de command. Si está utilizando una herramienta de integración en Visual Studio, puede hacer las cosas de manera diferente o puede que no se actualice con las últimas funciones de git.

Cuando agrega un submodule a un proyecto, git asociará una label o bifurcación con ese submodule. Entonces podrías hacer algo como esto:

Digamos que tengo 5 repositorys de git: A, B, P, Q, R. Todos existen independientemente.

En virtud de AI haría:

 git submodule add <P> 

Esto es un cambio a A, así que tengo que enviarlo con un post:

 git add . git commit -m "Added dependency P" 

Ahora tengo P clonado en un subdirectory de A. Si quiero una versión específica de P, lo haría:

 cd P git checkout V3.7 

Ahora A tendría un cambio que comprometer, es decir, el cambio a una grabación A que necesita P en la Versión 3.7, por lo que quiero confirmar ese cambio:

 cd .. git add . git commit -m "Use P version 3.7" 

Ahora supongamos que realizas algunas actualizaciones a P y cambias la versión 3.8. De vuelta en A, repetirías el process:

 cd P git checkout V3.8 cd .. git add . git commit -m "Updated P to V3.8" 

Alguien más que esté trabajando en A, después de desconectarse del repository compartido, solo tendría que hacer:

 git submodule update 

Mientras tanto, el proyecto B, que también puede tener P como submodule, aún podría estar en V3.7.

Esto puede ser un poco desalentador, pero no lo rechaces porque es difícil. Si baja esto, será mucho más suave navegando.