Сезимтал маалыматтар же өтө көп эстутум керектөө: 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 саатка чейин созулушу мүмкүн). Бул үчүн, репозиторийдин жөндөөлөрүн ачыңыз (эгерде репозиторий уюмга таандык болсо, адегенде уюмга өз аккаунтуңузду кошушуңуз керек). Азыр биз өлчөмүн көрүп жатабыз:
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
сактоо мейкиндигин көрүү:
Алып салуудан кийин, бардык тартылган иштеп чыгуучулардын акыркы кадамдарга катышуусу маанилүү: Эгерде колдонуучу азыр өзүнүн жергиликтүү көчүрмөсү менен кадимки түртүүнү аткарса, бул чоң файлдардын кайра борбордук репозиторийге көчүп кетишине алып келет. Ошондуктан, төмөнкү 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 жума).