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.14
bifurcación, di la suya .gitignore
para 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.15
y 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.15
rama 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 .
fuente
Respuestas:
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:
drush sql-dump
). Realice una confirmación con el volcado o guárdelo en un lugar seguro.drush up drupal
)drush updb
en producción.git reset --hard HEAD~2
deberí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?
fuente
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
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.
fuente
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.
fuente