84

プレコミットフックを書いています。php -l拡張子が.phpのすべてのファイルに対して実行したい。しかし、私は立ち往生しています。

ステージングされた新しい/変更されたファイルのリストを取得する必要があります。削除されたファイルは除外する必要があります。

git diffとを使ってみgit ls-filesましたが、ここに手が必要だと思います。

4

5 に答える 5

104

同じリストを取得するための少しすっきりした方法は次のとおりです。

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のより優れた事前コミットフックの構築を参照してください。

于 2010-06-18T10:53:24.870 に答える
57

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

ただし、スペースを含むファイル名を処理するには、余分なフープをジャンプする必要があります(gitdiffへの-zオプションといくつかのより興味深い解析)

于 2010-03-09T22:39:43.900 に答える
21

ここでの回答はいずれも、スペースを含むファイル名をサポートしていません。そのための最良の方法は、-zフラグをと組み合わせて追加することです。xargs -0

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

これは、組み込みサンプルでgitによって提供されるものです(.git / hooks / pre-commit.sampleを参照) 。

于 2017-02-20T13:05:15.077 に答える
16

Perlチェックに使用するものは次のとおりです。

#!/bin/bash

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 < <(git diff --cached --name-status)

PHPの場合、次のようになります。

#!/bin/bash

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 < <(git diff --cached --name-status)
于 2010-11-05T23:45:06.007 に答える
0

コミット呼び出しが-aフラグで指定されている場合、git diff --cachedは十分ではなく、そのフラグがフックにスローされたかどうかを判断する方法はありません。コミットするための引数が調査のためにフックに利用可能である必要がある場合に役立ちます。

于 2015-09-10T17:16:44.560 に答える