• Как привести в порядок репозитарий

    Всегда приятно начинать проект с нуля, самому создавать под него репозитарий, определять принятый в нём стиль кодирования, да и многое другое. Но иногда нам достаются «трудные дети» с тяжелым прошлым, включающим мешанину табуляции и пробелов, разных способов обрыва строки, кодировок. Понятное дело, что все это приводит систему контроля версий к истерике. Но не беда. 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