2017-10-16 6 views
0

Ich habe ein nerviges Problem. Wir führen Linting als Pre-Commit-Hook aus. Das Problem besteht darin, dass es das Arbeitsverzeichnis und nicht das eigentliche Commit angibt. Es gibt zwei Probleme damit:Wie füge ich das Commit anstelle des Arbeitsverzeichnisses ein?

  1. Commit ist schlecht, aber Linting passiert.
    Wenn Sie vergessen haben, Ihre Änderungen nach dem Beheben der Linting-Probleme zu übernehmen, geschieht dies.

  2. Commit ist gut, aber Linting schlägt fehl.
    Ich habe oft Debug-Code, den ich nicht festlegen möchte. Es hat wirklich keinen Sinn, diese Änderungen zu ignorieren, und es ist nervig, damit umzugehen.

Nun ist die Frage, wie ich schreiben kann eine intelligentere Haken pre-commit, dass die tatsächlichen begehen, anstatt das Arbeitsverzeichnis Fusseln, vorzugsweise ohne das Arbeitsverzeichnis zu ändern?

+0

Nur das abgestufte Diff. – ElpieKay

+0

Klingt Edge-Casey. Erstellen Sie keine Prozesse, die auf Vorab-Hooks angewiesen sind. Sie dienen nur der Bequemlichkeit und können leicht deaktiviert werden. Wir verwenden verschiedene Zweige, um Hauptversionen unseres Produkts darzustellen, und veröffentlichen gelegentlich Fehlerkorrekturen in alten Zweigen. Da wir die neueste Version von eslint verwenden, schlägt Linting in Zweigen basierend auf älteren Versionen fehl. Wir drücken einfach mit '--no-verify' auf den Server, aber unser Build-Prozess ist viel robuster und sorgt dafür, dass Linting (mit der korrekten Version) vor dem Zusammenführen zu Zweigstellen (per PR) – JDB

+0

@JDB Jenkins läuft linting, bevor das Commit mit dem Master zusammengeführt wird, so dass der Prozess nicht auf den Pre-Commit-Hook angewiesen ist. Problem ist, dass Jenkins normalerweise überlastet ist und es viel Zeit dauern kann, bevor es tatsächlich ausgeführt wird. Der Pre-Commit-Hook ist gut, weil er viel schneller Feedback gibt und Jenkins unnötig belastet. –

Antwort

1

Dies ist im Allgemeinen ziemlich schwierig.

Die einfachste Methode besteht darin, den Index in ein temporäres Verzeichnis zu extrahieren. Dies hat einige offensichtliche Nachteile: Insbesondere werden ignorierte Dateien, die im Arbeitsbaum enthalten sind, nicht in das temporäre Verzeichnis übertragen. Schlimmer noch, das temporäre Verzeichnis hat nur diese Repository-Dateien: jede Umgebung (Submodule und/oder Superprojekte, zum Beispiel) werden nicht übertragen.

Das Tragen dieser Dinge ist möglich, verbraucht aber möglicherweise viel Platz und/oder Zeit.

Hier ist eine einfache Methode für die gesamte Arbeit Baum unter (einschließlich Submodule) über in ein temporäres Verzeichnis, dann Extrahieren der Index Inhalt oben auf sie:

#! /bin/sh -e 

tmpdir=$(mktemp -d) 
trap "rm -rf $tmpdir" 0 1 2 3 15 

# remainder assumes we are at top of work-tree, which is true in 
# practice in git hooks, even if it is not documented anywhere. 

# step 1: copy current tree to tmp dir 
tar cf - . | (cd $tmpdir; tar xf -) 

# step 2: extract current index to tmp dir 
git --work-tree=$tmpdir checkout -- . 

# step 3: run tests 
... tests go here ... 

Für pre-commit Haken, die ändern möchten Dateien (z. B. gofmt oder clang-format), dies verwirrt die allgemeine Idee, da jetzt die geänderten Dateien in einem temporären Verzeichnis sind, das entfernt wird.

+0

Ich würde empfehlen, 'rsync' oder' cp -ap' anstelle von '2' tar 's zu verwenden. Ansonsten - perfekte Antwort! – phd

+0

Danke. Ich hatte noch keine Zeit, dies zu versuchen. Sobald ich bestätigt habe, dass es funktioniert, akzeptiere ich deine Antwort. –

Verwandte Themen