Den GitHub Blogg

til Slutt, noen interessante programvare vil prosjektet komme til å avhenge av et annet prosjekt, et bibliotek eller et rammeverk. Git gir submodules å hjelpe til med dette. Submodules lar deg inkludere eller bygge inn ett eller flere registre som en sub-mappe i en annen depotet.

For mange prosjekter, submodules er ikke den beste svar (mer om dette nedenfor), og selv på sitt beste, som arbeider med submodules kan være vanskelig, men la oss starte med å se på en rett-frem-eksempel.,

Legge til en Submodule

La oss si at du arbeider på et prosjekt som heter Sprettert. Du har fått koden for y-shaped stick og rubber-band.


flickr photo deles av ung@art under en Creative Commons ( AV ) lisens

På samme tid, i en annen depotet, du har fått et annet prosjekt som heter Rock—det er bare en generisk rock biblioteket, men du tror det ville være perfekt for Sprettert.

Du kan legge til rock som en submodule av slingshot., I slingshot depotet:

På dette punktet, vil du ha en rock mappe inni slingshot, men hvis du var til å ta en titt inne i den mappen, avhengig av din versjon av Git, kan du se … ingenting.,

Nyere versjoner av Git vil gjøre dette automatisk, men eldre versjoner vil kreve at du eksplisitt fortelle Git å laste ned innholdet av rock:

Hvis alt ser bra ut, du kan gjennomføre denne endringen, og du vil ha en rock mappe i slingshot depotet med alt innholdet fra rock depotet.,

På GitHub, rock mappe-ikonet vil ha en liten indikator som viser at det er en submodule:

Og deretter klikke på rock mappe vil ta deg over til rock depotet.

det er det! Du har lagt rock inne i depotet slingshot depotet. Du kan samhandle med innholdet fra rock som om det var en mappe inni slingshot (fordi det er).,

På kommandolinjen, Git-kommandoer utstedt fra slingshot (eller noen av de andre mapper, rubber-band og y-shaped-stick) vil operere på den «overordnede depotet», slingshot, men kommandoer du problemet fra rock mappe vil fungere på akkurat de rock depotet:

Bli med i et prosjekt ved hjelp av submodules

Nå, si at du er en ny samarbeidspartner bli med i Prosjektet Sprettert., Du vil starte ved å kjøre git clone for å laste ned innholdet av slingshot depotet. På dette punktet, hvis du var til å ta en titt inni rock mappe, du vil se … ingenting.

Igjen, Git forventer at vi eksplisitt ber om det for å laste ned den submodule innhold., Du kan bruke git submodule update --init --recursive her også, men hvis du er kloning slingshot for første gang, kan du bruke en modifisert clone kommando for å sikre at du laste ned alt, inkludert eventuelle submodules:

Bytte til submodules

Det kan være litt vanskelig å ta et eksisterende undermappe og slå den inn i en ekstern avhengighet. La oss se på et eksempel.

Du er i ferd med å starte et nytt prosjekt—en magisk roll-back kan–som også er behov for en rubber-band., La oss ta rubber-band du bygget for slingshot, dele den ut til en frittstående depotet, og deretter legge den til både prosjekter via submodules.

Du kan ta alt fra Prosjektet Sprettert er rubber-band mappe og pakke det inn i et nytt depot og selv opprettholde begå historie.

La oss begynne ved å trekke ut innholdet av rubber-band mappe av slingshot., Du kan bruke git filter-branch for å gjøre dette, forlater deg med bare begår relatert til rubber-band. git filter-branch – kommandoen til å skrive om våre depotet er historie, noe som gjør at det ser ut som om den rubber-band mappe hadde vært et eget depot alle sammen. For mer informasjon om git filter-branch, kan du se denne artikkelen.

Det første trinnet er å lage en kopi av slingshot for å arbeide på—end-målet er rubber-band til å stå som sin egen depotet, så la slingshot som det er., Du kan bruke cp med -r for å undermapper kopiere hele slingshot mappe til en ny mappe rubber-band.,

Det ser ut som rubber-band er bare en annen slingshot, men nå, fra rubber-band depotet, kan du kjøre git filter-branch:

På dette punktet, vil du ha en mappe rubber-band, som er et oppbevaringssted for den slags ligner Prosjektet Sprettert, men det har bare filene og forplikte historie fra rubber-band mappe.,

Siden du har kopiert dette fra slingshot, det nye depotet vil fortsatt ha noen ekstern sporing grener du oppsett når det var slingshot. Du ønsker ikke å presse rubber-band tilbake på slingshot. Du vil overføre denne til et nytt depot.

du vil Opprette en ny plassering for rubber-band på GitHub, så oppdatere fjernkontrollen for rubber-band., Forutsatt at du var ringe eksterne origin, kunne du:

Deretter kan du publisere den nye «generisk gummi-band-modul» med git push.,

Nå som du har separert rubber-band inn i sin egen depotet, må du slette de gamle rubber-band mappe fra slingshot depotet:

oppdater slingshot for å bruke rubber-band som en submodule:

Som vi så før når vi var å legge til rock, vi har nå et depot-i-en-depotet., Tre depoter, faktisk: «mor» depotet slingshot, pluss to «sub» repositories, rock og rubber-band.

I tillegg, hvis vi dykk tilbake i slingshot‘s historie, og vi vil se den, begår vi opprinnelig laget til rubber-band tilbake da det ble en mappe slette mappen ikke slette noen av historie., Dette kan noen ganger være litt forvirrende—siden rubber-band «barn» depotet har en kopiert-og-modifisert versjon av de gamle slingshot forplikter, kan det noen ganger føler du har déja vu.

Dessverre, noen samarbeidspartner som trekker slingshot på dette punktet vil ha en tom rubber-band mappe., Du ønsker kanskje å minne dine samarbeidspartnere for å kjøre denne kommandoen for å sikre at de har alt de submodule innhold:

Du vil også ønsker å legge til rubber-band submodule til magic roll-back can. Heldigvis, alt du trenger å gjøre er å følge den samme fremgangsmåten du brukte tidligere, når du har lagt rock til slingshot, i «Legge til en submodule.»

Råd om hvordan du bruker submodules (eller ikke)

  • Før du legger til et depot som en submodule, først sjekke for å se om du har et bedre alternativ tilgjengelig., Git submodules fungerer godt nok for enkle saker, men i disse dager er det ofte bedre verktøy tilgjengelig for å håndtere avhengigheter enn hva Git submodules kan tilby. Moderne språk som Går vennlig, Git-klar avhengighet management systems bygget inn fra starten av. Andre, som Ruby ‘ s rubygems, Node.js’ npm, eller Kakao er CocoaPods og Carthage, har blitt lagt til av programmering samfunnet. Selv front-end utviklere har verktøy som Stua til administrer biblioteker og rammer for klient-side JavaScript og CSS.
  • Husk at Git laster ikke ned submodule innholdet som standard., Hvis du legger til en submodule til et eksisterende prosjekt, sørg for at alle som arbeider på prosjektet vet de trenger for å kjøre kommandoer som git submodule update og git clone --recursive for å sikre at de får alt dette omfatter alle automatisert distribusjon eller utprøving som kan være involvert i prosjektet! Vi anbefaler at du bruker noe som våre «Skript til å Styre Dem Alle» for å sikre at alle samarbeidspartnere og tjenester har tilgang til de samme depotet innhold overalt.
  • Submodules krever at du nøye balanse konsistens og bekvemmelighet., Oppsettet som er brukt her sterkt foretrekker konsistens, på bekostning av en liten bekvemmelighet. Det er vanligvis best å ha et prosjekt submodules låst til en bestemt SHA, slik at alle medarbeidere får samme innhold. Men dette oppsettet gjør det også vanskelig for utviklere i den «overordnede» i depotet for å bidra endringer tilbake til submodule depotet.
  • Husk at samarbeidspartnere vil ikke automatisk oppdateringer til submodules—hvis du vil oppdatere en submodule, du kan få behov for å minne dine kolleger til å kjøre git submodule update eller vil de sannsynligvis se merkelig oppførsel.,
  • Administrere dynamisk, i rask utvikling eller sterkt co-avhengige depoter med submodules kan fort bli frustrerende. Dette innlegget ble fokusert på enkel, relativt statisk foreldre-barn-depotet relasjoner. En fremtidig oppfølging innlegget vil detalj noen strategier for å hjelpe håndtere mer komplekse submodule arbeidsflyter.

Mer å lese

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *