Мини-статьи
September 13, 2021

Как запретить коммит, если не поменялся определённый файл?

Уж не знаю, насколько это часто бывает в разработке, но недавно такое пригодилось мне.

Вкратце опишу суть проблемы: есть файл, который должен меняться при каждом коммите (допустим, чейнджлог, или ещё какая-нибудь описательная штука). По идее, мы должны заполнять его по зову сердца, но часто бывает сильное желание сделать это "как-нибудь потом", которое, естественно, приводит к тому, что ничего дальше не делается :)

И вот, решение: используя git-хуки мы можем сделать так, чтобы если в коммите нет какого-то файла (то есть, он не был изменён) — мы не разрешали сделать пуш. Так сказать, наводим твёрдый порядок жёсткой рукой! А то слишком удобно живётся.

Итак, речь пойдёт про окружение Linux и Mac. Предположим, что наш файл называется changeme.txt. Нам понадобится такой вот шелл-скрипт:

#!/bin/bash

changes=$(git diff --cached --name-only)

if [[ $changes == *"changeme.txt"* ]]; then
  exit 0;
else
  echo "ERROR: changeme.txt is not updated"
  exit 1;
fi

Теперь дадим ему разрешение выполняться:

chmod +x ./changeme-detect.sh

Ну а дальше дело за малым — с помощью какого-нибудь lint-staged или husky добавляем запуск этого скрипта на хук коммита.

Теперь при коммите будет происходить следующее: скрипт будет смотреть, есть ли в списке изменённых файлов тот, который мы ищем; если есть — всё ок, можно пушить, но вот если нет — коммит не пройдёт. Конечно, всегда можно отключить хуки и всё пройдёт нормально, но это уже бОльшая сделка с совестью, чем отложить что-то на потом.

Вот как-то так. Вам слишком удобно работается? Тогда добавляйте это в свой проект :)