Git geçmişi bölüm 2'yi temizle

Hassas veriler veya çok fazla bellek tüketimi: Git geçmişini değiştirmek istemek için iyi nedenler vardır. Bu blog yazısında BFG kullanarak Git geçmişindeki dosyaların nasıl temizleneceğini anlattım. BFG'nin zayıf bir noktası, doğrudan yollar için desteğin olmamasıdır, bu nedenle alt klasörlerdeki dosyaları veya klasörleri geçmişten özel olarak kaldıramazsınız. Bununla, alternatif çözümlere bakmanın zamanı geldi.


Resmi olarak tavsiye edilmeyen git filter branch 'a ek olarak git-filter-repo , geçmişi temizlemek için kullanılan araçlardan biridir. Kısa bir kurulumdan sonra, önce depoyu analiz eder ve örneğin tarihteki en büyük klasörleri buluruz.:

git filter-repo --analyze

Peki klasörde ol .git/filter-repo/analysis her türlü TXT dosyasını oluşturdu:

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

Dosyaya değer directories-all-sizes.txt daha yakından bak:

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

Genellikle, geçmişteki HEAD verilerini (örneğin, WordPress medya klasörü) uzun süredir yok saymış ve kaldırmışsınızdır. wp-content/uploads/ veya yanlışlıkla itilen bir node_modules- veya vendor-Bağlayıcı).

Genel olarak tavsiye eder git-filter-repo temizledikten sonra yeni, boş bir depoya iterek. Burada listelenen sayısız neden var, neden bu mantıklı ve birçok sorundan kaçınıyor. Bununla birlikte, aynı depoya zorlamak isteyebilirsiniz ve bu da birkaç ipucu ile mümkündür.

Önemli olarak, ana kod barındırma platformları GitHub ve GitLab bazıları birbirinden farklı olan farklı yaklaşımlar önerir. Örneğin, GitHub'da kaldırıyoruz wp-content/uploads/ aşağıdaki adımları kullanarak git-filter-repo tarihten:

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

Artık boyutu uzaktan da kontrol edebiliyoruz (boyutu API aracılığıyla ve kullanıcı arayüzünde değiştirmek 24 saate kadar sürebilir). Bunu yapmak için, depo ayarlarını açın (depo bir kuruluşa aitse, önce kuruluşa kendi hesabınızı eklemelisiniz). Şimdi boyutu görüyoruz:

GitHub: temizlemeden önce disk alanı
GitHub: temizlemeden sonra disk alanı

GitLab'da prosedür biraz farklıdır:

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 dakika daha bekledikten sonra aşağıya inebiliriz. Settings > Usage Quotas depolama alanını görüntüle:

GitLab: temizlemeden önce disk alanı
GitLab: temizlemeden sonra disk alanı

Kaldırma işleminden sonra, ilgili tüm geliştiricilerin son adımlara dahil olması önemlidir: Bir kullanıcı şimdi kendi yerel kopyasıyla normal bir push işlemi gerçekleştirirse, bu büyük dosyaların merkezi havuza geri taşınmasına neden olur. Bu nedenle, aşağıdaki 3 seçenek önerilir:

  • "fakir adamın taze klonu"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Değiştirilen dosyalar için (uygulamaya bağlı olarak): git checkout -- . veya. git add -A . && git commit -m "Push obscure file changes." && git push
  • "sıfırdan başlamak"
    • rm -rf repo && git clone xxx .
  • "rebase ile çirkin çekme"
    • git pull -r
    • Burada hala temizlenmemiş geçmişe sahipsiniz, ancak çoğu durumda artık büyük yerel değişkenle uzak deponun üzerine yanlışlıkla yazmazsınız.

Mevcut kotalar sırasında (özellikle GitLab'ın yeni kısıtlamaları nedeniyle), her zaman depolarınızın geçmişinin boyutunu kontrol etmeye ve gerekirse onları temizlemeye değer.:

GitHub ÜcretsizGitLab Ücretsiz
Maksimum dosya boyutu sınırı100MB
Maksimum depo boyutu sınırı5.000 MB
Maksimum repo sayısı sınırı
Maksimum genel boyut sınırı5.000 MB

Son olarak, aşağıdaki gibi kendi kendine barındırılan, ücretsiz bir varyanta da göz atmaya değer. Gitea atmak. Küçük bir çaba ile bir çok ince sunucu kendi kendine barındırılan bir Git örneği (GUI başına SSL güvenli, Destek olmak dahil, üzerinde kontrol güçlü API) ev sahibi, ki bu da mükemmel yapılandır ve veri koruması açısından da üstündür. Bu arada, burada da kullanabilirsiniz git-filter-repo Depoları basitçe düzene sokun:

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

Burada özellikle komut sudo -u git git gc --aggressive --prune=now önemli (cron çalışıyor git gc aksi halde çok uzun budama zamanı 2 hafta).

Geri