Hoe Git Subtree te gebruiken om meerdere projectrepositories te beheren

0
170

Programmeurs hergebruiken vaak code. In feite is het een van de kernprincipes van elke goede codebase: Don't Repeat Yourself (DRY). Wat als u een gedeeld project binnen meerdere andere repositories wilt gebruiken? De opdracht git subtree kan daarbij helpen.

Het probleem van het hergebruik van code

Het inbedden van projecten in andere projecten levert een probleem op; Project 1 en Project 2 zijn beide verbonden met Git, maar het directe gebruik van het gedeelde subproject voor beide is geen goede ontwerpkeuze. Dit is in wezen een forking van het subproject om het op twee plaatsen te gebruiken, en het zal onmogelijk zijn om een ​​officiële versie van het subproject te onderhouden.

Er zijn een paar oplossingen voor dit probleem, elk met hun eigen nadelen.

Ten eerste is de meest voor de hand liggende oplossing om van het subproject een pakket te maken en het te distribueren op een pakketbeheerder zoals NPM of NuGet. Dit werkt heel goed voor dingen die niet vaak worden bijgewerkt of onderhouden, en die het zich kunnen veroorloven om in discrete versienummers aan hun consumenten te worden gedistribueerd. Als u deze code echter regelmatig wijzigt, werkt het integreren, publiceren en ophalen van nieuwe versies van het project van een externe bron gewoon niet zo goed als de code direct toegankelijk hebben. Het introduceert ook complicaties voor lokale ontwikkeling.

De andere oplossing is om een ​​monorepo te gebruiken, één gigantische opslagplaats voor al je code. Dit is niet zo gek als je zou denken, en werkt goed als al je code zich in hetzelfde domein bevindt; Google gebruikt een monorepo voor al hun code en Microsoft gebruikt er een voor alle .NET-assemblies die ze onderhouden. Dit lost het probleem op, want als u code in het subproject wijzigt, wordt deze bijgewerkt wanneer u opnieuw opbouwt. In Visual Studio kan dit eenvoudig worden gedaan met Project References.

Advertentie

Er zijn echter veel gevallen waarin u het beste van twee werelden wilt hebben en het centraal als een pakket, maar ook direct insluiten en bewerken in meerdere projecten. Hiervoor biedt Git Subtree een oplossing.

Het kernconcept is vrij eenvoudig: je kunt kleinere Git-repo's hebben, met hun

Gewoonlijk is Git slim genoeg om automatisch pushen en samenvoegen af ​​te handelen, afhankelijk van welke wijzigingen uit welke substructuur kwamen. Het is echter een goede gewoonte om geen commits tussen subboomcode en hoofdprojectcode te mixen, omdat er gevallen zijn waarin je een meer gecompliceerde samenvoeging kunt tegenkomen waarvoor je de onderliggende Git-tools moet gebruiken die git subtree-wraps.

Git-substructuur instellen

Als je net een leeg project hebt opgezet en substructuren gaat opzetten, moet je een eerste commit maken, zelfs als het leeg is, anders geeft Git een foutmelding over een dubbelzinnig HOOFD. Je kunt een lege commit maken met het volgende commando:

git commit –allow-empty -n -m “Initial commit.”

U wilt de afstandsbediening voor het subproject toevoegen en het een naam geven. Je zult deze naam gebruiken om ernaar te verwijzen:

git remote add -f SubTreeName https://github.com/user/project.git

Vervolgens kun je de subtree toevoegen bij het gegeven voorvoegsel. Gebruik de opdracht –squash zodat de volledige geschiedenis van het subproject niet in het hoofdproject wordt opgeslagen.

git subtree add –prefix .Path/To/SubTree SubTreeName master –squash

Git-subboom gebruiken

Als je moet pullen, zal Git alleen het hoofdproject automatisch bijwerken, dus je moet de afstandsbediening ophalen en dan een subboom-specifieke commando trekken. Het is een beetje lang, omdat je het voorvoegsel moet doorgeven, maar de klus is geklaard:

git fetch SubTreeName master git subtree pull –prefix .Path/To/SubTree SubTreeName SubTreeName master –squash

Houd er rekening mee dat je commits van de afstandsbediening kunt ophalen, maar ze in de subtree trekken, of ze naar de afstandsbediening duwen, vereist dat je specifiek git subtree gebruikt.

Als het tijd is om terug upstream bijdragen, moet je git subtree push gebruiken:

git subtree push –prefix=.Path/To/SubTree SubTreeName master