2009-11-24 13 views

Antwort

15

Sie können dies tun, indem Sie ein Muster hinzufügen, für das Dateien, denen diese Funktionalität folgen soll, gefolgt von ident in der Datei .gitattributes. Dies ersetzt $ Id $ durch $ Id: < 40-stellige SHA> $ beim Auschecken der Datei. Beachten Sie jedoch, dass es Ihnen keine Versionsnummer der Datei wie in CVS/SVN geben wird.

Beispiel:

$ echo '*.txt ident' >> .gitattributes 
$ echo '$Id$' > test.txt 
$ git commit -a -m "test" 

$ rm test.txt 
$ git checkout -- test.txt 
$ cat test.txt 

Link zu gitattributes(5) Manual Page

+3

Ich habe gerade damit herumgespielt und soweit ich weiß, gibt es nur eine SHA für eine bestimmte Datei, keine $ Id $ für das gesamte Repository. – Aaron

+0

Was ist mit% Format%? –

37

Zusammenfassung: Empfohlene Art und Weise Versionsinformationen in Produkt einzubetten ist Build-System dafür zu verwenden; Details und alternative Vorgehensweisen finden Sie unten.


In Git (und ich denke, in der Regel auch in anderen VCS Systemen mit atomaren Commits) gibt es nicht so etwas wie Version eine einzigen Datei.

Git tun Unterstützung On-Demand-Erweiterung von $Id:$ Schlüsselwort, aber:

  1. Es ist geschehen auf Anfrage nur. Sie müssen angeben (vielleicht mithilfe von Globbing-Muster), dass eine Datei (oder eine Reihe von Dateien) einen identattribute Satz (in '.gitattributes' Datei im Baum oder in '.git/info/attributes' für lokale Repository-Einstellungen) hat .
  2. Es erweitert sich auf SHA-1 der Datei Inhalt (oder genauer zu $Id:<sha-1 of blob>$). Der Grund für diese Wahl liegt darin, dass Git keine Dateien berührt, die sich beim Umschalten oder Zurückspulen nicht geändert haben. Wenn '$ Id: $' zu Revisionsinformationen erweitert wird, muss jede versionsgesteuerte Datei, z. beim Wechseln von Zweigen.

Git unterstützt ein ziemlich breites Spektrum von $Format:...$ Platzhalter, die Informationen zu begehen erweitert (zB $Format:%H$ durch eine Hash-Commit ersetzt), aber:

  1. Expansion nur erfolgt, wenn git archive ausgeführt wird, in seinem Ausgang Datei.
  2. Es ist getan auf Anfrage, gesteuert über export-subst Attribut.

Der empfohlene Weg Versionsinfo der Einbettung ist es über das Build-System zu tun (in einer Build-Stufe); siehe zum Beispiel Git Makefile und GIT-VERSION-GEN Skript von Makefile in Git Web-Schnittstelle für git.git Repository verwendet.

Sie können (ab) den clean-/smudge-Filtertreiber verwenden (über filter Attribut), um eine CVS-ähnliche Schlüsselwort-Erweiterung zu erhalten, Schlüsselwörter beim Auschecken zu erweitern und beim Eingeben von Inhalten in das Repository zu bereinigen.

+0

Filter-Treiber wäre wirklich toll, wenn es tatsächlich Macht hätte. Wie es scheint, scheint nur Dateiname als Parameter, das ist noch weniger als Ident-Filter, bekommen BLOB SHA1 als Parameter. Wenn wir '$ Format: ... $' übergeben könnten, um die Treiberbefehlszeile zu filtern - das würde alles viel besser machen. Und das sollte mit Textdateizeichensatz beginnen ... –

+0

Es gibt keine Version einer einzelnen Datei, aber es gibt so etwas wie den Status aller Dateien zu einem bestimmten Zeitpunkt. Dieser Zustand wird durch einen Hash repräsentiert. –

+0

@GeorgeStocker: Ja, der Status aller Dateien kann durch den SHA-1-Hash des obersten Baumobjekts des Projekts dargestellt werden, aber er ist etwas anderes als der SHA-1-Hash des Blob-Objekts, d. H. Des Dateiinhalts. –

2

Git's ident macht nicht, was $ Id $ in anderen Versionierungssystemen tut. Als Kluding verwenden Sie RCS zusammen mit git: RCS für einzelne Dateirevisionen und git, um das Projekt als Ganzes zu überprüfen. Wie gesagt, das ist ein Klud, aber es macht Sinn (manchmal für einige Dinge).