Пример хука, который удаляет пробелы в конце строки.

Хук pre-commit для удаления пробелов в конце строк (.git/hooks/pre-commit):

#!/usr/bin/env python3

import sys
import subprocess

def strip_trailing_whitespace(filename):
    with open(filename, 'r+') as f:
        lines = f.readlines()
        new_lines = [line.rstrip() + '\n' for line in lines]
        f.seek(0)
        f.writelines(new_lines)
        f.truncate()

def main():
    files_to_check = subprocess.check_output(['git', 'diff', '--name-only', '--cached']).decode('utf-8').splitlines()

    for filename in files_to_check:
        try:
            strip_trailing_whitespace(filename)
        except Exception as e:
            print(f"Error processing {filename}: {e}")
            sys.exit(1)

    # Add modified files back to staging area
    subprocess.run(['git', 'add'] + files_to_check)
    print("Trailing whitespace removed and files re-staged.")
    return 0

if __name__ == "__main__":
    sys.exit(main())

Сделайте скрипт исполняемым: chmod +x .git/hooks/pre-commit


Пример хука Git для удаления пробелов в конце строк (pre-commit)

Этот хук, расположенный в .git/hooks/pre-commit, автоматически удаляет пробелы в конце каждой строки в изменяемых файлах перед коммитом.

Содержимое файла .git/hooks/pre-commit:

#!/usr/bin/env bash

# Проверяем, находимся ли мы в репозитории Git
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
  echo "Не является репозиторием Git. Хук завершает работу."
  exit 0
fi

# Находим все файлы, которые были изменены и находятся в индексе
FILES=$(git diff --cached --name-only -z | tr '\0' '\n')

# Функция для удаления пробелов в конце строки
remove_trailing_whitespace() {
  file="$1"
  if [[ -f "$file" ]]; then
    # Проверяем, является ли файл текстовым (чтобы избежать обработки бинарных файлов)
    file --mime "$file" | grep -q "^$file: text/"
    if [[ $? -eq 0 ]]; then
       echo "Удаление пробелов в конце строк: $file"
       sed -i 's/[[:space:]]*$//' "$file"
       git add "$file" # Повторно добавляем файл в индекс после изменений
    fi
  fi
}

# Итерируемся по всем измененным файлам и удаляем пробелы
if [ -n "$FILES" ]; then
  echo "Проверка и удаление пробелов в конце строк..."
  while IFS= read -r -d $'\n' file; do
    remove_trailing_whitespace "$file"
  done < <(echo "$FILES")
fi

echo "Проверка пробелов завершена."

exit 0

Как установить хук:

  1. Создайте файл с именем pre-commit в папке .git/hooks вашего репозитория Git.
  2. Скопируйте приведенный выше скрипт в этот файл.
  3. Сделайте файл исполняемым: chmod +x .git/hooks/pre-commit

Описание скрипта:

  • #!/usr/bin/env bash: Указывает, что скрипт должен быть выполнен с помощью Bash.
  • git rev-parse --is-inside-work-tree: Проверяет, что мы находимся в репозитории Git.
  • git diff --cached --name-only -z: Получает список измененных файлов, добавленных в индекс (то есть тех, которые будут закоммичены). -z и tr '\0' '\n' используются для обработки имен файлов, содержащих пробелы.
  • remove_trailing_whitespace(): Функция, которая удаляет пробелы в конце каждой строки файла.
    • file --mime "$file" | grep -q "^$file: text/": Проверяет, является ли файл текстовым. Это важно, чтобы не повредить бинарные файлы.
    • sed -i 's/[[:space:]]*$//' "$file": Использует sed для замены (s) любого количества пробельных символов ([[:space:]]*) в конце строки ($) ничем (удалением). Опция -i означает "in-place" (изменить файл на месте).
    • git add "$file": Добавляет измененный файл обратно в индекс, чтобы изменения (удаление пробелов) были включены в коммит.
  • Цикл while: Итерируется по списку измененных файлов и вызывает функцию remove_trailing_whitespace для каждого файла.

Важные замечания:

  • Этот хук изменяет файлы в вашем рабочем каталоге. Убедитесь, что вы понимаете, что он делает, прежде чем использовать его.
  • Он обрабатывает только текстовые файлы. Он старается избегать бинарных файлов, но будьте осторожны.
  • Если у вас есть сложные требования к форматированию кода, рассмотрите возможность использования более продвинутых инструментов, таких как prettier или eslint.
  • Убедитесь, что пользователи, работающие с репозиторием, знают о наличии этого хука, чтобы избежать неожиданного поведения.
0