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