Обновляем файловую систему с помощью 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, программирование, полезное, утилиты, программы




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



PHP 8.0 поставляется с типами объединений, JIT-компиляцией
Программа "Запомни домино" - тренировка внимания с помощью домино
Урок 19. Простые функции форматирования строк C#