¿Cómo comienzo a usar Git para diferentes bases de código de diferentes servidores?

11

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?

usuario9268966
fuente
¿Entonces todos los desarrolladores se fueron antes de que empezaras?
Ewan
Si; solo fueron tres desarrolladores en este conjunto particular de proyectos, aunque habían estado trabajando en esto durante bastantes años. Me dijeron que se fueron abruptamente y me llevaron para comenzar a recoger los pedazos de lo que dejaron.
user9268966
Echa un vistazo a " nvie.com/posts/a-successful-git-branching-model " es un modelo que se usa con frecuencia.
Patrick Mevzek
1
@RobertHarvey y? Estoy usando el mismo modelo en el desarrollo de software "one guy" (yo), y el punto importante es la configuración con ramas como: master, dev (elop), feature-X, hotfix-Y. Esto funciona independientemente de la cantidad de personas y repositorios.
Patrick Mevzek
2
@RobertHarvey como dije: a menudo se usa , obviamente no es una solución para el 100% de los casos de uso, pero es al menos útil leer antes de decidir qué modelo usar. Y hubo desarrolladores anteriores, por lo que el chico solitario puede no estar siempre solo ... :-)
Patrick Mevzek

Respuestas:

10

Empuje las cosas de producción en la masterrama de un nuevo repositorio. Cree una developrama 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 otra feature_branchdesde developy 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 realiza feature_branchesy solo se fusiona con la developrama cuando la característica se realiza, se prueba y es estable. Como es estable, se puede usar como puesta en escena. Corte una releaserama de developcuando esté listo para liberar, ate los cabos sueltos, combínelos mastery 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 en develop* y luego developvolver a hacerlo master. Tenga en cuenta que feature_branchpuede contener código y características no comprobadas, así que tenga cuidado al combinarlo developy luego master. 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 una developrama, además feature_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 en master). Esto evita que tenga que probar nuevas funciones además de todas las otras pruebas que realizará.

mmathis
fuente
1
Suena como GitFlow.
Robert Harvey
1
Esta es una pequeña respuesta de culto de carga. ¿Cómo ayudaría gitflow específicamente a resolver el problema mencionado en la pregunta?
Sr. Cochese
@MrCochese ver mi edición
mmathis
Al principio, su respuesta parecía solo una explicación de Gitflow que no era lo que estaba buscando, pero su edición agregó el contexto muy necesario para responder realmente a la pregunta en cuestión. No iré con Gitflow ya que no creo que sea apropiado para la situación, sin embargo, aprecio la lógica detrás de la idea y su minuciosidad. Sugeriría agregar más de su proceso de pensamiento a las respuestas en el futuro para proporcionar ese contexto como mencioné antes.
user9268966
3

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 los productionque no están staging, debido a las correcciones urgentes, pero mucho menos si no hay cambios en stagingeso production. Del mismo modo, hay cambios en los developmentque no están staging, debido a las nuevas características, pero es probable que haya muchos menos cambios en los stagingque no están development.

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 una stagingrama, luego haga un git checkout -b master stagingpara crear su masterrama y verifique su código de producción allí. Luego haga una git checkout -b development stagingpara crear su developmentsucursal, y verifique su código de desarrollo allí.

Ahora revisa tu developmentrama y únete master a ella. Esto le permitirá resolver la gran cantidad probable de conflictos de fusión mientras mantiene masterun 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.

Karl Bielefeldt
fuente
2

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:

  1. Crea un nuevo repositorio
  2. Desde una copia de trabajo basada en la producción: agregue todo, confirme y envíe
  3. Checkout master a un nuevo directorio
  4. Para cada ambiente adicional XYZ
    1. Crear sucursal Archive-XYZ
    2. Reemplace todo con XYZfuente (excepto .git)
    3. agregar todo, confirmar y empujar

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.

svidgen
fuente