Всегда приятно начинать проект с нуля, самому создавать под него репозитарий, определять принятый в нём стиль кодирования, да и многое другое. Но иногда нам достаются «трудные дети» с тяжелым прошлым, включающим мешанину табуляции и пробелов, разных способов обрыва строки, кодировок. Понятное дело, что все это приводит систему контроля версий к истерике. Но не беда. Linux to the rescue!
Форматирование
Нам пригодится утилита expand.
find ./ -type f -name "*.php" -exec sh -c 'expand -t 4 {} > _tmp_ && mv _tmp_ {}' \;
Данная команда заменит в каждом *.php файле табуляцию на 4 пробела. В обратную сторону работает команда unexpand.
Завершение строки
Исторически так сложилось, что способов завершить строку в текстовом файле довольно много. Самые распространенные: версия Windows (CR+LF) и Unix (LF). В репозитарии же следует выбрать что-то одно. Нам придет на выручку другая замечательная утилита dos2unix (еще более замечательная тем, что нет необходимости париться с временными файлами!)
find ./ -type f -name "*.php" -exec sh -c 'dos2unix {}' \;
Еще одно решение: hook для git`а
В этом случае, мы обрабатываем только те файлы, которые были изменены в этом коммите, а не все файлы в репозитарии вообще. Кроме того, мы проверяем только определенные типы файлов, менять табы на пробелы в бинарных файлах, по распространенному мнению, не стоит.
# nano repository_path/.git/hooks/pre-commit
ALLOWED_EXTENSIONS=('php' 'phtml' 'js' 'css' 'html' 'htm' )
git diff --cached --name-only --diff-filter=ACM | while read FILENAME; do
FILENAME_EXTENSION=${FILENAME#*.}
for ALLOWED_EXTENSION in "${ALLOWED_EXTENSIONS[@]}"
do
if [ "$ALLOWED_EXTENSION" == "$FILENAME_EXTENSION" ] ; then
# fixing line endings
dos2unix --quiet $FILENAME
# converting tabs into spaces
expand -t 4 $FILENAME > _tmp_ && mv _tmp_ $FILENAME
git add $FILENAME
fi
done
done
exit 0