پاک کردن تاریخچه Git قسمت 2

داده های حساس یا مصرف بیش از حد حافظه: دلایل خوبی برای تغییر تاریخچه 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-صحاف کننده).

نکته مهم، پلتفرم های میزبانی کد اصلی است 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
mv /tmp/config-backup .git/config
git push origin --force --all
git push origin --force --tags
# check size locally
git gc && git count-objects -vH
cd ..
rm -rf tmp-repo

اکنون می‌توانیم اندازه را از راه دور نیز بررسی کنیم (تغییر اندازه از طریق API و در UI ممکن است تا 24 ساعت طول بکشد). برای انجام این کار، تنظیمات مخزن را باز کنید (اگر مخزن متعلق به یک سازمان است، ابتدا باید حساب کاربری خود را به سازمان اضافه کنید). حالا اندازه را می بینیم:

GitHub: فضای دیسک قبل از پاکسازی
GitHub: فضای دیسک پس از پاکسازی

رویه در GitLab کمی متفاوت است:

mkdir tmp-repo
cd tmp-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 on main/master"
cd ./../../
rm -rf tmp-repo
date
# wait 30 minutes (😱)
date
# Settings > Repository > upload /tmp/commit-map-X

بعد از 5 دقیقه صبر دیگر می توانیم به زیر برویم Settings > Usage Quotas فضای ذخیره سازی را مشاهده کنید:

GitLab: فضای دیسک قبل از پاکسازی
GitLab: فضای دیسک پس از پاکسازی

پس از حذف، مهم است که همه توسعه دهندگان درگیر در مراحل نهایی باشند: اگر کاربر اکنون یک فشار معمولی را با کپی محلی خود انجام دهد، منجر به انتقال فایل های بزرگ به مخزن مرکزی می شود. بنابراین 3 گزینه زیر پیشنهاد می شود:

  • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp && git add -A .
    ("کلون تازه مرد فقیر"، دوباره در مخزن موجود کلون کنید)
  • rm -rf repo && git clone xxx .
    ("از ابتدا شروع کن"، تمیزترین نوع)
  • git pull -r
    ("pull with rebase"، شما هنوز سابقه پاک نشده را دارید، اما دیگر به طور تصادفی بازنویسی نکنید)

در طول سهمیه های فعلی (به ویژه به دلیل محدودیت های جدید GitLab )، همیشه ارزش دارد که اندازه تاریخچه مخازن خود را بررسی کنید و در صورت لزوم آنها را تمیز کنید.:

GitHub رایگانGitLab رایگان
حداکثر اندازه فایل100 مگابایت
حداکثر محدودیت اندازه مخزن5000 مگابایت
حداکثر محدودیت تعداد مخزن
حداکثر محدودیت اندازه کلی5000 مگابایت

در نهایت، ارزش این را دارد که به یک نوع خود میزبان و رایگان مانند Gitea نگاهی بیندازید . با کمی تلاش، می‌توانید یک نمونه Git خود میزبان (GUI ایمن شده با SSL ، پشتیبان‌گیری شامل، کنترل از طریق API قدرتمند ) را روی یک سرور بسیار ناب میزبانی کنید ، که همچنین می‌تواند عالی پیکربندی شود و همچنین از نظر حفاظت از داده‌ها برتر است.

بازگشت