unity3d und git Submodule ist es möglich?

8

TLDR; Dies wird eine langatmige Post sein, aber ich bin sicher, dass viele von euch unity3d-Entwicklern auch auf das gleiche Problem stoßen, das ich bin. Ein Problem, das eine klare, endgültige und ein für allemal Antwort braucht, um unsere kollektive Vernunft zu retten.

Also habe ich Git für die letzten 2+ Jahre benutzt, aber ich habe mich nicht zu sehr in sie vertieft. Ich kann push pull von bitbucket / github etc verzweigen / zusammenführen und das funktioniert gut für normale Gewinnformen / traditionelle Anwendungen.

Hier ist das Problem. Ich bin schon lange von xna / silverlight auf unity3d und auf unity umgestiegen, um einen Verweis auf eine Bibliothek hinzuzufügen. Sie müssen die Quelldateien aus dieser Bibliothek in Ihren Unity-Projektordner kopieren. Obwohl es die Einheit erlaubt, * .dll-Dateien in einen Plugin-Ordner zu kopieren, gibt es offensichtliche plattformübergreifende Kompatibilitätsprobleme und daher möchte ich nie dorthin gehen.

Ich habe über ein Dutzend Bibliotheksprojekte mit verschiedenen Funktionen von KI über Content-Management, Logging, abstrahiertes Benutzereingabesystem usw. und ich habe an einem neuen Level-Editor für ein zukünftiges Spiel gearbeitet, das ich machen werde / p>

Jedes einzelne Bibliotheksprojekt selbst ist ein Einheitsprojekt und die Codedateien für jedes Projekt sind als solche in Einheit organisiert.

%Vor%

Ich tue das, um die Dinge hoch organisiert zu halten, im Gegensatz zu vielen anderen Assets, die sich im Unity Asset Store befinden. : (

Also verwendet mein Level-Editor-Projekt mehrere Bibliotheksprojekte, deren Code per Copy-Paste importiert wurde. Jede dieser Bibliotheken wird selbst in eigenen lokalen Git-Repositories gehostet. Wenn ich also die Code-Dateien aus den Bibliotheksprojekten in mein Haupteinheitsprojekt kopiere, verliere ich automatisch die Möglichkeit, Änderungen, die ich an diesem Bibliotheken-Git-Repo vorgenommen habe, zu committen.

Was ich im letzten Jahr gemacht habe, war die Brache

  1. Start eines Hauptprojekts Assets\<company name>\<main project name>\
  2. Importieren Sie beliebige Bibliotheksprojekte (Kopieren / Einfügen von Codedateien) Assets\<company name>\<library name>\
  3. Wenn ich eine Änderung an einer der Bibliotheken vornehmen muss, bearbeite ich normalerweise nur die Code-Datei (en) der Bibliotheken, die im Hauptprojekt sind, an dem ich gerade arbeite. (Ansonsten ergibt sich eine größere Komplexität)
  4. Da das Hauptprojekt auch ein Git-Repo ist, werden die Änderungen, die ich an irgendwelchen Bibliotheksdateien mache, auch an das Repo des Hauptprojekts gebunden.
  5. Nach einer Weile benutze ich CodeCompare (ein diff-Dienstprogramm), um einen Ordnervergleich von Assets\<company name>\<library name>\ mit dem ursprünglichen Speicherort der Bibliothek zu machen, wo ich vorher die Bibliotheksdateien kopiert habe.
  6. Ich vergleiche jede geänderte Codedatei sorgfältig nach Diff und migriere die in meinem Hauptprojekt vorgenommenen Änderungen zum ursprünglichen Speicherort der Bibliothek.
  7. Nun, das ist getan, die Bibliothek ist ein Git-Repo, also nochmal (2. Mal) Ich muss Commits über die verschiedenen Änderungen machen, die an den Code-Dateien vorgenommen wurden.

Zusammen mit diesem Wahnsinn liegt hier noch ein anderes Problem. Das Hauptprojekt ist nicht das einzige Hauptprojekt, das ich gerade unterwegs habe. Ich habe eine Handvoll Projekte, die alle diese anderen Bibliotheken referenzieren (über Kopieren / Einfügen). Jetzt, da ich den Code für die Bibliothek aktualisiert und festgeschrieben habe, muss ich nun durch jedes Hauptprojekt zurückgehen, das die Bibliothek verwendet, und die Änderungen von den Bibliotheken git repo über diese Hauptprojekte kopieren / einfügen.

Arbeitsablauf summerized

MainProjectA- & gt; Codedateien, die von LibraryA- & gt; Library kopiert wurdenA Dateien, die innerhalb von MainProjectA- & gt; LibraryA Dateien geändert wurden, die über diff comparison wieder in die ursprüngliche LibraryA -Orte kopiert wurden- & gt; LibraryA Codedateien, die dann in andere Projekte kopiert wurden das verwenden LibraryA IE: MainProjectB, MainProjectC, MainProjectD.

Guter Gott! Wenn meine verschiedenen Projekte größer und größer werden, wird dieses Problem mehr und mehr verschärft. Dieses System funktioniert, aber es ist sehr, sehr mühsam.

Unterbrechung

Also ein bisschen eine kurze Tirade. / TakesDeepBreath / Seufz Ich weigere mich, die git-Befehlszeile zu verwenden. Es führt von MS-DOS ala 1980's. Es sind 20 freakige 14 Leute. 2014 und wir Entwickler arbeiten immer noch mit Kommandozeilen. In der heutigen Zeit erwarte ich mehr. Ich lerne im Grunde nicht eine komplett neue Kommandozeilensprache, geschweige denn zwischen Windows und Apps hin- und herwechseln zu müssen, nur um etwas so fundamental Einfaches wie einen Codewechsel zu machen. Etwas, das mit 2-3 schnellen Mausklicks und einer kurzen getippten Nachricht erreicht werden kann, ist alles was benötigt wird. git = neue Hawtness + unnötige Befehlszeilenkomplexität

Nachdem ich gesagt habe, dass ich die eingebauten vs2013 git Features am häufigsten benutze, um Commits und Verzweigungen / Zusammenführungen usw. zu machen. Aber es scheint, Submodule nicht zu unterstützen, soweit ich das beurteilen kann. Also verwende ich SourceTree.

Beenden Sie die Intermission.

Gib git Submodul Hölle ein

Wie ich schon sagte, habe ich Git noch nicht viel mehr benutzt als nur grundlegende Kernfunktionen und ich habe nur Vortests über Testprojekte gemacht, aber ich kann Git nicht so zuverlässig arbeiten, wie ich es brauche und oft bei der Arbeit Submodule gibt es ein bisschen Verwirrung, und es wird oft nicht wegen verschiedener Fehler committen.

Was ich tun möchte, ist dies

  1. Erstellen Sie ein neues Unity-Projekt namens MainProjectA, und machen Sie es zu einem lokalen Repo
  2. Fügen Sie git Submodule zu MainProjectA von LibraryA (lokaler Repo), LibraryB (lokaler Repo) usw. hinzu
  3. Wenn ich innerhalb von MainProjectA Änderungen an Code-Dateien im Zusammenhang mit LibraryA vornehme, möchte ich diese spezifischen Änderungen zurück in den Repo von LibraryA innerhalb von MainProjectA einbinden können.

Ich bin sogar so weit gegangen, ein Programm zu schreiben, das automatisch Dateien zwischen zwei verschiedenen Ordnern synchronisiert, sobald es eine Änderung feststellt. Aber ich habe es aufgegeben, weil es zwar die Synchronisationsprobleme lösen würde, aber die Probleme mit dem Git-Commit nicht lösen würde.

Ein weiteres Problem ist, dass alle meine bestehenden Unity-Projekte, die ein lokales Repo haben, als Brachen eingerichtet werden.

%Vor%

Ich möchte einen LibraryA-Ordner in meinem Hauptprojekt haben, der ein Submodul meines LibraryA-Projekts ist. Genauer gesagt möchte ich nur den Inhalt von <Unity LibraryA Folder>\Assets\Company Name\LibraryA\ als Submodul in meinen Hauptprojektordner% co_de aufnehmen %

%Vor%

Aber SourceTree / git beschwert sich, dass ich kein Submodul zu einem vorhandenen Repo-Ordner hinzufügen kann. <Unity Main Project Folder>\Assets\Company Name\LibraryA\

Ich würde weiter schreiben, aber ... ja, ich denke, das ist genug Schreiben, und mein Ziel sollte jetzt gut genug beschrieben werden.

Fazit

Ich denke, ich könnte auch fragen, ob das Git genug gereift ist als ein Produkt, dass es mir sogar erlaubt, das zu tun, was ich versuche zu tun? Oder ist es einfach nicht möglich angesichts der Architektur von Git zu unterstützen, was ich versuche zu tun?

Jede Suche ist leer, YouTube ist keine Hilfe und Zeitverschwendung, ganz zu schweigen von jedem Beispiel, das ich finden kann, ist ein Befehlszeilen-Beispiel und berührt keine Submodule.

In einer normalen Windows-Anwendung wären Submodule kein Problem. Das Problem liegt vor allem darin, dass Einheit gerne alle Code-Dateien in ihrem Projekt hat. Das und wie ich versuche, meine organisierte Ordnerstruktur intakt zu halten.

Bitte helfen Sie. Bitte. Purdy bitte. ICH BITTE DICH! ICH BITTE DICH! AUF MEINEM FRIECHISCHEN KNIE-BEGGING! : P

    
Dean Lunz 22.07.2014, 23:03
quelle

4 Antworten

3

Vielleicht möchten Sie Symlinks / Hardlinks verwenden?

%Vor%

Dies sollte funktionieren, obwohl sich Unity über Symlinks beschwert. Zumindest auf OSX.

Ein anderer (und IMO korrekterer) Weg besteht darin, LibraryA als Submodul zu haben und ein separates Testprojekt dafür zu haben (derzeit Ihr Unity LibraryA Folder ).

Ich habe 2+ Jahre in diesem Setup (2-3 verknüpfte Repositories) gemacht und Git hat gut funktioniert. Vielleicht ist dein grafischer Client nicht so gut? Probieren Sie gitx-dev oder githubs Desktop-Client aus (der auch für Nicht-Github-Repos funktioniert) - oder lernen Sie einfach die Befehlszeile, es funktioniert.

Oh und die Probleme mit dem Hinzufügen eines Untermoduls zu einem vorhandenen Verzeichnis - entfernen Sie das Verzeichnis zuerst und commit.

    
Krzysztof Bociurko 24.07.2014, 15:19
quelle
1

Es gibt eine wirklich gute Erklärung und einen guten Prozess auf der Prime31-Website: Ссылка Dies ist meiner Meinung nach der beste Workflow, um diese Situation zu bewältigen.

    
anthony db 11.12.2017 10:54
quelle
0

hier ist was ich getan habe.

Erstens - wenn Sie die Dateien von LibraryA bereits in Ihr Projekt kopiert haben und Ihr Projekt Objekte von LibraryA & amp; Skripte, müssen Sie sehr vorsichtig sein. Stellen Sie sicher, dass Sie beim Start nichts mehr von Ihrem Git-Repository geändert haben ...

Wenn Sie nun Unity geschlossen haben, löschen Sie den Ordner LibraryA, den Ihr Projekt enthält. Die Einheit würde, wenn sie offen wäre, an diesem Punkt anfangen zu würgen und zu sterben.

Erstellen Sie nun ein Hardlink-Verzeichnis (mklink / J-Ordnerziel) in Ihrem Projekt im Ordner "Assets", das sich anordnet und den gerade gelöschten Ordner nachahmt. Der neue Hardlink muss fast genau so aussehen, wie er gerade gelöscht wurde.

Öffnen Sie Ihr Projekt in Unity. Wenn Sie Glück haben, wenn Sie mit dem Importieren von Assets fertig sind, werden immer noch die richtigen Objekte an den richtigen Stellen angezeigt, aber in Ihrem Bibliotheksordner wurde ein Haufen von Inhalten aktualisiert. Das ist in Ordnung.

Stellen Sie in Git sicher, dass das Repository, das BibliothekA darstellt, keine darin enthaltenen Dateien enthält. Einfach das Verzeichnis mit dem darin enthaltenen Hardlink in LibraryA zu importieren, sollte die Dateien von LibraryA NICHT berührt haben. Wenn ja, haben Sie wahrscheinlich etwas falsch gemacht.

Überprüfen Sie alle neuen Änderungen im Bibliotheksordner Ihres Projekts.

Jetzt kannst du dich in Unity weiterentwickeln.

Äh, hoffentlich.

    
eric frazer 08.11.2017 23:58
quelle
-2

Ich war in der gleichen Situation mit Unity. Ehrlich gesagt, was Sie tun wollen, ist Git für dieses zu vermeiden und SVN mit Externs zu verwenden. Git SubModule sind wirklich nicht das, wonach du aus eigener Erfahrung suchst, es gibt keine Möglichkeit, sie so zu verhalten, wie du es für Unity willst. Git hat viele Vorteile gegenüber SVN, aber SubModule gehören definitiv noch nicht dazu.

SVN Externs funktionieren jedoch genau so, wie Sie es möchten. Sie können den spezifischen Ordner in der Bibliothek A repo direkt in Ihr Hauptrepo auschecken. Von dort aus haben fast alle SVN-Clients, die ich benutzt habe (ich bin auf OS X und ich benutze Cornerstone dafür), die Möglichkeit, direkt von diesem externen Ordner zu aktualisieren und zu committen, was den eigentlichen LibraryA-Repo modifiziert. Auch wenn Sie ein Update auf der Basis des Hauptrepo tun, werden alle Ihre Externen ebenfalls aktualisiert. Wenn Sie Ihr Projekt verzweigen müssen, können Sie extern auf bestimmte Revisionen statt auf den Kopf zeigen.

    
Figbash 08.03.2015 17:36
quelle

Tags und Links