Was passiert hier: Git ist so optimiert, dass es so schnell wie möglich zwischen den Filialen wechseln kann. Insbesondere ist git checkout
entworfen, um keine Dateien zu berühren, die in beiden Zweigen identisch sind.
Leider bricht RCS Schlüsselwortsubstitution das. Wenn Sie z. B. $Date$
verwenden, müssen Sie bei der Verzweigung von Verzweigungen jede Datei im Baum mit git checkout
berühren. Bei einem Repository in der Größe des Linux-Kerns würde dies alles zum Stillstand bringen.
Im Allgemeinen ist die beste Wahl mindestens eine Version zu markieren:
$ git tag v0.5.whatever
... und rufen Sie dann den folgenden Befehl von Ihrem Makefile:
$ git describe --tags
v0.5.15.1-6-g61cde1d
Hier git sagt Ich, dass ich an einer anonymen Version 6 arbeite, beginne nach v0.5.15.1, mit einem SHA1 Hash beginnend mit g61cde1d
. Wenn Sie die Ausgabe dieses Befehls irgendwo in eine *.h
Datei stecken, sind Sie im Geschäft und haben kein Problem, die veröffentlichte Software wieder mit dem Quellcode zu verknüpfen. Dies ist die bevorzugte Vorgehensweise.
Wenn Sie RCS-Schlüsselwörter nicht vermeiden können, möchten Sie vielleicht mit dieser explanation by Lars Hjemli beginnen. Grundsätzlich ist $Id$
ziemlich einfach, und wenn Sie git archive
verwenden, können Sie auch $Format$
verwenden.
Aber, wenn Sie absolut nicht RCS Keywords vermeiden, Sie sollte folgendes erhalten begonnen:
git config filter.rcs-keyword.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'
git config filter.rcs-keyword.smudge 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date: `date`\\\$/"'
echo '$Date$' > test.html
echo 'test.html filter=rcs-keyword' >> .gitattributes
git add test.html .gitattributes
git commit -m "Experimental RCS keyword support for git"
rm test.html
git checkout test.html
cat test.html
Auf meinem System, die ich erhalten:
$Date: Tue Sep 16 10:15:02 EDT 2008$
Wenn Sie Schwierigkeiten haben, die Shell-Escapes haben in den smudge
und clean
Befehle zu arbeiten, schreiben Sie einfach Ihre eigenen Perl-Skripte zum Erweitern bzw. Entfernen von RCS-Schlüsselwörtern, und verwenden Sie diese Skripte als Ihr Filter.
Beachten Sie, dass wirklich will das nicht als unbedingt notwendig, um weitere Dateien zu tun, oder git wird den größten Teil seiner Geschwindigkeit verlieren.
Kann dieses "git describe" -Ding als Teil der normalen Git-Operationen transparent ausgeführt werden? Wir können nicht zuverlässig erwarten, dass der Befehl git in unseren Hudson-Instanzen verfügbar ist. –
@ Thorbjørn Ravn Andersen, ich kenne Hudson nicht, aber wenn deine Hudson-Instanz keine Kopie von git hat, muss ein anderes System git ausgeführt haben, um einen Checkout der Quelle zu generieren. Verwenden Sie _that_ system, um git describe auszuführen. Ich bin mir nicht sicher, ob das hilft. – emk
Ich endete mit jGit - es unterstützt "rev-parse HEAD", ist aber sehr leise darüber. –