Frage

Im Moment verwenden wir Perforce für die Versionskontrolle. Es hat die praktische Funktion einer streng monoton wachsend Änderungsnummer, die wir uns beziehen können auf Builds, zB „Sie werden die Bugfix erhalten, wenn Ihr Build mindestens 44902 ist“.

Ich mag ein verteiltes System mit wechseln (wahrscheinlich git) es leichter zu verzweigen und von zu Hause aus zu arbeiten. (Beide, die durchaus möglich sind mit Perforce, aber der git Workflow hat einige Vorteile.) Obwohl also „Nebenfluß Entwicklung“ verteilt werden würde und nicht auf eine gemeinsame Revision Sequenzierung beziehen, würden wir immer noch einen Master git Repo halten, dass alle Änderungen würden müssen füttern, die vor einem Build erstellt wurde.

Was ist der beste Weg, streng zu bewahren ids zu erhöhen bauen? Die einfachste Art, wie ich denken kann, ist eine Art post-commit Haken zu haben, die aus feuern, wenn das Master-Repo aktualisiert wird, und registriert sie (die Hash), um das neue Baum-Objekt (oder das Objekt zu begehen? Ich bin neu auf git) mit einer zentralen Datenbank, die ids austeilt. (Ich sage „Datenbank“, aber ich würde wahrscheinlich tut es mit git-Tags und suchen Sie einfach nach der nächsten verfügbaren Tag-Nummer oder so etwas. So ist die „Datenbank“ wirklich .git / refs / tags würde / build-id /. )

Dies ist bearbeitbar, aber ich frage mich, ob es eine einfachere oder bereits umgesetzt oder Standard / „best practice“ Art und Weise, dies zu erreichen.

War es hilfreich?

Lösung

Ich schließe ich den Vorschlag von git describe verwenden. Vorausgesetzt, dass Sie eine vernünftige Versionierung haben, und Sie haben noch keine verrückten Sachen mit Ihrem Repository tun, git describe wird immer monotoner sein (zumindest als monotone, wie Sie sein können, wenn der Revisionshistorie ist ein DAG anstelle eines Baumes) und einzigartig.

Eine kleine Demonstration:

git init
git commit --allow-empty -m'Commit One.'
git tag -a -m'Tag One.' 1.2.3
git describe    # => 1.2.3
git commit --allow-empty -m'Commit Two.'
git describe    # => 1.2.3-1-gaac161d
git commit --allow-empty -m'Commit Three.'
git describe    # => 1.2.3-2-g462715d
git tag -a -m'Tag Two.' 2.0.0
git describe    # => 2.0.0

Die Ausgabe von git describe besteht aus folgenden Komponenten:

  1. Der neueste Tag erreichbar von der begehen Sie beschreiben fragen
  2. Die Zahl der Commits zwischen dem Commit und dem Tag (wenn nicht Null)
  3. Die (abgekürzt) id des commit (wenn # 2 ist ungleich Null)

# 2 ist, wie die Ausgabe monotone macht, # 3 ist, was es einzigartig macht. # 2 und # 3 weggelassen werden, wenn die commit ist der Tag, so dass git describe auch geeignet für die Produktion Mitteilungen.

Andere Tipps

monoton steigende Zahl entsprechend den Strom mit

wird commit könnte erzeugt
git log --pretty=oneline | wc -l

das gibt eine einzelne Zahl. Sie können auch aktuelle SHA1 zu dieser Nummer, hängen Einzigartigkeit hinzuzufügen.

Dieser Ansatz ist besser als git describe, weil es Sie nicht benötigen keine Tags hinzuzufügen, und es verschmilzt automatisch verarbeitet.

Es könnte Probleme mit Rebasieren, aber Rebasieren ist „gefährlich“ Operation sowieso.

    git rev-list BRANCHNAME --count

Das ist viel weniger ressourcenintensiv als

    git log --pretty=oneline | wc -l

git tag kann genug sein für das, was Sie brauchen. Wählen Sie ein Tag-Format, das jeder wird zustimmen, nicht anders zu verwenden.

Hinweis: Wenn Sie lokal Tag, ein git push werden die Tags nicht auf dem Server aktualisieren. Verwenden Sie git push --tags dafür.

Sie sollten git describe untersuchen. Es gibt eine eindeutige Zeichenfolge, die den aktuellen Zweig beschreibt (oder jede Commit-ID übergeben wird) in Bezug auf den neuesten kommentierten Tag, die Zahl der Commits seit diesem Tag und ein gekürzte ID des Kopfes der Branche verpflichten.

Vermutlich haben Sie einen einzelnen Zweig, die Sie bauen Freisetzungen aus gesteuert perform. In diesem Fall würde ich Tag früh mit einem bekannten Tag-Format begehen und dann git verwenden, um mit der --match Option beschreiben die aktuellen HEAD relativ zu einem bekannten Tag zu beschreiben. Sie können dann das Ergebnis von git beschreiben, wie, oder wenn Sie wirklich nur eine einzige Nummer möchten, können Sie einen regulären Ausdruck verwenden, um die Nummer aus dem Tag zu hacken.

Unter der Annahme, dass Sie nie dem Zweig die Anzahl der folgenden Commits zurückspulen immer einen einzigartigen Punkt in der Geschichte des Zweiges identifizieren.

z. (Unter Verwendung von bash oder ähnlichem)

# make an annotated tag to an early build in the repository:
git tag -a build-origin "$some_old_commitid"

# describe the current HEAD against this tag and pull out a build number
expr "$(git describe --match build-origin)" : 'build-origin-\([0-9]*\)-g'

Ich würde verwenden „Labels“ Erstellen Sie ein Label, wenn Sie ein erfolgreiches (oder auch nicht erfolgreich) bauen, und Sie werden in der Lage sein, für immer, dass die Build zu identifizieren. Es ist nicht ganz dasselbe, aber es bietet jene Zahlen bauen, während immer noch die Vorteile der verteilten Entwicklung.

Wie Sie wahrscheinlich wissen, berechnet git einen Hash (eine Zahl), die eindeutig einen Knoten der Geschichte identifiziert. Mit diesen, auch wenn sie nicht streng monoton wachsend ist, scheint, wie es wäre gut genug. (Noch besser ist, sie immer entsprechen der Quelle, also wenn Sie den Hash haben, haben Sie den gleichen Code.) Sie sind große Zahlen, aber meistens kann man mit 6 erhalten, indem oder so von der führende Ziffern.

Beispiel:

  

war, dass Fehler behoben bei 064f2ea ...

Mit Mercurial können Sie den folgenden Befehl verwenden:

# get the parents id, the local revision number and the tags
[yjost@myhost:~/my-repo]$ hg id -nibt
03b6399bc32b+ 23716+ default tip

Siehe hg identifizieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top