¿Cuál es la mejor práctica para actualizar el núcleo de Drupal sin romper el repositorio de Git y el sitio web de producción?

13

Tengo un repositorio Git en el que todo mi código está en la rama maestra, y anteriormente solo ignoraba todos los archivos de Drupal, por lo que mantuve una separación estricta entre el código que escribí (o modifiqué o podría modificar) y el código eso podría generarse con Drush o lo que sea.

Esto parecía una buena estrategia hasta que tuve que actualizar Drupal. Me di cuenta de que quiero poder retroceder si las cosas salieron mal, y qué mejor herramienta para usar que Git para hacerlo. Pensé que esta sería la situación perfecta para una bifurcación de características, así que hice una drupal-7.14bifurcación, di la suya .gitignorepara ignorar todos mis archivos de código y configuración y prestar atención solo a los archivos que son parte de la instalación de Drupal, lo cual no haría. No se conmove. Realicé una actualización a mano (descargar, descomprimir, descomprimir, copiar), clasificando casos límite como robots.txt y .htaccess, y sobrescribiendo el .gitignore de Drupal con el mío. Arreglé algunas configuraciones que funcionaban con 7.14 pero no con 7.15, para recuperarme de un error 500, y luego todo parecía perfecto. Cambié el nombre de la sucursal drupal-7.15y estaba a punto de seguir felizmente mi camino.

Hasta que me di cuenta de lo que había hecho inadvertidamente: los archivos que mi rama maestra no había rastreado anteriormente pero que se dejaron en el directorio de trabajo ahora se eliminaron del directorio de trabajo cuando desprotegí la maestra, ¡ya que ya no eran archivos sin seguimiento! D'oh!

Si fusiono la drupal-7.15rama con master, perderé la separación del código.

Probablemente haya alguna forma de convertir una rama en un submódulo. Suponiendo que sea posible, esa podría ser la mejor estrategia. Antes de hacer esto, sabía que los submódulos eran la solución "correcta", pero como no me di cuenta del efecto secundario del uso de ramas para archivos previamente no rastreados, decidí cortar las esquinas e ir por esa ruta. (Además, todos los enfoques que he visto para usar submódulos con Drupal suponen que está comenzando un nuevo proyecto y Drupal será la rama maestra. No es deseable que convierta el código de otra persona en la rama maestra, y ya tenía un repositorio con una rama maestra. Esto parecía que sería innecesariamente complicado hacer una actualización).

Puede haber alguna otra solución en la que no haya pensado.

¿Cómo puedo recuperarme mejor de esto con la menor cantidad posible de desventajas?

ACTUALIZACIÓN : Esto está en desarrollo (en una máquina virtual Linux en mi computadora portátil) y aún no se ha pasado a producción. Para cuando empecemos la producción, planeo tener todo envuelto en módulos de funciones, pero eso aún no está implementado.

ACTUALIZACIÓN 2 : los submódulos pueden no funcionar. Según Pro Git , "los submódulos le permiten mantener un repositorio de Git como subdirectorio de otro repositorio de Git". Drupal no proporciona una separación tan agradable. En lugar de que todo el código de Drupal esté en un subdirectorio, la relación está más o menos invertida, pero todavía no hay una separación limpia, ya que puede estar editando su .htaccess y robots.txt, por lo que su código y el repositorio de Drupal se mezclan. Estoy buscando una solución a este problema .

iconoclasta
fuente
Tu pregunta es realmente sobre git. Creo que obtendrá mejores respuestas al migrar esto a un sitio que no es específico de Drupal. Acerca de las actualizaciones: siempre hago actualizaciones al compilar el archivo make en un nuevo directorio y luego actualizo el enlace simbólico del directorio público antiguo al nuevo, lo que hace triviales las reversiones de código.
Letharion
2
@Letharion no estoy de acuerdo. Todos pasarán por este proceso de actualizar su sitio de su versión actual a una nueva. Usar git para actualizar el núcleo es bastante común, ya que este es un método ampliamente utilizado para actualizar módulos. Mucha gente luchará con este problema, como lo he hecho antes. Actualmente no hay buena documentación en la web que aborde este problema y creo que este es un buen lugar para ello.
iStryker
Solo para aclarar, creo que una pregunta sobre "La mejor práctica para actualizar Drupal" sería más adecuada, ya que esta pregunta es realmente "¿Cómo reparo un error de git?", Que no creo que pertenezca aquí. Sin embargo, no tengo sentimientos fuertes sobre el tema, así que lo dejaré así. :)
Letharion
OK bastante justo. El problema que tiene Brandon es bastante común. Tal vez debería crear una nueva pregunta o reescribir esta (y mover el resto a otra pregunta). Los primeros 2-3 párrafos son comunes. Crea un repositorio git de 7.x-1.0 y desea actualizar a 7.x-1.1. Los archivos del problema son .gitignore, .htaccess y robot.txt. A veces quieres que se rastreen porque están modificados, a veces no quieres que se rastreen porque están modificados. Al actualizar el repositorio, crea una nueva rama, la fusión o simplemente actualiza el maestro. @ Sugerencia Letharion?
iStryker
@Letharion: Pensé en poner esto en StackOverflow como una pregunta de Git o aquí como una pregunta de Drupal. Si lo pongo allí, todos se quejarían y dirían que esto es realmente sobre Drupal, y creo que realmente tendrían razón. Aunque Git puede ser la herramienta utilizada para reparar la situación, la dirección tomada depende de un conocimiento de Drupal. Todos los usuarios de Drupal usan Git (o deberían hacerlo si no lo hacen), pero solo una pequeña fracción de los usuarios de Git usa Drupal. Las personas que responden a las preguntas sobre Git no van a entender los antecedentes de Drupal.
iconoclasta

Respuestas:

10

De la discusión anterior parece que su pregunta no se trata de arreglar su repositorio git, sino de mantener un sitio Drupal en git y cómo funciona con las actualizaciones principales.

Creo que la práctica estándar es, de hecho, mantener todos los archivos en su repositorio, incluido el núcleo de Drupal. La separación del código Drupal del código personalizado parece una buena idea, pero no creo que sea necesario, y no veo qué ventajas le ofrece. También parece suponer que nunca querrá parchear el núcleo (o tendrá que hacerlo como parte de su implementación), lo que, aunque no es la mejor práctica, definitivamente es algo que desea poder hacer si algo se rompe en producción. Mantener tus compromisos agradables y enfocados también ayuda a lograr este tipo de separación.

La solución que he usado es mantener todo el código en el mismo repositorio, poner todo lo posible en Características u otros tipos de exportaciones / código / configuración, y mantener una lista de parches que deben aplicarse fuera de -box core y contrib.

Cuando actualice core, comience en su entorno de desarrollo:

  • Asegúrese de que el directorio de trabajo esté limpio
  • Volcar la última base de datos ( drush sql-dump). Realice una confirmación con el volcado o guárdelo en un lugar seguro.
  • Actualizar core ( drush up drupal)
  • Cometer todos los cambios.
  • Verifique el archivo de parches. Si necesita aplicar algún parche, aplíquelo y realice otra confirmación
  • Ejecute update.php si es necesario (ya lo hizo si utilizó drush para la actualización)
  • Pon a prueba tu sitio de desarrollo. Si todo está bien, envíe el código a producción. Ejecutar drush updben producción.
  • Si hay un problema y necesita revertir, revierta o restablezca su repositorio ( git reset --hard HEAD~2debería hacerlo), o revierta las dos confirmaciones si desea mantener el historial. Reemplace su base de datos con el volcado.

El volcado de la base de datos es necesario porque de lo contrario no puede deshacer los cambios realizados en la base de datos mediante actualizaciones. También puede realizar la actualización en una rama, en cuyo caso la reversión solo significa retirar el maestro. Es un poco desaconsejable si está trabajando en un sitio de desarrollo porque realmente no puede volver a master y seguir trabajando allí en paralelo debido a la base de datos.

El uso de este flujo de trabajo más simple de git-side le permitirá usar toda la potencia de git cuando lo necesite sin la complicación de submódulos, etc. Si esto no parece adecuado, ¿podría explicar por qué necesita una mayor separación del código?

goron
fuente
0

De mis comentarios anteriores, esta pregunta que tiene es sobre el mantenimiento de los archivos de un sitio Drupal con git, y cómo funciona con las actualizaciones principales. No mencionó nada acerca de hacer copias de seguridad y actualizar la base de datos. Intentaré no copiar nada de la respuesta de Goron.

He creado una publicación de blog sobre este tema Actualizando el núcleo de Drupal en su sitio web con Git

Metodos alternativos

  1. Ejecutar comando Drush drush up drupal
  2. Aplica un parche de las diferencias entre las versiones. Ver http://drupal.org/node/359234 y http://fuerstnet.de/en/drupal-upgrade-easier

No dijo esto, pero si está interesado en rastrear los cambios entre las versiones de Drupal, lo haría usando etiquetas en lugar de ramas . Una vez que haya terminado con su compromiso de actualización a maestro , etiquete su código como 7.x.

iStryker
fuente
Si entiendo correctamente, también está sugiriendo que guarde todo el código central de Drupal en el mismo repositorio. Este parece ser el consenso. Soy reacio, pero es posible que tenga que ceder y hacerlo de esa manera.
iconoclasta el
Sí, todo en un repositorio. Tengo módulos, perfiles y temas dentro del repositorio principal / principal que son sus propios repositorios git. No sé si es la mejor manera, pero es la mejor manera que conozco.
iStryker
Esta solución no proporciona ninguna forma de retroceder. Mi razón para votar en contra.
Andre Baumeier
@Serpiente: No veo por qué la falta de una forma de regresar debería ser motivo de un voto negativo. Si es el mejor enfoque, es suficiente. Si no cree que es el mejor enfoque, indique por qué no.
iconoclasta
@iconoclast ¿de qué se trata un sistema de revisión si no puede volver a su línea de tiempo? Por ejemplo, piense en una actualización fallida: ¿cuál sería la forma de recuperarse aquí? Una versión enviada de "lo que sea" software debe tener dependencias claras, que incluyen especialmente el núcleo del marco. De lo contrario, simplemente puede soltar su git y comenzar a hacer implementaciones de FTP nuevamente. solo mis 2 centavos.
Andre Baumeier
0

Estoy ejecutando la configuración con dos ramas como la OP: una rama con mi código personalizado solamente y una rama que tiene mis archivos personalizados y principales. Me encontré con la misma situación: los archivos principales ignorados se eliminan al cambiar de rama.

Terminé teniendo dos directorios git idénticos: uno para trabajar en mi código personalizado, con los archivos principales presentes pero ignorados, y nunca cambiaría a la rama "completa" en este directorio, uno para realizar fusiones, de modo que realice el cambio de rama y la fusión dentro de este directorio solamente.

La razón por la que elijo esta configuración de dos ramas es porque quiero rastrear fácilmente todas las confirmaciones locales a los archivos principales, es más fácil examinar y volver a aplicar las modificaciones principales al actualizar los archivos principales.

sillyxone
fuente