programmatūra · 6 min · 26.07.2026

FreeBSD iesaldēja ports koku uz četrām dienām: vainīgs 150 MB Copilot izpildfails

FreeBSD ports repozitorijs no 21. jūlija četras dienas bija iesaldēts: committeri nevarēja iesūtīt nevienu izmaiņu. Iemesls nebija uzlaušana vai servera avārija. Kokā nonāca viens 150 MB liels binārs fails, kas pārsniedza GitHub 100 MB faila ierobežojumu un pārrāva ports koka spoguļošanu uz github.com.

Fails ienāca 20. jūlijā kopā ar jaunu portu misc/github-copilot-cli. Portā vajadzēja būt tikai Makefile, kontrolsummām un lejupielādes adresei, no kuras būvētājs pats paņem programmu. Commit saturēja arī pašu GitHub Copilot CLI izpildfailu Linux videi. Nākamajā dienā core@ apturēja ports koku pilnībā. 22. jūlijā Kyle Evans core@ vārdā to paziņoja announce@ vēstkopā.

  • 20. jūlijs: commit ar 150 MB lielu izpildfailu nonāk main zarā.
  • 21. jūlijs: core@ iesaldē ports repozitoriju.
  • 22. jūlijs: pirmais publiskais paziņojums announce@ vēstkopā.
  • 24. jūlijs: vēsture pārrakstīta, koks atsaldēts.
  • 26. jūlijs: klasterī atsākas pilna pakotņu būvēšana.

Kāpēc 150 MB apturēja visu darbu

Ports koks glabā receptes, ne pašas programmas. Katrs ports ir daži kilobaiti teksta: Makefile, kontrolsummu fails, atsevišķi ielāpi. Pirmkodu vai gatavu binārfailu būvētājs lejupielādē no ražotāja servera būvēšanas laikā. Tāpēc viens 150 MB liels blāķis git vēsturē uzreiz izjauca divas lietas.

Pirmā ir spoguļošana. FreeBSD ports vēsturi automātiski dublē uz github.com un citiem forge servisiem. GitHub savukārt neļauj pievienot atsevišķu failu, kas lielāks par 100 MB. Šo robežu piemēro cieti. Push uz spoguli vienkārši pārstāja iet cauri.

Otrā ir licence. Copilot CLI izpildfails nav brīvi pārpublicējams. FreeBSD repozitorija vēsturē līdz ar to parādījās kods ar apšaubāmu izplatīšanas atļauju. Git vēsturi nevar notīrīt ar jaunu commit: fails paliek objektu datubāzē un ceļo līdzi katram klonam.

Tādā situācijā izvēles ir maz. Faila pārvietošana uz git-lfs būtu palīdzējusi tikai tad, ja tas būtu izdarīts pirms commit. Kad blobs jau ir vēsturē, vienīgais veids, kā to izņemt, ir pārrakstīt visus commit, kas nāk pēc tā. Tāpēc FreeBSD izvēlējās variantu, kas sagādā neērtības visiem lietotājiem uzreiz. Alternatīva bija nest failu līdzi katrā turpmākajā klonā.

Attiecīgais commit pārtrauca mūsu ports koka spoguļošanu uz github.com to 100 MB faila lieluma robežas dēļ un ievietoja repozitorija vēsturē blobu ar apšaubāmu licenci.

Tā paziņojumā raksta Kyle Evans. Vienlaikus viņš uzsvēra, ka koks nav apdraudēts un runa nav par ļaunprātīgu iejaukšanos.

Vēsture tika pārrakstīta

24. jūlijā René Ladan no portmgr@ un Kyle Evans no core@ izsūtīja otro paziņojumu. Visiem commit, kas main zarā ir jaunāki par a70c5c3fd44b, ir nomainītas hash vērtības. Pārrakstīšana skāra tikai misc/github-copilot-cli, pārējais koka saturs palika tāds pats.

Lai to nevajadzētu ņemt uz ticības vārda, projekts publicēja atkārtojamu skriptu ar SHA256 kontrolsummu, kas sākas ar 9f954e7e. Ikviens var palaist skriptu uz vecās vēstures un pārbaudīt, ka rezultāts sakrīt ar to, kas tagad ir serverī. Tā ir pareizā atbilde uz teikumu “mēs pārrakstījām vēsturi, uzticieties mums”.

Ko darīt ar lokālo kopiju

Parasts git pull pēc šādas pārrakstīšanas neizlabo neko. Git mēģina apvienot veco un jauno vēsturi. Rezultātā parādās dubulti commit ar vienādu saturu un atšķirīgām hash vērtībām. Kam ir tikai lasāma kopija, vienkāršākais ir klonēt no jauna vai ar git reset --hard origin/main atgriezt zaru uz servera stāvokli.

Committeriem ar saviem lokālajiem zariem paziņojumā ir dots piemērs:

git rebase --onto f9c90a4f96f0700 0a717e9c118aa6

Otrais hash ir jāaizvieto ar to commit, uz kura balstījās konkrētais zars pirms pārrakstīšanas. Kas šo soli izlaidīs un mēģinās push, saņems atteikumu vai iesūtīs vecos objektus atpakaļ kokā.

Āķi, kas nākamreiz to neļaus

Kopā ar tīrīšanu FreeBSD ievieš servera puses āķus visos trijos repozitorijos. Tie pārbaudīs faila izmēru pirms commit pieņemšanas. Binārie artefakti var prasīt atsevišķu saskaņošanu. Līdz šim šādu pārbaužu nebija, tāpēc vienas neuzmanīgas commit cena bija četras dienas iesaldēts ports koks un pārrakstīta vēsture katrā klonā.

Tas pats attiecas arī uz mazākiem projektiem. Git pieņem visu, ko tam pasniedz. Komanda git add -A nepajautā, vai mapē blakus Makefile nav palicis lejupielādēts instalators. Ja kokā binārfailiem nav vietas, vienīgā droša vieta, kur to pateikt, ir servera āķis, jo klienta puses pre-commit katrs var izlaist ar --no-verify.

Publiskajās diskusijās uzmanība ātri pārgāja no izmēra uz to, kas tas par failu bija. The Register 24. jūlijā rakstīja par gadījumu kā par parastu cilvēcisku kļūdu, kurai git padara pārāk viegli notikt. Tajā pašā rakstā izdevums pievērsās arī citiem versiju kontroles rīkiem, kuros šādu failu būtu grūtāk nejauši iesūtīt.

Ports koks tika atsaldēts dažu stundu laikā pēc 24. jūlija paziņojuma. Infrastruktūras remonts turpinās vēl nedēļu. Pilna pakotņu būvēšana klasterī atsākas 26. jūlijā.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie