2016-05-19 8 views
2

Wenn das Git für die Quellcodeverwaltung verwendet wird, wird empfohlen, generierten Code von der Versionskontrolle auszuschließen.Wie behandeln Quellen und generierten Code in Git für Bereitstellungszwecke?

Vor kurzem habe ich gelernt, dass git push zu Remote-Repository kann für die Bereitstellung Zwecke nutzen.

Meine Frage ist, wie Quelle und generierten Codes in git Versionskontrolle zu behandeln. Muss ich separate Repos für die Quelle und für die Bereitstellung aufbewahren?

Vielleicht ist es Art und Weise sowohl die Quelle zu halten und generierten Dateien in einem Repo- und einige git Techniken Verteilung Dateien zusammenführen Deployment Zweig zu können sagen?

Vielen Dank.

+0

Können Sie mir bitte weitere Informationen teilen, was Sie gemeint „' git push' [...] können für den Einsatz Zwecke verwendet werden“zu sagen. Auf welches Szenario beziehen Sie sich? Ist es Web/Mobile/Desktop-Anwendung usw.? –

+0

@MaxK Ich beziehe mich auf [dies] (https://gist.github.com/thomasfr/9691385) Szenario. Ich habe es selbst ausprobiert und es hat sehr gut funktioniert. –

+0

Ah, also hast du schon 'post-receive' versucht - das ist gut, siehe meine Antwort unten. –

Antwort

-1

Einzelheiten hängen von können, welchem ​​Szenario sind Sie auf (entweder das Web/Mobile/Desktop-Anwendung oder Bibliothek ist oder was auch immer). Aber der allgemeine Ansatz ist nicht automatisch generierten Zeug in Ihrem Repository zu halten.

Stattdessen sollten Sie eine Reihe von Skripten/Werkzeuge zur Verfügung stellt betrachten, die es Entwicklern ermöglicht aus sauberen handschriftlichen Quellen Arbeitsumgebung „auszupacken“.

Wenn Sie Artefakte Ihrer Arbeit an Kunden übergeben möchten, indem Sie git push tun, können Sie ein CI-Tool in Erwägung ziehen, in dem Sie alle erforderlichen Aktionen zum Erstellen von zu liefernden Elementen aus Quellen schreiben.

In einem einfachsten Ansatz (wenn aus irgendeinem Grund CI-System nicht anwendbar ist) können Sie Skript-Aktion in post-receive Remote-Hook-Skript.

Einige Referenzen:

githooks manpage

Setting up Push-to-Deploy with git

Should I store generated code in source control


aktualisieren

I Wenn Sie sich für diese Methode entschieden haben, sollten Sie einen Ansatz wählen, der es Ihnen ermöglicht, eine exakte Umgebung von jeder Version in der Vergangenheit zu reproduzieren. Dies trifft meistens auf Abhängigkeiten zu - im Falle von Ruby sollten Sie Gemfile.lock zu Ihrem Repo committen, im Falle eines Knotens - sollten Sie npm shrinkwrap oder ein ähnliches Tool verwenden, um sicherzustellen, dass Sie genau die gleiche Umgebung reproduzieren können, die früher verwendet wurde (das könnte vor über einem Jahr veröffentlicht worden sein und seitdem haben Sie Dutzende neue Versionen oder Ihre Abhängigkeiten) Version Ihrer App/Site oder was auch immer Debugging erlauben.

Gute Praxis ist hier Tags in Git und Einbetten von Informationen in lieferbaren verwenden, die Sie erlauben, genauen zu begehen zu finden, dass verwendet wurde, um es zu produzieren.

+0

Vielen Dank für Ihre Antwort, aber die Notwendigkeit der Versionierung der Distribution ist genau der Grund, warum ich Hooks nur zum Kopieren von einem leeren Repo-Ordner in den Deployment-Ordner und zum Starten/Stoppen des Servers auf der Remote-Seite verwende. –

+0

Es tut mir leid, ich bin nicht auf der "Versionierung", können Sie bitte genauer? Ich meine für mein Verständnis "Version" eines Liefergegenstandes kann in einer Konfigurationsdatei gespeichert werden, die verwendet wird, um mit dieser Version gekennzeichnete Artefakte zu produzieren, wenn Sie bereit sind zu veröffentlichen - Sie erhöhen die Version in dieser Datei und schieben sie. Remote liest diese Datei, generiert alles, was für die Zustellung benötigt wird und liefert. Fehle ich etwas? –

+0

Zum Beispiel ist mein aktueller Fall eine iOS-App mit react-nativem Framework, die iOS-App hat eine Version in der Projektdatei geschrieben, react-native erfordert, dass ich .js Bundle mit all dem Code erzeuge und in Binärcode einbettle. Also mein CI-Tool nimmt neue Version von Code in iOS-Projekt, liest Abhängigkeiten, produziert minimierte .js-Datei, die nie im Repo gehalten wird und kompiliert Binär, die für Kunden bereitgestellt wird. Zur gleichen Zeit ist sha1 eines Commits in der App selbst auf einer speziellen Seite verfügbar, so dass ich genau sagen kann, welche Version ich installiere und das Tag 'vX.Y.Z' wird zu Git geschoben, so dass ich immer Commit finden kann. –

1

Das Problem mit einem Zweig mit Quelldateien und ein Zweig mit generierten Dateien ist, dass, wenn Sie von der Quelle zum erzeugten Zweig wechseln, git wird die Quelldateien löschen, und beschweren sich, dass die erzeugten Dateien geändert haben.

Sie können Zweige wechseln mit aus der Datei Problemen mit niedrigem Niveau Befehle so etwas wie diese

git-read-tree <deploybranch> 
git update-index --refresh 
git write-tree 
git commit -p <deploybranch> TREESHA 
git branch -f <deploybranch> COMMITSHA 
git read-tree <reg branch> 
git update-index --refresh 

aber für einen Einsatz zu komplex zu sein scheint. Sie müssen die SHA-Werte manuell eingeben.

Betrachten Sie in einem separaten Einsatz Repository generierten Code setzen

set GIT_DIR=<local-deployment-dir> 
git add <local-deployment files> 
git commit -m"Release #.##" 
git push <remote-deployment-repos> master:master 
set GIT_DIR= 
+0

Vielen Dank für Ihre Antwort, es sieht so aus, als wäre das separate Repository für Deployment-Dateien erforderlich. Dann kann dieses "Deployment" -Repository verwendet werden, um zu entfernten Datenbanken zu gelangen (Test, Prod ..). –

+0

Obwohl dieser Ansatz die Aufgabe erledigen kann, missbrauchen Sie das Quellcodeverwaltungstool, indem Sie Daten speichern, die wirklich Teil der Implementierungsroutine sind. –

Verwandte Themen