Kaip pašalinti nepublikuotus lašus iš mano git saugyklos

Turiu GitHub repo, turinčią du filialus - kapitoną ir išleidimą.

Atleidimo filialuose buvo dvejetainiai platinimo failai, kurie prisidėjo prie labai didelio repo dydžio (> 250 MB), todėl nusprendžiau išvalyti.

Pirmiausia ištryniau nuotolinio atleidimo šaką, git push origin :release

Tada ištrinau vietinį spaudai skirtą filialą. Pirmą kartą bandžiau git branch -d release , bet sakiau: „klaida: filialo išleidimas nėra jūsų dabartinio HE vadovėlio“. tai tiesa, taigi aš pašalinau git branch -d release .

Bet mano saugyklos dydis tiek vietiniu, tiek „GitHub“ vis dar buvo didžiulis. Taigi, aš praleidau įprastą git komandų sąrašą, pavyzdžiui, git gc --prune=today --aggressive , be sėkmės.

Vadovaudamasis Charles Bailey instrukcijomis SO 1029969 , man pavyko gauti SHA1 sąrašą didžiausiems lašams. Tada aš naudoju scenarijų iš SO 460331, kad surastume lašus ... ir penkių didžiausių jų nėra, nors buvo rasta mažų lašų, ​​todėl žinau, kad scenarijus veikia.

Manau, kad šie dienoraščiai yra dvejetainiai failai iš išleidimo šakos ir jie kažkaip liko ištrinti šį skyrių. Kas yra tinkamas būdas atsikratyti jų?

89
15 дек. nustatė kkrugler 15 dec. 2009-12-15 05:28 '09, 5:28 2009-12-15 05:28
@ 10 atsakymų

... ir be fanfarų, galėčiau pateikti jums šį naudingą scenarijų, git -gc-all , kad būtų užtikrintas visų git šiukšlių pašalinimas, kol pasirodys papildomi konfigūracijos kintamieji:

 git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 \ -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@" 

Tai gali būti naudinga alternatyva agresyvi.

Jums taip pat gali tekti paleisti kažką panašaus, pirmiausia, oh dear, git yra sunku!

 git remote rm origin rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/ git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 --no-run-if-empty git update-ref -d 

Visa tai įdėjau į scenarijų, čia:

http://sam.nipl.net/b/git-gc-all-ferocious

redaguoti: „Zitrax“ taip pat gali tekti pašalinti kai kurias žymes:

 git tag | xargs git tag -d 
128
06 февр. Atsakymą pateikė Sam Watkins 06 vasario mėn. 2013-02-06 15:06 '13, 15:06 2013-02-06 15:06

Kaip aprašyta čia , tiesiog naudokite

 git reflog expire --expire-unreachable=now --all git gc --prune=now 

git reflog expire --expire-unreachable=now --all pašalina visas nuorodas į nepasiekiamus įsipareigojimus reflog .

git gc --prune=now panaikina įsipareigojimą.

Dėmesio . Tik naudojant git gc --prune=now neveiks, nes šie įsipareigojimai vis dar yra susiję su reflogu. Todėl „reflog“ valymas yra privalomas.

35
23 марта '15 в 7:59 2015-03-23 07:59 atsakymą Eliko pateikė kovo 23 d. 15 val. 7:59 2015-03-23 ​​07:59

Kaip minėta šiame atsakyme , git gc iš tikrųjų gali padidinti repo dydį!

Taip pat žiūrėkite šį srautą.

Dabar „git“ turi apsaugos mechanizmą, skirtą ištrinti objektus be nuorodų, kai veikia „ git gc “.
Pagal numatytuosius nustatymus objektai, neturintys nuorodų, išsaugomi 2 savaites. Tai padės jums susigrąžinti atsitiktinai ištrintus filialus ar įvykdyti ar išvengti rasės, kai objektas, sukurtas tik jo egzistavimo metu, bet dar nepaminėtas, gali būti ištrintas lygiagrečiai vykdant „ git gc “ procesą.

Taigi, norint suteikti šį lengvatinį laikotarpį supakuotiems, bet ne prijungtiems objektams, perpakavimo procesas perkelia šiuos nepublikuotus objektus iš pakuotės į laisvą formą, kad jie galėtų būti brandinami ir galiausiai apipjaustyti. Objektai, kurie tampa nepaskelbti, paprastai nėra daug. 404855 objektų, kuriuose nėra nuorodų, buvimas yra gana daug, ir šių objektų siuntimas pirmiausia naudojant kloną yra kvailas ir visiškas tinklo pralaidumo praradimas.

Bet kokiu atveju ... Norėdami išspręsti jūsų problemą, tiesiog reikia paleisti „ git gc “ su argumentu --prune=now kad išjungtumėte šį malonės laikotarpį ir nedelsiant atsikratytumėte šių objektų be nuorodų (tai saugu tik tuo atveju, jei nėra kitų git veiksmų tuo pačiu metu ji turėtų būti lengvai teikiama darbo vietoje).

Ir btw, naudodami „ git gc --aggressive “ su vėlesne „ git gc --aggressive “ versija (arba „ git repack -a -f -d --window=250 --depth=250 “)

tie patys siūlai nurodo :

  git config pack.deltaCacheSize 1 

Tai apriboja delta talpyklos dydį į vieną baitą (iš tikrųjų jį išjungiant) vietoj numatytosios 0 vertės, o tai reiškia neribotą. Šiuo būdu šią paketą galiu perpakuoti naudodamas pirmiau nurodytą git repack komandą x86-64 sistemoje su 4 GB RAM ir naudojant 4 gijas (tai yra keturių branduolių). Gyventojų atminties naudojimas auga iki maždaug 3,3 GB.

Jei jūsų kompiuteris yra SMP ir neturite pakankamai RAM, galite sumažinti siūlų skaičių iki vieno:

 git config pack.threads 1 

Be to, galite toliau apriboti atminties naudojimą, naudodami --window-memory argument--window-memory argument kad būtų „ git repack .
Pavyzdžiui, naudojant „ --window-memory=128M turėtų būti pagrįsta viršutinė delta delta atminties naudojimo riba, nors tai gali sukelti mažiau optimalų trikampių derinį, jei repo yra daug didelių failų.


Filtrų šakos priekyje galite peržiūrėti (atsargiai) šį scenarijų

 #!/bin/bash set -o errexit # Author: David Underhill # Script to permanently delete files/folders from your git repository. To use # it, cd to your repository root and then run the script with a list of paths # you want to delete, eg, git-delete-history path1 path2 if [ $# -eq 0 ]; then exit 0 fi # make sure we're at the root of git repo if [ ! -d .git ]; then echo "Error: must run this script from the root of a git repository" exit 1 fi # remove all paths passed as arguments from the history of the repo files=$@ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD # remove the temporary history git-filter-branch otherwise leaves behind for a long time rm -rf .git/refs/original/  git reflog expire --all  git gc --aggressive --prune 
28
15 дек. Atsakymą pateikė VonC 15 Dec. 2009-12-15 19:06 '09 19:06 PM 2009-12-15 19:06

git gc --prune=now arba mažai git prune --expire now .

17
16 дек. Jakub Narębski atsakymas 16 d. 2009-12-16 23:14 '09 11:14 val. 2009-12-16 23:14

Kiekvieną kartą, kai jūsų HEAD juda, git stebi jį reflog . Jei pašalinsite įsipareigojimą, jūs vis dar turite „kabančiojo įsipareigojimo“, nes jie vis dar nurodo apie 30 dienų reflog . Tai apsauginis tinklas, kai atsitiktinai pašalinate tvirtinimus.

Jei git reflog pašalinti tam tikrus įsipareigojimus, perpakuoti ir tt, galite naudoti git reflog arba tik aukšto lygio komanda:

 git gc --prune=now 
10
18 дек. atsakymas pateikiamas vdboor 18 dec. 2009-12-18 15:36 '09 15:36 2009-12-18 15:36

Galite naudoti git forget-blob .

Naudojant „ git forget-blob file-to-forget gana lengva. Daugiau informacijos galite rasti čia.

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Jis išnyks iš visų įvykių, susijusių su jūsų istorija, reflogu, žymėmis ir kt.

Kartais susiduriu su ta pačia problema, ir kiekvieną kartą, kai turiu grįžti į šį pranešimą ir kitus, kodėl aš automatizavau šį procesą.

Paskolos indėlininkams, pvz., Sam Watkins

4
23 янв. Atsakymą pateikė nachoparker, sausio 23 d 2017-01-23 10:21 '17 at 10:21 2017-01-23 10:21

Pabandykite naudoti „ git-filter-branch“ - jis nepašalina didelių lašų, ​​bet gali ištrinti didelius failus, kuriuos nurodote iš viso repo. Man tai sumažina repo dydį nuo šimtų MB iki 12 MB.

2
15 дек. Atsakymas pateikiamas W55tKQbuRu28Q4xv . 2009-12-15 07:23 '09 7:23 am 2009-12-15 07:23

Prieš atlikdami „ git filter-branch ir „ git gc , turėtumėte pažvelgti į žymes, kurios yra jūsų repo. Bet kokia reali sistema, kuri automatiškai žymi tokius dalykus kaip nuolatinė integracija ir diegimas, padarys nereikalingus objektus, kurie vis dar paminėti šiose žymose, todėl gc negali jų pašalinti, ir vis tiek stebėsite, kodėl vis dar išlieka repo dydis taip didelis.

Geriausias būdas atsikratyti visų nereikalingų medžiagų yra paleisti „ git-filter ir „ git gc , o tada spustelėkite „Master“, kad gautumėte naują „bare repo“. Naujasis neužtikrintas atpirkimas turės išvalytą medį.

1
08 сент. atsakymas pateikiamas v_abhi_v 08 rugsėjis 2011-09-08 12:40 '11, 12:40 2011-09-08 12:40

Norėdami pridėti dar vieną patarimą, nepamirškite naudoti „ git“ nuotolinio ištrynimo, kad pašalintumėte pasenusias konsolių šakas prieš naudodami git gc

juos galite pamatyti su git filialu -a

Tai dažnai naudinga, kai ištraukiama iš github ir forked saugyklų ...

1
12 февр. Atsakymą pateikė Tanguy vasario 12 d. 2013-02-12 14:58 '13, 14:58, 2013-02-12 14:58

Kartais priežastis, dėl kurios gc nėra labai gera, yra tai, kad pagal seną pataisą yra neišsamūs formatai arba atributai.

0
02 дек. Atsakymą pateikė StellarVortex 02 gruodis. 2011-12-02 15:17 '11 prie 15:17 2011-12-02 15:17

Peržiūrėkite kitus klausimus „ žyma arba užduoti klausimą