Ich bin ein weiterer Subversion-Benutzer, der Mühe hat, sich in das Tao der verteilten Versionskontrolle einzuarbeiten.
Bei der Verwendung von Subversion war ich ein großer Fan des Projekt-Minor-Ansatzes, und mit den meisten meiner früheren Arbeitgeber haben wir unsere Repository-Filialen strukturiert. Tags & Trunk wie folgt:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
Innerhalb des eigentlichen Quellbaums würden wir (so etwas wie) die folgende Struktur verwenden:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
Die Idee war (und ist), die Struktur des Repositorys zu verwenden, um die Kommunikation zwischen dem Engineering-Team zu strukturieren. der kundenorientierte Teil des Geschäfts und verschiedene andere Stakeholder und Domain-Experten.
Übrigens: Quelldokumente, die sich in einem der "Projekt" -Verzeichnisse befinden, werden nur einmal verwendet (und verdienen Geld). Dokumente, die sich in einem der "productLines" -Verzeichnisse befinden, verdienen so viel Geld, wie ein Produkt aus dieser bestimmten Zeile verkauft wird. Dokumente, die sich in einem der "Bibliotheks" -Verzeichnisse befinden, verdienen so viel Geld, wie Produkte, die sie verwenden, verkauft werden.
Der Begriff der Amortisation von Kosten wird explizit erwähnt, und es wird eine Unterstützung für die Wiederverwendung von Quelldokumenten im gesamten Unternehmen geschaffen.
Dies bedeutet auch, dass es eine gemeinsame Struktur gibt, über die unsere Build-Automatisierungstools arbeiten können. (Unsere Build-Skripte durchsuchen den Quellbaum nach "Build" -Ordnern, in denen sie Konfigurationsdateien finden, die angeben, wie die einzelnen Komponenten erstellt werden sollen. Ein ähnlicher Prozess wird für die Dokumentationserstellung und das Testen ausgeführt.)
Bezeichnenderweise benötigen die Produkte, an denen ich arbeite, in der Regel eine LANGE Zeit, um Leistungstests und Charakterisierungstests durchzuführen. von 20 bis 200 Stunden; Generieren von verarbeiteten Testergebnissen / Zwischendaten zwischen mehreren GB und mehreren TB (die gespeichert und an eine bestimmte Systemkonfiguration gebunden werden müssen, damit die Leistungsverbesserung im Laufe der Zeit gemessen werden kann). Dieses Problem macht das Konfigurationsmanagement zu einer wichtigen Überlegung und macht auch eine Zentralisierung erforderlich, da in der Regel nur begrenzte Rechenressourcen zum Ausführen der Leistungsmessung und der Charakterisierungstests erforderlich sind. (eine kleine Gruppe von 64-128 Kernen).
Als eine letzte Anmerkung; Das kontinuierliche Integrationssystem weiß, dass es einen Build auslösen muss. statische Analyse; Rauch- und Einheitentestlauf bei jeder Änderung des Trunks, bei jeder Änderung eines "Tag" -Zweigs und bei jeder Änderung eines "AUTOMATISIERT" -Zweigs. Auf diese Weise können einzelne Entwickler das CI-System mit ihren persönlichen Filialen nutzen, eine wichtige Funktion, IMHO.
Hier ist meine Frage: Wie kann ich all das oben Genannte mit Mercurial nachbilden (und es, wenn möglich, verbessern)?
--bearbeiten:
Meine derzeitige Denkweise besteht darin, ein zentrales Subversion-Repository zu verwenden, um die Gesamtstruktur zu definieren, aber die Verwendung von hg als Client zuzulassen, damit Entwickler Repos lokal verfügbar haben.