2009-02-05 5 views
17

Ich habe eine Open-Source-statische JavaScript + HTML-Anwendung, die derzeit an drei verschiedenen Orten eingesetzt wird, eine auf meinem lokalen Rechner, eine auf einem internen Server und eine auf einem stabilen externen Server.Wie würden Sie die aktuelle Commit-ID in die Dateien eines Git-Projekts aufnehmen?

Ich möchte sofort wissen, welche Version an welchem ​​Ort bereitgestellt wird, und ich möchte, dass Bugreporter einfachen Zugriff auf die Version haben, in der sie den Fehler melden.

Idealerweise möchte ich als Teil des Commit-Prozesses eine Datei mit dem Hash des Commits schreiben. Natürlich ist das, was ich von Git weiß, unmöglich, da das Einschließen des berechneten Hash als Teil einer Datei in einem Commit den berechneten Hash dieses Commits ändern würde.

Auf der anderen Seite könnte ich bauen dies als Teil eines Build-Prozesses integrieren. Ich habe derzeit keinen Build-Prozess, und ich möchte vermeiden, einen Schritt hinzuzufügen, wenn möglich.

Was ist der sauberste Weg, dies zu tun?

Antwort

6

Fügen Sie es Ihrem automatisierten Bereitstellungssystem hinzu.

Wenn Ihre Bereitstellung nicht automatisiert ist, automatisieren Sie sie und fügen Sie sie dort hinzu. Dann haben Sie einen Schritt entfernt.

Machen Sie es sinnvoller "Dies wurde am x-Datum um y Zeit aus z-Repository bereitgestellt". Der Hash des Commits bedeutet für Nichtentwickler nicht wirklich viel.

+5

Ich würde hinzufügen "git beschreiben" Ausgang. – Dustin

29

Es gibt einige Feinheiten wegen der Natur von Git. Die Art und Weise, wie ich das gemacht habe, besteht darin, zu kopieren, was die Git-Entwickler selbst machen. Zuerst sollten Sie annotierte Tags verwenden, was wahrscheinlich eine gute Idee ist. Um zu überprüfen, können Sie einen neuen Tag wie folgt erstellen:

$ git tag -a -m "Version 0.2" v0.2 HEAD 

Dann (wie in Ottos Beitrag vorgeschlagen) Sie git describe für ein sinnvolles „Version“ string verwenden können, um die Anzahl der Commits seit dem Tag enthalten wird und die führende Ziffern des sha1 des aktuellen Commits. Hier ist ein Beispiel von einem meiner Projekte:

$ git describe 
v1.0-3-gee47184 

Das heißt, diese Kopie ist 3 verpflichtet vor dem „v1.0“ Tag und die SHA1 begehen beginnt mit ee47184 (Ich bin nicht sicher, warum sie sind, dass führendes 'g').

Die Git-Entwickler gehen noch einen Schritt weiter und enthalten auch ein zusätzliches Bit, wenn die Arbeitskopie geändert wird (nicht festgeschrieben). Dies erfordert ein paar weitere Schritte, also ist alles in einem Skript verpackt, das sie VERSION-GEN nennen. Wenn es ausgeführt wird, druckt es die Versionszeichenfolge auf Standardausgabe und erstellt auch eine VERSION-FILE Datei (das Skript ist vorsichtig, die Datei nicht erneut zu berühren, wenn sich die Version nicht geändert hat - also build-tool-freundlich). Dann können Sie beinhalten, dass VERSION-FILE Datei in Ihrem Quellcode, Dateien helfen usw.

Mit meinem Beispiel VERSION-GEN Skript (unten), meine Version Zeichenfolge für das obige Beispiel ist:

$ VERSION-GEN 
version: 1.0-3-gee47 

Wenn ich ändern jede der nachgeführten Dateien, die er wie folgt aussieht:

$ VERSION-GEN 
version: 1.0-3-gee47-mod 

Hier ist meine leicht gezwickt Version von VERSION-GEN. Beachten Sie, dass erwartet wird, dass die Tags, die Versionen markieren, die Form v [0-9] * haben (z. B. v1.0 oder v0.2 oder v12.3.4 oder v12.2-4feb2009 usw.).)

#!/bin/sh 

# Tag revisions like this: 
# $ git tag -a -m "Version 0.2" v0.2 HEAD 

VF=VERSION-FILE 
DEFAULT_VERSION=UKNOWN 

LF=' 
' 

# First see if there is a version file (included in release tarballs), 
# then try git-describe, then default. 
if test -d .git -o -f .git && 
    VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && 
    case "$VN" in 
    *$LF*) (exit 1) ;; 
    v[0-9]*) 
     git update-index -q --refresh 
     test -z "$(git diff-index --name-only HEAD --)" || 
     VN="$VN-mod" ;; 
    esac 
then 
     continue 
    #VN=$(echo "$VN" | sed -e 's/-/./g'); 
else 
    VN="$DEFAULT_VERSION" 
fi 

VN=$(expr "$VN" : v*'\(.*\)') 

# Show the version to the user via stderr 
echo >&2 "version: $VN" 

# Parse the existing VERSION-FILE 
if test -r $VF 
then 
    VC=$(sed -e 's/^version: //' <$VF) 
else 
    VC=unset 
fi 

# If version has changed, update VERSION-FILE 
test "$VN" = "$VC" || { 
    echo "version: $VN" >$VF 
    echo >&2 "($VF updated)" 
} 
+0

Es gibt ein paar Tippfehler am Ende des Skripts. Ersetzen Sie die letzten drei Zeilen mit: VC = $ (sed -e 's/^ Version: //' $ VF) echo> & 2 "($ VF aktualisiert)" fi Notiere die Schließung ')' und ersetze das letzte '}' mit fi. – Patrick

+0

Ich denke, der Renderer hat mehrere Zeilen des Skripts geschluckt. Ich habe eine Änderung eingereicht, um den Code einzurücken, anstatt ihn in Code/Vor-Tags einzufügen. Die letzten Zeilen sollten '# Parse die vorhandene Version-Datei' ' wenn test -r $ VF' ' then' '\t VC = $ (sed -e 's/^ Version: //' sein < $ VF) '' else' '\t VC = unset' ' fi' '# Wenn Version geändert hat, aktualisieren VERSION-FILE' ' test "$ VN" = "$ VC" || {' ' \t echo "version: $ VN"> $ VF' '\t echo> & 2" ($ VF aktualisiert) "' '}' – seanf

+0

Wow, hässlich. Ich habe eine Kopie des gesamten Skripts hier: https://gist.github.com/880771 – seanf

Verwandte Themen