Wechsel von CVS zu Git: $Id:$ äquivalent?
Lese ich durch eine Reihe von Fragen zu Fragen, über simple source-code-control-tools und Git schien wie eine vernünftige Wahl. Ich habe es installiert, und es funktioniert gut so weit. Ein Aspekt, der wie ich über CVS ist die automatische Inkrementierung der Versionsnummer.
Ich verstehe, dass dies weniger sinnvoll ist, in einem verteilten repository, aber als Entwickler, ich will/braucht so etwas wie dieses. Lassen Sie mich erklären, warum:
Benutze ich Emacs. Regelmäßig gehe ich durch und suchen Sie nach neuen Versionen von Lisp-Quelldateien für third-party-Pakete. Sagen, ich habe eine Datei "foo".el, die, nach dem header, ist version 1.3; wenn ich schaue auf die neueste version-und siehe, es ist 1.143 oder 2,6 oder was auch immer, ich weiß, ich bin ziemlich weit hinter sich.
Wenn ich stattdessen ein paar von 40-Zeichen-hashes, kann ich nicht wissen, was später oder erhalten eine Idee von, wie viel später es wird. Ich absolut hasse es, wenn ich es manuell überprüfen ChangeLogs nur um eine Idee zu bekommen, wie out-of-date ich bin.
Als Entwickler, ich will verlängern diese Höflichkeit, so wie ich es sehe, den Menschen, die meine Ausgabe (und vielleicht bin ich ein Scherz mich, dass jemand ist, aber lassen wir das beiseite für einen moment). Ich will nicht daran denken müssen, erhöhen Sie die verdammte Nummer mich jedes mal, oder einen timestamp oder sowas. Das ist ein echter PITA, und ich weiß das aus Erfahrung.
Also welche alternativen habe ich? Wenn ich nicht bekommen kann eine $Id:$ äquivalent, wie kann ich sonst noch bieten, was ich Suche?
Sollte ich erwähnen, dass meine Erwartung ist, dass der Endanwender NICHT habe Git installiert und selbst wenn Sie es tun, wird kein lokales repository (in der Tat, ich erwarte nicht, um es auf diese Weise).
Du musst angemeldet sein, um einen Kommentar abzugeben.
SHA ist nur eine Darstellung einer version (auch kanonischen). Die
git describe
Befehl bietet andere und funktioniert so ganz gut.Zum Beispiel, wenn ich
git describe
in meinen master-branch von meinem Java-memcached-client Quelle, bekomme ich diese:Sagt, dass zwei Dinge wichtig:
Sagen wir zum Beispiel, Sie verpackt ein
version
Datei mit der Quelle (oder sogar umgeschrieben, alle Inhalte für die distribution) zeigen Sie, dass Nummer. Lassen Sie uns sagen, dass die verpackte version war2.2-12-g6c4ae7a
(kein release, aber ein Gültiger version).Können Sie nun genau sehen, wie weit hinter Ihnen sind (4 verpflichtet), und können Sie genau sehen, welche 4 verpflichtet:
filter-branch
oder so etwas.git describe
- Befehl vor dem erstellen, speichern Sie die Ausgabe in einer header-Datei oder sonst einbetten, den Wert in Ihrem code.Inzwischen gibt es Unterstützung für die $Id:$ Git. Aktivieren Sie für die Datei README würde man "README ident" in .gitattributes. Wildcards in Dateinamen werden unterstützt. Sehen Mann gitattributes für details.
$Id$
erwähnt. Was ist Weg gespeichert ist genau das, was Sie bekommen. In jedem Fall, die version gehört die vollständige Auflistung der Dateien, aus denen ein commit, nicht auf eine Datei im besonderen (diese Idee ist ein überbleibsel aus der RCS Tage, oder vielleicht SCCS ist die Schuld hier... Wie CVS ist nur ein besserer frontend zu RCS, SVN versucht ein CVS-workalike, es stecken.).Dies ist nicht eine unzumutbare Anforderung von der OP.
Mein use-case ist:
/usr/local/bin
wenn Sie bereit sind.Ich die Verwendung von drei separaten Maschinen mit der gleichen Git-repository auf. Es wäre schön zu wissen welche "version" der Datei habe ich derzeit in
/usr/local/bin
zimmerreserviereung, ohne das Sie eine manuelle "diff -u <repo-version> <version in /usr/local/bin>".Diejenigen als negativ, denken Sie daran gibt es andere Anwendungen heraus dort. Nicht jeder nutzt Git für die gemeinsame Arbeit mit den Dateien im Git-repository wird Ihre "endgültige" Lage.
Sowieso, wie ich es Tat, war es zu schaffen, ein Attribute-Datei in das repository wie diese:
Dann setzen $Id$ irgendwo in der Datei (ich mag, um es nach der shebang).
Dem commit. Beachten Sie, dass dies nicht automatisch tun, den ausbau wie ich es erwartet hatte. Sie müssen re-co-der-Datei, zum Beispiel,
Und dann werden Sie sehen, der ausbau, zum Beispiel:
Einige gute Informationen ist in Wie aktiviere ich den ident-string für ein Git-repository?.
git co
tun sollen? Ich bekam die Fehlermeldung "git: 'co' is not a git command. See 'git --help'.
" Sollte es werdengit checkout
?Nicht sicher, ob dies jemals sein wird in Git. Zu Zitat Linus:
Es ist ziemlich leicht zu überprüfen, das Protokoll, obwohl - wenn Sie tracking-foo.el stable-Zweig, Sie können sehen, welche neuen commits in den stabilen Zweig ' s log, die nicht in der lokalen Kopie. Wenn Sie simulieren möchten CVS-interne Versionsnummer, können Sie vergleichen die Zeitstempel der letzten übergabe.
Edit: Sie schreiben soll oder Sie verwenden jemand anderes die Drehbücher für diese, natürlich, nicht machen dies manuell.
$Id$
über dieident
Attribut, wie bereits erwähnt in einer anderen Antwort hier, die zeigen, dass auch git selbst nicht als Geisel, um Linus ' s Meinung.Als ich geschrieben habe,vor:
Ich hatte das gleiche problem. Ich brauchte, um eine version, die war einfacher, als einen hash-string und steht für den Menschen, das tool zu verwenden, ohne Verbindung zum repository hergestellt werden.
Habe ich es mit einem Git-pre-commit-hook und veränderte mein Skript automatisch selbst aktualisieren.
Ich base die version aus der Anzahl von commits gemacht. Dies ist ein leichter race-Bedingung, weil zwei Leute verpflichten konnte in der gleichen Zeit, und beide denken, Sie Begehen die gleiche Versionsnummer, aber wir haben nicht viele Entwickler an diesem Projekt.
Mir ist in Ruby, aber es ist nicht sehr komplexen code. Das Ruby-Skript:
Und dann habe ich ein command-line option (-updateVersion), dass Anrufe updateVersion für das tool.
Schließlich gehe ich auf die Git-Kopf und erzeugen Sie ein ausführbares Skript in
.git/hooks/pre-commit
.Das Skript ändert einfach auf den Kopf des Git-Verzeichnis und ruft mein script mit
-updateVersion
.Jedes mal, wenn ich check-in, die MYVERSION variable aktualisiert wird, basiert auf, was die Anzahl von commits wird.
git updateVersion
? Bitte legen Sie einige Beispiele, wie es auch genannt wird.Wenn $Keywords$ ist wichtig für Sie, dann vielleicht könnten Sie versuchen, zu schauen, Mercurial statt? Es hat eine hgkeyword Erweiterung, das umzusetzen, was Sie wollen. Mercurial ist interessant, wie ein DVCS sowieso.
Etwas, das getan wird mit Git-repositories, ist die Verwendung der
tag
Objekt. Dies kann verwendet werden, um tag Begehen, mit jeder Art von string und kann verwendet werden, um mark-Versionen. Sie können sehen, dass tags, die in einem repository mit dergit tag
Befehl gibt alle tags.Es ist einfach zum check-out einen tag. Zum Beispiel, wenn es einen tag
v1.1
Sie können überprüfen, dass die tag sich auf einen Zweig so:Da es eine top-level-Objekt, sehen Sie die ganze Geschichte zu Begehen, sowie in der Lage zu laufen diffs, änderungen und merges.
Nicht nur das, sondern einen tag anhält, auch wenn der Zweig, es war gelöscht worden, ohne zu sein verschmolzen zurück in die main-Linie.
Wenn Sie nur will, dass Menschen in der Lage sein, um eine Idee zu bekommen, wie weit die out-of-date sind, Git informieren können Sie in mehrere relativ einfache Möglichkeiten. Sie vergleichen die Daten der letzten übertragung auf Ihren Stamm und Ihren Stamm, zum Beispiel. Sie können
git cherry
, um zu sehen, wie viele commits, die stattgefunden haben in Ihrem Kofferraum, die sind nicht vorhanden in dem ihrigen.Wenn das alles ist, Sie wollen, dass diese für, ich würde schauen für ein Weg, um es ohne eine Versionsnummer.
Auch, ich würde nicht die Mühe, die Verlängerung der Höflichkeit, niemanden, es sei denn Sie sicher sind, dass Sie es wollen. 🙂
Wenn ich das richtig verstehe, im wesentlichen, Sie wollen wissen, wie viele commits geschehen auf eine bestimmte Datei seit der letzten Aktualisierung.
Zunächst die änderungen in das remote-Herkunft, aber nicht Zusammenführen, Sie in Ihrem
master
Branche:Dann erhalten Sie ein Protokoll der änderungen, die passiert sind, auf eine bestimmte Datei zwischen Ihrem
master
Zweig und die remote -origin/master
.Dies gibt Ihnen die log-Meldungen aller änderungen, die passiert sind, in das remote-repository seit dem letzten verschmolzen
origin/master
in Ihremaster
.Wenn Sie wollen einfach nur die Anzahl der änderungen, Weiterreichen
wc
. Sagen, wie diese:RCS-IDs sind schön für die single-file-Projekte, aber für alle anderen die $Id$ sagt nichts über das Projekt (es sei denn, Sie tun gezwungen dummy-check-ins, um eine dummy-version der Datei).
Dennoch könnte man daran interessiert sein, wie man sich die äquivalente von $Author$, $Date$, $Revision$, $RCSfile$, etc. auf einer pro-Datei-Ebene oder auf der commit-Ebene (wie Sie zu setzen, wo Sie einige Schlüsselwörter sind, ist eine andere Frage). Ich habe nicht eine Antwort auf diese, aber sehen die Anforderung, um diese zu aktualisieren, vor allem, wenn die Dateien (die jetzt im Git) stammt aus der RCS-kompatible Systeme (CVS).
Solche keywords sind möglicherweise interessant, wenn die Quellen verteilt werden, unabhängig von einem Git-repository (das ist, was ich auch tun). Meine Lösung ist wie folgt:
Jedes Projekt hat ein Verzeichnis seiner eigenen, und in der Projekt-root-ich habe eine text-Datei mit dem Namen
.version
die Inhalte beschrieben, die aktuelle version (der name, der verwendet wird, wenn beim exportieren der Quellen).Während der Arbeit für das nächste release ein Skript extrahiert, die
.version
Anzahl, einige Git-version descriptor (wiegit describe
) und eine monotone build-Nummer in.build
(plus Gastgeber und Datum) zu einer automatisch generierten Quell-Datei, die verbunden ist, um das endgültige Programm, so können Sie herausfinden, aus welcher Quelle und als es gebaut wurde.Ich entwickle neue features in separaten branches, und das erste, was ich tun ist, fügen Sie
n
(für "next"), um die.version
string (mehrere Zweige, die aus der gleichen Wurzel würde dasselbe temporäre.version
- Nummer). Vor Freisetzung ich entscheiden, welche Zweige Zusammenführen (hoffentlich alle mit dem gleichen.version
). Bevor der merge -, update ich.version
mit der nächsten Nummer (major-oder minor-update, je nach der zusammengeführten Funktionen).Ich Stimme mit denen, die denken, dass token-Ersatz gehört es, Werkzeuge zu bauen, anstatt zu version control tools.
Sollten Sie einige automatisierte Freigabe-tool die versions-IDs in deinen Quellen zu der Zeit des Releases markiert.
Anzuwenden, die Ausdehnung auf alle Dateien in allen Unterverzeichnissen in das repository, fügen Sie ein
.gitattributes
Datei in das oberste Verzeichnis im repository (also dort, wo Sie normalerweise legen Sie die.gitignore
- Datei) mit:Sehen diese in der Wirkung, die Sie tun müssen ist eine effektive checkout der Datei(en) zuerst, wie das löschen oder Bearbeiten Sie Sie in irgendeiner Weise. Dann wiederherstellen mit:
Und Sie sollten sehen
$Id$
ersetzt durch etwas wie:Vom
man gitattributes
:Diese ID ändern jedes mal, wenn eine neue version der Datei eingespielt wird.
Da Sie Emacs, können Sie froh sein 🙂
Habe ich bin auf diese Frage durch Zufall und auch durch Zufall, ich habe kam durch Lebendige paar Tagen, ein Emacs-Paket, das erlaubt, mit lebhaften Stücken von Emacs Lisp in Ihrem Dokument. Ich habe es nicht ausprobiert, um ehrlich zu sein, aber es kam mir in den Sinn, wenn Sie dies Lesen.
Ich kam auch von SCCS, RCS, und CVS (
%W% %G% %U%
).Ich hatte eine ähnliche Herausforderung. Ich wollte wissen, welche version ein Stück code war auf jedem system läuft es. Das system kann oder kann nicht mit einem Netzwerk verbunden. Das system kann oder möglicherweise nicht über Git installiert. Das system kann oder kann nicht auf der GitHub-repository installiert.
Wollte ich die gleiche Lösung für verschiedene Arten von code (.sh .gehen, .yml, .xml, etc). Ich wollte eine person ohne Kenntnisse in Git oder GitHub in der Lage sein, um die Frage zu beantworten "Welche version Sie ausführen?"
So, ich schrieb das, was ich nenne ein wrapper um ein paar Git-Befehle. Ich benutze es um zu markieren eine Datei mit einer Versionsnummer und einige Informationen. Es löst meine Herausforderung. Es kann Ihnen dabei helfen.
https://github.com/BradleyA/markit
Wenn Sie möchten, dass die git-commit-Informationen zugänglich in den code, dann Sie haben zu tun ein pre-build-Schritt, um es dort zu bekommen. In der bash für C/C++ könnte wie folgt Aussehen:
prebuild.sh
mit
version.h
suchen, wie:Dann, wo Sie es in Ihrem code
#include "version.h"
- und Referenz -git_tag
odergit_commit
als nötig.Und Ihre
Makefile
könnte so etwas wie dieses:Dies hat den Vorteil:
unabhängig davon, Verzweigung, Zusammenführung von cherry-picking und so.
Diese Umsetzung
prepublish.sh
hat die Nachteile:git_tag
/git_commit
auch nicht ändern.git describe --tags --always --dirty
zu fangen, die use-case.Züchter
prebuild.sh
könnte diese Probleme vermeiden ist Links als übung für den Leser.