Gå til hovedindhold

Oprydning i repositories: fjern objekter, der ikke kan nås

Oversat fra den engelske original. Hvis de to versioner er forskellige, gælder den engelske. Oversættelsen er endnu ikke korrekturlæst af en dansk modersmålsbruger.

Når du sletter en branch, et tag eller en pull request i Git, bliver commits ikke slettet. De bliver unreachable: ingen ref peger længere på dem, men objekterne ligger stadig på serveren og kan hentes eller vises af alle, der kender deres SHA, indtil Gits egen oprydning (garbage collection) fjerner dem på et senere tidspunkt.

Fjern objekter, der ikke kan nås (prune unreachable objects) fjerner dem nu. Brug funktionen, når et commit aldrig skulle have været pushet, for eksempel fordi det indeholdt en secret, en kundes personoplysninger eller en fil, I ikke må opbevare. Organisationens ejere kører den selv fra konsollen, og hver kørsel slutter med en skriftlig bekræftelse, som I kan gemme.

Før du starter: skift din secret

Hvis commit’et indeholdt en secret (en adgangskode, en API-nøgle, et token eller en privat nøgle), skal du skifte eller tilbagekalde den først. At fjerne commit’et gør ikke din secret ugyldig. Alle, der har klonet eller hentet repository’et, mens commit’et var der, har en kopi, og det samme har forks, mirrors og CI-logs (se Hvad den ikke fjerner). Oprydningen begrænser, hvem der fremover kan få fat i commit’et; den kan ikke kalde kopier tilbage, der allerede findes.

Push protection blokerer de fleste secrets, før de overhovedet når serveren.

Hvem kan køre den

Organisationens Owners (ejere). Siden ligger i administrationen af organisationen:

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

Du skal have Owner-adgang til administrationen af organisationen, via dit normale login, som kræver tofaktorgodkendelse (MFA). Der er ikke noget ekstra bekræftelsestrin ud over det. For at starte en kørsel skriver du repository’ets navn fuldt ud, så en kørsel ikke ved en fejl kan startes på det forkerte repository.

Trin for trin

  1. Skift en lækket secret. Se ovenfor.
  2. Slet det, der holder commit’et. Slet hver branch, hvert tag og hver pull request, der stadig indeholder commit’et, eller omskriv branchens historik, så commit’et ikke længere indgår i den, og force-push. Et commit, som en ref stadig kan nå, er ikke unreachable, og oprydningen fjerner det ikke.
  3. Forhåndsvis. Åbn siden for oprydning, og kør forhåndsvisningen. Du kan indsætte SHA’erne for de commits, du vil have fjernet (op til 20), og forhåndsvisningen fortæller for hvert af dem, om det bliver fjernet, eller hvad der stadig holder det. Se Sådan læser du forhåndsvisningen.
  4. Kør den. Vælg, om forældreløse LFS-objekter skal med, skriv repository’ets navn for at bekræfte, og start kørslen. Siden viser, hvor langt den er.
  5. Hent bekræftelsen. Når kørslen er færdig, henter du den skriftlige bekræftelse som PDF eller JSON og gemmer den sammen med jeres hændelsesrapport. Se Den skriftlige bekræftelse.

Sådan læser du forhåndsvisningen

Forhåndsvisningen ændrer ingenting. Den viser:

  • For hver SHA, du har indsat: om den findes i repository’et, og hvis en ref stadig holder den, hvilken (en branch, et tag, en pull request eller en anden ref). Slet den ref, og kør forhåndsvisningen igen. En SHA, som kun en reflog-post stadig holder, bliver fjernet af kørslen.
  • Commits, der ikke kan nås, og som bliver fjernet, med emnelinjen fra commit-beskeden.
  • Commits, der ikke kan nås, men er inden for henstandsperioden: for nye til at blive fjernet nu. Se Henstandsperioden på 30 minutter.
  • Forks af repository’et, med navn. En fork er en separat kopi og bliver ikke ændret. Se Forks.
  • Andet, som kørslen fjerner: antallet af cachede arkiv-downloads, poster til gendannelse af branches og, hvis du tager dem med, forældreløse LFS-objekter.
  • Hvorfor kørslen ikke kan starte, hvis den ikke kan. For eksempel: der kører allerede en oprydning for repository’et, eller repository’et er over størrelsesgrænsen for selvbetjening.

Henstandsperioden på 30 minutter

Objekter, der er oprettet eller fornyet inden for de seneste 30 minutter, bliver altid bevaret. Det beskytter pushes, der er i gang, mens kørslen sker: et push skriver sine objekter, før det opdaterer branchen, og i det korte øjeblik ser de nye objekter ud, som om de ikke kan nås. Henstandsperioden er fast og kan ikke gøres kortere.

Står et commit, du vil have fjernet, som inden for henstandsperioden (within grace), så vent, til der er gået 30 minutter, siden du slettede det, der holdt det, kør forhåndsvisningen igen, og start så kørslen.

Hvad den fjerner

  • Git-objekter, der ikke kan nås: commits og de trees og filindhold, som kun de commits bruger, sammen med de reflog-poster, der stadig holdt dem.
  • Commit’et i commit-graph’en, så commit’et ikke længere vises i historikvisninger, i søgning eller via sin SHA.
  • Cachede arkiv-downloads (zip og tar) af de commits.
  • Cachede kopier af fetch-pakker for repository’et, som serveren gemmer for at besvare gentagne kloninger og fetches hurtigere.
  • Poster til gendannelse af slettede branches, der pegede på de commits, så branchen ikke længere kan gendannes fra repository’ets liste over slettede branches.
  • Valgfrit, forældreløse LFS-objekter: LFS-filer, som intet commit i repository’et længere henviser til, og som blev uploadet for mere end 24 timer siden. Du vælger det, når du starter kørslen.

Når kørslen er færdig, svarer en URL, der viste commit’et, ikke fundet, og en git fetch af SHA’en fejler.

Hvad den ikke fjerner

Kørslen fjerner objekter fra dette repository på fremforges servere. Den når ikke kopier andre steder, og den retter ikke i poster, der nævner commit’et:

  • Forks. Hver fork er en separat kopi. Se Forks.
  • Eksisterende kloner og eksporter. Hver klon, hver fetch og hver dataeksport, der blev lavet, mens commit’et var der, indeholder det stadig. Bed de berørte om at slette deres kopi eller klone igen.
  • Mirrors. Et mirror af dette repository, på fremforge eller et andet sted, har sin egen kopi.
  • Repository’ets wiki. Wikien er et separat Git-repository og bliver ikke ryddet op.
  • Actions-logs og -artefakter. Et workflow, der kørte på commit’et, kan have udskrevet eller gemt dets indhold. Fjern dem separat.
  • Indholdet af webhook-leverancer, som indeholder commit-SHA’er, commit-beskeder og oplysninger om forfatteren.
  • Aktivitetsfeedet, commit-statusser og kommentarer i pull requests’ tidslinje, der nævner commit’et.

Hvis et af disse steder indeholder noget, du har brug for at få fjernet, og du ikke selv kan fjerne det, så skriv til support@frem.sh.

Forks

En fork er en fuld, separat kopi af repository’et, og det er forkens ejer, der bestemmer over den. Forhåndsvisningen viser forks med navn, så du ved, hvor commit’et ellers kan findes. For at fjerne commit’et fra en fork sletter forkens ejer den branch, det tag eller den pull request, der holder det dér, og kører oprydningen på forken, eller sletter forken.

Backups

Oprydningen fjerner objekterne fra det kørende repository. Den retter ikke i backups: fremforges backups bliver ikke ændret for at fjerne en enkelt kundes data, og de bruges kun til at gendanne platformen, aldrig til at udlevere data til nogen. Et fjernet objekt ligger derfor i de krypterede backups, indtil de udløber efter deres normale opbevaringsperiode:

  • Repository-indhold (Git-objekterne): op til 30 dage.
  • Kopier i objektlageret (cachede arkiv-downloads og LFS-objekter): op til 13 måneder i lageret til katastrofegendannelse.

Databaseposter, såsom poster til gendannelse af branches, følger databasens backups. Databehandleraftalen, §9 og bilag A.9, er den bindende beskrivelse af hvert backup-lag, og hvor længe det opbevares; hvis denne side og den gældende databehandleraftale siger noget forskelligt, gælder databehandleraftalen.

Den skriftlige bekræftelse

Hver afsluttet kørsel giver en bekræftelse, som du kan hente som PDF eller JSON. Den angiver repository’et, hvem der kørte oprydningen og hvornår, antallet af objekter før og efter kørslen, antallet af fjernede arkiv-downloads, poster til gendannelse af branches og LFS-objekter, og for hver SHA, du indsatte, om den nu er væk fra repository’et, eller hvad der stadig holder den.

Gem den sammen med jeres hændelsesrapport. Den dokumenterer, hvornår data blev fjernet fra den kørende tjeneste; afsnittet Backups ovenfor beskriver, hvor længe kopier ligger tilbage efter det.

Begrænsninger

  • Én kørsel pr. repository pr. time og 10 kørsler pr. organisation pr. døgn. En afvist anmodning tæller ikke med.
  • Størrelsesgrænse for selvbetjening: 5 GiB. Er et repository større end det, så skriv til support@frem.sh.
  • Op til 20 SHA’er kan indsættes i én forhåndsvisning.

API

Forhåndsvisningen og resultatet af en kørsel kan læses via API’et:

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

Status for en kørsel og den skriftlige bekræftelse har deres egne GET-endpoints, som står i OpenAPI-specifikationen.

En kørsel kan kun startes fra konsollen. API’et kan ikke starte en.