Ich schreibe einen Pre-Commit-Hook. Ich möchte rennenphp -l
gegen alle Dateien mit der Erweiterung .php laufen. Ich stecke jedoch fest.
Ich muss eine Liste der neuen / geänderten Dateien erhalten, die bereitgestellt werden. gelöschte Dateien sollten ausgeschlossen werden.
Ich habe versucht, git diff
und zu verwenden git ls-files
, aber ich denke, ich brauche hier eine Hand.
git
hook
pre-commit-hook
pre-commit
igorw
quelle
quelle
Antworten:
git diff --cached --name-status
zeigt eine Zusammenfassung der Inszenierungen an, sodass Sie entfernte Dateien einfach ausschließen können, z.Dies zeigt an, dass wt-status.c geändert und wt-status.h im Staging-Bereich (Index) entfernt wurde. So überprüfen Sie nur Dateien, die nicht entfernt wurden:
Sie müssen durch zusätzliche Rahmen springen, um mit Dateinamen mit Leerzeichen umzugehen (-z Option zum Git-Diff und einige interessantere Analyse).
quelle
Ein etwas übersichtlicherer Weg, um dieselbe Liste zu erhalten, ist:
Dies gibt die Liste der Dateien zurück, die überprüft werden müssen.
Es ist jedoch
php -l
möglicherweise nicht richtig, nur Ihre Arbeitskopie zu verwenden. Wenn Sie ein partielles Commit durchführen, dh nur eine Teilmenge der Unterschiede zwischen Ihrem aktuellen Arbeitssatz und dem HEAD für das Commit auswählen, wird der Test für Ihren Arbeitssatz ausgeführt, es wird jedoch ein Commit zertifiziert, das auf Ihrem Commit noch nie vorhanden war Scheibe.Um es richtig zu machen, sollten Sie das gesamte inszenierte Bild in einen temporären Bereich extrahieren und dort den Test durchführen.
Siehe Erstellen eines besseren Pre-Commit-Hooks für Git weitere Implementierung finden .
quelle
php -l
. Und damit sind wir gelandet. Siehe hier: github.com/phpbb/phpbb3/blob/develop-olympus/git-tools/hooks/…git show :FILENAME | php -l
.Keine der Antworten hier unterstützt Dateinamen mit Leerzeichen. Der beste Weg dafür ist, das
-z
Flag in Kombination mit hinzuzufügenxargs -0
Dies wird von git in integrierten Beispielen angegeben (siehe .git / hooks / pre-commit.sample ).
quelle
Folgendes verwende ich für meine Perl-Checks:
#!/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)
für PHP wird es so aussehen:
#!/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)
quelle
git diff --cached ist nicht ausreichend, wenn der Festschreibungsaufruf mit dem Flag -a angegeben wurde, und es gibt keine Möglichkeit festzustellen, ob dieses Flag in den Hook geworfen wurde. Es wäre hilfreich, wenn die zu feststellenden Argumente dem Haken zur Prüfung zur Verfügung stehen sollten.
quelle
git status --porcelain | grep -E -v '^[? ]'
git status --porcelain | perl -ane 'print $F[1],qq(\n) if m/^[ACM] /'
ist eine bessere Antwort. Es hat den Vorteil, dass eine --porcelain-Option verwendet wird, die sich garantiert nie ändert. Verwenden Sie Ihren eigenen Parser, wenn Perl zu schwer für Sie ist.