Обновляем файловую систему с помощью diff и patch
Как обычно происходит обновление сайта, блога, CMS или CRM в случае мелких ручных правок? Просто обновляется информация в базе данных (админка, phpMyAdmin) и/или заливается новый исправленный файл по SFTP. Такой процесс прост даже в случае крупных правок – например, полной переработки сайта: в конце заливаем все измененные файлы на боевой сервер, при необходимости перезапускаем и все. Но если в это же время на боевом сервере ведутся какие-то работы? В этом случае заливать файлы и обновлять БД просто так нельзя – мало ли какие там вносили изменения во время работы? Установлены новые расширения, добавлена информация и т.д. В этом случае безболезненно обновить (пропатчить) файлы можно с помощью команды diff и утилиты patch.
Для начала надо получить список изменений. Для этого запускаем Git Bash и вводим такую команду:
git diff хэш_первый_коммит хэш_последний_коммит > lsr.patchхэши коммитов в данной ситуации – это уникальные их идентификаторы. Например, в gitlab можно узнать их из адресной строки
Также первые коммиты (хэш) можно узнать с помощью команды:
git log –reverseТеперь, когда мы знаем две точки, между которым необходимо зафиксировать изменения, создаем патч с помощью команды diff и получаем файл lsr.patch. Его можно открыть в текстовом редакторе и посмотреть в какие файлы и какие именно изменения будут вноситься. Структура понятна интуитивно: первая строка адреса меняемых файлов (обычно совпадают), а ниже изменения. Теперь необходимо залить этот файл на сервер (по SFTP например) в его корень, а подключиться к боевому серверу по SSH и выполнить примерно такую команду от root:
patch -p1 < lsr.patchЕсли утилиты патч нет на сервере, то установить её несложно – система на сервере сама подскажет вариант. Но почему примерно такую? Потому что, вообще я бы рекомендовал для начала запустить с параметром --dry-run:
patch --dry-run -p1 < lsr.patchТак у вас будет произведена имитация обновления файлов и покажутся возможные ошибки. Например, такая:
warning: CRLF will be replaced by LF in include/file.php. The file will have its original line endings in your working directoryВозникает в основном из-за того, что у win-lin-mac немного разные окончания строк (невидимые символы). Но это уже другая тема. Есть и другие интересные ключи(параметры), например, --ignore-whitespace или --fuzz. Последний дает возможность задать максимальное число возможных расхождений символов.
В общем, попробуйте воспользоваться утилитой patch в работе и, возможно, вы её полюбите.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.