Хук 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/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
pre-commit в папке .git/hooks вашего репозитория Git.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.