Как лучше всего обновить ядро 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 смешаны вместе. Я ищу обходной путь для решения этой проблемы.
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, когда вам это нужно, без усложнения подмодулей и т.д. Если это кажется недостаточным, не могли бы вы объяснить, зачем вам нужно дальнейшее разделение кода?
Из моих комментариев выше, этот вопрос, который у вас есть, касается поддержки файлов сайта Drupal с помощью git и того, как это работает с обновлениями ядра. Вы ничего не упомянули о резервном копировании и обновлении базы данных. Я постараюсь ничего не копировать из ответа горона.
Я создал сообщение в блоге об этой проблеме Обновление ядра Drupal на вашем веб-сайте с помощью Git
Альтернативные методы
- Выполнить команду Drush
drush up drupal
- Применить исправление различий между версиями. См. http://drupal.org/node/359234 & http://fuerstnet.de/en/drupal-upgrade-easier
Вы этого не указали, но если вы заинтересованы в отслеживании изменений между версиями Drupal, я бы сделал это, используя теги вместо ветвей . Как только вы закончите с фиксацией обновления на master, пометьте свой код как 7.x.
Я запускаю установку с двумя ветвями, как и в OP: одна ветвь только с моим пользовательским кодом и одна ветвь, в которой есть как мои пользовательские, так и основные файлы. Я столкнулся с такой же ситуацией: игнорируемые основные файлы удаляются при переключении между ветвями.
В итоге у меня получилось два одинаковых каталога git: - один для работы над моим пользовательским кодом, с основными файлами, присутствующими, но игнорируемыми, и я бы никогда не переключился на "полную" ветвь в этом каталоге - один для выполнения слияний, так что что я буду выполнять переключение ветвей и объединение только внутри этого каталога.
Причина, по которой я выбираю эту настройку с двумя ветвями, заключается в том, что я хочу легко отслеживать все локальные фиксации в основных файлах, проще проверять и повторно применять основные моды при обновлении основных файлов.