code

Git 사전 커밋 후크 : 변경 / 추가 된 파일

codestyles 2020. 12. 3. 07:53
반응형

Git 사전 커밋 후크 : 변경 / 추가 된 파일


사전 커밋 후크를 작성 중입니다. php -l확장자가 .php 인 모든 파일에 대해 실행하고 싶습니다 . 그러나 나는 붙어 있습니다.

스테이징 된 신규 / 변경된 파일 목록을 가져와야합니다. 삭제 된 파일은 제외되어야합니다.

git diff및을 사용해 보았지만 git ls-files여기에 손이 필요하다고 생각합니다.


git diff --cached --name-status 준비된 항목에 대한 요약이 표시되므로 제거 된 파일을 쉽게 제외 할 수 있습니다. 예 :

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

이는 wt-status.c가 수정되었고 wt-status.h가 스테이징 영역 (색인)에서 제거되었음을 나타냅니다. 따라서 제거되지 않은 파일 만 확인하려면 :

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

공백이있는 파일 이름을 처리하려면 추가 후프를 거쳐야합니다 (-z 옵션은 git diff 및 좀 더 흥미로운 구문 분석).


동일한 목록을 얻는 약간 깔끔한 방법은 다음과 같습니다.

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

확인해야 할 파일 목록이 반환됩니다.

그러나 php -l작업 복사본에서 실행 하는 것은 올바른 일이 아닐 수 있습니다. 부분 커밋을 수행하는 경우, 즉 현재 작업 세트와 커밋에 대한 HEAD 간의 차이점 중 일부만 선택하면 테스트가 작업 세트에서 실행되지만 사용자에 존재하지 않은 커밋을 인증합니다. 디스크.

제대로하려면 전체 스테이지 이미지를 임시 영역에 추출하고 테스트를 수행해야합니다.

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.sample 참조 ).


git diff --cached는 커밋 호출이 -a 플래그와 함께 지정된 경우 충분하지 않으며 해당 플래그가 후크에서 throw되었는지 여부를 확인할 방법이 없습니다. 커밋 할 인수가 검사를 위해 후크에서 사용 가능해야한다면 도움이 될 것입니다.

참고 URL : https://stackoverflow.com/questions/2412450/git-pre-commit-hook-changed-added-files

반응형