Razumevanje Git plitvega klona in globine klona
Git je porazdeljeni sistem za nadzor različic. To je ena od prednosti uporabe Gita. Za lokalno delovanje vam ni treba biti odvisen od osrednjega strežnika ali repozitorija. Vse, kar potrebujete glede zgodovine modulov, je na dosegu roke. Vendar pa lahko postane problem, če imate opravka s skladišči z velikimi binarnimi datotekami ali skladišči z dolgo zgodovino. Še posebej, če imate situacijo, ko jo morate vsakič naložiti na novo, na primer strežnik za gradnjo, potem lahko velikost in čas prenosa postane problem.
Gitova rešitev problema je plitev klon, kjer lahko s pomočjo globine klona določite, kako globoko naj bo vaš klon. Če na primer uporabite -depth 1, bo Git med kloniranjem dobil samo najnovejšo kopijo ustreznih datotek. Prihranite lahko veliko prostora in časa.
Git plitki klon in velikost
Oglejmo si priljubljeno skladišče Git za Django. Če klonirate repo, dobite naslednje:
$ git klon https: // github.com / django / django.gitKloniranje v "django" ..
daljinsko: Štetje predmetov: 409053, končano.
daljinsko: Stiskanje predmetov: 100% (26/26), končano.
daljinski upravljalnik: Skupaj 409053 (delta 6), ponovno uporabljena 8 (delta 1), embalaža ponovno uporabljena 409026
Sprejem predmetov: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, končano.
Razreševanje delt: 100% (297045/297045), končano.
Preverjanje povezanosti ... končano.
Preverjanje datotek: 100% (5860/5860), končano.
Zdaj, če preverite velikost lokalne kopije, je:
$ du -sh django /225M django /
Pridobimo isto repozitorij Django s plitvim klonom:
$ git clone --depth 1 https: // github.com / django / django.gitKloniranje v "django" ..
daljinsko: Štetje predmetov: 8091, končano.
daljinsko: Stiskanje predmetov: 100% (4995/4995), končano.
daljinsko: Skupaj 8091 (delta 2036), ponovno uporabljeno 5507 (delta 1833), ponovno uporabljeno 0
Sprejem predmetov: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, končano.
Reševanje delt: 100% (2036/2036), končano.
Preverjanje povezanosti ... končano.
Preverjanje datotek: 100% (5860/5860), končano.
Zdaj, če preverite velikost lokalne kopije, bi morala biti bistveno manjša:
$ du -sh django /55M django /
Ko se vaš strežnik ukvarja s stotinami linij izdelkov, je tovrstno prihranek prostora na trdem disku lahko v pomoč. V primerih igralnih projektov, kjer obstajajo težke binarne datoteke, ima to lahko dramatičen učinek. Pomaga tudi pri dolgoletnih projektih. Na primer, celotno kloniranje repozitorija Linux iz GitHub je več kot 7 GB, vendar ga lahko plitko klonirate za manj kot 1 GB.
Git plitki klon in zgodovina
Lokalno preverite plitvo kloniranje z lastnim skladiščem. Ustvarimo datoteko v našem lokalnem repozitoriju, naredimo spremembe in jo naredimo 10-krat. In nato lahko kloniramo skladišče:
$ mkdir _primer$ cd _primer
$ ls
$ git init
Inicializirano prazno repozitorij Git v / Users / zakh / git_repo / _example /.git /
$ echo x> velika_datoteka
$ git add -A
$ git commit -m "Začetna odobritev"
[master (root-commit) dd11686] Začetna odobritev
1 datoteka spremenjena, 1 vstavitev (+)
ustvari način 100644 velika_datoteka
$ echo xx> velika_datoteka
$ git add -A
$ git commit -m "Sprememba velike datoteke_"
[master 9efa367] Sprememba velike datoteke_1
1 datoteka spremenjena, 1 vstavljanje (+), 1 brisanje (-)
..
..
$ mkdir test
$ cd test
$ git klon datoteka: //// Users / zakh / git_repo / _example
Kloniranje v '_example' ..
daljinsko: Štetje predmetov: 33, končano.
daljinsko: Stiskanje predmetov: 100% (22/22), končano.
daljinsko: Skupaj 33 (delta 10), ponovno uporabljeno 0 (delta 0)
Sprejem predmetov: 100% (33/33), 50.03 MiB | 42.10 MiB / s, končano.
Razreševanje delt: 100% (10/10), končano.
Preverjanje povezanosti ... končano.
V tem primeru smo v mapi / Users / zakh / git_repo / ustvarili _example git repozitorij z eno samo datoteko large_file. Prikazana sta samo prva dva prevoda. Nato ustvarimo celoten klon tega skladišča na drugem mestu.
Potem preverimo zgodovino naših prevzemov:
$ git log --oneline7fa451f Sprememba velike_datoteke 10
648d8c9 Sprememba v veliko_datoteko 9
772547a Sprememba velike_datoteke 8
13dd9ab Sprememba v veliko_datoteko 7
5e73b67 Sprememba velikega_datoteke6
030a6e7 Sprememba velike datoteke_5
1d14922 Sprememba velike datoteke_4
bc0f2c2 Sprememba velike_datoteke 3
2794f11 Sprememba velike_datoteke 2
d4374fb Sprememba velike_datoteke 1
924829d Začetna odobritev
Vse zaveze vidimo v popolnem klonu.
Zdaj izbrišimo trenutno kopijo in nato plitvi klon z globino 1:
Kloniranje v '_example' ..
daljinsko: Štetje predmetov: 3, končano.
daljinsko: Stiskanje predmetov: 100% (2/2), končano.
daljinsko: skupaj 3 (delta 0), ponovno uporabljeno 0 (delta 0)
Sprejem predmetov: 100% (3/3), 50.02 MiB | 65.12 MiB / s, končano.
Preverjanje povezanosti ... končano.
Če zdaj pogledamo zgodovino, vidimo samo zadnjo zgodovino odobritve:
$ git log --oneline7fa451f Sprememba velike datoteke_10
Plitvi klon z globino 3:
$ git clone --depth 3 datoteka: //// Uporabniki / zakh / git_repo / _exampleKloniranje v '_example' ..
daljinsko: Štetje predmetov: 9, končano.
daljinsko: Stiskanje predmetov: 100% (6/6), končano.
daljinsko: skupaj 9 (delta 2), ponovno uporabljeno 0 (delta 0)
Sprejem predmetov: 100% (9/9), 50.02 MiB | 65.15 MiB / s, končano.
Reševanje delt: 100% (2/2), končano.
Preverjanje povezanosti ... končano.
Zdaj vidimo še zaveze:
$ git log --oneline7fa451f Sprememba velike datoteke_10
648d8c9 Sprememba v veliko_datoteko 9
772547a Sprememba velike_datoteke 8
Težave z Git Shallow Clone
Uporabniki bi morali razumeti, da je prihranek pri velikosti in času prenosa odvisen od organizacije prevzemov. Lahko se bistveno razlikujejo od enega do drugega odlagališča. Dobro je, da shrambo preizkusite s plitvim klonom, da preverite, koliko prostora na trdem disku in čas prenosa vam bo prihranil.
Drug premislek je, da čeprav lahko potisnete kodo iz plitvega klona, lahko traja dlje zaradi izračunov med oddaljenim in lokalnim strežnikom. Če torej kodo redno izdajate iz lokalne kopije, je verjetno smiselno uporabiti celoten klon.
Možnost več podružnic
Ko uporabite zastavico -depth z ukazom clone, Git privzeto prevzame zastavico -single-branch. Lahko pa uporabite zastavico -no-single-branch, da Gitu naročite, naj pridobi zgodovine iz določene globine vsake veje.
Tu so veje Django brez možnosti -no-single-branch (globina 1):
$ git podružnica -a* mojster
daljinski upravljalci / izvor / HEAD -> izvor / glavni
oddaljeni / izvor / glavni
Prisotna je samo glavna veja.
Tu so veje Django po uporabi možnosti -no-single-branch:
$ git clone --depth 1 --no-single-branch https: // github.com / django / django.gitKloniranje v "django" ..
daljinsko: Štetje predmetov: 95072, končano.
daljinsko: Stiskanje predmetov: 100% (42524/42524), končano.
daljinsko: Skupaj 95072 (delta 52343), ponovno uporabljeno 82284 (delta 42389), ponovno uporabljeno 0
Sprejem predmetov: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, končano.
Razreševanje delt: 100% (52343/52343), končano.
Preverjanje povezanosti ... končano.
Preverjanje datotek: 100% (5860/5860), končano.
$ du -sh django
124M django
Upoštevajte, čeprav je globina še vedno 1, je velikost klona 124M namesto 55M za prejšnji primer.
Če preverimo veje, bi na tem klonu videli veliko več vej:
$ git podružnica -a
* mojster
daljinski upravljalci / izvor / HEAD -> izvor / glavni
daljinski upravljalci / izvor / podstrešje / balvan-oracle-sprint
daljinski upravljalci / izvor / podstrešje / celotna zgodovina
daljinski upravljalci / izvor / podstrešje / generična-avt
daljinski upravljalci / izvor / podstrešje / gis
daljinski upravljalci / izvor / podstrešje / i18n
daljinski upravljalci / izvor / podstrešje / magično odstranjevanje
daljinski upravljalci / izvor / podstrešje / večkratna prijava
daljinski upravljalci / izvor / podstrešje / podpora za več db
daljinski upravljalci / izvor / podstrešje / novi-admin
oddaljeni / izvor / podstrešje / newforms-admin
oddaljeni / izvor / podstrešje / dovoljenja na objekt
oddaljeni / izvor / podstrešje / poizvedba-refactor
daljinski upravljalci / izvor / podstrešje / razvoj sheme
oddaljeni / izvor / podstrešje / schema-evolution-ng
oddaljeni / izvor / podstrešje / iskanje-api
oddaljeni / izvor / podstrešje / sqlalchemy
daljinski upravljalci / izvor / podstrešje / unicode
oddaljeni / izvor / glavni
remotes / origin / soc2009 / admin-ui
remotes / origin / soc2009 / http-wsgi-izboljšave
remotes / origin / soc2009 / i18n-izboljšave
remotes / origin / soc2009 / validacija modela
oddaljeni / izvor / soc2009 / multidb
remotes / origin / soc2009 / test-izboljšave
remotes / origin / soc2010 / app-loading
remotes / origin / soc2010 / query-refactor
remotes / origin / soc2010 / test-refactor
daljinski upravljalci / izvor / stabilno / 0.90.x
daljinski upravljalci / izvor / stabilno / 0.91.x
daljinski upravljalci / izvor / stabilno / 0.95.x
daljinski upravljalci / izvor / stabilno / 0.96.x
daljinski upravljalci / izvor / hlev / 1.0.x
daljinski upravljalci / izvor / hlev / 1.1.x
daljinski upravljalci / izvor / hlev / 1.10.x
daljinski upravljalci / izvor / hlev / 1.11.x
daljinski upravljalci / izvor / hlev / 1.2.x
daljinski upravljalci / izvor / hlev / 1.3.x
daljinski upravljalci / izvor / hlev / 1.4.x
daljinski upravljalci / izvor / hlev / 1.5.x
daljinski upravljalci / izvor / hlev / 1.6.x
daljinski upravljalci / izvor / hlev / 1.7.x
daljinski upravljalci / izvor / hlev / 1.8.x
daljinski upravljalci / izvor / hlev / 1.9.x
daljinski upravljalci / izvor / hlev / 2.0.x
Povzetek
Plitki klon Git vam lahko pomaga prihraniti čas in prostor na trdem disku. Vendar ima svojo ceno. Če redno potiskate kodo v oddaljene repozitorije, se bo čas zapisov podaljšal. Za redne delovne postopke se je torej dobro izogniti plitvim klonom.
Reference:
- git-clones-vs-plitve-git-kloni /
- skupnosti.atlassian.com => clone-depth-does-what-Why-do-I-care-about-this-setting /
- git-scm.com / docs / git-clone
- jenkins.io => veliki git-repo.pdf
- srednje.com / @ wdyluis => git-gc-in-git-plitvo-klon
- preobremenitev.com => git-clone-by-default-plitve-ali-ne
- unix.stackexchange.com => linux-kernel-source-source-code-size-razlika
- atlassian.com => handle-big-repositories-git
- perforce.com => git-beyond-basics-using-plitve-kloni