Diese Frage bezieht sich auf die folgenden Fragen: Ссылка jedoch scheint keine der bereitgestellten Antworten auf diese Fragen meine Bedürfnisse zu erfüllen.
Ich habe eine Header-Datei (key_info.h), die von einem Python-Skript generiert wird. Um schlau zu sein, kontrollierte ich Version eine Platzhalterversion des Headers (key_info.h) mit einer einzelnen Codezeile:
%Vor%Vor dem Ausführen des Python-Skripts führt das Kompilieren dieses Codes zu einem Fehler, der dem Entwickler genau sagt, was zu tun ist. Führe das Skript aus.
Natürlich wird der Entwickler fortfahren, indem er das Python-Skript ausführt, um die neueste Version von key_info.h zu generieren, und der Code wird erfolgreich kompiliert. Der Entwickler wird dann eine Reihe von Änderungen vornehmen und dann seinen Code "commit".
Das Problem, auf das wir stoßen, ist die Tatsache, dass key_info.h jetzt geändert wurde. Als solches wird git es als eine Modifikation aufnehmen und erlauben, dass es begangen wird. Die generierte Version dieses Headers sollte jedoch niemals versionsgesteuert sein. Wir benötigen die Platzhalterversion, um unverändert zu bleiben, damit Entwickler weiterhin den Kompilierungsfehlerhinweis angeben können.
Mein erster Instinkt bestand darin, .gitignore zu verwenden, um zu verhindern, dass git key_info.h in einem Commit aufnimmt. .gitignore wird dann leicht zwischen Entwicklern geteilt, da .gitignore selbst versionsgesteuert ist. Leider funktioniert .gitignore nur für Dateien, die nicht versionsgesteuert sind.
Mein nächster Gedanke war, git update-index --assume-unverändert / path / to / file zu verwenden. Das funktioniert großartig lokal, aber ich habe keine Möglichkeit, diese Regel auf andere Entwickler durchzusetzen. Es ist nur eine Frage der Zeit, bis ein Entwickler den generierten Header versehentlich festlegt.
Meine Frage ist also: Gibt es eine Möglichkeit, eine Datei versionsgesteuert zu verwalten, während eine Regel im Hintergrund erzwungen wird, dass die Datei ignoriert wird, wenn es Zeit ist, Änderungen zu bestätigen? Was ich wirklich will, ist .gitignore für versionsgesteuerte Dateien.
aber ich kann diese Regel nicht auf andere Entwickler anwenden
Sie tun fast: Sie könnten Ihr Schlüssel-Info-Gen-Skript git update-index --assume-unchanged /some/path
ausführen lassen.
Aber ich denke nicht, dass das eine gute Idee ist.
Ich würde wahrscheinlich entscheiden, die Header-Datei überhaupt nicht zu überschreiben. Lassen Sie Ihr Python-Skript die richtige Header-Datei erzeugen und schreiben Sie sie in ein anderes -Verzeichnis und übergeben Sie -I
-Compiler-Optionen für diese beiden Verzeichnisse in der richtigen Reihenfolge. Wenn das Skript nicht ausgeführt wurde, wird der versionsgesteuerte Header gefunden. Wenn das Skript ausgeführt wurde, wird der vom Benutzer generierte Header gefunden. Und Sie können dann den Pfad des benutzergenerierten Headers in .gitignore
setzen.
Einige Alternativen, rangiert und tl; von einem Typen, den du noch nie getroffen hast:
Der beste Weg, dies zu tun, besteht darin, die Datei einfach nicht zu verfolgen, weil Sie ein Makefile-Ziel haben. Wenn Sie make
nicht bekommen oder nicht wollen ... nun, jede IDE kann Buildrezepte konfigurieren, richtig?
@hvd hat die beste Version von diesem , ich habe es zuerst vermisst: Setze generierte Header in ein .gitigignored generated-headers
Verzeichnis, in dem der Compiler zuerst sucht und den Standard als Sicherung behält.
Wenn Ihr Build-Prozess dafür nicht geeignet ist, ist die Filtermethode @VonC am besten, weil es so ist robust gegen das vorübergehende Auschecken eines Zweigs, der diese Datei nicht enthält. Der Filter auf den Filtern ist "Bewahre was da ist":
%Vor%Bitte beachten Sie: git ignoriert automatisch Filter die nicht konfiguriert sind , also eine Datei geben Ein nachverfolgbares Attribut wird funktionieren, es wird keine Auswirkungen auf andere haben, bis sie es wollen.
Als nächstes ist die kanonische Methode am besten, die am einfachsten zu implementieren ist und so lange funktioniert, wie die Datei in allen Zweigen verfolgt wird:
%Vor%Wenn Sie jedoch vorübergehend zu einem Zweig wechseln, der diese Datei nicht verfolgt, wird dieser Schutz bei der Rückkehr verloren gehen.
Das funktioniert großartig lokal, aber ich habe keine Möglichkeit diese Regel auf andere Entwickler anzuwenden
Die andere Möglichkeit besteht darin, einen Inhaltsfiltertreiber zu deklarieren, der in git add
Ihre Datei automatisch auf den entsprechenden Inhalt zurücksetzt.
(Aus Pro Git-Buch 7.2 Anpassen von Git - Git-Attributen )
Sie können speichern und teilen:
.gitattributes
-Datei . clean
', das den Inhalt wiederherstellt Aber: Jeder Benutzer muss diesen Filter immer noch in seiner lokalen Konfiguration registrieren:
%Vor%Es gibt also keine universelle Möglichkeit, eine versionierte Datei zu "ignorieren", sondern nur eine lokale Lösung, die in jedem Repo angewendet wird.
Derselbe Filter kann Ihnen helfen:
key_info.h.tpl
key_info.h
, das privat bleibt Sie müssen ein Skript nicht immer speichern, da es sich in der Filterdeklaration selbst als jthill befinden kann Kommentare unten :
%Vor%dafür, seit 1.8.5 erhalten die Filter den Pfadnamen und Sie können das Filter-Setup eigenständig machen.
Zum Beispiel:
Damit bleibt der Zielinhalt erhalten, wenn sonst etwas verwendet wird.
Dann:
- zu machen
echo anypatternyoulike filter=pin-content >>.git/info/attributes
, um den Filter lokal oder...>>.gitattributes
, um es global zu machen.
Tags und Links git