végül minden érdekes szoftverprojekt egy másik projekttől, könyvtártól vagy keretrendszertől függ. A Git submodulákat biztosít ehhez. Az almodulák lehetővé teszik, hogy egy vagy több tárolót almappaként egy másik tárolóba helyezzen be vagy ágyazzon be.
sok projekt esetében a submodules nem a legjobb válasz (erről bővebben alább), sőt a legjobb esetben is az almodulokkal való munka trükkös lehet, de kezdjük egy egyenesen előre mutató példával.,
Submodule hozzáadása
tegyük fel, hogy egy Slingshot nevű projekten dolgozik. y-shaped stick
és a rubber-band
kódja van.
flickr photo shared by young@art under a Creative Commons ( BY ) license
ugyanakkor, egy másik adattárban, van egy másik projekt nevű Rock—ez csak egy általánosrock
könyvtár, de úgy gondolja, hogy tökéletes lenne a csúzli.
rock
slingshot
almodulként adható hozzá., A slingshot
adattár:
Ezen a ponton, akkor egy rock
mappa belsejében slingshot
, de ha úgy döntesz, hogy kandikál be a mappába, attól függően, hogy a változat Git, talán látsz … semmit.,
az Újabb verziók a Git megteszi ezt automatikusan, de a régebbi verziók lesz szükség, hogy kifejezetten mondja Git, hogy töltse le a tartalmát rock
:
Ha mindent jól néz ki, lehet elkövetni, ez a változás majd, egy rock
mappa a slingshot
adattár minden tartalom a rock
adattár.,
a GitHub, a rock
mappa ikon lesz egy kis mutató azt mutatja, hogy ez egy almodul:
és kattintson a rock
mappa elviszi át a
adattár.
ennyi! A rock
tárolót a slingshot
tárolóba ágyazta. A rock
összes tartalmával kölcsönhatásba léphet, mintha a slingshot
mappában lenne (mert az).,
a parancssori, Git parancsokat kiadni a slingshot
(vagy bármely más mappákat, rubber-band
vagy y-shaped-stick
) fog működni a “szülő adattár”, slingshot
, de parancsok kérdés, hogy a rock
mappa fog működni, csak a rock
adattár:
Csatlakozás projekt segítségével submodules
Most, mondja, hogy egy új munkatárs csatlakozott Projekt Csúzli., A git clone
futtatásával letöltheti a slingshot
tároló tartalmát. Ezen a ponton, ha belenézne a rock
mappába, akkor semmit sem látna.
ismét a Git elvárja tőlünk, hogy kifejezetten kérje meg az almodul tartalmának letöltését., Használja a git submodule update --init --recursive
itt is, de ha a klónozás slingshot
az első alkalommal használja a módosított clone
parancs annak érdekében, hogy töltse le mindent, beleértve bármely submodules:
Váltás submodules
Ez egy kicsit trükkös, hogy egy meglévő almappát, majd kapcsolja be a külső függőség. Nézzünk egy példát.
új projektet indítasz-egy magic roll-back can-t -, amelynek szintén szüksége van egy rubber-band
– ra., Vegyük a rubber-band
a slingshot
számára épített
mindent elvehet a projekt Slingshot rubber-band
mappájából, majd kibonthatja egy új tárolóba, sőt megtarthatja a commit előzményeket.
kezdjük a rubber-band
mappa tartalmának kibontásával a slingshot
mappából., Ehhez használhatja a git filter-branch
– ot, így csak a rubber-band
– hoz kapcsolódó kötelezettségvállalásokat hagyhatja. Agit filter-branch
parancs átírja az adattár történetét, így úgy néz ki, mintha a rubber-band
mappa végig a saját tárolója volt. További információ a git filter-branch
, lásd ezt a cikket.
az első lépés az, hogy egy példányt aslingshot
dolgozni-a végső cél az rubber-band
állni, mint a saját adattár, így hagyja slingshot
ahogy van., Acp
-r
segítségével rekurzívan másolhatja a teljesslingshot
mappát egy új mappábarubber-band
.,
úgy néz ki, mint rubber-band
csak egy másik slingshot
, de most, a rubber-band
adattár, fuss git filter-branch
:
Ezen a ponton, akkor van egy mappa rubber-band
, amely egy tároló, hogy egyfajta hasonlít Project Slingshot, de csak a fájlokat, és elkövetni története a rubber-band
mappa.,
mivel ezt aslingshot
– ból másolta, az új tárolónak továbbra is vannak olyan távoli nyomkövető ágai, amelyeket beállítottál, amikorslingshot
volt. Nem akarja a rubber-band
slingshot
– ra tolni. Azt akarod, hogy álljon ez egy új tároló.
Hozzon létre egy új tárolórubber-band
A GitHub, majd frissítse a távolirubber-band
., Feltételezve, hogy a távvezérlőt origin
, akkor:
akkor közzéteheti az új “általános gumiszalag-modult” git push
.,
Most, hogy már elválasztott rubber-band
a saját repository -, el kell törölni a régi rubber-band
mappa a slingshot
adattár:
Akkor update slingshot
, hogy a rubber-band
mint egy részmodult:
Mint láttuk korábban, amikor voltunk, hozzátéve, hogy a rock
, most már van egy repository-az-adattár., Három adattár, valójában: a” szülő ” adattár slingshot
, plusz a két “sub” adattár, rock
és rubber-band
.
ezenkívül, ha visszatérünk a slingshot
előzményeibe, látni fogjuk az eredetileg a rubber-band
mappába tett kötelezettségvállalásokat—a Mappa törlése nem törölte az előzményeket., Ez néha lehet egy kicsit zavaró, mivel a rubber-band
“gyermek” adattár másolt-meg-módosított változata a régi slingshot
vállalja, néha érzem, hogy déja vu.
sajnos minden olyan munkatárs, aki slingshot
húzza, ezen a ponton üres rubber-band
mappa lesz., Érdemes emlékeztetnie munkatársait, hogy futtassák ezt a parancsot annak biztosítása érdekében, hogy rendelkezzenek az összes almodul tartalmával:
hozzá kell adnia a rubber-band
submodule magic roll-back can
. Szerencsére csak annyit kell tennie, hogy ugyanazt az eljárást kövesse, amelyet korábban használt, amikor hozzáadta a rock
slingshot
, a ” submodul hozzáadása.”
submodules (vagy nem)
- mielőtt egy adattárat submodulként adna hozzá, először ellenőrizze, hogy van-e jobb alternatíva., A Git almodulák elég jól működnek az egyszerű esetekhez, de manapság gyakran jobb eszközök állnak rendelkezésre a függőségek kezelésére, mint amit a Git almodulák kínálhatnak. Az olyan modern nyelvek, mint a Go, már a kezdetektől fogva barátságos, Git-tudatos függőségkezelő rendszerekkel rendelkeznek. Mások, mint Ruby rubygems, csomópont.a JS ‘ npm-et, vagyis a Cocoapods-ot és Carthage-t a programozó közösség egészítette ki. Még a front-end fejlesztőknek is vannak olyan eszközei, mint a Bower a kliens oldali JavaScript és CSS könyvtárainak és keretrendszereinek kezelésére.
- ne feledje, hogy a Git alapértelmezés szerint nem tölti le az almodul tartalmát., Ha hozzáad egy almodulot egy meglévő projekthez, győződjön meg róla, hogy bárki, aki a projekten dolgozik, tudja, hogy olyan parancsokat kell futtatnia, mint a
git submodule update
ésgit clone --recursive
annak biztosítása érdekében, hogy mindent megkapjon—ez magában foglal minden olyan automatizált telepítési vagy tesztelési szolgáltatást, amely részt vehet a projektben! Javasoljuk, hogy használja valami hasonló a “Scripts szabály őket” annak biztosítása érdekében, hogy minden együttműködő és szolgáltatások hozzáférhetnek az azonos tároló tartalom mindenhol. - Submodules megkövetelik, hogy gondosan egyensúlyt konzisztencia és a kényelem., Az itt használt beállítás erősen kedveli a konzisztenciát, egy kis kényelem árán. Általában a legjobb, ha egy projekt almoduljait egy adott SHA-hoz zárolják, így minden munkatárs ugyanazt a tartalmat kapja. De ez a Beállítás megnehezíti a fejlesztők számára a “szülő” repository hozzájárulni változások vissza a submodule repository.
- ne feledje, hogy az együttműködők nem fogják automatikusan látni a submodules frissítéseit—ha frissíti az almodulot, előfordulhat, hogy emlékeztetnie kell kollégáit a
git submodule update
futtatására, vagy valószínűleg furcsa viselkedést fognak látni., - a dinamikus, gyorsan fejlődő vagy erősen társfüggő tárolók kezelése az almodulokkal gyorsan frusztrálóvá válhat. Ez a bejegyzés az egyszerű, viszonylag statikus szülő-gyermek tároló kapcsolatokra összpontosított. A jövőbeli nyomon követési üzenet részletesen bemutatja néhány stratégiát, amelyek segítenek a bonyolultabb submodules munkafolyamatok kezelésében.