В процессе командной разработки иногда возникает потребность сразу видеть, какие файлы были изменены в коммите, не открывая каждый 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 автоматически становится более информативным.

  • Не нужно вручную перечислять изменённые файлы.

  • История коммитов остаётся чистой и читаемой.

Комментарии (1)


  1. weirded
    30.10.2025 06:34

    чтобы понять изменения, приходится открывать каждый diff

    Хорошее же у вас код-ревью, если это кажется проблемой, которой хочется избежать.