nakonec bude jakýkoli zajímavý softwarový projekt záviset na jiném projektu, knihovně nebo frameworku. Git poskytuje submoduly, které vám s tím pomohou. Submoduly umožňují zahrnout nebo vložit jeden nebo více úložišť jako podsložku do jiného úložiště.
u mnoha projektů nejsou submoduly nejlepší odpovědí (více o tom níže), a dokonce i v nejlepším případě může být práce s submoduly složitá, ale začněme tím, že se podíváme na přímý příklad.,
přidání Submodule
řekněme, že pracujete na projektu s názvem Slingshot. Máte kód pro y-shaped stick
a rubber-band
.
flickr foto sdílí mladý@umění pod licencí Creative Commons ( licence)
Ve stejné době, v jiném úložišti, máš další projekt s názvem Rock—to je jen obecný rock
knihovna, ale myslíš, že by bylo ideální pro Prak.
můžete přidat rock
jako submodul slingshot
., V slingshot
úložiště:
V tomto bodě, budete mít rock
složky uvnitř slingshot
, ale pokud jste se podívat uvnitř této složky, v závislosti na verzi systému Git, můžete vidět … nic.,
Novější verze systému Git to udělá automaticky, ale starší verze bude vyžadovat, abyste explicitně říct Git stáhnout obsah z rock
:
Pokud vše vypadá dobře, můžete potvrdit tuto změnu a budete mít rock
, složky v slingshot
úložiště s veškerý obsah z rock
úložiště.,
Na GitHub, rock
ikona složky bude mít trochu indikátor ukazuje, že se jedná o submodul:
kliknutím na rock
složka bude mít na rock
úložiště.
to je ono! Vložili jste úložiště rock
do úložiště slingshot
. S veškerým obsahem můžete komunikovat z rock
, jako by to byla složka uvnitř slingshot
(protože je).,
Na příkazovém řádku, Git příkazy vydané od slingshot
(nebo některou z dalších složek, rubber-band
y-shaped-stick
), bude pracovat na „mateřské úložiště“, slingshot
, ale příkazy vydávat od rock
složka bude fungovat jen na rock
úložiště:
Spojení projektu s využitím dílčích modulů
Nyní, řekněme, že jste nový spolupracovník spojování Projekt Prak., Začněte spuštěním git clone
a stáhněte si obsah úložiště slingshot
. V tomto okamžiku, pokud byste měli nahlédnout do složky rock
, uvidíte … nic.
společnost Git opět očekává, že ji výslovně požádáme o stažení obsahu submodule., Můžete použít git submodule update --init --recursive
tady stejně, ale pokud jste klonování slingshot
poprvé, můžete použít modifikovaný clone
příkaz k zajištění si stáhnout všechno, včetně všech dílčích modulů:
Přepnutí na submoduly
To může být trochu složitější, aby se existující podsložky a proměnit ji v externí závislost. Podívejme se na příklad.
Chystáte se zahájit nový projekt – kouzelná roll-back can – která také potřebuje rubber-band
., Pojďme se rubber-band
postaven pro slingshot
, rozdělit to do samostatného repozitáře, a pak vložte si je do obou projektů prostřednictvím dílčích modulů.
můžete si vzít vše ze složky project Slingshot rubber-band
a extrahovat ji do nového úložiště a dokonce udržovat historii odevzdání.
začněme rozbalením obsahu složky rubber-band
z slingshot
., Můžete použít git filter-branch
jak to udělat, takže vám jen zavazuje týkající se rubber-band
. Příkazgit filter-branch
přepíše historii našeho úložiště, takže vypadá, jako by složka rubber-band
byla po celou dobu vlastním úložištěm. Další informace o git filter-branch
naleznete v tomto článku.
prvním krokem je, aby se kopie slingshot
do práce na—konci-cílem je, aby rubber-band
stát jako jeho vlastní úložiště, takže nechat slingshot
jak je., Můžete použít cp
-r
rekurzivně kopírovat celé slingshot
složky do nové složky rubber-band
.,
vypadá To jako rubber-band
slingshot
, ale nyní, od rubber-band
úložiště, spusťte git filter-branch
:
V tomto bodě, budete mít složku rubber-band
, což je úložiště, které trochu připomíná Projekt Prak, ale to má pouze soubory a zavázat se historie z rubber-band
složka.,
Od doby, co jsi zkopíroval slingshot
, nové úložiště bude stále nějaké vzdálené sledování větvích nastavení, kdy to bylo slingshot
. Nechcete tlačit rubber-band
zpět na slingshot
. Chcete to posunout do nového úložiště.
vytvořte nové úložiště pro rubber-band
na Githubu a poté aktualizujte dálkový ovladač pro rubber-band
., Za předpokladu, že jste byli volání vzdálené origin
, můžete:
Pak můžete publikovat nové „generické gumy-band modul“ git push
.,
Nyní, že jste odděleni rubber-band
do své vlastní úložiště, budete muset odstranit staré rubber-band
složka slingshot
úložiště:
aktualizovat slingshot
rubber-band
jako submodul:
Jako jsme viděli dříve, když jsme byli přidání rock
, nyní máme úložiště-úložiště., Tři repozitáře, ve skutečnosti: „mateřské“ úložiště slingshot
plus dva „sub“ repozitáře, rock
rubber-band
.
kromě toho, pokud se ponoříme zpět do slingshot
‚historie, uvidíme se zavazuje, že jsme původně do rubber-band
zpátky, když to byla složku—odstranění složky nechtěla vymazat z historie., To může být někdy trochu matoucí—od rubber-band
„child“ úložiště má kopírovat-a-upravená verze z těch starých slingshot
spáchá, to může někdy pocit, že jste deja-vu.
Bohužel, každý spolupracovník, který táhne slingshot
v tomto bodě bude mít prázdný rubber-band
složka., Možná budete chtít připomenout své spolupracovníky ke spuštění tohoto příkazu, aby bylo zajištěno, že mají všechny submodul obsahu:
Budete také chtít přidat rubber-band
submodulu do magic roll-back can
. Naštěstí, vše, co musíte udělat, je následovat stejný postup, který jste použili dříve, když jste přidali rock
slingshot
, ve „Přidání submodulu.“
Rady na použití submoduly (nebo ne)
- předtím, Než přidáte úložiště jako submodul, nejprve zkontrolujte, zda máte lepší alternativu k dispozici., Submoduly Git fungují dostatečně dobře pro jednoduché případy, ale v těchto dnech jsou často k dispozici lepší nástroje pro správu závislostí než to, co submoduly Git mohou nabídnout. Moderní jazyky, jako je Go, mají od začátku vestavěné systémy správy závislostí git-aware. Jiní, jako Rubyho rubygems, uzel.js ‚ npm, nebo CocoaPods kakaa a Kartágo, byly přidány programovací komunitou. Dokonce i přední vývojáři mají nástroje jako Bower pro správu knihoven a rámců pro JavaScript a CSS na straně klienta.
- nezapomeňte, že Git ve výchozím nastavení nestáhne submodulový obsah., Pokud přidáváte submodulu do existujícího projektu, ujistěte se, že někdo pracuje na projektu, ví, že je třeba spustit příkazy, jako je
git submodule update
git clone --recursive
aby se zajistilo, že si vše—to zahrnuje automatizované nasazení nebo testování služby, které by mohly být zapojeny v projektu! Doporučujeme použít něco jako naše „Skripty vládne Všem“, aby zajistily, že všichni spolupracovníci a služby mají přístup k obsahu úložiště všude. - submoduly vyžadují, abyste pečlivě vyvážili konzistenci a pohodlí., Zde použité nastavení silně upřednostňuje konzistenci za cenu malého pohodlí. Obecně je nejlepší mít submoduly projektu uzamčené na konkrétní SHA, takže všichni spolupracovníci dostávají stejný obsah. Toto nastavení však také ztěžuje vývojářům v“ nadřazeném “ úložišti přispívat ke změnám zpět do úložiště submodulů.
- Pamatujte si, že spolupracovníci nebudou automaticky aktualizuje, aby se submoduly—pokud aktualizujete submodulu, možná budete muset připomenout své kolegy, aby spustit
git submodule update
nebo se bude pravděpodobně vidět podivné chování., - Správa dynamických, rychle se vyvíjejících nebo silně závislých úložišť s submoduly může být rychle frustrující. Tento příspěvek byl zaměřen na jednoduché, relativně statické rodič-dítě úložiště vztahy. Budoucí následný příspěvek podrobně popisuje některé strategie, které pomohou spravovat složitější pracovní postupy submodulů.