Bersihkan sejarah Git bahagian 2

Data sensitif atau penggunaan memori yang terlalu banyak: Terdapat sebab yang baik untuk ingin menukar sejarah Git. Dalam catatan blog ini , saya menerangkan cara untuk membersihkan fail daripada sejarah Git menggunakan BFG . Titik lemah BFG ialah kekurangan sokongan untuk laluan terus , jadi anda tidak boleh secara khusus mengalih keluar fail atau folder dalam subfolder daripada sejarah. Dengan itu, sudah tiba masanya untuk melihat penyelesaian alternatif.


Sebagai tambahan kepada cawangan penapis git yang tidak disyorkan secara rasmi , git-filter-repo ialah salah satu alat untuk membersihkan sejarah. Selepas pemasangan singkat , kami mula-mula menganalisis repositori dan mencari, sebagai contoh, folder terbesar dalam sejarah:

git filter-repo --analyze

Baik berada dalam folder .git/filter-repo/analysis menghasilkan semua jenis fail TXT:

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

Berbaloi dengan fail itu directories-all-sizes.txt perhatikan betul-betul:

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

Selalunya berlaku bahawa anda telah lama mengabaikan dan mengalih keluar data HEAD dalam sejarah (contohnya, folder media WordPress wp-content/uploads/ atau ditolak secara tidak sengaja node_modules- atau vendor-Pengikat).

Umumnya mengesyorkan git-filter-repo selepas membersihkan, menolak ke repositori baru yang kosong. Terdapat banyak sebab yang disenaraikan di sini, mengapa ini masuk akal dan mengelakkan banyak masalah. Walau bagaimanapun, ia boleh berlaku bahawa anda ingin menolak ke repositori yang sama dan itu juga mungkin dengan beberapa petunjuk.

Yang penting, platform pengehosan kod utama GitHub dan GitLab mengesyorkan pendekatan yang berbeza, beberapa daripadanya berbeza antara satu sama lain. Sebagai contoh, pada GitHub kami mengalih keluar wp-content/uploads/ menggunakan langkah-langkah berikut git-filter-repo daripada sejarah:

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

Kini kami juga boleh menyemak saiz dari jauh (menukar saiz melalui API dan dalam UI boleh mengambil masa sehingga 24 jam). Untuk melakukan ini, buka tetapan repositori (jika repositori milik organisasi, anda mesti terlebih dahulu menambah akaun anda sendiri pada organisasi). Sekarang kita lihat saiznya:

GitHub: ruang cakera sebelum pembersihan
GitHub: ruang cakera selepas pembersihan

Prosedurnya sedikit berbeza pada 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

Selepas menunggu lagi ~5 minit kita boleh pergi ke bawah Settings > Usage Quotas melihat ruang simpanan:

GitLab: ruang cakera sebelum pembersihan
GitLab: ruang cakera selepas pembersihan

Selepas pengalihan keluar, adalah penting bahawa semua pembangun yang terlibat terlibat dalam langkah terakhir: Jika pengguna kini melakukan tolakan biasa dengan salinan setempat mereka sendiri, ini akan mengakibatkan fail besar berhijrah kembali ke repositori pusat. Oleh itu, 3 pilihan berikut disyorkan:

  • "klon segar lelaki miskin"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Untuk fail yang diubah (bergantung pada aplikasi): git checkout -- . atau. git add -A . && git commit -m "Push obscure file changes." && git push
  • "bermula dari awal"
    • rm -rf repo && git clone xxx .
  • "tarik hodoh dengan rebase"
    • git pull -r
    • Di sini anda masih mempunyai sejarah yang tidak dibersihkan, tetapi dalam kebanyakan kes anda tidak lagi secara tidak sengaja menimpa repositori jauh dengan varian tempatan yang besar

Dalam perjalanan kuota semasa (terutamanya disebabkan oleh sekatan baharu GitLab ), ia sentiasa bernilai menyemak saiz sejarah repositori anda dan membersihkannya jika perlu:

GitHub PercumaGitLab Percuma
Had saiz fail maksimum100MB
Had saiz repo maks5,000MB
Had bilangan repo maks
Had saiz keseluruhan maksimum5,000MB

Akhir sekali, anda juga patut melihat varian percuma yang dihoskan sendiri Gitea untuk dilemparkan. Dengan sedikit usaha anda boleh pada a pelayan yang sangat tipis contoh Git yang dihoskan sendiri (GUI per SSL terjamin, Sandaran termasuk, kawalan ke atas API berkuasa) hos, yang juga sangat baik mengkonfigurasi dan juga unggul dari segi perlindungan data. Di sini, dengan cara ini, anda juga boleh menggunakan git-filter-repo Perkemaskan repositori sahaja:

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

Di sini secara khusus ialah arahan sudo -u git git gc --aggressive --prune=now penting (cron berjalan git gc jika tidak mempunyai satu terlalu lama masa pemangkasan selama 2 minggu).

Belakang