2015-12-13 3 views
0

Мы хотим запустить git filter-branch над большой базой данных PHP. Поскольку у нас более 21 тыс. Коммиттов, phpcbf хочет отформатировать всю кодовую базу каждый фиксатор filter-branch. Можно ли получить только файлы, которые были изменены для каждой фиксации, и форматировать их конкретно? Что-то вроде ...git filter-branch получить только измененные файлы?

git filter-branch --tree-filter \ 
'FILES=$(<something> | grep .php) php /usr/local/bin/phpcbf.phar $FILES || true' 

ответ

1

Я нашел решение:

git filter-branch --tree-filter 'phpcbf $(\ 
    git show $GIT_COMMIT --name-status | egrep ^[AM] |\ 
    grep .php | cut -f2)' -- --all 

Просто, чтобы дать краткий обзор того, что он делает:

  • git show $GIT_COMMIT --name-status будет возвращать все измененные файлы для этого совершить.
  • egrep ^[AM] фильтрует статуи только добавленным и модифицированным. Не нужно пытаться форматировать файлы, которые удаляются.
  • grep .php только для форматирования файлов PHP.
  • cut -f2 удаляет префикс состояния из списка, поэтому мы просто получаем необработанные пути к файлу.

Смотрите мой блог для более подробной информации: https://elliot.land/post/reformatting-your-codebase-with-git-filter-branch

+0

решение Эллиот получил меня 98% пути. Кажется, что какое-то поведение в 'git diff' во время ветвления фильтра изменилось (я запускаю git 2.10.2). Он постоянно сравнивался с моей последней версией HEAD, а не с фильтрованным сообщением. Мне удалось немного изменить код Эллиота, чтобы он работал. Вместо 'git diff --cached --name-status' во время фильтра, я использовал' git show $ GIT_COMMIT - имя-статус'. '$ GIT_COMMIT' автоматически устанавливается на каждом шаге' filter-branch'. –