プレコミットフックを書いています。php -l
拡張子が.phpのすべてのファイルに対して実行したい。しかし、私は立ち往生しています。
ステージングされた新しい/変更されたファイルのリストを取得する必要があります。削除されたファイルは除外する必要があります。
git diff
とを使ってみgit ls-files
ましたが、ここに手が必要だと思います。
プレコミットフックを書いています。php -l
拡張子が.phpのすべてのファイルに対して実行したい。しかし、私は立ち往生しています。
ステージングされた新しい/変更されたファイルのリストを取得する必要があります。削除されたファイルは除外する必要があります。
git diff
とを使ってみgit ls-files
ましたが、ここに手が必要だと思います。
同じリストを取得するための少しすっきりした方法は次のとおりです。
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のより優れた事前コミットフックの構築を参照してください。
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オプションといくつかのより興味深い解析)
ここでの回答はいずれも、スペースを含むファイル名をサポートしていません。そのための最良の方法は、-z
フラグをと組み合わせて追加することです。xargs -0
git diff --cached --name-only --diff-filter=ACM -z | xargs -0 ...
これは、組み込みサンプルでgitによって提供されるものです(.git / hooks / pre-commit.sampleを参照) 。
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)
コミット呼び出しが-aフラグで指定されている場合、git diff --cachedは十分ではなく、そのフラグがフックにスローされたかどうかを判断する方法はありません。コミットするための引数が調査のためにフックに利用可能である必要がある場合に役立ちます。