{"id":3363,"date":"2020-08-28T11:15:00","date_gmt":"2020-08-28T09:15:00","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=3363"},"modified":"2026-04-23T07:46:28","modified_gmt":"2026-04-23T05:46:28","slug":"monorepo-vor-und-nachteile","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/software-craftsmanship\/monorepo-vor-und-nachteile\/","title":{"rendered":"Monorepos \u2013 Vor- und Nachteile"},"content":{"rendered":"\n<p>Artikel \u00fcber Monorepos gibt es zahlreiche, deshalb werde ich in diesem Artikel insbesondere auf die praktischen Aspekte eingehen: Performance und das Mergen von bestehenden Repositories.<\/p>\n\n\n\n<p>Folgende Fragen wird dieser Artikel im Detail kl\u00e4ren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Was ist ein Monorepo?<\/li>\n\n\n\n<li>Was sind die Vor- und Nachteile eines Monorepos?<\/li>\n\n\n\n<li>Wie performant ist ein Git-Monorepo?<\/li>\n\n\n\n<li>Wie kann man mehrere Git-Repositories in ein Monorepo zusammenf\u00fchren (mergen) und dabei deren History beibehalten?<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-ist-ein-monorepo\">Was ist ein Monorepo?<\/h2>\n\n\n\n<p>Ein Monorepo (kurz f\u00fcr \"monolithic repository\") ist ein Repository, das den Quellcode mehrerer oder aller Projekte eines Teams oder eines Unternehmens enth\u00e4lt.<\/p>\n\n\n\n<p>Einige der gr\u00f6\u00dften Internetunternehmen, wie Google, Facebook, Microsoft und Twitter, arbeiten mit Monorepos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"warum-kenne-ich-mich-mit-monorepos-aus\">Warum kenne ich mich mit Monorepos aus?<\/h3>\n\n\n\n<p>Bei <a rel=\"noreferrer noopener\" href=\"https:\/\/www.nextpit.de\/\" target=\"_blank\">AndroidPIT<\/a> haben wir im August 2016 ein neues Produkt, das heute aus 25 Microservices und 23 Libraries besteht, als Git-Monorepo aufgesetzt. Zu Beginn waren alle Entwickler z\u00f6gerlich, doch unser Team entschied gemeinsam es auszuprobieren. Wir hielten uns die Option offen das Repository wieder aufzusplitten, falls wir unzufrieden sein sollten. Zwei Jahre sp\u00e4ter \u2013 nachdem wir \u00fcberwiegend positive Erfahrung gemacht hatten \u2013 entschieden wir uns, alle anderen Produkte ebenfalls in Monorepos zusammenzuf\u00fchren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"vor-und-nachteile-von-monorepos\">Vor- und Nachteile von Monorepos<\/h2>\n\n\n\n<p>Zwei lesenswerte, englischsprachige Artikel zu diesem Thema sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a rel=\"noopener\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\" target=\"_blank\">Monorepos: Please don\u2019t!<\/a> \u2013 ein Appell gegen Monorepos<\/li>\n\n\n\n<li><a rel=\"noopener\" href=\"https:\/\/presumably.de\/monorepos-and-the-fallacy-of-scale.html\" target=\"_blank\">Monorepos and the Fallacy of Scale<\/a> \u2013 eine Verteidigung von Monorepos als direkte Antwort auf den ersten Artikel <\/li>\n<\/ul>\n\n\n\n<p>Im folgenden findest du die Vor- und Nachteile, wie ich sie im Programmiereralltag erfahren habe, bzw. meine Sicht zu den verbreiteten Kritikpunkten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-sind-die-vorteile-eines-monorepos\">Was sind die Vorteile eines Monorepos?<\/h3>\n\n\n\n<p>Reduzierung von Aufwand \/ Kosten:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Weniger Repositories:<\/strong><br>Entwickler m\u00fcssen nur ein (oder wenige) Repositories auschecken und aktualisieren. Neue Projekte werden in Unterverzeichnissen erstellt und somit automatisch an die anderen Entwickler verteilt, ohne dass diese weitere Repositories auschecken m\u00fcssen.<\/li>\n\n\n\n<li><strong>Konsistenz des Gesamtprojekts:<\/strong><br>Entwickler haben zu jeder Zeit einen konsistenten Stand des Gesamtprojekts \u2013 nicht nur im <em>main<\/em>-Branch, sondern auch auf Branches und alten Commits. Bei vielen Einzelrepositories kommt es hingegen schnell zu Inkompatibilit\u00e4ten.<\/li>\n\n\n\n<li><strong>Atomare Commits:<\/strong><br>Zusammengeh\u00f6rige \u00c4nderungen an mehreren Teilprojekten k\u00f6nnen gemeinsam eingecheckt werden.<\/li>\n\n\n\n<li><strong>Einfacher mergen:<\/strong><br>Das Anlegen und Mergen von Branches f\u00fcr \u00c4nderungen, die mehrere Teilprojekte umfassen, ist aufw\u00e4ndig, wenn die Projekte in separaten Repositories liegen. In einem Monorepo muss man nur einmal mergen.<\/li>\n\n\n\n<li><strong>Einfacherere Aufl\u00f6sung von Merge-Konflikten:<\/strong><br>Das Behandeln von Merge-Konflikten wird vereinfacht, da sich in einem Monorepo w\u00e4hrend der Behandlung des Konflikts die komplette Codebasis in einem konsistenten Zustand befindet. Bei mehreren Repositories muss man diese ggf. erst m\u00fchsam auf einen einheitlichen Zustand bringen.<\/li>\n<\/ul>\n\n\n\n<p>Verbesserte Wartbarkeit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Code verschieben:<\/strong><br>Code kann deutlich einfacher zwischen den Verzeichnissen eines Monorepos verschoben werden als von einem Repository in ein anderes. Somit k\u00f6nnen Entwickler die Modulgrenzen bei \u00c4nderungen von Anforderungen oder Refactorings problemlos anpassen.<\/li>\n\n\n\n<li><strong>Zentrale Dokumentation:<\/strong><br><span style=\"font-size: 1rem;\">Projekt\u00fcbergreifende Dokumentation kann im Root-Folder des Monorepos abgelegt werden.<\/span><\/li>\n<\/ul>\n\n\n\n<p>Organisation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Transparenz:<\/strong><br>Monorepos f\u00fchren dazu, dass alle Entwickler Zugriff auf die gesamte Codebasis haben. In den meisten F\u00e4llen ist dies erw\u00fcnscht, f\u00f6rdert die team\u00fcbergreifende Zusammenarbeit und erlaubt es Entwicklern an Code anderer Teams mitzuarbeiten.<\/li>\n\n\n\n<li><strong>Reduzierte Konfiguration:<\/strong><br>Monorepos reduzieren den Konfigurationsaufwand der Source Code Management Tools.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"was-sind-die-nachteile-eines-monorepos\">Was sind die Nachteile eines Monorepos?<\/h3>\n\n\n\n<p>Performance \/ Skalierbarkeit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Performance-Probleme:<\/strong><br>Kritiker bem\u00e4ngeln, dass Monorepos zu Performance-Probleme f\u00fchren. Ich konnte in Projekten der Gr\u00f6\u00dfe, in der die meisten von uns sich bewegen, bisher keine Performance-Einbu\u00dfen feststellen (s. Folgeabschnitt \"<a href=\"#Performance_und_Skalierbarkeit_eines_Git-Monorepos\">Performance und Skalierbarkeit eines Git-Monorepos<\/a>\").<\/li>\n\n\n\n<li><strong>Erh\u00f6hter Speicherbedarf:<\/strong><br>Ebenso wird ein erh\u00f6hter Speicherbedarf kritisiert, da jeder Entwickler die gesamte Codebasis auschecken muss. Dies d\u00fcrfte heutzutage in den meisten Projekten unerheblich sein: Der Quellcode des Linux-Kernels bspw. belegt etwa 3,5 GB. Die Repositories der meisten Unternehmen d\u00fcrften kleiner sein.<\/li>\n\n\n\n<li><strong>Komplexere Builds:<\/strong><br>Monorepos machen vermeintlich die Build-Pipeline komplexer. Auch das entspricht nicht meiner Erfahrung. Mittels Sparse Checkouts und Polling Filtern kann man problemlos Teilprojekte bauen.<\/li>\n\n\n\n<li><strong>Komplizierte Versionierung: <\/strong><br>Angeblich wird die Versionierung komplizierter. Auch dies kann ich nicht nachvollziehen. Es ist sowohl m\u00f6glich die komplette Codebasis zu versionieren (mit Tags wie \"v1.0\") als auch einzelne Teilprojekte (mit Tags wie \"project-a-v1.0\").<\/li>\n<\/ul>\n\n\n\n<p>Architektur:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Schlechtere Modularisierung:<\/strong><br>Einige sind der Meinung, dass ein Monorepo einer sauberen und effektiven Modularisierung entgegen wirkt, da die Entwickler nicht gezwungen sind, den Code auf separate Repositories aufzuteilen. Ich sehe das als Vorteil, da Modulgrenzen durch Monorepos nicht in Stein gemei\u00dfelt werden (s. o. \"Verbesserte Wartbarkeit\").<\/li>\n<\/ul>\n\n\n\n<p>Organisation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Transparenz:<\/strong><br>Der unter den Vorteilen aufgef\u00fchrte Aspekt, dass alle Entwickler Zugriff auf die gesamte Codebasis haben, ist nicht in allen Organisationen erw\u00fcnscht. Beispielsweise sollten Projekte f\u00fcr unterschiedliche Kunden eines Auftragsentwicklers nicht in einem Monorepo abgelegt werden.<\/li>\n\n\n\n<li><strong>Open-Source-Libraries:<\/strong><br>Auch wenn Teilprojekte als Open Source-Komponenten freigegenen werden sollen, ist ein Monorepo hinderlich.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"performance-und-skalierbarkeit-eines-git-monorepos\">Performance und Skalierbarkeit eines Git-Monorepos<\/h2>\n\n\n\n<p>Ein weit verbreiteter Kritikpunkt an Monorepos ist deren schlechte Performance und Skalierbarkeit. <\/p>\n\n\n\n<p>Aus meiner Erfahrung der letzten drei Jahre kann ich sagen, dass es in den meisten Teams keine Performance-Probleme geben sollte. In den meisten Unternehmen d\u00fcrfte die gesamte Codebasis kleiner sein als der Linux-Kernel (17,9 Mio Codezeilen in 47.000 C\/C++ Files laut <a href=\"https:\/\/github.com\/AlDanial\/cloc\" target=\"_blank\" rel=\"noreferrer noopener\">cloc<\/a>; und 5,7 Mio Deltas), welcher ebenfalls durch Git verwaltet wird (und f\u00fcr den Git urspr\u00fcnglich entwickelt wurde).<\/p>\n\n\n\n<p>Aktuell arbeite ich an einem Projekt bei <a rel=\"noopener\" href=\"https:\/\/www.ionos.de\/\" target=\"_blank\">IONOS<\/a>. Das Monorepo des Java-Backends ist kleiner als der Linux-Kernel, liegt aber in einer vergleichbaren Gr\u00f6\u00dfenordnung. Das Klonen des gesamten Repositories dauert weniger als eine Minute. Das Umschalten von Branches dauert je nach Alter des Branches zwischen 0,2 und 1,5 Sekunden.<\/p>\n\n\n\n<p>Die meisten von uns arbeiten in Unternehmen dieser Gr\u00f6\u00dfenordnungen; von daher sehe ich in naher Zukunft keine praktischen Probleme bei der Skalierbarkeit eines Monorepos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfuehren-mergen-mehrerer-git-repositories-unter-beibehaltung-der-history\">Zusammenf\u00fchren (Mergen) mehrerer Git-Repositories unter Beibehaltung der History<\/h2>\n\n\n\n<p>Nehmen wir an, wir haben zwei Projekte, \"project-a\" (beispielhaft angelegt unter <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/project-a\" target=\"_blank\">https:\/\/github.com\/SvenWoltmann\/project-a<\/a>) und \"project-b\" (<a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/project-b\" target=\"_blank\">https:\/\/github.com\/SvenWoltmann\/project-b<\/a>), die wir zu einem Repository \"sparse-checkout-demo\" zusammenfassen wollen. Die zwei Projekte sollen dabei in Unterverzeichnissen mit den jeweiligen Projektnamen angeordnet werden.<\/p>\n\n\n\n<p>Zun\u00e4chst m\u00fcssen wir beide Projekte auschecken (sofern diese nicht bereits vorhanden sind), das Verzeichnis f\u00fcr das Monorepo erstellen und dort ein Git-Repository initialisieren (alternativ eines via GitHub erstellen und klonen):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">git clone git@github.com:SvenWoltmann\/project-a.git\ngit clone git@github.com:SvenWoltmann\/project-b.git\n\nmkdir sparse-checkout-demo\ngit init sparse-checkout-demo<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier die Ausgaben, die du sehen solltest:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><a href=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1.png\"><img decoding=\"async\" width=\"800\" height=\"277\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-800x277.png\" alt=\"Git-Repositories mergen \u2013 Schritt 1\" class=\"wp-image-27812\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-800x277.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-224x77.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-336x116.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-504x174.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-672x232.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-400x138.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-600x207.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1-944x326.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-1.png 992w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\">Git-Repositories mergen \u2013 Schritt 1<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Mit folgenden Kommandos mergen wir Projekt A in das Monorepo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">cd project-a\ngit filter-branch -f --prune-empty --tag-name-filter cat --tree-filter '\n    mkdir -p project-a\n    git ls-tree --name-only $GIT_COMMIT | xargs -I{} mv {} project-a\n'\ncd ..\/sparse-checkout-demo\ngit remote add project-a ..\/project-a\ngit fetch project-a\ngit merge --allow-unrelated-histories project-a\/main\ngit remote rm project-a<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Folgende Ausgabe solltest du sehen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><a href=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2.png\"><img decoding=\"async\" width=\"800\" height=\"289\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-800x289.png\" alt=\" Git-Repositories mergen \u2013 Schritt 2\" class=\"wp-image-27813\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-800x289.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-224x81.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-336x121.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-504x182.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-672x243.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-400x144.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-600x217.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2-944x341.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-2.png 992w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\"> Git-Repositories mergen \u2013 Schritt 2<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Das gleiche wiederholen wir f\u00fcr Projekt B:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">cd ..\/project-b\ngit filter-branch -f --prune-empty --tag-name-filter cat --tree-filter '\n    mkdir -p project-b\n    git ls-tree --name-only $GIT_COMMIT | xargs -I{} mv {} project-b\n'\ncd ..\/sparse-checkout-demo\ngit remote add project-b ..\/project-b\ngit fetch project-b\ngit merge --allow-unrelated-histories project-b\/main\ngit remote rm project-b<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hier die entsprechenden Ausgaben dazu:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><a href=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3.png\"><img decoding=\"async\" width=\"800\" height=\"433\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-800x433.png\" alt=\" Git-Repositories mergen \u2013 Schritt 3\" class=\"wp-image-27814\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-800x433.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-224x121.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-336x182.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-504x273.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-672x364.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-400x217.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-600x325.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3-944x511.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-3.png 992w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\"> Git-Repositories mergen \u2013 Schritt 3<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Und das war es schon!<\/p>\n\n\n\n<p>Mit <code>dir<\/code> und <code>git log<\/code> kannst du sehen, dass beide Teilprojekte und deren Commits im Monorepo enthalten sind:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><a href=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4.png\"><img decoding=\"async\" width=\"800\" height=\"478\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-800x478.png\" alt=\" Git-Repositories mergen \u2013 \u00dcberpr\u00fcfung\" class=\"wp-image-27815\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-800x478.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-224x134.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-336x201.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-504x301.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-672x402.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-400x239.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-600x359.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4-944x564.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/02\/merge-git-repos-step-4.png 992w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><figcaption class=\"wp-element-caption\"> Git-Repositories mergen \u2013 \u00dcberpr\u00fcfung<\/figcaption><\/figure>\n<\/div>\n\n\n<p>In diesem Beispiel ging das ziemlich schnell. Stell dich bei gr\u00f6\u00dferen Projekten darauf ein, dass der Prozess einige Stunden in Anspruch nehmen kann. Als wir bei AndroidPIT die Module, aus denen die Webseite besteht, zusammengefasst haben, hat dies etwa dreieinhalb Stunden gedauert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"fazit\">Fazit<\/h2>\n\n\n\n<p>In diesem Artikel habe ich die Vor- und Nachteile von Git-Monorepos gegen\u00fcbergestellt \u2013 meiner Meinung nach \u00fcberwiegen die Vorteile deutlich, sodass Monorepos f\u00fcr die meisten Teams eine gute Wahl sind. Die h\u00e4ufig kritisierten Performance- und Skalierbarkeitsprobleme kommen bei den Teamgr\u00f6\u00dfen der meisten Unternehmen nicht zum Tragen, und das einfachere Refactoring von Code \u00fcber Modulgrenzen hinweg erh\u00f6ht die Wartbarkeit des Codes.<\/p>\n\n\n\n<p>Ich habe Schritt f\u00fcr Schritt gezeigt, wie existierende Repositories unter Beibehaltung ihrer History zusammengef\u00fchrt werden k\u00f6nnen.<\/p>\n\n\n\n<p>Wer nicht alle Projekte in einem einzigen Repository haben m\u00f6chte, kann Monorepos auch auf diejenigen Projekte beschr\u00e4nken, die eng miteinander verwoben sind und bei denen gemeinsames Branchen und Mergen sinnvoll ist. Auch kannst du deine Projekte nach und nach in Monorepos \u00fcberf\u00fchren und \u2013 ebenso problemlos \u2013 Monorepos und Einzelprojekte nebeneinander laufen lassen.<\/p>\n\n\n\n<p>Wenn dir der Artikel gefallen hat, teile ihn gerne \u00fcber einen der Share-Buttons und hinterlasse mir einen Kommentar: Welche Erfahrungen hast du mit Monorepos gemacht? Teilst du meine Einsch\u00e4tzung der Vor- und Nachteile?<\/p>\n\n\n\n<p>M\u00f6chtest du informiert werden, wenn neue Artikel auf HappyCoders.eu ver\u00f6ffentlicht werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders.eu-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was ist ein Monorepo?<\/p>\n<p>Was sind seine Vor- und Nachteile?<\/p>\n<p>Wie kann man bestehende Git-Repositorien zu einem Monorepo zusammenf\u00fchren?<\/p>\n","protected":false},"author":1,"featured_media":35248,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Was ist ein Monorepo? Was sind die Vor-\/Nachteile? Wie werden bestehende Repositories unter Erhaltung ihrer History in ein Monorepo gemerged?","_seopress_robots_index":"","_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":10426,"_post_count":0,"footnotes":""},"categories":[204],"tags":[214],"class_list":["post-3363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-craftsmanship","tag-tools-de"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2020\/08\/monorepos-pros-and-cons.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":1,"uagb_excerpt":"Was ist ein Monorepo? Was sind seine Vor- und Nachteile? Wie kann man bestehende Git-Repositorien zu einem Monorepo zusammenf\u00fchren?","public_identification_id":"07e3772197a647bc8e33472d619cca0c","private_identification_id":"9d5a706dc5744af0ae186998859a7a2a","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/3363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=3363"}],"version-history":[{"count":11,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/3363\/revisions"}],"predecessor-version":[{"id":56098,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/3363\/revisions\/56098"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/35248"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=3363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=3363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=3363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}