Git

Git grunt klon och klon djup

Git grunt klon och klon djup

Förstå Git Shallow Clone och Clone Depth

Git är ett distribuerat versionskontrollsystem. Det är en av fördelarna med att använda Git. Du behöver inte vara beroende av en central server eller ett arkiv för att arbeta lokalt. Allt du behöver angående din modulhistorik ligger precis till hands. Det kan dock bli ett problem när du har att göra med förvar med stora binära filer eller förråd som har en lång historik. Speciellt om du har en situation där du behöver ladda ner den ny varje gång, som en build-server, kan storleken och nedladdningstiderna bli ett problem.

Gits lösning på problemet är grunt klon där du kan använda klondjup för att definiera hur djupt din klon ska gå. Om du till exempel använder -depth 1, kommer Git bara att få den senaste kopian av relevanta filer under kloning. Det kan spara mycket utrymme och tid.

Git grund klon och storlek

Låt oss ta en titt på det populära Git-förvaret för Django. Om du klonar full repo får du följande:

$ git-klon https: // github.com / django / django.git
Kloning till 'django' ..
fjärrkontroll: Räkna objekt: 409053, gjort.
fjärrkontroll: Komprimera objekt: 100% (26/26), klar.
fjärrkontroll: Totalt 409053 (delta 6), återanvändt 8 (delta 1), förpackat återanvändt 409026
Mottagande objekt: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, klar.
Lösa deltor: 100% (297045/297045), gjort.
Kontrollerar anslutning ... gjort.
Kolla in filer: 100% (5860/5860), klar.

Om du nu kontrollerar storleken på din lokala kopia är det:

$ du -sh django /
225M django /

Låt oss få samma Django-arkiv med en grund klon:

$ git-klon - djup 1 https: // github.com / django / django.git
Kloning till 'django' ..
fjärrkontroll: Räkna objekt: 8091, klar.
fjärrkontroll: Komprimera objekt: 100% (4995/4995), klar.
fjärrkontroll: Totalt 8091 (delta 2036), återanvänd 5507 (delta 1833), återanvänd förpackning 0
Mottagande objekt: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, klar.
Lösa deltas: 100% (2036/2036), gjort.
Kontrollerar anslutning ... gjort.
Kolla in filer: 100% (5860/5860), klar.

Om du nu kontrollerar storleken på din lokala kopia bör den vara betydligt mindre:

$ du -sh django /
55M django /

När din server har hundratals produktlinjer, kan den här typen av hårddiskutrymme spara. I fall av spelprojekt där det finns stora binärer kan detta ha en dramatisk effekt. Det hjälper också med långvariga projekt. Till exempel är den fullständiga Linux-förvarskloning från GitHub mer än 7 GB, men du kan grunt klona det för mindre än 1 GB.

Git Shallow Clone and History

Du kan lokalt kolla in grund kloning med ditt eget arkiv. Låt oss skapa en fil i vårt lokala arkiv, göra ändringar och begå den 10 gånger. Och sedan kan vi klona förvaret:

$ mkdir _exempel
$ cd _exempel
$ ls
$ git init
Initierat tomt Git-arkiv i / Användare / zakh / git_repo / _exempel /.git /
$ echo x> large_file
$ git add -A
$ git commit -m "Initial commit"
[master (root-commit) dd11686] Initialt engagemang
1 fil ändrad, 1 infogning (+)
skapa läge 100644 large_file
$ echo xx> large_file
$ git add -A
$ git commit -m "Modification to large_file 1"
[master 9efa367] Ändring av storfil 1
1 fil ändrad, 1 infogning (+), 1 radering (-)
..
..
$ mkdir-test
$ cd-test
$ git-klonfil: //// Användare / zakh / git_repo / _exempel
Kloning till '_exempel' ..
fjärrkontroll: Räkna objekt: 33, klar.
fjärrkontroll: Komprimera objekt: 100% (22/22), klar.
fjärrkontroll: Totalt 33 (delta 10), återanvändt 0 (delta 0)
Mottagande objekt: 100% (33/33), 50.03 MiB | 42.10 MiB / s, klar.
Lösa deltor: 100% (10/10), klar.
Kontrollerar anslutning ... gjort.

I det här exemplet har vi skapat _exempel git-arkivet i / Users / zakh / git_repo / mappen med en enda stor_fil. Endast de två första åtagandena visas. Sedan skapar vi en fullständig klon av förvaret på en annan plats.

Låt oss sedan kontrollera historien om våra åtaganden:

$ git log - online
7fa451f Ändring till storfil 10
648d8c9 Ändring till storfil 9
772547a Ändring av storfil 8
13dd9ab Ändring till storfil 7
5e73b67 Ändring till storfil 6
030a6e7 Ändring av storfil 5
1d14922 Ändring till storfil 4
bc0f2c2 Ändring till storfil 3
2794f11 Ändring till storfil 2
d4374fb Ändring till storfil 1
924829d Initialt åtagande

Vi ser alla åtaganden i hela klonen.
Låt oss nu ta bort den aktuella kopian och sedan grunt klon med ett djup på 1:

$ git clone --depth 1 file: //// Användare / zakh / git_repo / _exempel
Kloning till '_exempel' ..
fjärrkontroll: Räkna objekt: 3, klar.
fjärrkontroll: Komprimera objekt: 100% (2/2), klar.
fjärrkontroll: Totalt 3 (delta 0), återanvändt 0 (delta 0)
Mottagande objekt: 100% (3/3), 50.02 MiB | 65.12 MiB / s, klar.
Kontrollerar anslutning ... gjort.

Om vi ​​tittar på historien nu ser vi bara den sista åtagandeshistoriken:

$ git log - online
7fa451f Ändring till storfil 10

Låt oss grunt klona med ett djup av 3:

$ git clone --depth 3 file: //// Användare / zakh / git_repo / _exempel
Kloning till '_exempel' ..
fjärrkontroll: Räkna objekt: 9, klar.
fjärrkontroll: Komprimera objekt: 100% (6/6), klar.
fjärrkontroll: Totalt 9 (delta 2), återanvändt 0 (delta 0)
Mottagande objekt: 100% (9/9), 50.02 MiB | 65.15 MiB / s, klar.
Lösa deltor: 100% (2/2), klar.
Kontrollerar anslutning ... gjort.

Nu ser vi fler åtaganden:

$ git log - online
7fa451f Ändring till storfil 10
648d8c9 Ändring till storfil 9
772547a Ändring av storfil 8

Problem med Git Shallow Clone

Användare bör förstå att tidsbesparingarna i storlek och nedladdning beror på hur åtagandena organiseras. De kan skilja sig avsevärt från ett förvar till ett annat. Det är en bra idé att testa förvaret med en grund klon för att kontrollera hur mycket hårddiskutrymme och nedladdningstid det sparar dig.

En annan övervägning är att även om du kan skicka kod från en grund klon kan det ta längre tid på grund av beräkningarna mellan fjärrkontrollen och den lokala servern. Så om du begår kod regelbundet från den lokala kopian är det förnuftigt att använda en fullständig klon.

Flera grenalternativ

När du använder -depth-flaggan med klonkommando antar Git som standard -single-branch-flaggan. Men du kan använda -ingen-en-gren-flaggan för att berätta för Git att få historik från det angivna djupet för varje gren.

Här är Django-filialerna utan alternativet -no-single-branch (djup 1):

$ git gren -a
* mästare
fjärrkontroller / ursprung / HEAD -> ursprung / master
fjärrkontroller / ursprung / master

Endast befälhavaren är närvarande.

Här är Django-filialerna efter att ha använt -no-single-branch-alternativet:

$ git clone --depth 1 --no-single-branch https: // github.com / django / django.git
Kloning till 'django' ..
fjärrkontroll: Räkna objekt: 95072, klar.
fjärrkontroll: Komprimera objekt: 100% (42524/42524), klar.
fjärrkontroll: Totalt 95072 (delta 52343), återanvändt 82284 (delta 42389), återanvänd förpackning 0
Mottagande objekt: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, klar.
Lösa deltor: 100% (52343/52343), klar.
Kontrollerar anslutning ... gjort.
Kolla in filer: 100% (5860/5860), klar.
$ du -sh django
124M django

Observera även om djupet fortfarande är 1, är klonens storlek 124M istället för 55M för föregående fall.
Om vi ​​kontrollerar grenarna bör vi se mycket fler grenar på den här klonen:

$ cd django
$ git gren -a
* mästare
fjärrkontroller / ursprung / HEAD -> ursprung / master
fjärrkontroller / ursprung / vind / boulder-oracle-sprint
fjärrkontroller / ursprung / vind / fullhistoria
fjärrkontroller / ursprung / vind / generisk-autent
fjärrkontroller / ursprung / vind / gis
fjärrkontroller / ursprung / vind / i18n
fjärrkontroller / ursprung / vind / magisk borttagning
fjärrkontroller / ursprung / vind / multiautent
fjärrkontroller / ursprung / vind / multipel-db-stöd
fjärrkontroller / ursprung / vind / ny admin
fjärrkontroller / ursprung / vind / newforms-admin
fjärrkontroller / ursprung / vind / per-objekt-tillstånd
fjärrkontroller / ursprung / vind / queryset-refactor
fjärrkontroller / ursprung / vind / schema-evolution
fjärrkontroller / ursprung / vind / schema-evolution-ng
fjärrkontroller / ursprung / vind / sök-api
fjärrkontroller / ursprung / vind / sqlalchemy
fjärrkontroller / ursprung / vind / unicode
fjärrkontroller / ursprung / master
fjärrkontroller / ursprung / soc2009 / admin-ui
fjärrkontroller / ursprung / soc2009 / http-wsgi-förbättringar
fjärrkontroller / ursprung / soc2009 / i18n-förbättringar
fjärrkontroller / ursprung / soc2009 / modellvalidering
fjärrkontroller / ursprung / soc2009 / multidb
fjärrkontroller / ursprung / soc2009 / testförbättringar
fjärrkontroller / ursprung / soc2010 / app-laddning
fjärrkontroller / ursprung / soc2010 / fråga-refactor
fjärrkontroller / ursprung / soc2010 / test-refactor
fjärrkontroller / ursprung / stabil / 0.90.x
fjärrkontroller / ursprung / stabil / 0.91.x
fjärrkontroller / ursprung / stabil / 0.95.x
fjärrkontroller / ursprung / stabil / 0.96.x
fjärrkontroller / ursprung / stabil / 1.0.x
fjärrkontroller / ursprung / stabil / 1.1.x
fjärrkontroller / ursprung / stabil / 1.10.x
fjärrkontroller / ursprung / stabil / 1.11.x
fjärrkontroller / ursprung / stabil / 1.2.x
fjärrkontroller / ursprung / stabil / 1.3.x
fjärrkontroller / ursprung / stabil / 1.4.x
fjärrkontroller / ursprung / stabil / 1.5.x
fjärrkontroller / ursprung / stabil / 1.6.x
fjärrkontroller / ursprung / stabil / 1.7.x
fjärrkontroller / ursprung / stabil / 1.8.x
fjärrkontroller / ursprung / stabil / 1.9.x
fjärrkontroller / ursprung / stabil / 2.0.x

Sammanfattning

Git grund klon kan hjälpa dig att spara tid och hårddiskutrymme. Men det har ett pris. Om du regelbundet driver kod till fjärrförråd kommer det att öka förpliktelsestiderna. Så för vanliga arbetsflöden är det en bra idé att undvika grunda kloner.

Referenser:

Bästa spel att spela med handspårning
Oculus Quest introducerade nyligen den fantastiska idén om handspårning utan kontroller. Med ett ständigt ökande antal spel och aktiviteter som utför ...
Hur man visar OSD-överlägg i helskärms Linux-appar och -spel
Att spela helskärmsspel eller använda appar i distraktionsfritt helskärmsläge kan avskärma dig från relevant systeminformation som syns i en panel ell...
Topp 5 spelinspelningskort
Vi har alla sett och älskat streaming av spel på YouTube. PewDiePie, Jakesepticye och Markiplier är bara några av de bästa spelarna som har tjänat mil...