Хук 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
.