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:
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:
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 Gratis | Gratis GitLab | |
Batas ukuran file maksimum | 100MB | ∞ |
Batas ukuran repo maks | 5.000 MB | ∞ |
Batas jumlah repo maks | ∞ | ∞ |
Batas ukuran keseluruhan maks | ∞ | 5.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).