Git pre-commit hook: измененные / добавленные файлы



Я пишу крючок предварительной фиксации. Я хочу бежать php -l против всех файлов .расширение PHP. Однако я застрял.



мне нужно получить список новых/измененных файлов, которые устроили. удаленные файлы должны быть исключены.



Я пробовал использовать git diff и git ls-files, но я думаю, мне нужна помощь.

479   5  

5 ответов:

git diff --cached --name-status покажет резюме того, что поставлено, так что вы можете легко исключить удаленные файлы, например:

M       wt-status.c
D       wt-status.h

это указывает на то, что wt-статус.c был изменен и wt-статус.h был удален в промежуточной области (индекс). Итак, чтобы проверить только файлы, которые не были удалены:

steve@arise:~/src/git <master>$ git diff --cached --name-status | awk ' != "D" { print  }'
wt-status.c
wt-status.h

вам придется прыгать через дополнительные обручи, чтобы иметь дело с именами файлов с пробелами в though (- Z вариант git diff и еще несколько интересных разборов)

немного более аккуратный способ получения того же списка:

git diff --cached --name-only --diff-filter=ACM

это вернет список файлов, которые необходимо проверить.

но только под управлением php -l на вашей рабочей копии, не может быть правильным. Если вы делаете частичную фиксацию, т. е. просто выбираете подмножество различий между вашим текущим рабочим набором и головкой для фиксации, то тест будет выполняться на вашем рабочем наборе, но будет подтверждать фиксацию, которая никогда не существовала ваш диск.

чтобы сделать это правильно, вы должны извлечь все поэтапное изображение в область temp и выполнить тест там .

rm -rf $TEMPDIR
mkdir -p $TEMPDIR
git checkout-index --prefix=$TEMPDIR/ -af
git diff --cached --name-only --diff-filter=ACM | xargs -n 1 -I '{}' \bin\echo TEMPDIR/'{}' | grep \.php | xargs -n 1 php -l

посмотреть создание лучшего крючка предварительной фиксации для Git для другой реализации.

вот что я использую для моих проверок Perl:

git diff --cached --name-status | while read st file; do
        # skip deleted files
        if [ "$st" == 'D' ]; then continue; fi
        # do a check only on the perl files
        if [[ "$file" =~ "(.pm|.pl)$" ]] && ! perl -c "$file"; then
                echo "Perl syntax check failed for file: $file"
                exit 1
        fi
done

для PHP это будет выглядеть так:

git diff --cached --name-status | while read st file; do
        # skip deleted files
        if [ "$st" == 'D' ]; then continue; fi
        # do a check only on the php files
        if [[ "$file" =~ ".php$" ]] && ! php -l "$file"; then
                echo "PHP syntax check failed for file: $file"
                exit 1
        fi
done

ни один из ответов здесь не поддерживает имена файлов с пробелами. Лучший способ для этого-добавить -z флаг в сочетании с xargs -0

git diff --cached --name-only --diff-filter=ACM -z | xargs -0 ...

Это то, что дается git во встроенных образцах (см. .git / hooks / pre-commit.образец)

git diff --cached недостаточно, если вызов commit был указан с флагом-a, и нет способа определить, был ли этот флаг брошен в крючок. Было бы полезно, если бы аргументы для фиксации были доступны крюку для изучения.

Comments

    Ничего не найдено.