В процессе командной разработки иногда возникает потребность сразу видеть, какие файлы были изменены в коммите, не открывая каждый diff вручную.
Сегодня я расскажу, как я сделал небольшой, но полезный git hook, который автоматически добавляет в тело коммита список изменённых файлов с пометками: добавлен (A), изменён (M) или удалён (D).
Этот и другие полезные shell скрипты в моём GitHub репозитории:
https://github.com/prog-time/git-hooks
Проблема
Стандартный процесс работы с git выглядит так:
1) Создаёшь коммит:
git add .
git commit -m "Добавил новую функциональность"
2) Заголовок коммита фиксируется, но тело коммита пустое.
3) При создании MR коллеги видят только короткие сообщения коммитов, а чтобы понять изменения, приходится открывать каждый diff.
Это неудобно и замедляет ревью.
Решение: git hook prepare-commit-msg
Git позволяет использовать hooks — скрипты, которые запускаются автоматически на определённых этапах.
Для нашей задачи подойдёт hook prepare-commit-msg, который срабатывает перед открытием редактора коммита.
Я написал скрипт, который:
Берёт staged изменения (
git diff --cached --name-status).Формирует красивый блок со списком файлов и пометками.
Добавляет его в конец тела коммита.
#!/bin/sh
COMMIT_MSG_FILE=".git/COMMIT_EDITMSG"
# Не модифицируем merge commit
if grep -qE '^Merge' "$COMMIT_MSG_FILE"; then
exit 0
fi
# Получаем staged изменения
CHANGES=$(git diff --cached --name-status)
[ -z "$CHANGES" ] && exit 0
{
echo ""
echo "------------------------------"
echo "Изменённые файлы:"
echo "$CHANGES" | while read -r STATUS FILE; do
case "$STATUS" in
A) echo "Добавлен: $FILE" ;;
M) echo "Изменён: $FILE" ;;
D) echo "Удалён: $FILE" ;;
R) echo "Переименован: $FILE" ;;
*) echo "$STATUS: $FILE" ;;
esac
done
} >> "$COMMIT_MSG_FILE"
Пример результата
Добавил новую обработку данных
------------------------------
Изменённые файлы:
Добавлен: src/models/User.js
Изменён: src/api/server.js
Изменён: src/utils/helpers.js
Удалён: src/old/legacy.js
Добавлен: src/components/Button.vue
Такой коммит сразу информативен, и при создании MR в GitLab или GitHub список файлов попадает в описание merge commit’а.
Как п��дключить
1) Сохраняем скрипт в .git/hooks/prepare-commit-msg.
2) Делаем его исполняемым:
chmod +x .git/hooks/prepare-commit-msg
Результаты
MR автоматически становится более информативным.
Не нужно вручную перечислять изменённые файлы.
История коммитов остаётся чистой и читаемой.
weirded
Хорошее же у вас код-ревью, если это кажется проблемой, которой хочется избежать.