Как лучше всего обновить ядро Drupal, не нарушая репозиторий Git и производственный веб-сайт


У меня есть репозиторий Git, в котором весь мой код находится в главной ветке, и раньше я просто игнорировал все файлы Drupal, поэтому я строго разделял код, который я написал (или изменил или мог бы изменить), и код, который может быть сгенерирован с помощью Drush или чего-то еще.

Это казалось хорошей стратегией, пока мне не пришлось обновить Drupal. Я понял, что хочу иметь возможность откатиться, если дела пойдут плохо, и что может быть лучше, чем использовать Git для этого. Я подумал про себя, что это была бы идеальная ситуация для ветки функций, поэтому я создал ветку drupal-7.14, дал ей свою собственную .gitignore, чтобы игнорировать все мои файлы кода и настроек и обращать внимание только на файлы, которые являются частью установки Drupal, к которым я бы не прикасался. Я сделал обновление вручную (скачать, распаковать, распаковать, скопировать), сортируя пограничные случаи, такие как robots.txt и .htaccess, и перезапись .gitignore от Drupal моим собственным. Я исправил некоторые настройки, которые работали с 7.14, но не с 7.15, чтобы восстановиться после ошибки 500, и тогда все казалось идеальным. Я переименовал ветку в drupal-7.15 и собирался счастливо продолжить свой путь.

Пока я не понял, что я нечаянно сделал: файлы, которые ранее не отслеживались моей главной ветвью, но оставались в рабочем каталоге, теперь были удалены из рабочего каталога, когда я проверил master, так как они больше не были неотслеживаемыми файлами! Д'о!

Если я объединю ветвь drupal-7.15 с мастером, я потеряю разделение кода.

Вероятно, есть какой-то способ преобразовать ветвь в подмодуль. Предполагая, что это возможно, это может быть лучшей стратегией. До того, как я это сделал, я знал, что подмодули были "правильным" решением, но, поскольку я не осознавал побочного эффекта использования ветвей для ранее не отслеживаемых файлов, я решил срезать углы и пойти по этому пути. (Кроме того, все подходы, которые я видел к использованию подмодулей с Drupal, предполагают, что вы начинаете новый проект, и Drupal будет главная ветвь. Мне нежелательно делать чужой код главной ветвью, а у меня уже было репо с главной ветвью. Это выглядело так, как будто было бы излишне сложно просто выполнить обновление.)

Возможно, есть какое-то другое решение, о котором я не подумал.

Как я могу наилучшим образом оправиться от этого с наименьшими возможными недостатками?

ОБНОВЛЕНИЕ: Это находится в разработке (в виртуальной машине Linux на моем ноутбуке) и еще не запущено в производство. К тому времени, когда мы приступим к производству, я планирую, чтобы все было упаковано в функциональные модули, но это еще не сделано.

ОБНОВЛЕНИЕ 2: Подмодули могут не работать. Согласно Pro Git, "Подмодули позволяют хранить репозиторий Git в качестве подкаталога другого репозитория Git". Drupal не обеспечивает такого приятного разделения. Вместо того, чтобы весь код Drupal находился в подкаталоге, связь более или менее перевернута, но по-прежнему нет чистое разделение, так как вы, возможно, редактируете свой.htaccess и robots.txt , так что ваш код и репозиторий Drupal смешаны вместе. Я ищу обходной путь для решения этой проблемы.

Author: Community, 2012-09-04

3 answers

Из приведенного выше обсуждения следует, что ваш вопрос касается не исправления вашего репозитория git, а поддержания сайта Drupal в git и того, как это работает с основными обновлениями.

Я думаю, что стандартная практика на самом деле заключается в хранении всех файлов в вашем репозитории, включая ядро Drupal. Разделение кода Drupal от пользовательского кода кажется хорошей идеей, но я не думаю, что это необходимо, и я не вижу, какие преимущества это дает вам. Также, похоже, предполагается, что вы никогда не захотите исправьте ядро (или сделайте это как часть вашего развертывания), что, хотя это и не лучшая практика, определенно то, что вы хотите сделать, если что-то сломается в производстве. Сохранение ваших обязательств приятными и сосредоточенными также помогает добиться такого рода разделения.

Решение, которое я использовал, состоит в том, чтобы хранить весь код в одном хранилище, добавлять как можно больше функций или других видов экспорта/кода/конфигурации и поддерживать список исправлений, которые необходимо применить к готовому ядру и продолжение.

При обновлении ядра запустите в своей среде разработки:

  • Убедитесь, что рабочий каталог чист
  • Дамп последней базы данных (drush sql-dump). Либо сделайте фиксацию с помощью дампа, либо сохраните его в безопасном месте.
  • Обновление ядра (drush up drupal)
  • Зафиксируйте все изменения.
  • Проверьте файл исправлений. Если необходимо применить какие-либо исправления, примените их и сделайте еще один коммит
  • Выполнить update.php при необходимости (уже сделано, если вы использовали drush для обновление)
  • Протестируйте свой сайт разработчика. Если все в порядке, отправьте код в производство. Запустите drush updb на производстве.
  • Если возникла проблема и вам нужно вернуться, либо вернитесь, либо сбросьте свое репо (git reset --hard HEAD~2 должно это сделать), либо отмените два коммита, если вы хотите сохранить историю. Замените вашу базу данных на дамп.

Дамп базы данных необходим, поскольку в противном случае вы не сможете отменить изменения, внесенные в базу данных обновлениями. Вы также можете выполнить обновление в ветке, в которой возврат дела просто означает проверку мастера. Это немного нецелесообразно, если вы работаете на одном сайте разработчика, потому что вы не можете переключиться обратно на master и продолжать работать там параллельно из-за базы данных.

Использование этого более простого рабочего процесса на стороне git позволит вам использовать полную мощность git, когда вам это нужно, без усложнения подмодулей и т.д. Если это кажется недостаточным, не могли бы вы объяснить, зачем вам нужно дальнейшее разделение кода?

 10
Author: goron, 2012-09-04 18:07:18

Из моих комментариев выше, этот вопрос, который у вас есть, касается поддержки файлов сайта Drupal с помощью git и того, как это работает с обновлениями ядра. Вы ничего не упомянули о резервном копировании и обновлении базы данных. Я постараюсь ничего не копировать из ответа горона.

Я создал сообщение в блоге об этой проблеме Обновление ядра Drupal на вашем веб-сайте с помощью Git

Альтернативные методы

  1. Выполнить команду Drush drush up drupal
  2. Применить исправление различий между версиями. См. http://drupal.org/node/359234 & http://fuerstnet.de/en/drupal-upgrade-easier

Вы этого не указали, но если вы заинтересованы в отслеживании изменений между версиями Drupal, я бы сделал это, используя теги вместо ветвей . Как только вы закончите с фиксацией обновления на master, пометьте свой код как 7.x.

 0
Author: iStryker, 2020-06-15 09:13:00

Я запускаю установку с двумя ветвями, как и в OP: одна ветвь только с моим пользовательским кодом и одна ветвь, в которой есть как мои пользовательские, так и основные файлы. Я столкнулся с такой же ситуацией: игнорируемые основные файлы удаляются при переключении между ветвями.

В итоге у меня получилось два одинаковых каталога git: - один для работы над моим пользовательским кодом, с основными файлами, присутствующими, но игнорируемыми, и я бы никогда не переключился на "полную" ветвь в этом каталоге - один для выполнения слияний, так что что я буду выполнять переключение ветвей и объединение только внутри этого каталога.

Причина, по которой я выбираю эту настройку с двумя ветвями, заключается в том, что я хочу легко отслеживать все локальные фиксации в основных файлах, проще проверять и повторно применять основные моды при обновлении основных файлов.

 0
Author: sillyxone, 2014-05-07 14:54:06