Frage

In meiner Webanwendung habe ich eine Datei, die über $Rev$ die aktuelle Revisionsnummer enthält.Das funktioniert einwandfrei, außer dass sie nicht festgeschrieben wird, wenn ich keine Änderungen an dieser Datei vornehme.

Kann ich trotzdem erzwingen, dass eine einzelne Datei immer auf den SVN-Server übertragen wird?

Ich verwende TortoiseSVN für Windows, daher wäre jeder Code oder jede Schritt-für-Schritt-Anleitung hilfreich.

War es hilfreich?

Lösung

Wenn Sie TortoiseSVN installiert haben, steht Ihnen auch das SubWCRev-Tool zur Verfügung.Verwenden Sie dieses Tool, um die Revision abzurufen, anstatt das Schlüsselwort $REV$ zu missbrauchen.

  1. Erstellen Sie eine Vorlagendatei, die Ihre Definitionen enthält, vielleicht so etwas wie

    const long WC_REV = $WCREV$;

    in einer Datei mit dem Namen version.h.tmpl

  2. Rufen Sie bei jedem Build SubWCRev auf, um die „echte“ Datei zu erstellen, die Sie in Ihrer Anwendung verwenden können:

    SubWCRev-Pfad\zu\workingcopy Pfad\zu\version.h.tmpl Pfad\zu\version.h

Dadurch wird die Datei version.h aus version.h.tmpl erstellt, wobei der Text $WCREV$ durch die Revision ersetzt wird, in der sich Ihre Arbeitskopie derzeit befindet.

Der Dokumente für SubWCRev könnte auch helfen.

Andere Tipps

Grundsätzlich möchten Sie die Ausgabe des svnversion Befehl in einer Datei.

Solche Dateien werden normalerweise aus dem Repository ferngehalten und automatisch von einem Build-Skript erstellt.Ich schlage vor, dass Sie dasselbe tun.Wenn Sie nicht bauen, sondern nur zu einem svn up Auf der Serverseite rufen Sie einfach an svnversion nach svn up oder erstellen Sie ein Shell-Skript, um beide Aktionen auszuführen.

Wenn du haben um es andererseits im Repository zu behalten, rufen Sie an svnversion in einem Pre-Commit-Hook wäre die beste Wahl.

Ich denke, Sie verstehen möglicherweise nicht, wie die $Rev$-Flagge funktioniert.Das Ziel des Rev-Flags besteht nicht darin, dass diese Revision immer in das Subversion-Repository übernommen wird.Das Ziel besteht darin, dass bei einem Update die Rev-Flagge immer der Revision entspricht. Sie sollten keinen Code in Subversion einfügen müssen, der die Revision enthält. Subversion ist sehr gut darin, diese Informationen für Sie im Auge zu behalten.

Was Sie wahrscheinlich übersehen haben, ist, dass Sie eine Eigenschaft für die Datei festlegen müssen, damit das Schlüsselwort Revision ordnungsgemäß verarbeitet wird.

svn propset svn:keywords "Revision" file.txt

Dadurch wird sichergestellt, dass bei jeder Aktualisierung die $Rev:Das xxx$-Flag wird mit der aktuellen Revision aktualisiert.Sie müssen sich keine Gedanken darüber machen, wie es im Repository festgeschrieben wird.

@gatekiller:Es scheint, dass TortoiseSVN dies unterstützt Clientseitige Haken.

Das funktioniert einwandfrei, außer dass sie nicht festgeschrieben wird, wenn ich keine Änderungen an dieser Datei vornehme.

Wenn sich die Datei nie ändert, warum sollte sie dann jedes Mal festgeschrieben werden?

Edit] @sean = Ich verstehe, was er versucht, aber wenn die Datei nie über einen Haken oder einen anderen Prozess aktualisiert wird und sich daher nie ändert, wird SVN sie niemals abholen.

Ich schlage vor, den Ansatz zu ändern: Jedes Mal, wenn eine Datei festgeschrieben wird, bedeutet dies, dass die globale Revisionsnummer implizit in dieser Datei beibehalten wird.Der Benutzer benötigt möglicherweise ein anderes Schlüsselwort. GlobalKey, dessen Nichtexistenz erklärt wird Hier Ich habe es tatsächlich nicht erwähnt svnversion Es kann jedoch zu einer Lösung führen.

Könnte die Revisionsnummerndatei durch ein Skript geändert werden, das Ihre Website von SVN auf dem Webserver bereitstellt?

Unter Windows bin ich mir nicht sicher, aber mit einem Bash-Skript würde ich so etwas tun:

$ version=$(svnversion)
$ svn export . /tmp/staging/
Export complete.
$ echo "Revision: ${version}" > /tmp/staging/version.txt

Dann /tmp/staging/version.txt würde enthalten: „Revision:1" (oder was auch immer die höchste Revisionsnummer ist).

Sie könnten natürlich einen Bezeichner in einer Datei ersetzen, z $Rev$ (anstatt zu erstellen version.txt gemäß obigem Beispiel)

Abhängig von Ihrem Client bieten einige von ihnen einen Pre-Commit-Hook an, mit dem Sie etwas implementieren können, das einfach die Datei „berührt“ und sie als geändert markiert.Wenn Sie etwas wie Visual Studio verwenden, könnten Sie eine Post-Build-Aufgabe erstellen, die die Datei „berührt“, aber Sie müssten sicherstellen, dass Sie einen Build durchführen, bevor Sie Änderungen übernehmen.

@gradonmantank:Weil er möchte, dass diese Datei mit der neuesten Revisionsnummer aktualisiert wird.Hast du seine Frage vollständig gelesen?

Der Pre-Commit-Hook könnte funktionieren.

Früher habe ich das manuell gemacht.Ich würde ein Skript ausführen, das sed verwendet, um einen Kommentar durch den aktuellen Zeitstempel in meiner $Rev$-Datei zu ersetzen.Auf diese Weise würde sich der Dateiinhalt ändern und Subversion würde ihn festschreiben.

Was ich nicht getan habe, war, damit zum nächsten Schritt überzugehen:verwenden Die Repository-Hooks von Subversion um den Prozess zu automatisieren.Das Problem ist, ich bin nicht sicher, ob Sie Dateiinhalte in Hooks ändern dürfen.Die Dokumentation scheint darauf hinzudeuten, dass dies nicht möglich ist.

Stattdessen benötigen Sie vermutlich ein kleines Skript, das Sie anstelle von ausführen svn commit Befehl, der zuerst den Zeitstempel aktualisiert und dann den normalen Commit ausführt.

Die Übermittlung der Akte würde Ihnen nichts nützen.Die Datei wird nicht mit der Vollversion festgeschrieben, sondern nur durch das Schlüsselwort ersetzt.Wenn Sie sich die Datei im Repository ansehen, werden Sie dies sehen.

Daher müssen Sie stattdessen die Aktualisierung der Datei auf irgendeine Weise erzwingen.

Wenn Sie auf der Windows-Plattform arbeiten, können Sie das SubWCRev-Tool verwenden, das mit TortoiseSVN verteilt wird.Dokumentation Hier.

Sie können dazu SVN-Pre-Commit-Hooks verwenden.
Die allgemeine Idee, die ich im Kopf habe, besteht darin, eine zu erstellen, die vor dem Commit die neue Revisionsnummer in die Datei einfügt (rufen Sie sie mit svnlook ab) oder möglicherweise eine falsche Eigenschaft in der Datei ändert (sie muss sich ändern, sonst ignoriert SVN sie).

Weitere Informationen zu Pre-Commit-Hooks habe ich gefunden diese Seite nützlich.

Ich denke, der beste Ansatz, um sicherzustellen, dass es in Ihrer Webanwendung eine Datei mit der SVN-Revisionsnummer gibt, besteht darin, keine Datei festzuschreiben, sondern sie als Teil Ihres Build-Skripts zu extrahieren.

Wenn Sie Maven verwenden, können Sie dies mit dem Maven-Buildnumber-Plugin tun.

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