a GitHub Blog

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-bandkó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.

rockslingshotalmodulké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

id=”2e967c1e83″>

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-banda slingshot számára épített

-ot, osztjuk ki önálló tárolóvá, majd beágyazzuk mindkét projektbe az almodulokon keresztül.

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 slingshotmappá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, amikorslingshotvolt. 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 slingshotelő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 rockslingshot, 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és git 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.

további olvasat

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük