Das Internet ist übersät mit falschen und nicht idealen Antworten auf diese Frage. Das ist bedauerlich, weil Sie denken würden, dass dies eine allgemeine Sache wäre, die Sie tun möchten.Testen, was in einem Pre-Commit Hook begangen werden soll
Das Problem: Wenn ein Hook pre-commit
ausgeführt wird, ist das Repository möglicherweise nicht sauber. Wenn du deine Tests also naiv durchführst, werden sie nicht gegen das sein, was du verpflichtest, sondern egal, welcher Dreck gerade in deinem Arbeitsbaum ist.
Die offensichtliche Sache zu tun ist zu git stash --keep-index --include-untracked
am Anfang der pre-commit
und git pop
am Ausgang. Auf diese Weise testen Sie gegen den (reinen) Index, was wir wollen.
Leider generiert dies Merge-Konfliktmarker, wenn Sie git add --patch
verwenden (insbesondere wenn Sie hunks bearbeiten), da der Inhalt von [email protected]{0}
möglicherweise nicht mit dem Arbeitsbaum nach dem Festschreiben übereinstimmt.
Eine weitere gängige Lösung besteht darin, das Repository zu klonen und die Tests in einem neuen temporären Test auszuführen. Es gibt zwei Probleme damit: Einer ist, dass wir noch nicht festgeschrieben haben, also können wir nicht einfach eine Kopie des Repositorys in dem Zustand bekommen, den wir begehen wollen (ich bin mir sicher, dass es einen Weg dafür gibt) , aber ich bin nicht interessiert, weil :). Zweitens sind meine Tests empfindlich auf den Speicherort des aktuellen Arbeitsverzeichnisses. Zum Beispiel wegen der lokalen Umgebungskonfiguration.
Also: Wie kann ich meinen Arbeitsbaum in den Zustand vor der git stash --keep-index --include-untracked
wiederherstellen, ohne Merge-Konflikt-Marker einzuführen, und ohne die Post-Commit HEAD
zu ändern?
Der pre-commit Skript empfängt die Daten als Eingabe begangen werden. Warum musst du etwas anderes suchen? Vielleicht, was Sie versuchen, zu tun, würde am besten in etwas anderem als einem Vorbereitungshaken getan werden. Welche Art von Tests möchten Sie durchführen, die Zugriff auf das vollständige Repository benötigen? –
@WilliamPursell: Was meinen Sie mit "die Daten werden übertragen?". Das Vorab-Commit-Skript wird in meinem Arbeitsbaum (d. H. Der Basis des Quell-Repositorys) ausgeführt. Das Problem ist, dass wenn Sie einige Änderungen am Repository vornehmen und nur einige von ihnen inszenieren (zB fügen Sie einige Dateien hinzu, aber keine anderen), dann werden Sie das Commit nicht testen bevor es passiert (was ich machen möchte), Sie würden alles was Sie in Ihrem Arbeitsverzeichnis haben testen. – pwaller
Der Patch, den Sie committen, ist auf der Standardeingabe für den Pre-Commit Hook verfügbar. Was testen Sie, wenn nicht der Patch, der ausgeführt wird? Der Zweck des Vorbereitungs-Hooks besteht darin, das Patch zu verifizieren. –