Git pre-commit hook: измененные / добавленные файлы
Я пишу крючок предварительной фиксации. Я хочу бежать php -l против всех файлов .расширение PHP. Однако я застрял.
мне нужно получить список новых/измененных файлов, которые устроили. удаленные файлы должны быть исключены.
Я пробовал использовать git diff и git ls-files, но я думаю, мне нужна помощь.
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 -0git diff --cached --name-only --diff-filter=ACM -z | xargs -0 ...Это то, что дается git во встроенных образцах (см. .git / hooks / pre-commit.образец)
git diff --cached недостаточно, если вызов commit был указан с флагом-a, и нет способа определить, был ли этот флаг брошен в крючок. Было бы полезно, если бы аргументы для фиксации были доступны крюку для изучения.
Comments