Bersihkan riwayat Git bagian 2

Data sensitif atau konsumsi memori terlalu banyak: Ada alasan bagus untuk ingin mengubah riwayat Git. Dalam posting blog ini , saya menjelaskan cara membersihkan file dari riwayat Git menggunakan BFG . Titik lemah BFG adalah kurangnya dukungan untuk jalur langsung , sehingga Anda tidak dapat secara khusus menghapus file atau folder di subfolder dari riwayat. Dengan itu, saatnya untuk melihat solusi alternatif.


Selain git filter branch yang tidak direkomendasikan secara resmi , git-filter-repo adalah salah satu alat untuk membersihkan riwayat. Setelah instalasi singkat , pertama-tama kami menganalisis repositori dan menemukan, misalnya, folder terbesar dalam sejarah:

git filter-repo --analyze

Baik berada di folder .git/filter-repo/analysis menghasilkan semua jenis file TXT:

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

Ini sepadan dengan filenya directories-all-sizes.txt Lihat lebih dekat:

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

Sering terjadi bahwa Anda telah lama mengabaikan dan menghapus data HEAD dalam riwayat (misalnya, folder media WordPress wp-content/uploads/ atau yang didorong secara tidak sengaja node_modules- atau vendor-Bahan pengikat).

Umumnya merekomendasikan git-filter-repo setelah dibersihkan, mendorong ke repositori baru yang kosong. Ada banyak alasan yang tercantum di sini, mengapa ini masuk akal dan menghindari banyak masalah. Namun demikian, dapat terjadi bahwa Anda ingin mendorong ke repositori yang sama dan itu juga dimungkinkan dengan beberapa petunjuk.

Yang penting, platform hosting kode utama GitHub dan GitLab merekomendasikan pendekatan yang berbeda, beberapa di antaranya berbeda satu sama lain. Misalnya, di GitHub kami menghapus wp-content/uploads/ menggunakan langkah-langkah berikut git-filter-repo dari 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

Kami sekarang juga dapat memeriksa ukuran dari jarak jauh (mengubah ukuran melalui API dan di UI dapat memakan waktu hingga 24 jam). Untuk melakukan ini, buka pengaturan repositori (jika repositori milik organisasi, Anda harus terlebih dahulu menambahkan akun Anda sendiri ke organisasi). Sekarang kita lihat ukurannya:

GitHub: ruang disk sebelum pembersihan
GitHub: ruang disk setelah pembersihan

Prosedurnya sedikit berbeda di 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

Setelah menunggu lagi ~ 5 menit kita bisa pergi ke bawah Settings > Usage Quotas lihat ruang penyimpanan:

GitLab: ruang disk sebelum pembersihan
GitLab: ruang disk setelah pembersihan

Setelah penghapusan, penting bahwa semua pengembang yang terlibat terlibat dalam langkah terakhir: Jika pengguna sekarang melakukan push normal dengan salinan lokal mereka sendiri, ini akan mengakibatkan file besar bermigrasi kembali ke repositori pusat. Oleh karena itu, 3 opsi berikut direkomendasikan:

  • "klon segar orang miskin"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Untuk file yang diubah (tergantung aplikasinya): git checkout -- . atau. git add -A . && git commit -m "Push obscure file changes." && git push
  • "mulai dari awal"
    • rm -rf repo && git clone xxx .
  • "tarik jelek dengan rebase"
    • git pull -r
    • Di sini Anda masih memiliki riwayat yang tidak bersih, tetapi dalam banyak kasus Anda tidak lagi secara tidak sengaja menimpa repositori jarak jauh dengan varian lokal yang besar

Selama kuota saat ini (terutama karena pembatasan baru GitLab ), selalu ada baiknya memeriksa ukuran riwayat repositori Anda dan membersihkannya jika perlu:

GitHub GratisGratis GitLab
Batas ukuran file maksimum100MB
Batas ukuran repo maks5.000 MB
Batas jumlah repo maks
Batas ukuran keseluruhan maks5.000 MB

Akhirnya, ada baiknya juga melihat varian gratis yang dihosting sendiri seperti Gitea untuk melempar. Dengan sedikit usaha, Anda dapat melakukannya server sangat tipis instance Git yang di-host sendiri (GUI per SSL dijamin, Cadangan termasuk, kontrol atas API yang kuat) tuan rumah, yang juga luar biasa konfigurasikan dan juga unggul dalam hal perlindungan data. Di sini, omong-omong, Anda juga dapat menggunakan git-filter-repo Sederhanakan repositori:

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 adalah perintahnya sudo -u git git gc --aggressive --prune=now penting (cron berjalan git gc jika tidak memiliki satu terlalu panjang memangkas waktu dari 2 minggu).

Kembali