Git

Git Shallow Clone og Clone Depth

Git Shallow Clone og Clone Depth

Forstå Git Shallow Clone og Clone Depth

Git er et distribuert versjonskontrollsystem. Det er en av fordelene med å bruke Git. Du trenger ikke være avhengig av en sentral server eller et lager for å fungere lokalt. Alt du trenger angående modulhistorikken din er rett ved hånden. Det kan imidlertid bli et problem når du har å gjøre med arkiver med store binære filer eller lagre som har lang historie. Spesielt hvis du har en situasjon der du trenger å laste den ned fersk hver gang, som en build-server, så kan størrelsen og nedlastingstidene bli et problem.

Gits løsning på problemet er grunne kloner der du kan bruke klondybde for å definere hvor dypt klonen din skal gå. Hvis du for eksempel bruker -dypth 1, vil Git bare få den siste kopien av de relevante filene under kloning. Det kan spare deg for mye plass og tid.

Git grunne klon og størrelse

La oss ta en titt på det populære Git-depotet for Django. Hvis du fullkloner repoen, får du følgende:

$ git klon https: // github.com / django / django.git
Kloning til 'django' ..
ekstern: Telle objekter: 409053, ferdig.
fjernkontroll: Komprimeringsobjekter: 100% (26/26), ferdig.
fjernkontroll: Totalt 409053 (delta 6), gjenbrukt 8 (delta 1), pakket gjenbrukt 409026
Mottakende gjenstander: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, ferdig.
Løse deltas: 100% (297045/297045), ferdig.
Sjekker tilkobling ... ferdig.
Sjekke ut filer: 100% (5860/5860), ferdig.

Nå hvis du sjekker størrelsen på din lokale kopi, er det:

$ du -sh django /
225M django /

La oss få det samme Django-depotet med en grunne klon:

$ git clone - dybde 1 https: // github.com / django / django.git
Kloning til 'django' ..
fjernkontroll: Telle objekter: 8091, ferdig.
fjernkontroll: Komprimering av objekter: 100% (4995/4995), ferdig.
fjernkontroll: Totalt 8091 (delta 2036), gjenbrukt 5507 (delta 1833), gjenbrukt pakke 0
Mottakende objekter: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, ferdig.
Løse deltas: 100% (2036/2036), ferdig.
Sjekker tilkobling ... ferdig.
Sjekke ut filer: 100% (5860/5860), ferdig.

Nå hvis du sjekker størrelsen på den lokale kopien, bør den være betydelig mindre:

$ du -sh django /
55M django /

Når serveren din har å gjøre med hundrevis av produktlinjer, kan denne typen plassbesparelse på harddisken være nyttig. I tilfeller av spillprosjekter der det er tunge binærfiler, kan dette ha en dramatisk effekt. Det hjelper også med mangeårige prosjekter. For eksempel er full Linux-kloning fra GitHub mer enn 7 GB, men du kan grunne det for mindre enn 1 GB.

Git Shallow Clone and History

Du kan lokalt sjekke ut grunne kloning med ditt eget arkiv. La oss lage en fil i vårt lokale arkiv, gjøre endringer og begå den 10 ganger. Og så kan vi klone depotet:

$ mkdir _eksempel
$ cd _eksempel
$ ls
$ git init
Initialisert tomt Git-arkiv i / Brukere / zakh / git_repo / _eksempel /.git /
$ echo x> large_file
$ git add -A
$ git commit -m "Initial commit"
[master (root-commit) dd11686] Initial commit
1 fil endret, 1 innsetting (+)
opprett modus 100644 storfil
$ echo xx> large_file
$ git add -A
$ git commit -m "Modification to large_file 1"
[master 9efa367] Endring av storfil 1
1 fil endret, 1 innsetting (+), 1 sletting (-)
..
..
$ mkdir test
$ cd test
$ git klonfil: //// Brukere / zakh / git_repo / _eksempel
Kloning til '_eksempel' ..
fjernkontroll: Telle objekter: 33, ferdig.
fjernkontroll: Komprimeringsobjekter: 100% (22/22), ferdig.
fjernkontroll: Totalt 33 (delta 10), gjenbrukt 0 (delta 0)
Mottakende objekter: 100% (33/33), 50.03 MiB | 42.10 MiB / s, ferdig.
Løse deltas: 100% (10/10), ferdig.
Sjekker tilkobling ... ferdig.

I dette eksemplet har vi opprettet _example git repository i / Users / zakh / git_repo / folder med en enkelt large_file. Bare de to første forpliktelsene vises. Deretter lager vi en full klon av datalageret på et annet sted.

Så la oss sjekke historien om forpliktelsene våre:

$ git log --online
7fa451f Endring av storfil 10
648d8c9 Modifikasjon til storfil 9
772547a Endring av storfil 8
13dd9ab Modifikasjon til storfil 7
5e73b67 Endring av storfil 6
030a6e7 Endring av storfil 5
1d14922 Endring av storfil 4
bc0f2c2 Modifikasjon til storfil 3
2794f11 Endring av storfil 2
d4374fb Modifikasjon til storfil 1
924829d Opprinnelig forpliktelse

Vi ser alle forpliktelsene i full klon.
La oss nå slette den nåværende kopien og deretter grunne klone med en dybde på 1:

$ git clone - dybde 1 fil: //// Brukere / zakh / git_repo / _eksempel
Kloning til '_eksempel' ..
fjernkontroll: Telle objekter: 3, ferdig.
fjernkontroll: Komprimeringsobjekter: 100% (2/2), ferdig.
fjernkontroll: Totalt 3 (delta 0), gjenbrukt 0 (delta 0)
Mottakende gjenstander: 100% (3/3), 50.02 MiB | 65.12 MiB / s, ferdig.
Sjekker tilkobling ... ferdig.

Hvis vi ser på historien nå, ser vi bare den siste begivenhetshistorikken:

$ git log --online
7fa451f Endring av storfil 10

La oss grunne kloner med en dybde på 3:

$ git clone --depth 3 file: //// Brukere / zakh / git_repo / _eksempel
Kloning til '_eksempel' ..
fjernkontroll: Telle objekter: 9, ferdig.
fjernkontroll: Komprimering av objekter: 100% (6/6), ferdig.
fjernkontroll: Totalt 9 (delta 2), gjenbrukt 0 (delta 0)
Mottakende objekter: 100% (9/9), 50.02 MiB | 65.15 MiB / s, ferdig.
Løsning av deltaer: 100% (2/2), ferdig.
Sjekker tilkobling ... ferdig.

Nå ser vi flere forpliktelser:

$ git log --online
7fa451f Endring av storfil 10
648d8c9 Modifikasjon til storfil 9
772547a Endring av storfil 8

Problemer med Git Shallow Clone

Brukere bør forstå at størrelsen og tidsbesparelsen på nedlastingen avhenger av organisasjonen av forpliktelsene. De kan variere betydelig fra ett depot til et annet. Det er en god ide å teste depotet med en grunne klone for å sjekke hvor mye harddiskplass og nedlastingstid det vil spare deg.

En annen vurdering er at selv om du kan skyve kode fra en grunne klone, kan det ta lengre tid på grunn av beregningene mellom fjernkontrollen og den lokale serveren. Så hvis du bruker kode regelmessig fra den lokale kopien, er det sannsynligvis fornuftig å bruke en full klon.

Flere grenalternativer

Når du bruker -dypth-flagget med klon-kommando, antar Git -single-branch-flagget som standard. Men du kan bruke -no-single-branch flag for å fortelle Git å hente historier fra den spesifiserte dybden til hver gren.

Her er Django-grenene uten alternativet -no-single-branch (dybde 1):

$ git gren -a
* mester
fjernkontroller / opprinnelse / HEAD -> opprinnelse / master
fjernkontroller / opprinnelse / master

Bare mastergrenen er til stede.

Her er Django-grenene etter å ha brukt -no-single-branch-alternativet:

$ git clone - dybde 1 --no-single-branch https: // github.com / django / django.git
Kloning til 'django' ..
fjernkontroll: Telle objekter: 95072, ferdig.
fjernkontroll: Komprimeringsobjekter: 100% (42524/42524), ferdig.
fjernkontroll: Totalt 95072 (delta 52343), gjenbrukt 82284 (delta 42389), pakke-gjenbrukt 0
Mottakende objekter: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, ferdig.
Løse deltas: 100% (52343/52343), ferdig.
Sjekker tilkobling ... ferdig.
Sjekke ut filer: 100% (5860/5860), ferdig.
$ du -sh django
124M django

Legg merke til selv om dybden fortsatt er 1, er klonens størrelse 124M i stedet for 55M for forrige tilfelle.
Hvis vi sjekker grenene, bør vi se mange flere grener på denne klonen:

$ cd django
$ git gren -a
* mester
fjernkontroller / opprinnelse / HEAD -> opprinnelse / master
fjernkontroller / opprinnelse / loft / kampestein-orakel-sprint
fjernkontroller / opprinnelse / loft / fullhistorie
fjernkontroller / opprinnelse / loft / generisk-autent
fjernkontroller / opprinnelse / loft / gis
fjernkontroller / opprinnelse / loft / i18n
fjernkontroller / opprinnelse / loft / magisk fjerning
fjernkontroller / opprinnelse / loft / multi-auth
fjernkontroller / opprinnelse / loft / multiple-db-support
fjernkontroller / opprinnelse / loft / ny administrator
fjernkontroller / opprinnelse / loft / newforms-admin
fjernkontroller / opprinnelse / loft / per-objekt-tillatelser
fjernkontroller / opprinnelse / loft / queryset-refactor
fjernkontroller / opprinnelse / loft / skjema-evolusjon
fjernkontroller / opprinnelse / loft / skjema-evolusjon-ng
fjernkontroller / opprinnelse / loft / search-api
fjernkontroller / opprinnelse / loft / sqlalchemy
fjernkontroller / opprinnelse / loft / unicode
fjernkontroller / opprinnelse / master
fjernkontroller / opprinnelse / soc2009 / admin-ui
fjernkontroller / opprinnelse / soc2009 / http-wsgi-forbedringer
fjernkontroller / opprinnelse / soc2009 / i18n-forbedringer
fjernkontroller / opprinnelse / soc2009 / modellvalidering
fjernkontroller / opprinnelse / soc2009 / multidb
fjernkontroller / opprinnelse / soc2009 / testforbedringer
fjernkontroller / opprinnelse / soc2010 / app-lasting
fjernkontroller / opprinnelse / soc2010 / spørringsrefaktor
fjernkontroller / opprinnelse / soc2010 / test-refactor
fjernkontroller / opprinnelse / stabil / 0.90.x
fjernkontroller / opprinnelse / stabil / 0.91.x
fjernkontroller / opprinnelse / stabil / 0.95.x
fjernkontroller / opprinnelse / stabil / 0.96.x
fjernkontroller / opprinnelse / stabil / 1.0.x
fjernkontroller / opprinnelse / stabil / 1.1.x
fjernkontroller / opprinnelse / stabil / 1.10.x
fjernkontroller / opprinnelse / stabil / 1.11.x
fjernkontroller / opprinnelse / stabil / 1.2.x
fjernkontroller / opprinnelse / stabil / 1.3.x
fjernkontroller / opprinnelse / stabil / 1.4.x
fjernkontroller / opprinnelse / stabil / 1.5.x
fjernkontroller / opprinnelse / stabil / 1.6.x
fjernkontroller / opprinnelse / stabil / 1.7.x
fjernkontroller / opprinnelse / stabil / 1.8.x
fjernkontroller / opprinnelse / stabil / 1.9.x
fjernkontroller / opprinnelse / stabil / 2.0.x

Sammendrag

Git grunne klone kan hjelpe deg med å spare tid og harddiskplass. Men det har en pris. Hvis du regelmessig skyver kode til eksterne arkiver, vil det øke forpliktelsestiden. Så for vanlige arbeidsflyter er det en god ide å unngå grunne kloner.

Referanser:

Topp 5 spillfangstkort
Vi har alle sett og elsket streaming av spill på YouTube. PewDiePie, Jakesepticye og Markiplier er bare noen av de beste spillerne som har tjent milli...
Hvordan utvikle et spill på Linux
For et tiår siden ville ikke mange Linux-brukere forutsi at deres favorittoperativsystem en dag ville være en populær spillplattform for kommersielle ...
Åpne kildeporter for kommersielle spillmotorer
Gratis, åpen kildekode og plattformspillmotorrekreasjoner kan brukes til å spille gamle så vel som noen av de ganske nylige spilletitlene. Denne artik...