GitHub-bloggen

til sidst vil ethvert interessant soft .areprojekt afhænge af et andet projekt, bibliotek eller ramme. Git leverer undermoduler til at hjælpe med dette. Undermoduler giver dig mulighed for at inkludere eller integrere et eller flere arkiver som en undermappe i et andet arkiv.

For mange projekter er undermoduler ikke det bedste svar (mere om dette nedenfor), og selv på deres bedste kan det være vanskeligt at arbejde med undermoduler, men lad os starte med at se på et ligetil eksempel.,

tilføjelse af en undermodul

lad os sige, at du arbejder på et projekt kaldet Slingshot. Du har kode for y-shaped stick og en rubber-band.


flickr foto deles af unge@kunst under en Creative Commons ( BY ) licens

På samme tid, i et andet arkiv, du har fået et andet projekt kaldet Rock—det er bare en generisk rock bibliotek, men du tror, det ville være perfekt for Slangebøsse.

Du kan tilføje rock som et undermodul af slingshot., I slingshot repository:

På dette punkt, vil du have et rock mappe inde slingshot, men hvis du var til at kigge i den mappe, afhængigt af din version af Git, kan du se … intet.,

Nyere versioner af Git vil gøre det automatisk, men ældre versioner vil kræve, at du eksplicit fortæller Git til at hente indholdet af rock:

Hvis alt ser godt ud, du kan forpligte sig på denne forandring, og du vil have en rock i mappen slingshot arkiv med alt indhold fra rock repository.,

På GitHub, rock mappe-ikonet vil have en lille indikator, der viser, at det er en submodule:

Og klik på rock mappe vil tage dig til den rock repository.

det er det! Du har indlejret rock repository inde i slingshot repository. Du kan interagere med alt indhold fra rock som om det var en mappe inde slingshot (fordi det er).,

På kommando-linjen, Git kommandoer, der er udstedt fra slingshot (eller nogen af de andre mapper, rubber-band og y-shaped-stick) vil operere på “forælder repository”, slingshot men kommandoer du spørgsmål rock mappe vil operere på kun rock repository:

Vær et projekt ved hjælp af submodules

Nu siger du er en ny medarbejder tiltræder Projekt Slangebøsse., Du vil starte ved at køre git clone for at hente indholdet af slingshot repository. På dette tidspunkt, hvis du skulle kigge inde i rock mappe, ville du se … intet.

igen forventer Git, at vi eksplicit beder den om at do .nloade undermodulets indhold., Du kan bruge git submodule update --init --recursive her så godt, men hvis du er kloning slingshot for første gang, kan du bruge en modificeret clone kommando til at sikre, at du downloade alt, herunder enhver submodules:

Skift til submodules

Det kan være lidt tricky at tage en eksisterende undermappe og gøre det til en ekstern afhængighed. Lad os se på et eksempel.

Du er ved at starte et nyt projekt—en magisk roll-back kan–som også har brug for en rubber-band., Lad os tage rubber-band du byggede til slingshot, opdele det i et selvstændigt Depot og derefter integrere det i begge projekter via undermoduler.

Du kan tage alt fra Projektslingshot ‘ s rubber-band mappe og udpakke det i et nyt arkiv og endda opretholde commithistorikken.

Lad os begynde med at udtrække indholdet af rubber-band mappe ud af slingshot., Du kan bruge git filter-branch til at gøre dette, så du kun har de forpligtelser, der er relateret til rubber-band. Kommandoen git filter-branch vil omskrive vores arkivs historie, så det ser ud som om mappen rubber-band havde været dets eget arkiv hele tiden. For mere information om git filter-branch, se denne artikel.

Det første skridt er at lave en kopi af slingshot for at arbejde på—det endelige mål er, at vi rubber-band til at stå som sin egen repository, så lad slingshot, som det er., Du kan bruge cp med -r rekursivt at kopiere hele slingshot mappe til en ny mappe rubber-band.,

Det ser ud som rubber-band er bare en anden slingshot, men nu, fra rubber-band repository, kør git filter-branch:

På dette punkt, har du en mappe rubber-band, som er et lager, som en slags ligner Projekt Slangebøsse, men det har kun de filer og begå historie fra rubber-band mappe.,

da du kopierede dette fra slingshot, vil det nye arkiv stadig have nogen fjernsporingsgrene, du opsætter, når det var slingshot. Du ønsker ikke at skubbe rubber-band tilbage på slingshot. Du vil skubbe dette til et nyt depot.

Opret et nyt arkiv for rubber-band på GitHub, opdater derefter fjernbetjeningen til rubber-band., Forudsat, at du var ringer den eksterne origin, du kunne:

Så kan du offentliggøre den nye “generiske rubber-band modulet” med git push.,

Nu, at du har adskilt rubber-band i sit eget arkiv, er du nødt til at slette den gamle rubber-band mappen fra slingshot repository:

Så opdatering slingshot for at bruge rubber-band som en submodule:

Som vi så før, da vi var at tilføje rock vi har nu en repository-i-en-repository., Tre depoter, i virkeligheden: “forælder” repository slingshot, plus de to “sub” repositories, rock og rubber-band.hvis vi desuden dykker tilbage i slingshot ‘ s historie, ser vi de forpligtelser, vi oprindeligt lavede til rubber-band tilbage, da det var en mappe—sletning af mappen slettede ikke nogen af historikken., Dette kan sommetider være en lidt forvirrende—siden rubber-band “barn” lageret har en kopieret og modificeret version af de gamle slingshot begår, kan det nogle gange føles, som om du har déja vu.

desværre vil enhver samarbejdspartner, der trækker slingshotpå dette tidspunkt, have en tom rubber-band mappe., Du måske ønsker at minde dine samarbejdspartnere til at køre denne kommando til at sikre, at de har alle de submodule indhold:

Du vil også ønsker at tilføje rubber-band submodule til magic roll-back can. Heldigvis er alt, hvad du skal gøre, at følge den samme procedure, du brugte tidligere, da du tilføjede rock til slingshot, i “Tilføjelse af en undermodul.”

råd om brug af undermoduler (eller ej)

  • før du tilføjer et arkiv som undermodul, skal du først kontrollere, om du har et bedre alternativ til rådighed., Git-undermoduler fungerer godt nok til enkle tilfælde, men i disse dage er der ofte bedre værktøjer til rådighed til styring af afhængigheder end hvad Git-undermoduler kan tilbyde. Moderne sprog som Go har venlige, Git-a .are afhængighedsstyringssystemer indbygget fra starten. Andre, som Rubys rubygems, Node.js ‘npm, eller Cocoa’ s CocoaPods og Carthage, er blevet tilføjet af programmeringen samfund. Selv front-end udviklere har værktøjer som bo .er til at styre biblioteker og rammer for klientsiden JavaScript og CSS.
  • Husk, at Git ikke Do .nloader undermodulindhold som standard., Hvis du tilføjer en submodule til et eksisterende projekt, så sørg for enhver, der arbejder på projektet ved, at de er nødt til at køre kommandoer som f.eks. git submodule update og git clone --recursive for at sikre, at de får alt—dette inkluderer en automatiseret udsendelse eller test service, der kan være involveret i projektet! Vi anbefaler, at du bruger noget som vores “Scripts til at styre dem alle” for at sikre, at alle samarbejdspartnere og tjenester har adgang til det samme arkiv indhold overalt.
  • undermoduler kræver, at du omhyggeligt afbalancerer konsistens og bekvemmelighed., Opsætningen, der bruges her, foretrækker stærkt konsistens på bekostning af en lille bekvemmelighed. Det er generelt bedst at have et projekts undermoduler låst til en bestemt SHA, så alle samarbejdspartnere får det samme indhold. Men denne opsætning gør det også vanskeligt for udviklere i” parent ” repository at bidrage med ændringer tilbage til undermodul repository.
  • Husk, at samarbejdspartnere ikke automatisk ser opdateringer til undermoduler—hvis du opdaterer en undermodul, skal du muligvis minde dine kolleger om at køre git submodule update, eller de vil sandsynligvis se mærkelig opførsel.,
  • håndtering af dynamiske, hurtigt udviklende eller stærkt co-afhængige repositorier med undermoduler kan hurtigt blive frustrerende. Dette indlæg var fokuseret på enkel, relativt statiske forældre-barn repository relationer. En fremtidig opfølgende post vil detaljere nogle strategier for at hjælpe med at styre mere komplekse undermodule arbejdsgange.

yderligere læsning

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *