Wie Commit-Dateien, die durch den Pre-Commit-Hook in Git geändert wurden

3697
dimovnike

Ich kämpfe ein paar Stunden lang, um Metadaten von git store (Berechtigungen / Flags / etc) der Dateien mit Metastore zu erstellen, und ich verwende hooks/pre-commitdafür.

Das Skript wird korrekt aufgerufen, und die Datei "Metadaten" wird geändert, jedoch nicht zum Festschreiben hinzugefügt.

Ich habe versucht anzurufen:

git add ./metadata 

und

git add -u ./metadata 

aus dem Pre-Commit-Skript, aber es gibt keinen Effekt. Die Datei wird unverbindlich und als modifiziert oder in Staging markiert, ABER nicht festgelegt.

Gibt es eine Möglichkeit, dies zu erreichen? Grundsätzlich möchte ich, dass die Datei "Metadaten" bei jedem Commit aktualisiert und festgeschrieben wird (vorzugsweise als das gleiche Commit, damit ich nach dem Checkout alle Berechtigungen wiederherstellen kann).

Vielen Dank!

PS Wenn Sie sich fragen, warum ich das brauche, ist die Antwort: Ich speichere OS-Dateien für ein eingebettetes Gerät, das Permissions / Suid-Flags usw. benötigt.

3
Es sollte funktionieren, vielleicht machen Sie etwas falsch. Der Pre-Commit-Hook wird automatisch ausgeführt, wenn Sie "Git-Commit" ausführen. Es muss ein ausführbares Bit gesetzt sein. Versuchen Sie also, einige Dateien zum Staging manuell hinzuzufügen, und führen Sie dann "git commit" aus. Danach "git show", um zu sehen, welche Änderungen in diesem Commit vorgenommen wurden und ob Metadaten festgeschrieben wurden. Arkadiusz Drabczyk vor 9 Jahren 0

2 Antworten auf die Frage

2
Batist

Sie können so etwas tun:

#!/bin/sh #  perl -i -pe 's/var app_version = "\d+\.\d+\.\K(\d+)/ $1+1 /e' ./version.js  git add ./version.js 

Was es macht: Es ändert den String var app_version = "0.1.1"; in var app_version = "0.1.2"; und fügt die Datei dem Git-Commit-Prozess hinzu. Wenn Sie ein Commit ausführen, wird die letzte Änderung eingefügt.

falsche Frage? dimovnike vor 9 Jahren 2
Das Problem hierbei ist, dass Sie alle Änderungen in dieser bestimmten Datei festschreiben. Nicht nur die zuvor inszenierten Änderungen. Möglicherweise funktioniert das für Dateien, die nur die Version enthalten. Martin Gerhardy vor 6 Jahren 0
1
dimovnike

Ich habe die Lösung gefunden. Das Problem ist, dass bei der Änderung der Hook-Datei vor dem Festschreiben die einzige modifizierte Datei ist - das Festschreiben findet nicht statt. Während ich dies testete, habe ich nur Änderungen in der "Metadaten" -Datei vorgenommen und deshalb hat es für mich nicht funktioniert.

Sobald ich andere Dateien im Repo modifiziere, füge add / rm neue Dateien hinzu - die Metadatendatei wird ordnungsgemäß festgelegt!

Fazit: Um die modifizierten Dateien vom Pre-Commit-Hook aus festzuschreiben, benötigt git einige andere gestaffelte Änderungen. Andernfalls wird das Commit nicht ausgeführt (wahrscheinlich erkennt git fälschlicherweise, dass nichts zu bestätigen ist).

Dies scheint mir ein bisschen unerwartetes Verhalten zu sein. Ich habe dies in git 1.8 und git 2.0 getestet. Das Verhalten ist das gleiche.

Ich habe das gleiche Problem, aber das Ändern anderer bereitgestellter Dateien löst das Problem nicht. Git nimmt Änderungen, die in meinem Fall durch Pre-Commit vorgenommen wurden, nicht auf. frhd vor 9 Jahren 0
Stellen Sie sicher, dass Sie git add für die Canges verwenden, die durch das Pre-Commit-Skript (am Ende des Skripts) erstellt wurden. dimovnike vor 9 Jahren 0
Das kann ich nicht. Ich erhalte die Fehlermeldung "index.lock", da "git-commit" das "pre-commit" aufruft. Funktioniert es für Sie? frhd vor 9 Jahren 0