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
master
rama de un nuevo repositorio. Cree unadevelop
rama 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_branch
desdedevelop
y 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_branches
y solo se fusiona con ladevelop
rama cuando la característica se realiza, se prueba y es estable. Como es estable, se puede usar como puesta en escena. Corte unarelease
rama dedevelop
cuando esté listo para liberar, ate los cabos sueltos, combínelosmaster
y 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_branch
posterior endevelop
* y luegodevelop
volver a hacerlomaster
. Tenga en cuenta quefeature_branch
puede contener código y características no comprobadas, así que tenga cuidado al combinarlodevelop
y 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
master
y unadevelop
rama, ademásfeature_branches
de 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
staging
código como la mejor línea de base para su importación inicial. Esto se debe a que hay cambios en losproduction
que no estánstaging
, debido a las correcciones urgentes, pero mucho menos si no hay cambios enstaging
esoproduction
. Del mismo modo, hay cambios en losdevelopment
que no estánstaging
, debido a las nuevas características, pero es probable que haya muchos menos cambios en losstaging
que no estándevelopment
.Tenga en cuenta que no desea
staging
ser 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
staging
código en unastaging
rama, luego haga ungit checkout -b master staging
para crear sumaster
rama y verifique su código de producción allí. Luego haga unagit checkout -b development staging
para crear sudevelopment
sucursal, y verifique su código de desarrollo allí.Ahora revisa tu
development
rama y únetemaster
a ella. Esto le permitirá resolver la gran cantidad probable de conflictos de fusión mientras mantienemaster
un registro de lo que realmente está en producción.development
ahora 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:
XYZ
Archive-XYZ
XYZ
fuente (excepto .git)Alternativamente, si eres escéptico sobre el valor de esto, en
git diff > XYZ.diff
lugar 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