Articles

Mastering Git-alamoduulia

Alamoduulia, askel askeleelta

– Meidän täytyy nyt tutkia vaihe vaiheelta käyttämällä alamoduulia yhteistyönä hankkeen, varmista, korostamme, default käyttäytymistä, ansoja ja käytettävissä parannuksia.

helpottamiseksi seuraavat mukana, olen koonnut muutaman esimerkin repos heidän ”kaukosäätimet” (oikeastaan vain hakemistoja)., Voit purkaa arkiston minne haluat, avaa kuori (tai Git Bash, jos olet Windows) vuonna git-subs-hakemisto luo:

Lataa esimerkki repos

löydät kolme hakemistoja siellä:

  • tärkein toimii kontti repo, paikallista ensimmäinen yhteistyökumppani,
  • plugin toimii keski-huolto repo-moduuli, ja
  • kaukosäätimet sisältää tiedostojärjestelmä kaukosäätimet kahden edellisen repos.

esimerkissä komennot alla, kehote näkyy aina joka repo olemme.,

lisätään submodule

aloitetaan lisäämällä plugin submodule sisällä säiliö (joka on pääasiassa). Plugin itsessään on yksinkertainen rakenne:

.
├── README.md
├── lib
│ └── index.js
└── plugin-config.json

Joten mennään osaksi tärkein ja käyttää git submodule lisää komento. Se vie kaukosäätimen URL ja alihakemiston, jossa ”instantiate” submodule.

Koska käytämme polkuja sen sijaan, että Url-osoitteet täällä meidän kaukosäätimet, me osuma outo, vaikkakin tunnettuja, kelo: suhteellisia polkuja kaukosäätimet tulkitaan suhteessa tärkein kauko, ei meidän repo on root-hakemistoon., Tämä on todella outoa, ei kuvattu missään, mutta olen nähnyt sen tapahtuvan joka kerta. Joten sen sijaan, että sanoisit ../remotes / plugin, me vain sanoa ../laajennus.

main (master u=) $ git submodule add ../plugin vendor/plugins/demo
Cloning into 'vendor/plugins/demo'…
done.
main (master + u=) $

Tämä lisätty joitakin asetuksia paikallinen kokoonpano:

main (master + u=) $ cat .git/config


url = ../remotes/plugin

Ja tämä järjesti myös kaksi tiedostot:

Huh?! Mikä tämä on?gitmodules-tiedosto? Katsotaanpa sitä:

main (master + u=) $ cat .gitmodules

path = vendor/plugins/demo
url = ../plugin

Tämä raivokkaasti muistuttaa meidän paikallinen config-Joten miksi päällekkäisyyttä? Juuri siksi, että paikallinen konfigimme on… paikallinen., Meidän yhteistyökumppaneita ei näe sitä (joka on täysin normaalia), joten he tarvitsevat mekanismi saada määritelmiä kaikille alamoduulia ne täytyy perustaa oman repos. Tämä on mitä .gitmodules on; se voidaan lukea myöhemmin git submodule init-komento, kuten näemme hetken kuluttua.

Kun olemme tila, huomaa, miten minimalistinen se on, kun se tulee meidän submodule: se vain menee liian yleisiä uusi tiedosto sen sijaan kertoa meille enemmän siitä, mitä tapahtuu sen sisällä., Meidän submodule oli todellakin pistänyt alihakemistoon:


└── vendor
└── plugins
└── demo
├── .git
├── README.md
├── lib
│ └── index.js
└── plugin-config.json

Tila, kuten lokit ja vertailuissa, on rajoitettu aktiivinen repo (juuri nyt, säiliö), ei alamoduulia, jotka ovat sisäkkäisiä repos. Tämä on usein ongelmallista (se on super helppo jättää regressio kun vain tämä näkymä), joten suosittelen sinua perustaa submodule-tietoinen tila kerran:

git config --global status.submoduleSummary true

Ja nyt:

Aaaah, tämä on huomattavasti parempi., Tila ulottuu sen pohja tietoa lisätä, että submodule läsnä myyjä/plugins/demo sai 3 uutiset tekee (kuten me juuri luonut sitä, se tarkoittaa, kauko-haara oli vain kolme sitoutuu), viimeinen lisäys (huomaa, että oikealle osoittava kulmasulje >), jossa on ensin sitouduttava viesti rivi, jossa lukee ”Fix repo nimi…”.

jotta todella tuoda kotiin, että me käsitellä kaksi erillistä repos täällä, mennään submodule hakemistoon:

aktiivinen repo on muuttunut, koska uusi .,git ottaa komennon: nykyisessä hakemistossa (demo, submodule ’ s directory), a .Git on todellakin olemassa, yksi tiedosto liian, ei Hakemisto. Katsotaanpa alla:

demo (master u=) $ cat .git
gitdir: ../../../.git/modules/vendor/plugins/demo

Jälleen, koska Git 1.7.8, Git ei jätä repo hakemistoja säiliön sisällä on työhakemiston, mutta keskittää nämä säiliössä on .git-hakemisto (sisällä .git/moduulit), ja käyttää gitdir-viittausta alimoduleissa.,

tämän perustelut on yksinkertainen: se mahdollistaa säiliön repo on submodule-vähemmän oksat, ilman romu submodule on repo työhakemiston ja palauttaa sen myöhemmin.

Luonnollisesti, kun lisäämällä submodule, voit valita, käyttää erityisiä haara, tai jopa tietyn sitoutua, käyttää -b CLI vaihtoehto (kuten tavallista, oletuksena on master). Huomaa, että emme ole tällä hetkellä irrallaan päässä, toisin kuin myöhemmin tapahtuu: tämä johtuu siitä, että Git tarkistanut master, Ei tietty SHA1. Meidän olisi pitänyt määritellä SHA1 to-b, jotta saisimme irronneen pään ulosajosta.,

Niin, takaisin säiliöön repo, ja anna on viimeistellä submodule on lisäksi ja paina kauko:

demo (master u=) $ cd -
main (master + u=) $ git commit -m "Ajout submodule plugin demo"
main (master u+1) $ git push

Tarttumalla repo, joka käyttää alamoduulia

jotta voitaisiin havainnollistaa asiat kanssa yhteistyötä repo, joka käyttää alamoduulia, jaamme persoonia ja toimivat kollegamme, jotka klooneja säiliö on kauko aloittaa kanssamme. Olemme kloonanneet, että kollega hakemistoon, niin voimme heti kertoa, mitkä persoonallisuuden korkki meillä on milloin tahansa.,

ensimmäinen asia huomata on, että meidän submodule puuttuu työhakemiston; vain sen pohja hakemisto on täällä:

vendor
└── plugins
└── demo

Miten se tapahtui? Tämä johtuu yksinkertaisesti siitä, että, niin kaukana, uusi repo (kollega) ei ole tietoinen meidän submodule vielä: tietoja ei missään sen paikallinen kokoonpano (tarkistaa sen .git / config jos et usko minua). Se pitää täyttää .gitmodules on sanoa, mikä on juuri mitä git submodule init tekee:

meidän .git / config on nyt tietoinen alivalmiudestamme., Kuitenkin, meillä ei vielä ole haettu sen kauko, puhumattakaan niistä, joilla se on läsnä meidän työhakemiston. Ja silti statuksemme on puhdas!

Katso, meidän on tartuttava asiaankuuluviin toimituksiin manuaalisesti. Se ei ole jotain, mitä alkuperäinen kloonimme teki, meidän on tehtävä se joka vedolla. Palaamme siihen hetken kuluttua, koska tämä on käyttäytyminen klooni voi todella automatisoida, kun oikein kutsutaan.,

käytännössä käsiteltäessä submodule-käyttämällä repos, me yleensä ryhmän kaksi komennot (init ja päivitys) yksi:

colleague (master u=) $ git submodule update --init

Se on silti sääli, että Git on tehdä kaikki itse. Kuvitelkaa, että suuremmissa HAMMASLANKAPROJEKTEISSA, kun koneilla on omat submodulinsa ja niin edelleen, – Tästä tulisi nopeasti painajainen.

käy niin, että git tarjoaa kloonille vaihtoehdon automaattisesti git submodule update — init rekursiivisesti heti kloonauksen jälkeen: melko osuvasti nimetty-rekursiivinen vaihtoehto.,

joten kokeillaan taas koko juttua:

nyt se on parempi! Huomaa, että olemme nyt irrottaa pään sisällä submodule (kuten olemme nyt):

git-subs $ cd colleague/vendor/plugins/demo
demo ((master)) $

Katso kaksinkertainen sarja suluissa minun kuiskata, sen sijaan, että yhdet?, Jos kehote ei ole määritetty, kuten minun, näyttää irrottaa pään, koska kuvaa (Git on sisäänrakennettu nopea käsikirjoituksen, sinun täytyy määritellä GIT_PS1_DESCRIBE_STYLE=haara-ympäristömuuttuja), sinun tulee pikemminkin nähdä jotain, kuten tämä:

demo ((fe64799...)) $

joka tapauksessa, tila vahvistetaan, missä olemme:

demo ((master)) $ git status
HEAD detached at fe64799
nothing to commit, working directory clean

Tulossa päivitys submodule on kauko

OK, nyt, että meillä on oma repo (tärkein) ja ”kollegansa” (kollega) kaikki perustaa yhteistyötä, katsotaanpa astu kengät kolmas henkilö: yksi, joka ylläpitää plugin., Täällä, katsotaanpa siirtyä se:

Nyt, lisätä kaksi pseudo-sitoutuu ja julkaista nämä kauko:

Lopuksi, nyt laittaa ”ensimmäinen kehittäjä” korkki uudestaan:

plugin (master u=) $ cd ../main
main (master u=) $

Oletetaan, että haluamme nyt saada nämä kaksi sitoutuu sisällä meidän submodule. Tämän saavuttamiseksi meidän on päivitettävä paikallinen repo, alkaen siirtymällä sen työhakemistoon, jotta siitä tulee aktiivinen repo.

sivuhuomautuksessa en suosittele Pullin käyttöä tällaiseen päivitykseen., Kunnolla saada päivitykset työkopiossa, tämä komento vaatii, että olet oikea aktiivinen haara, johon yleensä ole (olet irrotettu pää suurimman osan ajasta). Sinun pitäisi aloittaa sen haaran kassalla. Mutta vielä tärkeämpää, kauko-haara voisi hyvin ovat siirtyneet eteenpäin, koska sitoutua haluat asettaa, ja veto olisi pistää sitoutuu siihen, et ehkä halua paikallisessa codebase.,

näin Ollen, suosittelen halkaisu prosessi manuaalisesti: ensin git fetch saada kaikki uudet tiedot kauko-paikallinen välimuisti, kirjaudu tarkistaa, mitä sinulla on ja kassalle haluamasi SHA1. Lisäksi hienorakeisemmasta ohjaus, tämä lähestymistapa on lisäetu toimii riippumatta siitä, nykyinen tila (aktiivinen haara tai irrottaa pää).

OK, so we ’ re good, no external commit., Olla, että koska se voi, anna on nimenomaisesti asetettu yksi olemme kiinnostuneita (ilmeisesti sinulla on eri SHA1):

demo (master u-2) $ git checkout -q 0e90143

(q on vain säästää meidät Git lepertely siitä, kuinka me päätyä irrotettu pää. Yleensä tämä olisi terve muistutus, mutta tällä tiedämme, mitä teemme.)

Nyt, että meidän submodule on päivitetty, voimme nähdä tuloksen säiliössä repo-tila:

”klassisen” osa tilan näemme uuden sitoutuu vaihda tyyppiä, mikä tarkoittaa, viitattu sitoutua muuttunut., Toinen mahdollisuus (joka voitaisiin liittää tähän) on uusi sisältö, mikä tarkoittaisi, että teimme paikallisia muutoksia submodulen työhakemistoon.

alaosa, käytössä statuksemme.submoduleSummary = true asetus aiemmin, todetaan nimenomaisesti, sen käyttöön sitoutuu (kuten he käyttävät oikealle osoittava kulmasulje >), koska viimeinen kontti tehnyt, että oli koskettanut submodule.

”kauhea oletuksena käyttäytymistä” perhe, git diff jättää paljon toivomisen varaa:

Mitä…?, Siellä on CLI vaihtoehto, joka antaa meidän nähdä jotain enemmän hyötyä:

main (master * u=) $ git diff --submodule=log
Submodule vendor/plugins/demo fe64799..0e90143:
> Pseudo-commit #2
> Pseudo-commit #1

ei ole muita paikallisia muutoksia nyt lisäksi submodule on viitattu tehnyt… Huomaa tämä vastaa lähes täsmälleen pienempi osa tehostettua git status-näyttö.

Ottaa tyyppi, joka tavallaan CLI vaihtoehto joka kerta (joka, muuten, ei näy Git on nykyisen valmistumisen tarjoukset) on melko kankea. Onneksi on vastaava asetusasetus:

nyt tarvitsee vain suorittaa kontti, joka viimeistelee alivalikon päivityksen., Jos sinun piti koskettaa säiliön koodia, jotta se toimisi tämän päivityksen kanssa, sitoudu siihen luonnollisesti. Toisaalta, välttää sekoittamalla submodule liittyviä muutoksia ja muita juttuja, että olisi vain liittyvät container code: by siististi erottaa kaksi, myöhemmin vaellukset muihin koodi-uudelleenkäytön lähestymistavat ovat helpompaa (myös, kuten tavallista, atomi sitoutuu FTW).

Koska olemme aikeissa napata tämä submodule päivitys kollegamme repo, me paina oikeaa tehtyään (joka ei ole yleinen hyvä käytäntö).

main (master * u=) $ git commit -am "Setting submodule on PC2"
main (master u+1) $ git push

Vetää submodule-käyttämällä repo

Klikkaa!, ”Kollega” cap päälle!

Joten olemme vetämällä päivitykset säiliöstä repo kauko…

(Sinulla ei ehkä ole ”Onnistuneesti rebased ja päivitetään…” ja nähdä ”Yhdistä tekemät ’recursive'” – strategian sijaan. Jos on, sydämeni sammuu sinulle, ja sinun pitäisi heti oppia, miksi vetää pitäisi uudelleen).

huomaa tämän näytön toinen puolisko: se kertoo submodulesta, alkaen ”noudetaan submodule…”.

tästä käytöksestä tuli oletusarvo Git 1.7.5: n kanssa asetusasetuksella fetch.,recurseSubmodules nyt oletuksena on-demand: jos kontti hanke saa päivityksiä viitattu submodule sitoutuu, nämä alamoduulia saada haettua automaattisesti. (Muista, että noutaminen on vetämisen ensimmäinen osa.)

vielä, ja tämä on kriittistä: git autohakuja, mutta ei automaattista päivitystä. Paikallinen välimuistisi on ajan tasalla submodulen kaukosäätimen kanssa, mutta submodulen työhakemisto on kiinni entisessä sisällössään. Voit sulkea läppärin, hypätä koneeseen ja jatkaa matkaa., Vaikka tämä auto-noudettaessa on rajoitettu jo tunnettu alamoduulia: uudet, ei vielä kopioitu paikallinen kokoonpano, ei auto haettu.

git auto-noudot, mutta ei automaattista päivitystä.

nykyinen nopea, sen tähdellä (*), ei vihjaavat paikallisia muutoksia, koska meidän WD ei ole synkassa kanssa indeksi, jälkimmäinen on tietoinen äskettäin viitattu submodule sitoutuu. Tutustu tila:

Huomaa, miten kulma suluissa kohta vasemmalle (<)?, Git näkee, että nykyinen WD ei ole näiden kahden sitoutuu, toisin kontti-projekti on odotukset.

Tämä on massiivinen vaara: jos sinulla ei ole nimenomaisesti päivittää submodule on työhakemiston, seuraava kontti sitoutua taantua, että submodule. Tämä on ensiluokkainen ansa.

On siksi pakollista, että voit viimeistellä päivitys:

niin kauan Kuin yritämme muodostaa yleisiä hyviä tapoja, suositeltava komento tässä olisi git submodule päivitys — init — rekursiivinen, jotta auto-init uusia submodule, ja rekursiivisesti, päivittää niitä, jos tarvetta on.,

Siellä on toinen reuna tapauksessa: jos submodule on kauko URL muuttunut siitä, kun viimeksi käytetty (ehkä yksi yhteistyökumppaneita muuttaa sitä .gitmodules), sinun täytyy manuaalisesti päivittää paikallisen config vastaamaan tätä. Tällaisessa tilanteessa, ennen git submodule päivitys, sinun pitäisi suorittaa git submodule sync.

mainittakoon täydellisyyden vuoksi, että vaikka git submodule päivitys on oletusarvoisesti tsekata viitattu SHA1, voit muuttaa sitä, esimerkiksi, rebase kaikki paikalliset submodule työ (me puhumme siitä, että hyvin pian) päälle., Voit tehdä sen asettamalla päivityksen asetukset alivalikkosi uudelleenasentaa kontin paikallisen kokoonpanon sisällä.

Ja olen pahoillani, mutta ei, ei paikallinen kokoonpano-asetus, tai jopa CLI vaihtoehto, että asia, joka voi auto-päivitys vetää. Automatisoida tällaisia asioita, sinun täytyy käyttää joko peitenimiä, mukautettuja skriptejä, tai Huolellisesti muotoillun paikallisia koukkuja., Tässä on esimerkki spull alias (single line, jakaa täällä display):

git config --global alias.spull '!git pull && git submodule sync --recursive && git submodule update --init --recursive'

Jos haluat säilyttää kyky siirtää custom väitteitä git pull, voit joko määritellä funktio on-the-fly ja kutsua sitä, tai mennä mukautetun komentosarjan. Ensimmäinen lähestymistapa näyttäisi tältä (jälleen, single line):

ei kovin luettavissa, eh? Pidän enemmän mukautetusta käsikirjoituksesta., Sanotaan että voisit laittaa git-spull script-tiedoston, jonnekin sisällä POLKU (olen ~/perso/bin hakemistoon minun POLKU vain tällaisia asioita):

#! /bin/bash
git pull "$@" &&
git submodule sync --recursive &&
git submodule update --init --recursive

Me sitten antaa sen toteutus oikeudet:

chmod +x git-spull

Ja nyt voimme käyttää sitä, aivan kuin meillä olisi käyttää alias.

Päivittäminen submodule in-paikka säiliö

Tämä on vaikein käyttää-asia, ja sinun pitäisi pysyä erossa niin paljon kuin mahdollista, mieluummin huolto läpi keski -, omistettu repo.,

voi kuitenkin käydä niin, että submodule-koodia ei voi testata tai edes koota kontin koodin ulkopuolelta. Monilla teemoilla ja liitännäisillä on tällaisia rajoitteita.

ensimmäinen asia ymmärtää on, koska olet menossa tehdä sitoutuu, sinun täytyy aloittaa asianmukainen perusta, joka on sivuliike kärki. Sinun on siis varmistettava, että konttorin viimeisimmät toimitukset eivät” riko ” konttiprojektiasi. Jos he eivät, no, luoda oman kontti-erityinen haara submodule kuulostaa houkuttelevalta, mutta se tie johtaa vahva kytkentä välillä submodule ja kontti, joka ei ole suositeltavaa., Saatat haluta lopettaa ”submoduling” että koodi tässä nimenomaisessa projektissa, ja vain upottaa sen kuin mitä tahansa säännöllistä sisältöä sen sijaan.

katsotaanpa myöntää, että voit hyvällä omallatunnolla lisätä submodule nykyinen master haara. Aloitetaan synkronointi paikallisen valtion kauko-on:

Toinen tapa mennä tästä olisi, säiliöstä repo, nimenomaisesti synkronoida submodule on paikallisyhdistys yli sen seurata kauko-haara (yhden rivin päälle, viime — seuraa välilyönnillä):

nyt Voimme muokata koodia, jotta se toimisi, testata sitä, jne., Kun kaikki on valmista, voimme sitten tehdä kaksi sitoutuu ja kaksi välttämätöntä työntää (se on erittäin helppoa, ja käytännössä kaikki liian usein unohtaa joitakin sen).

– Anna on yksinkertaisesti lisätä fake työtä ja tehdä kaksi, jotka liittyvät tekee klo submodule ja kontti tasot:

tässä vaiheessa, suuri vaara on unohtanut työntää submodule. Palaat konttiprojektiin, sitoudut siihen ja työnnät vain konttia. Se on helppo virhe tehdä, erityisesti IDE tai GUI. Kun työkaverit yrittävät saada päivityksiä, kaikki helvetti pääsee irti., Katso ensimmäinen askel:

ei ole mitään viitteitä siitä, että Git ei voitu noutaa viitattu sitoutua päässä submodule kauko-ohjaimella. Ensimmäinen vihje, että tämä on status:

Huomaa varoitus: ilmeisesti hiljattain viitattu sitoutuvat submodule ei löydy mistään. Todellakin, jos yritämme päivittää submodule on työhakemiston, saamme:

main (master * u=) $ git submodule update
fatal: reference is not a tree: 12e3a529698c519b2fab790630f71bd531c45727
Unable to checkout '12e3a529698c519b2fab790630f71bd531c45727' in submodule path 'vendor/plugins/demo'

Voit selvästi nähdä, kuinka tärkeää on muistaa työntää submodule liian, mieluiten ennen kuin työntää astiaan., Tehdään, että kollega ja yritä päivitystä uudelleen:

– minun pitäisi huomata, on CLI vaihtoehto, joka tarkistaa, onko tällä hetkellä viitattu submodule sitoutuu täytyy työntää liian, ja jos on, niin työntää niitä: se on git push — recurse-alamoduulia=on-demand (melko suupala, tosin). Se tarvitsee jotain kontti-tason työntää töihin, mutta: vain alamoduulia ei leikkaa.

Mitä enemmän, (siellä ei kokoonpano-asetusta, joten sinun täytyy yhtenäistää menettelyjä noin alias, esim. spush:) — alkaen Git 2.7.0, siellä on nyt työntää.,recurseSubmodules kokoonpanot asetus voit määritellä (on-demand tai tarkistaa).

git config --global alias.spush 'push --recurse-submodules=on-demand'

Poistaminen submodule

On olemassa kaksi tilannetta, joissa haluat ”poistaa” on submodule:

  • haluat vain tyhjentää työhakemisto (ehkä ennen arkistointi säiliö on WD), mutta haluavat säilyttää mahdollisuus palauttaa se myöhemmin (niin se on edelleen .gitmodules ja .git / moduulit);
  • haluat poistaa sen lopullisesti nykyisestä haarasta.

katsotaan jokainen tapaus vuorollaan.,

submodule

ensimmäisen tilanteen hoitaa helposti git submodule deinit. Katso itse:

Tällä ei ole vaikutusta container status lainkaan. Submodule ei ole enää paikallisesti tunnettu (se on poissa .git/config), joten sen puuttuminen työhakemistosta jää huomaamatta. Meillä on vielä myyjä / plugins / demo Hakemisto, mutta se on tyhjä; voisimme riisua sen ilman seurauksia.

submodule ei saa olla paikallisia muutoksia, kun teet tämän, muuten sinun täytyy — force puhelun.,

myöhemmin subcommand git submodule on autuaasti sivuuttaa tämän submodule kunnes init uudestaan, koska submodule ei ole edes paikallinen config. Tällaisia komentoja ovat muun muassa update, foreach ja sync.

toisaalta submodule on edelleen määritelty .gitmodules: init jälkeen päivityksen (tai yksittäinen päivitys — init) palauttaa sen uutta:

Pysyvästi poistamalla submodule

Tämä tarkoittaa sitä, että haluat päästä eroon submodule hyvää: säännöllinen git rm tekee, aivan kuten mikä tahansa muu osa työ-hakemistoon., Tämä toimii vain, jos submodule käyttää gitfile (a .git, joka on tiedosto, ei hakemisto), joka on tapaus alkaen Git 1.7.8. Muuten sinun täytyy hoitaa tämä käsin (kerron miten lopussa).

sen lisäksi, että alivalikko poistetaan työhakemistosta, komento päivittää .gitmodules tiedosto, joten se ei viittaa submodule enää. Täällä mennä:

Luonnollisesti, lisäasetukset-tila-info kompastua itse, koska gitfile varten submodule on mennyt (oikeastaan koko demo hakemisto katosi).,

Mikä on erikoista, on, että paikallinen config säilyttää submodule tietoa, toisin kuin mitä tapahtuu, kun deinit. Joten, kattava poisto, suosittelen teitä tekemään molemmat, järjestyksessä, jotta päätyä kunnolla siivottu (se ei toimisi jälkeen edellisen komennon, koska se selvitetty .gitmodules jo):

git submodule deinit path/to/module # ensure local config cleanup
git rm path/to/module # clean WD and .gitmodules

Riippumatta siitä, teidän lähestymistapa, submodule on repo on edelleen läsnä .git/modules/vendor/plugins / demo, mutta olet vapaa tappamaan, että milloin haluat.

Jos sinun on joskus poistettava submodule, joka on perustettu ennen Git 1.7: ää.,8, ja siksi upottaa sen .git-hakemisto suoraan säiliöön on työhakemisto (sen sijaan vedota gitfile), sinun täytyy rikkoa pois puskutraktori: kahden edellisen komennot täytyy edeltää manuaalinen kansion poisto, esim. rm-fr myyjä/plugins/demo, koska sanoi komennot tulee aina kieltäytyä poistaa todellinen arkistoon.