Εκκαθάριση ιστορικού 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 στο ιστορικό (για παράδειγμα, το φάκελο πολυμέσων του WordPress wp-content/uploads/ ή ένα σπρώξιμο κατά λάθος node_modules- ή vendor-Βιβλιοδέτης).

Συνιστά γενικά git-filter-repo μετά τον καθαρισμό, σπρώχνοντας σε ένα νέο, κενό χώρο αποθήκευσης. Υπάρχουν πολλοί λόγοι που αναφέρονται εδώ, γιατί αυτό είναι λογικό και αποφεύγει πολλά προβλήματα. Ωστόσο, μπορεί να συμβεί να θέλετε να μεταβείτε στο ίδιο αποθετήριο και αυτό είναι επίσης δυνατό με μερικές συμβουλές.

Είναι σημαντικό, οι κύριες πλατφόρμες φιλοξενίας κώδικα 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/
# 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

Μπορούμε πλέον να ελέγξουμε το μέγεθος και από απόσταση (η αλλαγή του μεγέθους μέσω API και στο UI μπορεί να διαρκέσει έως και 24 ώρες). Για να το κάνετε αυτό, ανοίξτε τις ρυθμίσεις αποθετηρίου (αν το αποθετήριο ανήκει σε έναν οργανισμό, πρέπει πρώτα να προσθέσετε τον δικό σας λογαριασμό στον οργανισμό). Τώρα βλέπουμε το μέγεθος:

GitHub: χώρος στο δίσκο πριν από την εκκαθάριση
GitHub: χώρος στο δίσκο μετά την εκκαθάριση

Η διαδικασία είναι ελαφρώς διαφορετική στο 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

Μετά από άλλη αναμονή ~ 5 λεπτών μπορούμε να πάμε κάτω Settings > Usage Quotas προβολή αποθηκευτικού χώρου:

GitLab: χώρος στο δίσκο πριν από την εκκαθάριση
GitLab: χώρος στο δίσκο μετά την εκκαθάριση

Μετά την κατάργηση, είναι σημαντικό να συμμετέχουν όλοι οι εμπλεκόμενοι προγραμματιστές στα τελικά βήματα: Εάν ένας χρήστης εκτελεί τώρα μια κανονική ώθηση με το δικό του τοπικό αντίγραφο, αυτό θα είχε ως αποτέλεσμα τη μετεγκατάσταση των μεγάλων αρχείων πίσω στο κεντρικό αποθετήριο. Επομένως, προτείνονται οι ακόλουθες 3 επιλογές:

  • "ο φρέσκος κλώνος του φτωχού"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Για αλλαγμένα αρχεία (ανάλογα με την εφαρμογή): git checkout -- . ή. git add -A . && git commit -m "Push obscure file changes." && git push
  • "ξεκινώ από την αρχή"
    • rm -rf repo && git clone xxx .
  • "άσχημο τράβηγμα με επαναφορά"
    • git pull -r
    • Εδώ έχετε ακόμα το μη καθαρισμένο ιστορικό, αλλά στις περισσότερες περιπτώσεις δεν αντικαθιστάτε πλέον κατά λάθος το απομακρυσμένο αποθετήριο με τη μεγάλη τοπική παραλλαγή

Κατά τη διάρκεια των υφιστάμενων ποσοστώσεων (ειδικά λόγω των νέων περιορισμών του GitLab ), αξίζει πάντα να ελέγχετε το μέγεθος του ιστορικού των αποθετηρίων σας και να τα καθαρίζετε εάν είναι απαραίτητο:

GitHub ΔωρεάνGitLab Δωρεάν
Μέγιστο όριο μεγέθους αρχείου100 MB
Μέγιστο όριο μεγέθους repo5.000 MB
Μέγιστο όριο καταμέτρησης αποθεμάτων
Μέγιστο συνολικό όριο μεγέθους5.000 MB

Τέλος, αξίζει επίσης να ρίξετε μια ματιά σε μια αυτο-φιλοξενούμενη, δωρεάν παραλλαγή όπως Gitea να πετάξουν. Με λίγη προσπάθεια μπορείτε να α πολύ λεπτός διακομιστής μια αυτο-φιλοξενούμενη παρουσία Git (GUI ανά SSL εξασφαλισμένη, Αντιγράφων ασφαλείας περιλαμβάνεται, έλεγχος επί ισχυρό API) οικοδεσπότης, οι οποίοι είναι επίσης εξαιρετικοί Διαμορφώστε και είναι επίσης ανώτερη όσον αφορά την προστασία των δεδομένων. Εδώ, παρεμπιπτόντως, μπορείτε επίσης να χρησιμοποιήσετε git-filter-repo Απλώς απλοποιήστε τα αποθετήρια:

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

Εδώ είναι συγκεκριμένα η εντολή sudo -u git git gc --aggressive --prune=now σημαντικό (το cron running git gc διαφορετικά έχει ένα πολύ μακρύ ώρα κλαδεύματος των 2 εβδομάδων).

Πίσω