Git тарыхын тазалоо 2-бөлүк

Сезимтал маалыматтар же өтө көп эстутум керектөө: Git тарыхын өзгөртүүнү каалаган жакшы себептер бар. Бул блогдо мен BFG аркылуу Git тарыхынан файлдарды кантип тазалоону түшүндүрдүм. BFGдин алсыз жери - түз жолдорду колдоонун жоктугу, андыктан сиз ички папкалардагы файлдарды же папкаларды тарыхтан атайын өчүрө албайсыз. Муну менен альтернативдүү чечимдерди карап чыгууга убакыт келди.


Расмий түрдө сунушталбаган git фильтр тармагынан тышкары , git-filter-repo тарыхты тазалоо куралдарынын бири болуп саналат . Кыска орнотуудан кийин, биз адегенде репозиторийди талдап, тарыхтагы эң чоң папкаларды табабыз:

git filter-repo --analyze

Папкада бол .git/filter-repo/analysis TXT файлдарынын бардык түрлөрүн түздү:

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

Бул файл татыктуу directories-all-sizes.txt жакшыраак карап көрүңүз:

=== 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
...

Көбүнчө тарыхтагы HEAD маалыматтарын көптөн бери этибарга албай, алып салгансыз (мисалы, WordPress медиа папкасы) wp-content/uploads/ же кокустан түртүп жиберди node_modules- же vendor-байлгыч).

Жалпысынан сунуштайт git-filter-repo тазалоодон кийин, жаңы, бош репозиторийге түртүп. Бул жерде саналган көптөгөн себептер бар, эмне үчүн бул акылга сыярлык жана көптөгөн көйгөйлөрдөн качат. Ошого карабастан, сиз ошол эле репозиторийге өтүүнү кааласаңыз жана бул бир нече кеңештер менен да мүмкүн болушу мүмкүн.

Маанилүүсү, негизги код хостинг платформалары GitHub жана GitLab ар кандай ыкмаларды сунушташат, алардын айрымдары бири-биринен айырмаланат. Мисалы, GitHub'да биз алып салабыз wp-content/uploads/ төмөнкү кадамдарды колдонуу git-filter-repo тарыхтан:

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

Эми биз өлчөмдү алыстан текшере алабыз (Өлчөмдү API аркылуу жана UIде өзгөртүү 24 саатка чейин созулушу мүмкүн). Бул үчүн, репозиторийдин жөндөөлөрүн ачыңыз (эгерде репозиторий уюмга таандык болсо, адегенде уюмга өз аккаунтуңузду кошушуңуз керек). Азыр биз өлчөмүн көрүп жатабыз:

GitHub: тазалоодон мурун диск мейкиндиги
GitHub: тазалоодон кийин диск мейкиндиги

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

Дагы ~5 мүнөт күткөндөн кийин биз астына кете алабыз Settings > Usage Quotas сактоо мейкиндигин көрүү:

GitLab: тазалоодон мурун диск мейкиндиги
GitLab: тазалоодон кийин диск мейкиндиги

Алып салуудан кийин, бардык тартылган иштеп чыгуучулардын акыркы кадамдарга катышуусу маанилүү: Эгерде колдонуучу азыр өзүнүн жергиликтүү көчүрмөсү менен кадимки түртүүнү аткарса, бул чоң файлдардын кайра борбордук репозиторийге көчүп кетишине алып келет. Ошондуктан, төмөнкү 3 вариант сунушталат:

  • "кедей адамдын жаңы клону"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Өзгөртүлгөн файлдар үчүн (колдонмого жараша): git checkout -- . же. git add -A . && git commit -m "Push obscure file changes." && git push
  • "нөлдөн баштоо"
    • rm -rf repo && git clone xxx .
  • "жүрөк менен тартуу"
    • git pull -r
    • Бул жерде дагы эле тазаланбаган тарыхыңыз бар, бирок көпчүлүк учурда сиз кокусунан алыскы репозиторийди чоң жергиликтүү вариант менен кайра жаза албайсыз

Учурдагы квоталардын жүрүшүндө (өзгөчө GitLab жаңы чектөөлөрүнөн улам ) ар дайым репозиторийлериңиздин тарыхынын өлчөмүн текшерип, керек болсо аларды тазалап туруу зарыл.:

GitHub акысызGitLab акысыз
Файлдын максималдуу өлчөмү чеги100MB
Репо өлчөмүнүн максималдуу чеги5 000 МБ
Максималдуу репо саны чеги
Максималдуу жалпы өлчөмү чеги5 000 МБ

Акыр-аягы, ошондой эле өзүн-өзү жайгаштырылган, акысыз вариантты карап чыгуу керек Гитеа ыргытуу. Бир аз аракет менен сиз а абдан ичке сервер өз алдынча жайгаштырылган Git инстанциясы (GUI per SSL камсыздалган, Камдык көчүрмө камтыган, көзөмөлдөө күчтүү API) хост, алар да эң сонун конфигурациялоо жана маалыматтарды коргоо жагынан да жогору турат. Бул жерде, демек, сиз да колдоно аласыз git-filter-repo Жөн эле репозиторийлерди иретке келтириңиз:

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

Бул жерде атайын буйрук болуп саналат sudo -u git git gc --aggressive --prune=now маанилүү (cron иштеп жатат git gc башкасы өтө узун кыркуу убактысы 2 жума).

Артка