Wir verwenden SVN bei der Arbeit, aber für meine persönlichen Projekte habe ich mich für Git entschieden. Also installierte ich Git gestern, und ich frage mich , was das ist Revisionsnummer Äquivalent in Git .
Angenommen, wir arbeiten an Version 3.0.8 und jede Fehlerbehebung hat ihre eigene Versionsnummer, die wir verwenden können, wenn wir über diese Fehlerbehebung sprechen. Wenn ich also den Code in Git mit 3.0.8 tagge, was kann ich dann als Revisionsnummer oder eine andere detailliertere Art der Identifizierung verwenden? Ich finde den Hash nicht so benutzerfreundlich für Menschen.
Antworten:
Gute oder schlechte Nachrichten für Sie, dieser Hash ist die Revisionsnummer. Ich hatte auch Probleme damit, als ich von SVN zu Git wechselte.
Sie können "tagging" in git verwenden, um eine bestimmte Revision als "release" für eine bestimmte Version zu kennzeichnen, sodass Sie leicht auf diese Revision verweisen können. Schauen Sie sich diesen Blog-Beitrag an .
Das Wichtigste zu verstehen ist, dass Git keine Revisionsnummern haben kann - denken Sie an die Dezentralität. Wenn Benutzer A und B sich beide auf ihre lokalen Repositorys festlegen, wie kann git eine fortlaufende Revisionsnummer sinnvoll zuweisen? A hat keine Kenntnis von B, bevor sie die Änderungen des anderen drücken / ziehen.
Eine andere zu betrachtende Sache ist die vereinfachte Verzweigung für Bugfix-Verzweigungen:
Beginnen Sie mit einer Version: 3.0.8. Führen Sie dann nach dieser Veröffentlichung Folgendes aus:
Dadurch wird eine Verzweigung für Bugfixes erstellt. Kasse der Filiale:
Nehmen Sie nun die gewünschten Bugfix-Änderungen vor.
Übernehmen Sie sie und wechseln Sie zurück zum Hauptzweig:
Ziehen Sie dann diese Änderungen aus dem anderen Zweig ein:
Auf diese Weise haben Sie einen separaten Release-spezifischen Bugfix-Zweig, aber Sie ziehen die Bugfix-Änderungen immer noch in Ihren Hauptentwicklungs-Trunk.
quelle
fixed in 547cc3e..c4b2eba
ist und Sie eine andere Revision haben, haben Sie keine Ahnung, ob Ihr Code das Update enthalten soll oder nicht?! Sicher haben die Git bei git-central eine Lösung dafür?!?!Mit modernem Git (in meinem Fall 1.8.3.4) und ohne Verwendung von Zweigen können Sie Folgendes tun:
quelle
git rev-list --count --first-parent HEAD
git rev-list --count HEAD
je nachdem, wann die letzten Pushs und Pulls ausgeführt wurden.--first-parent
Adresse Ihr Anliegen? Ich würde es hassen, eine scheinbar einfachste Lösung aufgrund eines seltenen Randfalls zu vermeiden, wenn es eine ebenso einfache Problemumgehung oder einen Weg gibt, sie robuster zu machen.--first-parent
hilft. Solange keine Neubasierung durchgeführt wird und immer derselbe Zweig für die Erstellung von Releases verwendet wird (und natürlich für die Berechnung dieser Release-Nummer), könnte dies verwendet werden. Ich bin mir jedoch immer noch nicht sicher, ob das Commit, von dem die Veröffentlichung stammt, immer eindeutig identifiziert werden kann. Es gibt so viele Dinge, die hier schief gehen können ... aber im Moment kann ich mir nichts vorstellen, was dies definitiv brechen würde (angesichts meiner obigen "solange" Aussagen). Diegit describe
in einer anderen Antwort erwähnte Methode ist der richtige Weg. Erstellen Sie ein Tag, wenn Sie etwas lesbares möchten.Der
git describe
Befehl erstellt einen etwas besser lesbaren Namen, der sich auf ein bestimmtes Commit bezieht. Zum Beispiel aus der Dokumentation:Solange Sie vernünftig benannte Tags verwenden, um bestimmte Releases zu kennzeichnen, kann dies als ungefähr gleichwertig mit einer SVN- "Revisionsnummer" angesehen werden.
quelle
git
Repository bereits Tags enthält. Wenn dies nicht der Fall ist , schlägt git description möglicherweise mit "fatal: Keine Namen gefunden, kann nichts beschreiben" fehl. - Stapelüberlauf ; Dies bedeutet, dass Sie Tags selbst einrichten müssen.git describe
niemals versagen möchten , verwenden Sie diegit describe --always
Option.git describe
irgendwie verwendet werden, um das Quell-Commit zu finden? Ich meine, ohne die Commits im Protokoll manuell zu zählen.v1.0.4
) als auch die letzte Commit-ID (2414721
) sind bereits Teil der Ausgabe von git description.Die anderen Plakate sind richtig, es gibt keine "Revisionsnummer".
Ich denke, der beste Weg ist, Tags für "Releases" zu verwenden!
Aber ich habe das Folgende verwendet, um Revisionsnummern zu fälschen (nur damit Kunden Revisionen und den Fortschritt sehen können, da sie die gleichen zunehmenden Revisionen von Git haben wollten, wie sie es durch Subversion gewohnt waren).
Zeigen Sie an, dass die "aktuelle Version" von "HEAD" folgendermaßen simuliert wird:
git rev-list HEAD | wc -l
Aber was ist, wenn der Client mir sagt, dass es einen Fehler in "Revision" 1302 gibt?
Zu diesem Zweck habe ich dem Abschnitt [alias] meiner ~ / .gitconfig Folgendes hinzugefügt:
show-rev-number = !sh -c 'git rev-list --reverse HEAD | nl | awk \"{ if(\\$1 == "$0") { print \\$2 }}\"'
using
git show-rev-number 1302
wird dann den Hash für die "Revision" drucken :)Ich habe vor einiger Zeit einen Blog-Beitrag über diese "Technik" verfasst.
quelle
git bisect
(Link) das geeignete Werkzeug, um zu identifizieren, was sich wann von wem geändert hat.git rev-list --reverse HEAD | awk "{ print NR }" | tail -n 1
Git hat nicht das gleiche Konzept von Revisionsnummern wie Subversion. Stattdessen wird jeder mit einem Commit erstellte Snapshot durch eine SHA1-Prüfsumme gekennzeichnet. Warum? Es gibt verschiedene Probleme mit einem laufenden Revno in einem verteilten Versionskontrollsystem:
Erstens, da die Entwicklung überhaupt nicht linear ist, ist das Anhängen einer Zahl als Problem ziemlich schwierig zu lösen, so dass Ihre Anforderungen als Programmierer erfüllt werden. Der Versuch, dies durch Hinzufügen einer Nummer zu beheben, kann schnell problematisch werden, wenn sich die Nummer nicht wie erwartet verhält.
Zweitens können Revisionsnummern auf verschiedenen Computern generiert werden. Dies erschwert die Synchronisation von Zahlen erheblich - insbesondere, da die Konnektivität nur in eine Richtung erfolgt. Möglicherweise haben Sie nicht einmal Zugriff auf alle Computer mit dem Repository.
Drittens entspricht die Identität eines Commits (was das Commit ist) in git, etwas Pionierarbeit durch das inzwischen nicht mehr existierende OpenCM-System, seinem Namen (der SHA-ID). Dieses Namens- / Identitätskonzept ist sehr stark. Wenn Sie mit einem Commit-Namen in der Hand sitzen, wird das Commit auch auf nicht fälschbare Weise identifiziert. Auf diese Weise können Sie alle Ihre Commits mit dem
git fsck
Befehl auf Beschädigung zurück überprüfen .Da wir nun eine DAG (Directed Acyclic Graph) mit Revisionen haben und diese den aktuellen Baum bilden, benötigen wir einige Tools, um Ihr Problem zu lösen : Wie unterscheiden wir verschiedene Versionen? Erstens können Sie einen Teil des Hashs weglassen, wenn ein bestimmtes Präfix, beispielsweise 1516bd , Ihr Commit eindeutig identifiziert. Das ist aber auch eher erfunden. Stattdessen besteht der Trick darin, Tags und / oder Zweige zu verwenden. Ein Tag oder Zweig ähnelt einem "gelben Stick it Note", den Sie an eine bestimmte Commit-SHA1-ID anhängen. Tags sollen sich im Wesentlichen nicht bewegen, während sich ein Zweig bewegt, wenn neue Festschreibungen an seinem HEAD vorgenommen werden. Es gibt Möglichkeiten, auf ein Commit um ein Tag oder einen Zweig zu verweisen. Weitere Informationen finden Sie in der Manpage von git-rev-parse.
Wenn Sie an einem bestimmten Code arbeiten müssen, wird dieser normalerweise geändert und sollte daher ein Zweig mit einem sprichwörtlichen Themennamen sein. Das Erstellen vieler Zweige (20 bis 30 pro Programmierer sind keine Seltenheit, einige 4 bis 5 werden veröffentlicht, damit andere daran arbeiten können) ist der Trick für effektives Git. Jedes Werk sollte als eigener Zweig beginnen und dann beim Testen zusammengeführt werden. Unveröffentlichte Zweige können komplett umgeschrieben werden, und dieser Teil der Zerstörung der Geschichte ist eine Kraft des Schwachsinns.
Wenn die Änderung in den Meister aufgenommen wird , friert sie etwas ein und wird zur Archäologie. An diesem Punkt können Sie es markieren, aber häufiger wird in einem Bug-Tracker oder Issue-Tracker über die sha1-Summe auf das bestimmte Commit verwiesen. Tags sind in der Regel für Versionsfehler und Verzweigungspunkte für Wartungszweige (für alte Versionen) reserviert.
quelle
Wenn Sie interessiert sind, habe ich Versionsnummern automatisch aus Git-Infos hier im Format verwaltet
Dabei ist build die Gesamtzahl der Commits. Sie sehen den interessanten Code in der
Makefile
. Hier ist der relevante Teil, um auf den anderen Teil der Versionsnummer zuzugreifen:quelle
Eine Bash-Funktion:
gibt so etwas wie aus
Das ist
quelle
Der SHA1-Hash des Commits entspricht einer Subversion-Revisionsnummer.
quelle
Dies habe ich in meinem Makefile basierend auf anderen Lösungen getan. Beachten Sie, dass Ihr Code dadurch nicht nur eine Revisionsnummer erhält, sondern auch der Hash angehängt wird, mit dem Sie die Version neu erstellen können.
quelle
git-describe
, um Fehler zu vermeiden, mitgit describe --always --dirty --long --tags
dem in allen Fällen funktioniert, die ich mir vorstellen kann.Das Problem bei der Verwendung des Git-Hash als Build-Nummer ist, dass er nicht monoton ansteigt. OSGi schlägt vor, einen Zeitstempel für die Build-Nummer zu verwenden. Es sieht so aus, als ob die Anzahl der Commits für den Zweig anstelle der Subversion- oder Perforce-Änderungsnummer verwendet werden könnte.
quelle
Ich habe einige PowerShell-Dienstprogramme geschrieben, um Versionsinformationen von Git abzurufen und das Taggen zu vereinfachen
Funktionen: Get-LastVersion, Get-Revision, Get-NextMajorVersion, Get-NextMinorVersion, TagNextMajorVersion, TagNextMinorVersion:
quelle
Jedes Commit hat einen eindeutigen Hash. Ansonsten gibt es in git keine Revisionsnummern. Sie müssen Commits selbst markieren, wenn Sie mehr Benutzerfreundlichkeit wünschen.
quelle
Ich möchte nur einen anderen möglichen Ansatz erwähnen - und zwar unter Verwendung von
git
Git-Notes (1) , die seit Version 1.6.6 ( Note to Self - Git ) existieren (ich verwendegit
Version 1.7.9.5).Grundsätzlich habe ich
git svn
ein SVN-Repository mit linearem Verlauf geklont (kein Standardlayout, keine Verzweigungen, keine Tags) und wollte die Revisionsnummern im geklontengit
Repository vergleichen. Dieser Git-Klon hat standardmäßig keine Tags, daher kann ich ihn nicht verwendengit describe
. Die Strategie hier würde wahrscheinlich nur für die lineare Historie funktionieren - nicht sicher, wie sie sich bei Zusammenführungen usw. entwickeln würde; aber hier ist die grundlegende Strategie:git rev-list
nach einer Liste aller Commit-Historienrev-list
standardmäßig in "umgekehrter chronologischer Reihenfolge" erfolgt, verwenden wir den--reverse
Schalter, um eine Liste der Commits zu erhalten, die zuerst nach den ältesten sortiert sindbash
Shell, umgit log
with--notes
, wodurch auch die Notiz eines Commits ausgegeben wird, in diesem Fall die "Revisionsnummer".git status
).Beachten Sie zunächst, dass
git
Notizen einen Standardspeicherort haben. Sie können jedoch auch einenref
(Erence) für Notizen angeben , der sie in einem anderen Verzeichnis unter speichert.git
. In einemgit
Repo-Ordner können Sie beispielsweise anrufen, umgit notes get-ref
zu sehen, welches Verzeichnis dies sein wird:Zu beachten ist, dass Sie, wenn Sie
notes add
mit a arbeiten--ref
, diese Referenz auch danach erneut verwenden müssen. Andernfalls werden möglicherweise Fehler wie " Keine Notiz für Objekt XXX gefunden ... " angezeigt .In diesem Beispiel habe ich beschlossen,
ref
die Notizen "linrev" (für lineare Überarbeitung) zu nennen. Dies bedeutet auch, dass es unwahrscheinlich ist, dass die Prozedur bereits vorhandene Notizen stört. Ich benutze den--git-dir
Schalter auch, da ich alsgit
Neuling einige Probleme hatte, ihn zu verstehen - also möchte ich mich "für später erinnern":)
; und ich benutze auch--no-pager
zur Unterdrückung Laichen vonless
bei der Verwendunggit log
.Angenommen, Sie befinden sich in einem Verzeichnis mit einem Unterordner,
myrepo_git
der eingit
Repository ist. man könnte tun:Zumindest in meinem speziellen Fall einer vollständig linearen Historie ohne Verzweigungen scheinen die Revisionsnummern mit diesem Ansatz
git log
übereinzustimmen - und außerdem scheint es, dass dieser Ansatz die Verwendung mit Revisionsbereichen ermöglicht, während immer noch die richtigen Revisionsnummern erhalten werden - YMMV mit einem anderen Kontext, obwohl ...Hoffe das hilft jemandem,
Prost!
EDIT: Ok, hier ist es ein bisschen einfacher, mit
git
Aliasnamen für die obigen Schleifen, genanntsetlinrev
undunsetlinrev
; Wenn Sie sich in Ihrem Git-Repository-Ordner befinden, tun Siebash
dies ( Beachten Sie das böse Entkommen, siehe auch # 16136745 - Hinzufügen eines Git-Alias mit einem Semikolon ):... damit Sie einfach aufrufen können,
git setlinrev
bevor Sie versuchen, ein Protokoll mit linearen Revisionsnotizen zu erstellen; undgit unsetlinrev
diese Notizen zu löschen, wenn Sie fertig sind; Ein Beispiel aus dem Git-Repo-Verzeichnis:Die Zeit, die die Shell benötigt, um diese Aliase zu vervollständigen, hängt von der Größe des Repository-Verlaufs ab.
quelle
Für Personen mit einem Ant- Build-Prozess können Sie eine Versionsnummer für ein Projekt auf Git mit diesem Ziel generieren:
Das Ergebnis sieht folgendermaßen aus:
Das Dirty-Flag ist hier, wenn Sie Dateien haben, die beim Generieren der Versionsnummer nicht festgeschrieben wurden. Denn normalerweise muss sich beim Erstellen / Packen Ihrer Anwendung jede Codeänderung im Repository befinden.
quelle
Zusammen mit der SHA-1-ID des Commits hätten Datum und Uhrzeit der Serverzeit geholfen?
Etwas wie das:
quelle
Tags aus dem Git-Handbuch sind eine brillante Antwort auf dieses Problem:
Schauen Sie sich 2.6 Git Basics - Tagging an
quelle
By default, the git push command doesn’t transfer tags to remote servers.
Wir verwenden diesen Befehl, um Version und Revision von git abzurufen:
Es kehrt zurück
gcc7b71f
)v2.1.0
für Releases verwendet)v5.3.0-88-gcc7b71f
)v5.3.0-88-gcc7b71f-dirty
)Siehe auch: https://www.git-scm.com/docs/git-describe#Documentation/git-describe.txt
quelle
Post-Build-Ereignis für Visual Studio
quelle
Betrachten Sie zu verwenden
git-rev-label
Gibt Informationen zur Git-Repository-Revision in einem Format wie
master-c73-gabc6bec
. Kann Vorlagenzeichenfolge oder -datei mit Umgebungsvariablen und Informationen von Git füllen. Nützlich, um Informationen zur Version des Programms bereitzustellen: Zweig, Tag, Commit-Hash, Commit-Anzahl, Dirty-Status, Datum und Uhrzeit. Eines der nützlichsten Dinge ist die Anzahl der Commits, wobei zusammengeführte Zweige nicht berücksichtigt werden - nur der erste Elternteil.quelle