Ich habe eine Reihe von Fragen zu einfachen Tools zur Quellcodeverwaltung gelesen und Git schien mir eine vernünftige Wahl zu sein. Ich habe es in Betrieb und es funktioniert soweit gut. Ein Aspekt, den ich an CVS mag, ist die automatische Inkrementierung einer Versionsnummer.
Ich verstehe, dass dies in einem verteilten Repository weniger sinnvoll ist, aber als Entwickler möchte / brauche ich so etwas. Lassen Sie mich erklären, warum:
Ich benutze Emacs. In regelmäßigen Abständen suche ich nach neuen Versionen der Lisp-Quelldateien für Pakete von Drittanbietern. Angenommen, ich habe eine Datei, foo.el, die laut Header Version 1.3 ist. Wenn ich nach der neuesten Version schaue und sehe, dass es 1.143 oder 2.6 oder was auch immer ist, weiß ich, dass ich ziemlich weit zurück bin.
Wenn ich stattdessen ein paar Hashes mit 40 Zeichen sehe, weiß ich nicht, welche später sind, oder bekomme keine Vorstellung davon, wie viel später es ist. Ich würde es absolut hassen, wenn ich ChangeLogs manuell überprüfen müsste, um eine Vorstellung davon zu bekommen, wie veraltet ich bin.
Als Entwickler möchte ich diese Höflichkeit, wie ich sie sehe, auf die Leute ausdehnen, die meine Ausgabe verwenden (und vielleicht mache ich mir selbst etwas vor, aber das lassen wir für einen Moment beiseite). Ich möchte nicht daran denken müssen, die verdammte Zahl jedes Mal selbst zu erhöhen, oder einen Zeitstempel oder ähnliches. Das ist eine echte PITA, und das weiß ich aus Erfahrung.
Welche Alternativen habe ich? Wenn ich kein $ Id: $ -Äquivalent erhalten kann, wie kann ich sonst das angeben, wonach ich suche?
Ich sollte erwähnen, dass meine Erwartung ist, dass der Endbenutzer Git NICHT installiert hat und selbst wenn dies der Fall ist, kein lokales Repository hat (in der Tat erwarte ich, dass es nicht auf diese Weise verfügbar gemacht wird).
quelle
filter-branch
oder so etwas neu aufbauen kann.git describe
Befehl unmittelbar vor dem Erstellen ausführen , die Ausgabe in einer Header-Datei speichern oder den Wert auf andere Weise in Ihren Code einbetten.Inzwischen gibt es Unterstützung für $ Id: $ in Git. Um es für die Datei README zu aktivieren, würden Sie "README ident" in .gitattributes einfügen . Platzhalter für Dateinamen werden unterstützt. Siehe man gitattributes für Details.
quelle
$Id$
genannten. Was weggespeichert wird, ist genau das, was Sie bekommen. In jedem Fall gehört die Version zur vollständigen Sammlung von Dateien, aus denen sich ein Commit zusammensetzt, nicht zu einer bestimmten Datei (Diese Idee ist ein Überbleibsel aus den RCS-Tagen, oder vielleicht ist SCCS hier schuld ... Da CVS nur eine ist verherrlicht Frontend zu RCS, und SVN versucht, ein CVS-Workalike zu sein, es blieb.).Dies ist keine unangemessene Anfrage des OP.
Mein Anwendungsfall ist:
/usr/local/bin
wenn sie fertig sind.Ich benutze drei separate Maschinen mit demselben Git-Repository. Es wäre schön zu wissen, in welcher "Version" der Datei ich mich gerade
/usr/local/bin
befinde, ohne ein Handbuch "diff -u <Repo-Version> <Version in / usr / local / bin>" erstellen zu müssen.Wenn Sie negativ sind, denken Sie daran, dass es andere Anwendungsfälle gibt. Nicht jeder verwendet Git für die Zusammenarbeit, wobei die Dateien im Git-Repository ihr "endgültiger" Speicherort sind.
Wie auch immer, ich habe eine Attributdatei im Repository wie folgt erstellt:
Dann füge $ Id $ irgendwo in die Datei ein (ich setze es gerne nach dem Schebang).
Das Commit. Beachten Sie, dass dies nicht automatisch die erwartete Erweiterung bewirkt. Sie müssen die Datei beispielsweise neu zusammenstellen, z.
Und dann sehen Sie die Erweiterung zum Beispiel:
Einige gute Informationen finden Sie unter Wie aktiviere ich die Ident-Zeichenfolge für ein Git-Repository? .
quelle
git co
soll tun? Ich habe die Fehlermeldung "git: 'co' is not a git command. See 'git --help'.
" Sollte es seingit checkout
?Ich bin mir nicht sicher, ob dies jemals in Git sein wird. Um Linus zu zitieren :
Es ist jedoch ziemlich einfach, das Protokoll zu überprüfen. Wenn Sie den stabilen Zweig von foo.el verfolgen, können Sie sehen, welche neuen Commits im Protokoll des stabilen Zweigs enthalten sind, die nicht in Ihrer lokalen Kopie enthalten sind. Wenn Sie die interne Versionsnummer von CVS simulieren möchten, können Sie den Zeitstempel des letzten Commits vergleichen.
Bearbeiten: Sie sollten dafür die Skripte eines anderen schreiben oder verwenden, natürlich nicht manuell.
quelle
$Id$
viaident
Attribut hinzugefügt , wie in einer anderen Antwort hier erwähnt, was zeigt, dass selbst git selbst keine Geisel von Linus 'Meinung ist.Wie ich geschrieben habe vor :
quelle
Ich hatte das gleiche Problem. Ich brauchte eine Version, die einfacher als eine Hash-Zeichenfolge war und für Benutzer des Tools verfügbar war, ohne eine Verbindung zum Repository herstellen zu müssen.
Ich habe es mit einem Git-Pre-Commit-Hook gemacht und mein Skript geändert, um es automatisch aktualisieren zu können.
Ich stütze die Version auf die Anzahl der durchgeführten Commits. Dies ist eine leichte Rennbedingung, da zwei Personen gleichzeitig eine Verpflichtung eingehen könnten und beide glauben, dass sie dieselbe Versionsnummer festschreiben, aber wir haben nicht viele Entwickler für dieses Projekt.
Als Beispiel habe ich ein Skript, das ich in Ruby einchecke, und ich füge diesen Code hinzu - es ist ein ziemlich einfacher Code, so dass es einfach ist, in verschiedene Sprachen zu portieren, wenn Sie etwas in einer anderen Sprache einchecken (obwohl dies offensichtlich der Fall ist) funktioniert nicht einfach mit nicht ausführbaren Checkins (wie Textdateien). Ich habe hinzugefügt:
Und dann füge ich dem Skript eine Befehlszeilenoption (-updateVersion) hinzu. Wenn ich sie also als "tool -updateVersion" bezeichne, ruft sie einfach updateVersion für das Tool auf, das den Wert "MYVERSION" an sich ändert und dann beendet (Sie könnten) Lassen Sie es auch andere Dateien aktualisieren, wenn diese ebenfalls geöffnet werden, wenn Sie dies wünschen.
Sobald das eingerichtet ist, gehe ich zum Git-Kopf und erstelle ein ausführbares einzeiliges Bash-Skript in
.git/hooks/pre-commit
.Das Skript wechselt einfach in den Kopf des Git-Verzeichnisses und ruft mein Skript mit auf
-updateVersion
.Jedes Mal, wenn ich das Pre-Commit-Skript einchecke, wird es ausgeführt, wodurch mein Skript mit -updateVersion ausgeführt wird. Anschließend wird die Variable MYVERSION basierend auf der Anzahl der Commits aktualisiert. Magie!
quelle
git updateVersion
? Bitte geben Sie einige Beispiele an, wie es heißt.Wenn es für Sie wichtig ist, $ Keywords $ zu haben, könnten Sie vielleicht versuchen, stattdessen Mercurial zu betrachten? Es hat eine hgkeyword-Erweiterung, die implementiert, was Sie wollen. Mercurial ist sowieso als DVCS interessant.
quelle
Mit Git-Repositorys wird das
tag
Objekt verwendet. Dies kann verwendet werden, um ein Commit mit einer beliebigen Art von Zeichenfolge zu kennzeichnen, und kann zum Markieren von Versionen verwendet werden. Sie können diese Tags in einem Repository mit demgit tag
Befehl sehen, der alle Tags zurückgibt.Es ist einfach, ein Tag auszuchecken. Wenn beispielsweise ein Tag vorhanden ist
v1.1
, können Sie dieses Tag in einem Zweig wie diesem auschecken:Da es sich um ein Objekt der obersten Ebene handelt, wird der gesamte Verlauf dieses Commits angezeigt. Außerdem können Sie Diffs ausführen, Änderungen vornehmen und Zusammenführungen durchführen.
Darüber hinaus bleibt ein Tag bestehen, auch wenn der Zweig, in dem es sich befand, gelöscht wurde, ohne wieder in die Hauptzeile eingefügt zu werden.
quelle
export-subst
Funktion von in Dateien bearbeitet werdengitattributes(5)
. Dies erfordert natürlich die Verwendung vongit archive
, um Releases zu erstellen, und nur in der resultierenden TAR-Datei sind die Ersetzungsänderungen sichtbar.Wenn ich das richtig verstehe, möchten Sie im Wesentlichen wissen, wie viele Commits für eine bestimmte Datei seit Ihrer letzten Aktualisierung durchgeführt wurden.
Holen Sie sich zuerst die Änderungen im Remote-Ursprung, aber führen Sie sie nicht in Ihrem
master
Zweig zusammen:Holen Sie sich dann ein Protokoll der Änderungen, die an einer bestimmten Datei zwischen Ihrem
master
Zweig und der Fernbedienung vorgenommen wurdenorigin/master
.Dies gibt Ihnen die Log - Meldungen aller Commits, die im Remote - Repository passiert seit dem letzten verschmolzen
origin/master
in Ihremmaster
.Wenn Sie nur die Anzahl der Änderungen zählen möchten, leiten Sie sie an weiter
wc
. Sagen Sie so:quelle
Wenn Sie nur möchten, dass die Leute eine Vorstellung davon bekommen, wie weit sie veraltet sind, kann Git sie auf verschiedene recht einfache Arten darüber informieren. Sie vergleichen beispielsweise die Daten des letzten Commits auf ihrem Trunk und Ihrem Trunk. Sie können verwenden, um
git cherry
zu sehen, wie viele Commits in Ihrem Trunk aufgetreten sind, die in ihrem nicht vorhanden sind.Wenn das alles ist, wofür Sie dies möchten, würde ich nach einer Möglichkeit suchen, es ohne Versionsnummer bereitzustellen.
Außerdem würde ich mich nicht darum kümmern, die Höflichkeit auf irgendjemanden auszudehnen, es sei denn, Sie sind sicher, dass sie es wollen. :) :)
quelle
Um die Erweiterung auf alle Dateien in allen Unterverzeichnissen im Repository anzuwenden, fügen Sie
.gitattributes
dem Verzeichnis der obersten Ebene im Repository (dh dort, wo Sie normalerweise die.gitignore
Datei ablegen würden) eine Datei hinzu, die Folgendes enthält:Um dies zu sehen, müssen Sie zuerst die Datei (en) effektiv auschecken, z. B. löschen oder auf irgendeine Weise bearbeiten. Stellen Sie sie dann wieder her mit:
Und Sie sollten sehen,
$Id$
ersetzt durch etwas wie:Von
man gitattributes
:Diese ID ändert sich jedes Mal, wenn eine neue Version der Datei festgeschrieben wird.
quelle
RCS-IDs eignen sich gut für Projekte mit nur einer Datei, aber für alle anderen Projekte sagt die $ Id $ nichts über das Projekt aus (es sei denn, Sie erzwingen Dummy-Check-Ins in eine Dummy-Versionsdatei).
Dennoch könnte man interessiert sein, wie man die Entsprechungen von $ Author $, $ Date $, $ Revision $, $ RCSfile $ usw. auf Dateiebene oder auf Commit-Ebene erhält (wie man sie dort platziert, wo einige Schlüsselwörter sind, ist eine andere Frage). Ich habe keine Antwort auf diese Fragen, sehe aber die Notwendigkeit, diese zu aktualisieren, insbesondere wenn die Dateien (jetzt in Git) von RCS-kompatiblen Systemen (CVS) stammen.
Solche Schlüsselwörter können interessant sein, wenn die Quellen getrennt von einem Git-Repository verteilt werden (das mache ich auch). Meine Lösung lautet wie folgt:
Jedes Projekt hat ein eigenes Verzeichnis, und im Projektstamm habe ich eine Textdatei mit dem Namen,
.version
deren Inhalt die aktuelle Version beschreibt (der Name, der beim Exportieren der Quellen verwendet wird).Während der Arbeit für die nächste Version extrahiert ein Skript diese
.version
Nummer, einen Git-Versionsdeskriptor (wiegit describe
) und eine monotone Build-Nummer.build
(plus Host und Datum) in eine automatisch generierte Quelldatei, die mit dem endgültigen Programm verknüpft ist aus welcher Quelle und wann es gebaut wurde.Ich entwickle neue Funktionen in separaten Zweigen und füge als erstes
n
(für "next") der.version
Zeichenfolge hinzu (mehrere Zweige, die von derselben Wurzel stammen, würden dieselbe temporäre.version
Nummer verwenden). Vor der Veröffentlichung entscheide ich, welche Zweige zusammengeführt werden sollen (hoffentlich haben alle die gleichen.version
). Vor dem Festschreiben der Zusammenführung aktualisiere ich.version
auf die nächste Nummer (Haupt- oder Nebenaktualisierung, abhängig von den zusammengeführten Funktionen).quelle
Wenn Sie die git wollen Informationen verpflichten zugänglich in den Code, dann Sie haben einen Pre-Build - Schritt zu tun , um es dorthin zu gelangen. In Bash für C / C ++ könnte es ungefähr so aussehen:
prebuild.sh
mit dem
version.h
Aussehen wie:Dann, wo immer Sie es in Ihrem Code
#include "version.h"
und Ihrer Referenz benötigengit_tag
odergit_commit
nach Bedarf.Und
Makefile
vielleicht haben Sie so etwas:Dies hat den Vorteil von:
Diese Implementierung von
prepublish.sh
hat die Nachteile von:git_tag
/git_commit
nicht geändert hat.git describe --tags --always --dirty
diese Option, um diesen Anwendungsfall zu erfassen.Ein Züchter
prebuild.sh
, der diese Probleme vermeiden könnte, bleibt dem Leser als Übung überlassen.quelle
Ich stimme denen zu, die der Meinung sind, dass das Ersetzen von Token eher zu Build-Tools als zu Tools zur Versionskontrolle gehört.
Sie sollten über ein automatisiertes Release-Tool verfügen, mit dem Sie die Versions-IDs in Ihren Quellen zum Zeitpunkt der Freigabe der Version festlegen können.
quelle
Tag-Namen und andere verwandte Informationen können jetzt von Git über die
export-subst
Funktion von automatisch direkt in Dateien bearbeitet werdengitattributes(5)
. Dies erfordert natürlich die Verwendung vongit archive
, um Releases zu erstellen, und nur in der resultierenden TAR-Datei sind die Ersetzungsänderungen sichtbar.Fügen Sie beispielsweise in die
.gitattributes
Datei die folgende Zeile ein:Dann können Sie in Quelldateien eine Zeile wie die folgende hinzufügen:
Und es wird erweitert, um in einer Version so auszusehen, die zum Beispiel erstellt wurde von
git archive v1.2.0.90
:quelle
Da Sie Emacs verwenden, könnten Sie Glück haben :)
Ich bin zufällig auf diese Frage gestoßen, und auch zufällig bin ich vor einigen Tagen auf Lively gestoßen, ein Emacs-Paket, mit dem Sie lebhafte Stücke von Emacs Lisp in Ihrem Dokument haben können. Ich habe es nicht versucht, um ehrlich zu sein, aber es kam mir beim Lesen in den Sinn.
quelle
Ich kam auch von SCCS, RCS und CVS (
%W% %G% %U%
).Ich hatte eine ähnliche Herausforderung. Ich wollte wissen, welche Version ein Code auf einem System hat, auf dem er ausgeführt wird. Das System kann mit einem Netzwerk verbunden sein oder nicht. Auf dem System ist möglicherweise Git installiert oder nicht. Auf dem System ist möglicherweise das GitHub-Repository installiert oder nicht.
Ich wollte die gleiche Lösung für verschiedene Codetypen (.sh, .go, .yml, .xml usw.). Ich wollte, dass jede Person ohne Git- oder GitHub-Kenntnisse die Frage "Welche Version läuft?" Beantworten kann.
Also schrieb ich einen Wrapper um ein paar Git-Befehle. Ich benutze es, um eine Datei mit einer Versionsnummer und einigen Informationen zu markieren. Es löst meine Herausforderung. Es kann Ihnen helfen.
https://github.com/BradleyA/markit
quelle
Um dieses Problem für mich selbst zu beheben, habe ich einen kleinen "Hack" als Post-Commit-Hook erstellt:
Ausführlicher dokumentiert in diesem Beitrag auf meinem Blog .
quelle