Antecedentes: recientemente heredé un conjunto de proyectos en mi empresa y estoy tratando de resolver algunos problemas fundamentales con respecto a cómo se han manejado. Es decir, los desarrolladores anteriores (que ya no están con la compañía) no estaban utilizando ninguna forma de control de fuente, hicieron poca documentación y realmente no tenían ningún buen proceso de desarrollo.
Así que ahora tengo tres servidores de proyectos (desarrollo, preparación, producción) que consisten principalmente en sitios web y aplicaciones y herramientas creadas para aplicaciones de terceros y API que utilizamos, hasta tiendas de scripts SQL y otras cosas. Lo primero que pensé fue poner todo esto en Git antes de que se realicen los cambios y las correcciones, pero estoy teniendo dificultades para encontrar la mejor manera de hacerlo.
Gran parte del desarrollo anterior se realizó directamente en los servidores de producción, lo que ha creado una división entre la base de código de cada servidor. No está claro de inmediato dónde radican todas las diferencias: veo correcciones de errores en el lado de la producción que no se transfieren en el desarrollo / puesta en escena, así como nuevas características en el desarrollo que no se han movido hacia la puesta en escena / producción .
Pregunta: ¿Cuál sería la mejor manera para mí de organizar y mover estos a Git? ¿Cómo estructuraría mis repositorios / ramas para acomodar las diferencias en el código?
He considerado el desarrollo continuo a partir de clones del código del servidor de producción y mantener las bases del código de desarrollo / preparación como referencia histórica. ¿Sería potencialmente un punto de partida, teniendo en cuenta que no sé nada sobre el código de desarrollo / preparación de todos modos? Simplemente podría crear repositorios de los servidores de producción para cada sitio web, herramienta, conjunto de secuencias de comandos, etc., crear ramas para el código de desarrollo / preparación existente, y cualquier nuevo desarrollo se ramificaría desde la base de código del servidor de producción. ¿Esto tiene sentido?
fuente

Respuestas:
Empuje las cosas de producción en la
masterrama de un nuevo repositorio. Cree unadeveloprama a partir de eso y luego combine el servidor provisional en él. Puede terminar con conflictos que deben resolverse. Una vez que estos se resuelven, crear otrafeature_branchdesdedevelopy combinar el servidor de desarrollo en ella. Resolver cualquier conflicto que surja.Esto le deja con 3 ramas, que representan sus entornos de producción, puesta en escena y desarrollo. Producción ->
master, puesta en escena ->develop, desarrollo ->feature_branch. De este modo, todo el desarrollo se realizafeature_branchesy solo se fusiona con ladeveloprama cuando la característica se realiza, se prueba y es estable. Como es estable, se puede usar como puesta en escena. Corte unareleaserama dedevelopcuando esté listo para liberar, ate los cabos sueltos, combínelosmastery luego tendrá su nueva construcción de producción.Una de sus primeras órdenes de negocios después de configurar esto debería ser fusionar la parte
feature_branchposterior endevelop* y luegodevelopvolver a hacerlomaster. Tenga en cuenta quefeature_branchpuede contener código y características no comprobadas, así que tenga cuidado al combinarlodevelopy luegomaster. Una vez hecho esto, todas las ramas deben contener el mismo código, y cualquier desarrollo que se haya realizado en el servidor de producción ahora se transfiere nuevamente al "servidor" de desarrollo.En este modelo, cada proyecto estaría en su propio repositorio, y ese repositorio tendría una
mastery unadeveloprama, ademásfeature_branchesde cualquier trabajo que se realice.EDITAR, para abordar los comentarios: Sí, esto es Gitflow.
Esta estrategia (o Gitflow en general) mantiene el sistema de 3 niveles existente (producción, puesta en escena, desarrollo) con una clara ruta de fusión desde el desarrollo hasta la producción. Importar las bases de código de esta manera también permite que las ramas se sincronicen mientras se mantiene el status quo en producción, al menos, hasta que se puedan probar las fusiones. Esto logra algunos objetivos: obtiene el código en el control de origen, sincroniza y fusiona las diferentes bases de código (por lo que ya no hay correcciones de errores en la producción pero no el desarrollo), y proporciona un buen proceso para usar en el futuro (un proceso que está bien definido y utilizado por muchas personas / equipos / empresas). Si el OP descubre que Gitflow no es adecuado para sus proyectos / equipos / empresa a medida que lo usa / la empresa crece, entonces '
* Es posible que desee cortar otra rama de características y eliminar cualquier característica nueva obvia, y fusionar esa rama en
develop(y luego enmaster). Esto evita que tenga que probar nuevas funciones además de todas las otras pruebas que realizará.fuente
Voy a recomendar el
stagingcódigo como la mejor línea de base para su importación inicial. Esto se debe a que hay cambios en losproductionque no estánstaging, debido a las correcciones urgentes, pero mucho menos si no hay cambios enstagingesoproduction. Del mismo modo, hay cambios en losdevelopmentque no estánstaging, debido a las nuevas características, pero es probable que haya muchos menos cambios en losstagingque no estándevelopment.Tenga en cuenta que no desea
stagingser su línea de base después de su importación inicial. Esta es solo una situación temporal debido a que los cambios no se rastrearon previamente. Las operaciones de bifurcación son mucho más fluidas si agrega cambios en lugar de eliminarlos. Después de su importación inicial, cambie al modelo de ramificación que mejor se adapte a sus necesidades en el futuro.Por lo tanto, verifique su
stagingcódigo en unastagingrama, luego haga ungit checkout -b master stagingpara crear sumasterrama y verifique su código de producción allí. Luego haga unagit checkout -b development stagingpara crear sudevelopmentsucursal, y verifique su código de desarrollo allí.Ahora revisa tu
developmentrama y únetemastera ella. Esto le permitirá resolver la gran cantidad probable de conflictos de fusión mientras mantienemasterun registro de lo que realmente está en producción.developmentahora contiene todos los cambios de cada entorno. Ahora puede cambiar al modelo de ramificación que más le convenga.fuente
Es una buena idea tener la historia. Crearía el repositorio (o uno para cada producto) desde el entorno más estable. Crea ramas o diferencias para los demás.
A un nivel alto:
XYZArchive-XYZXYZfuente (excepto .git)Alternativamente, si eres escéptico sobre el valor de esto, en
git diff > XYZ.difflugar de comprometerte y empujar, y archivar las diferencias.De cualquier manera, debe terminar en un estado en el que pueda comparar fácilmente el código que está ejecutando en cada entorno, que puede usar para establecer un único punto de partida para cada proyecto. Y, si algo se rompe, teóricamente podrás comparar tus cambios con cualquiera de los tres entornos.
fuente