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
oggit 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.