Hoe kan ik het verzamelen van afval op een externe Git-repository activeren?

Zoals we weten, kunnen we periodiek git gcuitvoeren om objecten onder .git/objectsin te pakken.

In het geval van een centrale Git-repository op afstand (kaal of niet), hoewel, na veel pushen, er veel bestanden onder myproj.git/objects; elke commit lijkt daar een nieuw bestand aan te maken.

Hoe kan ik zoveel bestanden inpakken? (Ik bedoel die op de externe centrale kale repository, niet op de lokale kloonrepository.)


Antwoord 1, autoriteit 100%

De externe repo moet worden geconfigureerd om gc uit te voeren als dat nodig is nadat een commit is gemaakt. Zie de documentatie van gc.autoin git-gcen git-configman-pagina’s.

Echter, een externe repo zou niet zo veel garbage collection nodig moeten hebben, aangezien het zelden bungelende (onbereikbare) commits zal hebben. Deze zijn meestal het gevolg van zaken als het verwijderen en opnieuw baseren van vertakkingen, wat meestal alleen gebeurt in lokale opslagplaatsen.

Gc is dus meer nodig voor het opnieuw inpakken, wat bedoeld is om opslagruimte te besparen in plaats van het daadwerkelijke afval te verwijderen. De variabele gc.autois voldoende om hiervoor te zorgen.


Antwoord 2, autoriteit 25%

Hoewel je een proces zou moeten hebben dat dit periodiek, automatisch, regelt, is het geen probleem om uit te voeren

git gc

op een kale repository

[email protected]:/pix/git/repositories/abd.git$ ls -l
total 28
drwxrwxr-x   2 git git    6 2010-06-06 02:44 branches
-rw-rw-r--   1 git git   66 2010-06-06 02:44 config
-rw-r--r--   1 git git   23 2011-03-15 18:19 description
-rw-rw-r--   1 git git   23 2010-06-06 02:44 HEAD
drwxrwxr-x   2 git git 4096 2010-06-06 02:44 hooks
drwxrwxr-x   2 git git   20 2010-06-06 02:44 info
drwxrwxr-x 260 git git 8192 2010-09-01 00:26 objects
drwxrwxr-x   4 git git   29 2010-06-06 02:44 refs
$ git gc
Counting objects: 3833, done.
Compressing objects:  31% (1085/3500)...

Antwoord 3, autoriteit 10%

na veel pushen, zijn er veel bestanden onder myproj.git/objects

Er zal niet zoveel zijn met git 2.11+ (Q4 2016) en een pre-receive hook.
In dat scenario hoef je geen git gchelemaalte activeren.

Zie commit 62fe0eb, commit e34c2e0, , 2564d99 vastleggen, commit 526f108(03 okt 2016) door Jeff King (peff).
(Samengevoegd door Junio ​​C Hamano — gitsterin commit 25ab004, 17 okt 2016)

receive-pack: objecten in quarantaine plaatsen totdat pre-receive accepteert

Om ervoor te zorgen dat de ontvangende kant van “git push” de ontvangen geschiedenis kan inspecteren en kan besluiten de push te weigeren, moeten de objecten die vanaf de verzendende kant zijn verzonden, beschikbaar worden gesteld aan de hook en het mechanisme voor de verbindingscontrole, en dit werd traditioneel gedaan door de objecten in de ontvangende repository op te slaan en “git gc” te laten verlopen.

Sla de nieuw ontvangen objecten in plaats daarvan op in een tijdelijk gebied en maak ze beschikbaar door het alternatieve objectopslagmechanisme alleen voor hen te gebruiken terwijl we
beslissen of we de cheque accepteren, en zodra we een beslissing hebben genomen, migreren we ze naar de repository of verwijderen ze ze onmiddellijk.

Dat tijdelijke gebied wordt ingesteld door de nieuwe omgevingsvariabele GIT_QUARANTINE_ENVIRONMENT.

Op die manier, als een (grote) push wordt afgewezen door een pre-receivehaak, zullen die grote objecten niet gedurende 90 dagen wachten op git gcom ze op te ruimen.


Antwoord 4, Autoriteit 8%

Deze vraag moet wat licht werpen op hoe vaak u zou moeten Voer Garbage Collection uit.

De gemakkelijkste optie zou zijn om een geplande taak in Windows of een cron-taak in UNIX te gebruiken om git gcperiodiek uit te voeren. Op deze manier hoeft u er niet eens over na te denken.

Other episodes