![]() |
Repository aufteilen GIT
Guten Morgen,
gegeben ist ein Repository. Dort sind Zwei Hauptprojekte drin. Die Hauptsoftware und eine weitere Software zum Pflegen der Datenbestände. Das Datenpflegetool hat leider extrem starke Verbindungen zu der Hauptsoftware. Deswegen werden so gut wie alle Units mit Compiliert. Das sind mit externen Code knapp 3 Millionen Zeilen Code. Dies dauert natürlich extrem lange zu erzeugen wenn man auf ein Branch wechselt. Da wir mehre Releases haben muss die Abteilung die für die Pflege des Datenbestand zuständig sind öfter den Branch ändern. Da geht an schlechten Tagen gerne mal pro Mitarbeiter mehr als 1 Stunde zeit verloren mit Branch wechselen und neu Erzeugen der Sourcen. Hat jemand ein Ansatz wie man das Projekt aufteilen könnte? Die Sourcen der Hauptsoftware ändern sich nur einmal die Woche in den Branches wo das Datenpflege Tool entwickelt wird. |
AW: Repository aufteilen GIT
Ich denke da kämst Du gut mit einem Subrepository (git Nomenklatur ist mir grad nicht geläufig, aber es dürfte klar sein, was ich meine) hin, das alle gemeinsamen Units beinhaltet. Dann aus dem einen alten Repositor zwei machen (pro Projekt eines) und das Subrepository einbinden und es sollte alles so werden, wie Du es Dir vorstellst.
Sherlock |
AW: Repository aufteilen GIT
Wir haben dafür gemeinsame Units, die in den anderen Projekten eingebunden werden. Aber nicht per Quelltext, sondern per DCU. Sprich wir haben ein Package mit den gemeinsamen Units um diese zu kompilieren und in den Projekten direkt eingebunden nur die projektspezifischen Units.
So können wir die gemeinsamen Units per Buildskript bei Bedarf erzeugen und nur die projektspezifischen werden mit dem Projekt erzeugt. Ihr könntet nun z.B. schlicht ein Package nehmen, bei dem für die einzelnen Releases mit unterschiedlichen DCU-Ausgabeverzeichnissen gearbeitet wird, je nach Branch. Dann bleiben die unveränderten Units nämlich liegen und es geht deutlich schneller zu kompilieren. Dann noch ein PostBuild-Skript oder ein Befehl im Buildskript, dass die Units nach dem Kompilieren aus diesem Ausgabeverzeichnis in ein entsprechendes gemeinsames Bibliotheksverzeichnis kopiert (das im Bibliothekspfad eingetragen ist). Um an den gemeinsamen Units leichter etwas ändern zu können, haben wir aber auch oft *_debug.dproj Projektdateien, in denen auch die gemeinsamen Units in den Projekten eingebunden sind. Mit entsprechend längeren Kompilierzeiten. |
AW: Repository aufteilen GIT
Zitat:
Zitat:
In der IDE muss ich nur eine Umgebungsvariable umsetzen (alle Suchpfade von 3th-Party-Komponenten/eigen Source basieren darauf). Ist praktisch kein Aufwand. |
AW: Repository aufteilen GIT
Wenn das eigentliche Problem die Dauer für das Zweig-Wechseln und Neu-Kompilieren für Zweige A,B,C (z.B.) sind, warum dann nicht einfach mehrmals das Repo drei mal auf der Platte haben, jeweils auf Stand A, B und C? 8-)
|
AW: Repository aufteilen GIT
Ja, mehrfach aus unterschiedlichen Branches nebeneinander ausgescheckt haben wir auch. Aber eben mit unterschiedlichen DCU-Ausgabepfaden.
|
AW: Repository aufteilen GIT
Beide Programme mit der selben Delphi-Version?
Wenn nicht, dann muß sowieso jeder alles kompilieren. Die zweite Anwendung bekommt nur Zugriff auf die vorkompilierten DCU. PAS maximal im Bibliothekspfad, zum Debuggen, aber lohnt sich nur, wenn die DCUs auch mit Debuginfos kompiliert werden. Man könnte auch komplett alle gemeinsamen PAS (sie sollten seltener geändert werden) in ein drittes Projekt legen und darüber kompilieren. Die beiden eigentlichen Programme bekommen dann nur die DCUs, müssen sie niemals neu kompilieren. Die DCUs sollten dann natürlich mit im GIT liegen oder in einem externen branch-/versionsabhängigen Verzeichnis, damit beim Branchwechsel direkt die passenden DCUs vorhanden sind. Wie haben bei uns alle Fremdkomponenten mit im SVN. Das waren samt SVN-Dateien fast 1,5 GB. und die eigentlichen Programmsourcen nur 80 MB (300 MB kompiliert) Die Fremdbibliothenken wurden auch auch so schon einzeln kompiliert (eine überspringbare Gruppe im FinalBuilder) und es konnte so entweder alles oder z.B. nur die eigenen EXE/DLL/BPL kompiliert werden. Als weitere Gruppen noch sowas wie Setup erstellen, Hilfe generieren, Delphi einrichten (Femdkomponenten reistrieren und DDevExtensions, IDE-FixPack usw). Den Teil mit den Fremdkomponenten haben wie letztens auch in ein eigenes Repository ausgelegt (je Eines pro Version) und das Auschecken/Branchwechseln geht jetzt auch viel schneller, da ja nur noch knapp 150MB statt 1,5GB runtergeladen werden müssen, aber als Sub-Repository (Unterverzeichnis) an der alten Stelle verlinkt (Hardlink), um jetzt nicht alles umbauen zu müssen (Pfade überall anpassen/ändern). |
AW: Repository aufteilen GIT
Danke euch hat mir schon extrem weitergeholfen. Ich werde die Unterschieldichen Optionen am Montag mit meinen Teamleiter besprechen.
Ja zum Glück sind alle aktuellen Releases gerade mit der gleichen Delphi Version. Das Erzeugen dauert auf meinen Rechner meist 6 Minuten. Mit Branch wechseln dauert es meist 20-30 Minuten bis man weiter arbeiten kann. |
AW: Repository aufteilen GIT
Wenn es zu lange dauert.
![]() Aber 6-20 Minuten geht ja noch. |
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Zitat:
Könnt ihr bei euren Virenscanner *.pas, *.dfm und *.dcu-Dateien von der Prüfung ausnehmen lassen.? |
AW: Repository aufteilen GIT
Mit Eurekalog geht die CompileTime locker um das Dreifache hoch.
Die großen Fremdbibliotheken ala FastReport kompilieren schnell (ohne Eurekalog) und unsere eigenen kleineren DLL/BPL/EXE brauchen dagegen mit Eurekalog im Finalbuilder ewig. Aber OK, knapp 70 BPL/DLL/EXE und bissl weiterer Kleinkram laufen in knapp 5 Minuten durch den FinalBuilder. (7-8 mit allen Fremdbibliotheken) 3-3,5 Minuten ohne Eurekalog auf SSD, 12 Kerne, 64 GB RAM (meistens 30 GB frei) alle DLL, EXE und paar BPL multithreaded, also mehrere Compiler parallel Dagegen waren aber (damals) auch erstmal 10-30 Minuten auschecken, wenn man mal schnell eine bestimmte ältere Version zum Fehlersuchen/Bugfixing/Mergen/... brauchte. |
AW: Repository aufteilen GIT
Zitat:
Ich habe die Erfahrung gemacht, dass es da enorme Unterschiede gibt. AVG verlangsamt den Kompiliervorgang z.B. deutlich, während es mit Norton kaum Unterschiede zu ohne gibt. |
AW: Repository aufteilen GIT
Das Verzeichnis wo die Sourcen drin liegen sind vom Virenscanner ausgeschlossen.
|
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Zitat:
Der Suchpfad ist nur für den Debugger um beim Debuggen die Quelltexte zu finden. In den Projektoptionen ist leider der Bibliothekspfad fälschlicherweise als Suchpfad bezeichnet. |
AW: Repository aufteilen GIT
Zitat:
Darum sollte man seine IDE auch als deutscher/französischer/japanischer Entwickler auf englisch stellen. Dann hat man a) solche Probleme nicht und b) kann viel besser im Internet nach Problemen suchen, wenn man eins mit der IDE hat. |
AW: Repository aufteilen GIT
Liste der Anhänge anzeigen (Anzahl: 1)
Ich meine den hier.
|
AW: Repository aufteilen GIT
Das ist wie TiGü schon vermutet hat in der Tat in Wirklichkeit der Bibliothekspfad.
Wir benutzen stattdessen den globalen Bibliothekspfad, in dem allerdings fast nur ein Pfad zusätzlich drin ist. Dorthin kompiliert das Komponenten/Unit-Buildskript alle Units und kopiert auch die notwendigen .inc Dateien usw. vorher dorthin. Dadurch ging die Kompilierzeit auch herunter, weil nicht mehr an so vielen Stellen nach den Dateien gesucht werden muss. |
AW: Repository aufteilen GIT
Zitat:
Wir haben hier im allgemeinen mehrere Ordner mit je einem working copy, so dass wir mehrere branches bearbeiten können. Diese Ordner werden mit subst auf einen Buchstaben gemappt. Ein Wechsel sind bei mir vier Klicks: - Delphi beenden - Zwei Tasten für Laufwerk ummappen - Delphi starten Wenn ihr wirklich das repo aufteilen wollt dann schaut mal git submodule an. |
AW: Repository aufteilen GIT
Zitat:
![]() Sherlock |
AW: Repository aufteilen GIT
Ich habe den schon gesehen, dachte aber wegen "Subrepository (git Nomenklatur ist mir grad nicht geläufig)" schreib ich das nochmals explizit hin.
|
AW: Repository aufteilen GIT
Zitat:
Sherlock |
AW: Repository aufteilen GIT
Ich versuche jetzt gerade das Repository aufzuteilen. Nun folgendes Problem.
Ich habe ein neues Projekt erstellt damit ich die ganzen Suchpfade und so raus habe. Anschließend habe ich die Pfade wo die DCU Dateien liegen als Suchpfad eingefügt und die Units zum Projekt hinzugefügt. Jetzt bekomme ich leider für alle Units die Meldung "[dcc32 Fataler Fehler] UnitName.pas(54): F2051 Unit UnitName wurde mit einer unterschiedlichen Version von UnitName.TKlassenname compiliert". Die DCU's sind aber gerade vorher von mir erzeugt worden. Wenn ich dann den Pfad der Unit als Suchpfad hinzufüge meckert er für diese Natürlich nicht mehr. Aber die nächste Unit macht Probleme. Ich denke mal das wird solange weiter gehen bis ich wieder alle Suchpfade drin habe. Hat jemand eine Idee was ich falsch mache? |
AW: Repository aufteilen GIT
Welche Units hast du zum Projekt hinzugefügt? Dort gehören nur die rein, die du nicht per .dcu einbinden willst.
|
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Ich schreibe nochmal was ich genau gemacht habe.
Ich habe das alte Projekt kompiliert. Anschließend eine DCU rausgelöscht. Die Unit zu der gelöschten DCU habe ich zu meinem Blanken Projekt hinzugefügt. Anschließend habe ich die Pfade der DCU's hinzugefügt. Nun bekomme ich die Meldung. [dcc32 Fataler Fehler] UnitName.pas(8): F2051 Unit UnitName wurde mit einer unterschiedlichen Version von UnitName.Klassenname compiliert |
AW: Repository aufteilen GIT
Der Punkt ist, dass keine der nur in kompilierten Versionen vorliegenden Units eine Unit referenzieren darf, die du in Quelltextform eingebunden hast. Denn die als Quelltext eingebundene Unit kompilierst du ja mit dem Projekt dann neu, die nur kompiliert vorliegende Version aber nicht.
Daher ist dann die kompiliert vorliegende Version älter als die gerade neu kompilierte eingebundene Unit. Und deshalb wurde die bereits vorkompilierte Unit mit einer anderen Version der nun neu kompilierten Unit kompiliert. Deshalb haben wir auch zwischen gemeinsamen Units und Projektunits getrennt. Die Projektunits dürfen beide einbinden, die gemeinsamen Units nur andere gemeinsame Units. Alle gemeinsamen Units werden durch ein Package vorkompiliert. |
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Zitat:
|
AW: Repository aufteilen GIT
Such am besten mal auf der Festplatte überall nach den beiden beteiligten Units als kompilierte Variante (.dcu). Vielleicht liegen da ja noch Duplikate irgendwo. (Dafür eignet sich z.B.
![]() |
AW: Repository aufteilen GIT
Manchmal wäre es halt schön, wenn der Compiler 'ne Liste ausgeben würde, wo alle von ihm genutzten Dateien drin stehen, samt der Pfade, damit man sehen kann, was er wirklich nutzt, vorallem bei solchen Fehlern.
|
AW: Repository aufteilen GIT
Bin ich froh, daß ich es einfach nur einfach und nicht elegant oder so gelöst habe. Ich erzeuge meine Projekte immer komplett neu, und kann dennoch währenddessen die Luft anhalten, korrekt versioniert wird es auch noch. Aber viele Wege führen nach Rom, manche mehr, manche weniger steinig.
Sherlock |
AW: Repository aufteilen GIT
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz