داده های حساس یا مصرف بیش از حد حافظه: دلایل خوبی برای تغییر تاریخچه Git وجود دارد. در این پست وبلاگ ، نحوه پاکسازی فایل ها از تاریخچه Git با استفاده از BFG را توضیح دادم. نقطه ضعف 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 را در تاریخچه نادیده گرفته و از آنها حذف کرده اید (به عنوان مثال، پوشه رسانه وردپرس 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 رایگان | |
حداکثر اندازه فایل | 100 مگابایت | ∞ |
حداکثر محدودیت اندازه مخزن | 5000 مگابایت | ∞ |
حداکثر محدودیت تعداد مخزن | ∞ | ∞ |
حداکثر محدودیت اندازه کلی | ∞ | 5000 مگابایت |
در نهایت، ارزش این را دارد که به یک نوع خود میزبان و رایگان مانند نگاهی بیاندازیم گیته پرتاب کردن با کمی تلاش می توانید روی یک سرور بسیار باریک یک نمونه Git خود میزبان (GUI برای 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 running git gc
در غیر این صورت یکی بیش از حد طولانی است زمان هرس از 2 هفته).