Hoe verwijder je ongebruikte objecten uit een git-repository?

Ik heb per ongeluk een enorm binair bestand met mijn allerlaatste commit toegevoegd, vastgelegd en gepusht naar een Git-repository.

Hoe kan ik Git de object(en) laten verwijderen die voor die commit zijn/werden gemaakt, zodat mijn .gitdirectory weer krimpt tot een normale grootte?

Bewerken: bedankt voor je antwoorden; Ik heb verschillende oplossingen geprobeerd. Geen werkte. Die van GitHub heeft bijvoorbeeld de bestanden uit de geschiedenis verwijderd, maar de mapgrootte .gitis niet afgenomen:

$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten
$ git log -p # looks nice
$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done.
Writing objects: 100% (625/625), done.
Total 625 (delta 351), reused 0 (delta 0)
$ du -hs .git
174M    .git
$ # still 175 MB :-(

Antwoord 1, autoriteit 100%

Ik heb dit elders beantwoord en zal het hier kopiëren omdat ik er trots op ben!

… en zonder verder oponthoud, mag ik je dit handige script presenteren, git-gc-all, dat gegarandeerd al je git-rommel verwijdert totdat ze met extra configuratievariabelen komen:

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

De –agressieve optie kan handig zijn.

OPMERKING: hiermee worden ALLE dingen zonder referentie verwijderd, dus kom niet huilen als je later besluit dat je er een paar wilt houden!

Misschien moet je ook eerst zoiets als dit uitvoeren, oh jee, git is ingewikkeld!!

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

Ik heb dit allemaal in een script gezet, hier:

http://sam.nipl.net/b/git-gc- meedogenloos


Antwoord 2, autoriteit 21%

Uw git reflog expire --allis onjuist. Het verwijdert reflog-items die ouder zijn dan de vervaltijd, die standaard 90 dagen is. Gebruik git reflog expire --all --expire=now.

Mijn antwoordop een vergelijkbare vraag gaat over de probleem van het echt schrobben van ongebruikte objecten uit een repository.


Antwoord 3, autoriteit 15%

1) Verwijder het bestand uit de git repo (& niet het bestandssysteem):

  • git rm --cached path/to/file

2) Verklein de repo met:

  • git gc,

  • of git gc --aggressive

  • of git prune

of een combinatie van het bovenstaande zoals voorgesteld in deze vraag: Verklein de grootte van de git-repository


Antwoord 4, autoriteit 7%

Deze handleiding over het verwijderen van gevoelige gegevenskan op dezelfde manier worden toegepast. Je gaat de geschiedenis herschrijven om dat bestand te verwijderen uit elke revisie waarin het aanwezig was. Dit is destructief en zal repo-conflicten veroorzaken met andere check-outs, dus waarschuw eerst eventuele bijdragers.

Als je het binaire bestand beschikbaar wilt houden in de repo voor andere mensen, dan is er geen echte manier om te doen wat je wilt. Het is zo ongeveer alles of niets.


Antwoord 5, autoriteit 6%

De sleutel voor mij bleek git repack -A -d -fen vervolgens git gcte draaien om de grootte van het enkele git-pakket dat ik had te verkleinen.


6, Autoriteit 5%

HY!

Git ontvangt alleen objecten die het daadwerkelijk nodig heeft bij het klonen van repositories (als ik het goed begrijp)

Dus u kunt de laatste commit wijzigen die per fouten worden toegevoegd die per ongeluk wordt toegevoegd en vervolgens op uw wijzigingen in de externe repository drukken (met -f-optie om de oude commit op de server te overschrijven)

Wanneer u vervolgens een nieuwe kloon van die repo maakt, moet de GIM-map zo klein zijn als vóór het big-toegepaste bestand (en).

Optioneel Als u de onnodige bestanden van de server ook wilt verwijderen, kunt u de repository op de server verwijderen en uw nieuw gekloneerde kopie (die de volledige geschiedenis heeft)


7, Autoriteit 4%

Zie “Objecten verwijderen” in het PRO GIT-boek:

http: // git- SCM.com/Book/en/Git-Internals-Maintenance-And-Data-Recovery#Removing-Objects

Update: zie ook BFG Repo Cleaner: http://rttyley.github.io/BFG -repo-cleaner /

Other episodes