Как подключить внешний инструмент форматирования к Git-хукам?

Подключение внешнего инструмента форматирования к Git-хукам:
  1. Определите инструмент: Выберите инструмент форматирования кода (например, `prettier`, `black`, `eslint --fix`).
  2. Установите инструмент: Установите инструмент в проект локально (например, `npm install --save-dev prettier`) или глобально.
  3. Создайте Git-хук `pre-commit`: В `.git/hooks/pre-commit` создайте исполняемый скрипт (например, на Bash, Python или Node.js). Сделайте файл исполняемым: `chmod +x .git/hooks/pre-commit`.
  4. В скрипте `pre-commit`:
    • Найдите измененные файлы, подлежащие форматированию (`git diff --cached --name-only`).
    • Запустите инструмент форматирования на этих файлах (`prettier --write <список файлов>`, `black <список файлов>`, etc.).
    • Добавьте отформатированные файлы в индекс (`git add <список файлов>`).
    • Выйдите с кодом 0, если форматирование прошло успешно, иначе с кодом 1, чтобы отменить коммит.
  5. Пример (Bash):
    #!/bin/sh
    FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep '\.js$' ) # Только JS файлы
    if [ -n "$FILES" ]; then
      echo "Formatting files with prettier..."
      npx prettier --write $FILES
      git add $FILES
      echo "Formatting complete."
    fi
Важно: Убедитесь, что у скрипта `pre-commit` есть права на выполнение (`chmod +x .git/hooks/pre-commit`). Рассмотрите использование менеджера хуков (husky, pre-commit) для упрощения управления хуками и распространения их конфигурации между разработчиками.

Подключение внешнего инструмента форматирования к Git-хукам

Подключение внешнего инструмента форматирования (например, Prettier, Black, gofmt) к Git-хукам позволяет автоматически форматировать код перед коммитом, обеспечивая соблюдение единого стиля в репозитории. Вот как это делается:

1. Выбор инструмента форматирования

Определите, какой инструмент форматирования соответствует вашему языку программирования и предпочтениям. Установите его локально или глобально в вашей системе.

2. Установка Git-хуков

Git-хуки – это скрипты, которые автоматически выполняются Git'ом при определенных событиях (например, перед коммитом, перед отправкой изменений на сервер). Наиболее подходящий хук для форматирования - pre-commit.

3. Создание скрипта pre-commit

В корневом каталоге вашего Git-репозитория перейдите в папку .git/hooks. Если она не существует, создайте её. Создайте файл с именем pre-commit (без расширения) и сделайте его исполняемым.

4. Написание скрипта pre-commit

Внутри файла pre-commit напишите скрипт, который будет выполнять следующие действия:

  1. Получать список файлов, находящихся в стадии подготовки к коммиту (staged).
  2. Запускать инструмент форматирования на этих файлах.
  3. Добавлять отформатированные файлы обратно в staging area (индекс).

Пример скрипта pre-commit для Prettier (JavaScript/TypeScript):

#!/bin/sh
# pre-commit hook to format staged files with Prettier

# Get staged files
staged_files=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.(js|jsx|ts|tsx|css|scss|less|html|json|md)$')

if [ -n "$staged_files" ]; then
  echo "Running Prettier on staged files..."
  npx prettier --write $staged_files

  # Add formatted files back to staging area
  git add $staged_files
  echo "Prettier finished."
else
  echo "No files to format."
fi

exit 0

Пример скрипта pre-commit для Black (Python):

#!/bin/sh
# pre-commit hook to format staged files with Black

# Get staged files
staged_files=$(git diff --cached --name-only --diff-filter=ACMR | grep '\.py$')

if [ -n "$staged_files" ]; then
  echo "Running Black on staged files..."
  black $staged_files

  # Add formatted files back to staging area
  git add $staged_files
  echo "Black finished."
else
  echo "No files to format."
fi

exit 0

5. Разрешения на выполнение

Убедитесь, что у файла .git/hooks/pre-commit установлены права на выполнение:

chmod +x .git/hooks/pre-commit

6. Тестирование

Измените какой-либо файл, соответствующий формату, который обрабатывает ваш инструмент, и выполните git add и git commit. Скрипт pre-commit должен запуститься автоматически и отформатировать файл перед коммитом.

7. Общие рекомендации

  • Используйте относительные пути: В скрипте pre-commit лучше использовать относительные пути к инструментам форматирования (например, с помощью npx), чтобы избежать зависимостей от глобальных установок.
  • Обработка ошибок: Добавьте обработку ошибок в скрипт, чтобы коммиты не прерывались из-за ошибок форматирования.
  • Отключить хук: Если нужно временно отключить хук, можно использовать опцию --no-verify при коммите: git commit --no-verify -m "Your commit message".
  • husky и lint-staged: Рассмотрите использование инструментов husky и lint-staged. Они упрощают управление Git-хуками и позволяют запускать линтеры и форматтеры только на измененных файлах. Это значительно ускоряет процесс.
0