Ευαίσθητα δεδομένα ή υπερβολική κατανάλωση χώρου αποθήκευσης: Υπάρχουν καλοί λόγοι για να θέλετε να αλλάξετε το ιστορικό Git. Σε αυτήν την ανάρτηση ιστολογίου εξήγησα πώς να διαγράψετε αρχεία από το ιστορικό Git χρησιμοποιώντας το BFG . Ένα αδύναμο σημείο του BFG είναι η έλλειψη υποστήριξης για άμεσες διαδρομές , επομένως δεν μπορείτε να αφαιρέσετε συγκεκριμένα αρχεία ή φακέλους σε υποφακέλους από το ιστορικό. Με αυτό, ήρθε η ώρα να εξετάσουμε εναλλακτικές λύσεις.
Εκτός από τον επίσημα μη συνιστώμενο κλάδο `git filter` , το `git-filter-repo` είναι ένα από τα εργαλεία για τον καθαρισμό του ιστορικού. Μετά από μια γρήγορη εγκατάσταση , αναλύουμε πρώτα το αποθετήριο και βρίσκουμε, για παράδειγμα, τους μεγαλύτερους φακέλους στο ιστορικό.:
git filter-repo --analyze
Λοιπόν να είστε στο φάκελο .git/filter-repo/analysis δημιούργησε όλα τα είδη αρχείων TXT:
directories-all-sizes.txtextensions-all-sizes.txtpath-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 ώρες). Για να το κάνετε αυτό, ανοίξτε τις ρυθμίσεις αποθετηρίου (αν το αποθετήριο ανήκει σε έναν οργανισμό, πρέπει πρώτα να προσθέσετε τον δικό σας λογαριασμό στον οργανισμό). Τώρα βλέπουμε το μέγεθος:


Η διαδικασία είναι ελαφρώς διαφορετική στο 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 προβολή αποθηκευτικού χώρου:


Μετά την κατάργηση, είναι σημαντικό να συμμετέχουν όλοι οι εμπλεκόμενοι προγραμματιστές στα τελικά βήματα: Εάν ένας χρήστης εκτελεί τώρα μια κανονική ώθηση με το δικό του τοπικό αντίγραφο, αυτό θα είχε ως αποτέλεσμα τη μετεγκατάσταση των μεγάλων αρχείων πίσω στο κεντρικό αποθετήριο. Επομένως, προτείνονται οι ακόλουθες 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 | ∞ |
| Μέγιστο όριο μεγέθους repo | 5.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 εβδομάδων).