Purigu Git-historian parton 2

Sentemaj datumoj aŭ tro da memorkonsumo: Estas bonaj kialoj por voli ŝanĝi la Git-historion. En ĉi tiu bloga afiŝo , mi klarigis kiel purigi dosierojn el Git-historio uzante BFG . Malforta punkto de BFG estas la manko de subteno por rektaj vojoj , do vi ne povas specife forigi dosierojn aŭ dosierujojn en subdosierujoj de la historio. Kun tio, estas tempo rigardi alternativajn solvojn.


Krom la oficiale ne rekomendita git filter-branĉo , git-filter-repo estas unu el la iloj por purigi la historion. Post mallonga instalado , ni unue analizas la deponejon kaj trovas, ekzemple, la plej grandajn dosierujojn en la historio:

git filter-repo --analyze

Nu estu en la dosierujo .git/filter-repo/analysis generis ĉiajn TXT-dosierojn:

  • directories-all-sizes.txt
  • extensions-all-sizes.txt
  • path-all-sizes.txt
  • ...

Ĝi valoras la dosieron directories-all-sizes.txt rigardu pli proksime:

=== All directories by reverse size ===

Format: unpacked size, packed size, date deleted, directory name

  4624417043 3796607988 <present> <toplevel>
  4475940396 3778033787 <present> wp-content
  4060236681 3694449320 <present> wp-content/uploads
   305163809   70576241 <present> wp-content/plugins
   123818107   15442735 <present> wp-includes
...

Ofte okazas, ke vi longe ignoris kaj forigis el la HEAD-datumoj en la historio (ekzemple, la WordPress-media dosierujo wp-content/uploads/ aŭ hazarde puŝita node_modules- aŭ vendor- Binder).

Ĝenerale rekomendas git-filter-repo post purigado, puŝado al nova, malplena deponejo. Estas multaj kialoj listigitaj ĉi tie, kial ĉi tio havas sencon kaj evitas multajn problemojn. Tamen, povas okazi, ke vi volas puŝi al la sama deponejo kaj tio ankaŭ eblas per kelkaj sugestoj.

Grave, la ĉefaj kodaj gastigaj platformoj GitHub kaj GitLab rekomendas malsamajn alirojn, iuj el kiuj diferencas unu de la alia. Ekzemple, en GitHub ni forigas wp-content/uploads/ uzante la sekvajn paŝojn git-filter-repo el la historio:

mkdir tmp-repo
cd tmp-repo
git clone git@github.com:foo/bar.git .
cp .git/config /tmp/config-backup
git filter-repo --invert-paths --path wp-content/uploads/
# option 1: same repo
  mv /tmp/config-backup .git/config
  git push origin --force --all
# option 2: new repo
  git remote add origin git@github.com:foo/bar-new.git
  git push origin --force --all
cd ..
rm -rf tmp-repo

Ni nun povas ankaŭ kontroli la grandecon malproksime (ŝanĝi la grandecon per API kaj en la UI povas daŭri ĝis 24 horoj). Por fari tion, malfermu la deponejon agordojn (se la deponejo apartenas al organizo, vi unue devas aldoni vian propran konton al la organizo). Nun ni vidas la grandecon:

GitHub: diskospaco antaŭ purigado
GitHub: diskospaco post purigado

La proceduro estas iomete malsama en GitLab:

mkdir tmp-repo
cd tmp-repo
# option 1: same repo
  # Settings > General > Advanced > Export project > download tar.gz file into tmp-repo
  tar xzf 20*.tar.gz
  git clone --bare --mirror project.bundle
  cd project.git
  git filter-repo --invert-paths --path wp-content/uploads/
  cp ./filter-repo/commit-map /tmp/commit-map-1
  # copying the commit-map has to be done after every single command from git filter-repo
  # you need the commit-map files later
  git remote remove origin
  git remote add origin git@gitlab.com:foo/bar.git
  # Settings > Repository > Protected branches/Protected branches >
  # enable "Allowed to force push to main/master"
  git push origin --force 'refs/heads/*'
  git push origin --force 'refs/tags/*'
  git push origin --force 'refs/replace/*'
  # Settings > Repository > Protected branches/Protected branches >
  # disable "Allowed to force push to main/master"
  date
  # wait 30 minutes (😱)
  date
  # Settings > Repository > upload /tmp/commit-map-X
# option 2: new repo
  git clone git@gitlab.com:foo/bar.git .
  git filter-repo --invert-paths --path wp-content/uploads/
  git remote add origin git@gitlab.com:foo/bar-new.git
  # Settings > Repository > Protected branches/Protected branches >
  # enable "Allowed to force push to main/master"
  git push origin --force --all
  # Settings > Repository > Protected branches/Protected branches >
  # disable "Allowed to force push to main/master"
cd ..
rm -rf tmp-repo

Post alia atendo de ~5 minutoj ni povas suben Settings > Usage Quotas vidi stokan spacon:

GitLab: diskospaco antaŭ purigado
GitLab: diskospaco post purigado

Post la forigo, estas grave ke ĉiuj programistoj implikitaj estas implikitaj en la finaj paŝoj: Se uzanto nun faras normalan puŝon kun sia propra loka kopio, tio rezultigus la grandajn dosierojn migras reen al la centra deponejo. Tial, la sekvaj 3 opcioj estas rekomenditaj:

  • "la freŝa klono de malriĉulo"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Por ŝanĝitaj dosieroj (depende de la aplikaĵo): git checkout -- . aŭ. git add -A . && git commit -m "Push obscure file changes." && git push
  • "komenci de nulo"
    • rm -rf repo && git clone xxx .
  • "malbela tiro kun rebazo"
    • git pull -r
    • Ĉi tie vi ankoraŭ havas la nepurigitan historion, sed plejofte vi ne plu hazarde anstataŭigas la foran deponejon per la granda loka varianto.

Dum la nunaj kvotoj (precipe pro la novaj limigoj de GitLab ), ĉiam indas kontroli la grandecon de la historio de viaj deponejoj kaj purigi ilin se necese.:

GitHub SenpagaGitLab Senpaga
Maksimuma dosiera grandeco limo100MB
Maksimuma repo-granda limo5.000 MB
Maksimuma repo-nombra limo
Maksimuma totala limo5.000 MB

Fine, ankaŭ indas rigardi memgastigitan, senpagan varianton kiel Gitea ĵeti. Kun malmulte da peno vi povas sur a tre svelta servilo mem-gastigita Git-okazaĵo (GUI per SSL sekurigita, Sekurkopio inkluzivita, kontrolo super potenca API) gastiganto, kiuj ankaŭ estas bonegaj agordi kaj estas ankaŭ supera laŭ datuma protekto. Ĉi tie, cetere, vi ankaŭ povas uzi git-filter-repo Simple simpligu deponejojn:

mkdir tmp-repo
cd tmp-repo
git clone git@git.tld.com:foo/bar.git .
cp .git/config /tmp/config-backup
git filter-repo --invert-paths --path wp-content/uploads/
# option 1: same repo
  mv /tmp/config-backup .git/config
  git push origin --mirror
  # login on the remote command line and run in the repo-folder
  sudo -u git git reflog expire --expire=now --all
  sudo -u git git gc --aggressive --prune=now
  # if you face memory limit issues, modify the git configuration
  sudo -u git git config --global pack.windowMemory "100m"
  sudo -u git git config --global pack.packSizeLimit "100m"
  sudo -u git git config --global pack.threads "1"
  # if in web ui the size does not change, make a slight
  # modification to a file and push again normally
# option 2: new repo
  git remote add origin git@git.tld.com:foo/bar-new.git
  git push origin --force --all
cd ..
rm -rf tmp-repo

Jen specife la komando sudo -u git git gc --aggressive --prune=now grava (la krono kuras git gc alie havas tro longan pritondi tempon de 2 semajnoj).

Reen