Naar de hoofdinhoud

Repository's opschonen: onbereikbare objecten verwijderen

Als je in Git een branch, tag of pull request verwijdert, worden de commits niet verwijderd. Ze worden onbereikbaar: geen ref wijst er nog naar, maar de objecten blijven op de server staan en iedereen die hun SHA kent, kan ze nog ophalen of bekijken, totdat de eigen garbage collection van Git ze op een later moment verwijdert.

Onbereikbare objecten verwijderen haalt ze nu weg. Gebruik het als een commit nooit gepusht had mogen worden, bijvoorbeeld omdat hij een secret, persoonsgegevens van een klant of een bestand bevatte dat je niet mag opslaan. Eigenaren van de organisatie voeren het zelf uit vanuit de console, en elke uitvoering eindigt met een schriftelijke bevestiging die je kunt bewaren.

Voordat je begint: roteer het secret

Bevatte de commit een secret (een wachtwoord, API-sleutel, token of privésleutel), roteer of trek het secret dan eerst in. Door de commit te verwijderen wordt het secret niet ongeldig. Iedereen die de repository heeft gekloond of opgehaald terwijl de commit er stond, heeft een kopie, en dat geldt ook voor forks, mirrors en CI-logs (zie Wat het niet verwijdert). Opschonen beperkt wie de commit vanaf nu nog kan krijgen; het kan bestaande kopieën niet terughalen.

Push-bescherming houdt de meeste secrets al tegen voordat ze de server bereiken.

Wie het kan uitvoeren

Eigenaren van de organisatie. De pagina staat in het beheer van de organisatie op:

frem.sh/<your-org>/_admin/repos-overview/<repo>/housekeeping

Je hebt eigenaarstoegang tot het beheer van de organisatie nodig, via je gewone aanmelding, die meervoudige authenticatie vereist. Daarnaast is er geen aparte bevestigingsstap. Om een uitvoering te starten typ je de volledige naam van de repository, zodat je niet per ongeluk de verkeerde repository kunt opschonen.

Stap voor stap

  1. Roteer een gelekt secret. Zie hierboven.
  2. Verwijder wat de commit vasthoudt. Verwijder elke branch, tag of pull request die de commit nog bevat, of herschrijf de geschiedenis van de branch zodat de commit er geen deel meer van uitmaakt, en force-push. Een commit die een ref nog bereikt, is niet onbereikbaar, en opschonen verwijdert hem niet.
  3. Bekijk het voorbeeld. Open de opschoonpagina en voer het voorbeeld uit. Je kunt de SHA’s plakken van de commits die weg moeten (maximaal 20), en het voorbeeld vertelt je per commit of hij wordt verwijderd of wat hem nog vasthoudt. Zie Het voorbeeld lezen.
  4. Voer het uit. Kies of je verweesde LFS-objecten wilt meenemen, typ ter bevestiging de naam van de repository en start de uitvoering. De pagina toont de voortgang.
  5. Download de bevestiging. Als de uitvoering klaar is, download je de schriftelijke bevestiging als pdf of JSON en bewaar je die bij je incidentdossier. Zie De schriftelijke bevestiging.

Het voorbeeld lezen

Het voorbeeld verandert niets. Het toont:

  • Voor elke SHA die je hebt geplakt: of hij in de repository bestaat en, als een ref hem nog vasthoudt, welke (een branch, tag, pull request of een andere ref). Verwijder die ref en voer het voorbeeld opnieuw uit. Een SHA die alleen nog door een reflog-item wordt vastgehouden, wordt door de uitvoering verwijderd.
  • Onbereikbare commits die worden verwijderd, met het onderwerp van hun commitbericht.
  • Onbereikbare commits in de wachtperiode: te recent om nu te verwijderen. Zie De wachtperiode van 30 minuten.
  • Forks van de repository, op naam. Een fork is een aparte kopie en wordt niet gewijzigd. Zie Forks.
  • Andere items die de uitvoering verwijdert: het aantal gecachete archiefdownloads, items om branches te herstellen en, als je ze meeneemt, verweesde LFS-objecten.
  • Waarom de uitvoering niet kan starten, als dat zo is. Bijvoorbeeld: er loopt al een uitvoering voor de repository, of de repository is groter dan de selfservicelimiet.

De wachtperiode van 30 minuten

Objecten die in de afgelopen 30 minuten zijn aangemaakt of vernieuwd, blijven altijd bewaard. Dat beschermt pushes die tijdens de uitvoering bezig zijn: een push schrijft eerst zijn objecten en werkt pas daarna de branch bij, en heel even lijken de nieuwe objecten dan onbereikbaar. De wachtperiode ligt vast en kan niet korter.

Staat een commit die je wilt verwijderen als In de wachtperiode vermeld, wacht dan tot er 30 minuten zijn verstreken sinds je hebt verwijderd wat hem vasthield, voer het voorbeeld opnieuw uit en start dan de uitvoering.

Wat het verwijdert

  • Onbereikbare Git-objecten: de commits, en de trees en bestandsinhoud die alleen door die commits worden gebruikt, samen met de reflog-items die ze nog vasthielden.
  • De commit uit de commit-graph, zodat de commit niet meer verschijnt in geschiedenisweergaven, in zoekresultaten of via zijn SHA.
  • Gecachete archiefdownloads (zip en tar) van die commits.
  • Gecachete kopieën van fetch-packs voor de repository, die de server bewaart om herhaalde clones en fetches sneller te beantwoorden.
  • Items om branches te herstellen voor verwijderde branches die naar die commits wezen, zodat de branch niet meer kan worden hersteld uit de lijst met verwijderde branches van de repository.
  • Optioneel, verweesde LFS-objecten: LFS-bestanden waarnaar geen commit in de repository nog verwijst en die meer dan 24 uur geleden zijn geüpload. Je kiest dit bij het starten van de uitvoering.

Als de uitvoering klaar is, geeft een URL die de commit toonde niet gevonden terug, en mislukt een git fetch van de SHA.

Wat het niet verwijdert

De uitvoering verwijdert objecten uit deze repository op de servers van fremforge. Ze bereikt geen kopieën die elders worden bewaard, en ze past geen gegevens aan die de commit noemen:

  • Forks. Elke fork is een aparte kopie. Zie Forks.
  • Bestaande clones en exports. Elke clone, fetch en gegevensexport die is gemaakt terwijl de commit er stond, bevat hem nog. Vraag de betrokkenen hun kopie te verwijderen of opnieuw te klonen.
  • Mirrors. Een mirror van deze repository, op fremforge of elders, houdt een eigen kopie.
  • De wiki van de repository. De wiki is een aparte Git-repository en wordt niet opgeschoond.
  • Logs en artefacten van Actions. Een workflow die op de commit draaide, kan de inhoud ervan hebben afgedrukt of opgeslagen. Verwijder die apart.
  • Payloads van webhookleveringen, die commit-SHA’s, berichten en auteursgegevens bevatten.
  • De activiteitenfeed, commitstatussen en reacties in de tijdlijn van pull requests die de commit noemen.

Bevat een van deze iets dat weg moet en kun je het niet zelf verwijderen, neem dan contact op met support@frem.sh.

Forks

Een fork is een volledige, aparte kopie van de repository, en de eigenaar van de fork beheert die. Het voorbeeld toont de forks op naam, zodat je weet waar de commit nog meer kan staan. Om de commit uit een fork te verwijderen, verwijdert de eigenaar van de fork daar de branch, tag of pull request die hem vasthoudt en schoont hij de fork op, of verwijdert hij de fork.

Back-ups

Opschonen verwijdert de objecten uit de live repository. Back-ups worden niet aangepast: de back-ups van fremforge worden niet gewijzigd om de gegevens van een individuele klant te verwijderen, en ze worden alleen gebruikt om het platform te herstellen, nooit om de gegevens aan iemand te leveren. Een opgeschoond object blijft daarom in de versleutelde back-ups staan totdat die via hun gewone bewaartermijn verlopen:

  • Inhoud van repository’s (de Git-objecten): tot 30 dagen.
  • Kopieën in de objectopslag (gecachete archiefdownloads en LFS-objecten): tot 13 maanden, in opslag voor noodherstel.

Databaserecords, zoals items om branches te herstellen, volgen de databaseback-ups. De verwerkersovereenkomst, §9 en bijlage A.9, is de bindende beschrijving van elk back-upniveau en hoe lang het wordt bewaard; waar deze pagina en de geldende verwerkersovereenkomst verschillen, geldt de verwerkersovereenkomst.

De schriftelijke bevestiging

Elke voltooide uitvoering levert een bevestiging op die je als pdf of JSON kunt downloaden. Ze vermeldt de repository, wie de uitvoering startte en wanneer, het aantal objecten voor en na de uitvoering, het aantal verwijderde archiefdownloads, items om branches te herstellen en LFS-objecten en, voor elke SHA die je hebt geplakt, of hij nu uit de repository verdwenen is of wat hem nog vasthoudt.

Bewaar haar bij je incidentdossier. Ze is je bewijs van het moment waarop de gegevens uit de live dienst zijn verwijderd; het onderdeel Back-ups hierboven vermeldt hoe lang kopieën daarna nog bestaan.

Limieten

  • Eén uitvoering per repository per uur, en 10 uitvoeringen per organisatie per dag. Een geweigerd verzoek telt niet mee.
  • Selfservicelimiet: 5 GiB. Voor een grotere repository neem je contact op met support@frem.sh.
  • Maximaal 20 SHA’s kun je in één voorbeeld plakken.

API

Het voorbeeld en de resultaten van een uitvoering kun je via de API lezen:

GET /_app/api/v1/orgs/{slug}/repos/{repo}/housekeeping/prune/preview?sha=<sha>[,<sha>...]

De status van een uitvoering en de schriftelijke bevestiging hebben hun eigen GET-endpoints, die in de OpenAPI-specificatie staan.

Een uitvoering starten kan alleen vanuit de console. De API kan er geen starten.