-
Notifications
You must be signed in to change notification settings - Fork 23
Repository History
Ένα πρόβλημα που εμφανίζεται συχνά σε μεγάλα αποθετήρια με πολλούς contributors είναι το ιστορικό που μπορεί να μεγαλώσει πάρα πολύ σε μέγεθος, ίσως μετά από fork ενός προηγούμενου αποθετηρίου το οποίο περιέχει χιλιάδες commits ήδη. Το μέγεθος του ιστορικού στο git έχει την παρενέργεια ότι αυξάνει φυσικά το μέγεθος του αποθετήριου και επίσης περιέχει authors που δεν ήταν ποτέ μέρος της προσπάθειας ενός project και κάνει δύσκολη την δουλειά της ανάλυσης των authors και του ιστορικού στην καρτέλα _Insights _του GitHub.
Σαν μέθοδο για να λύσουμε αυτό το πρόβλημα στο δικό μας αποθετήριο είναι η χρήση των git grafts, με την εντολή $ git replace --graft a32be aea18, με τα a32be και aea18 να είναι αντίστοιχα οι πρώτοι 5 χαρακτήρες των CRC checksums του πρώτου και τελευταίου commit που θέλουμε να αφαιρέσουμε από το ιστορικό μας. Η εντολή δημιουργεί το graft σαν placeholder έως ότου να τρέξουμε την εντολή git filter-branch χωρίς φίλτρα για να κλειδώσουμε το graft στο ιστορικό, επαναγράφοντας στην διαδικασία όλα τα commits στο αποθετήριο βάση αυτού ($ git filter-branch --tag-name-filter cat -- --all)
Άρα με τις δύο προηγούμενες εντολές έχουμε διαγράψει όλα τα commits μεταξύ του πρώτου commit του αποθετηρίου και του πρώτου commit αφότου έχει γίνει fork το αποθετήριο. (ΥΓ: όλα τα checksums των commits έχουν αλλάξει με την εντολή filter-branch γιατί κυριολεκτικά ξαναχτίζουμε όλο το ιστορικό με καινούργια βάση, άρα όλα τα commits ενώ περιέχουν τις ίδιες αλλαγές και authors, είναι διαφορετικά γιατί έχουν διαφορετικό parent commit).
Συγκεκριμένα για το δικό μας αποθετήριο βλέπουμε περίπου 1200 λιγότερα commits, κάναμε επαλήθευση των αποτελεσμάτων των παραπάνω εντολών με διάφορους τρόπους:
Για πρώτη επαλήθευση κοιτάμε το ιστορικό από το git init σε γράφο με git log --graph
Όπως βλέπουμε έχει μείνει μόνο το αρχικό commit (initial commit) του αποθετηρίου, με δεύτερο χρονολογικά να είναι το πρώτο commit μετά το fork.
Σαν δεύτερη επαλήθευση του καινούργιου ιστορικού κοιτάμε τα commits μέσω του GitHub
Σαν τρίτη επαλήθευση βλέπουμε το 2ο commit του αποθετηρίου που τώρα είναι το πρώτο commit μετά το fork, και δίνουμε προσοχή στα 821 αλλαγμένα αρχεία και στα 47,000 additions.
Για να μεταφέρουμε το git αποθετήριο τώρα στο καινούργιο του GitHub αποθετήριο πρέπει να δημιουργήσουμε πρώτα ένα καινούργιο αποθετήριο στο GitHub, να το προσθέσουμε σαν
Με την εντολή git push --force origin master
Το θέμα έχει λυθεί θεωρητικά, πρακτικά όμως όχι, έχει ακόμα δουλειά και τέστ να τρέξω για να βεβαιωθώ για την λύση γιατί μιλάμε για κοινό αποθετήριο, δεν θέλω να έχω κάτι που μου ξέφυγε. Αφού τελειώσουν όλοι το δύσκολο θέμα που έχουν μέχρι 30 απριλίου και έπειτα θα μιλήσουμε όλοι οι contributors μαζί ώστε να προχωρήσω στην διαδικασία αλλά για το κύριο αποθετήριο.
Για να είμαστε έτοιμοι για όλα θα τρέξω τεστ στο δικό μου fork με δικά μου pull requests κτλ για να δω πως συμπεριφέρονται τα παλία branches που είχα, και γενικά πώς θα βγάλουμε οδηγίες μετάβασης.
Περιμένω σχόλια κυρίως από @epidrome @NikosAvg @jimDragon @GIANNIS-AGGELIS @p15zerv και όποιος άλλος θέλει.
αν θες κάνε το δημόσιο κάπου στην περιοχή σου στο γκιτχαμπ να το δούμε με τα εργαλεία οπτικοποίησης του γκιτχαμπ
Εκανα push το master εδω: https://github.com/constantinexisc/site-gr
Στο contributors tab βλεπουμε μονο τους "δικους" μας.
Επίσης ενας εξτρα ελεγχος που σκεφτηκα να κανω, εκανα clone το κεντρικο αποθετηριο σε καινουργιο φακελο και ετρεξα linux diff (οχι git diff) στα 2 αποθετηρια, η μονη αλλαγη που βρηκε μεταξυ των ειναι το τελευταιο commit στο readme που κανατε πριν 5 μερες. Αρα με 4η επαληθευση ειμαι σιγουρος οτι δεν εκανα κατι λαθος.
(κλικ για να ανοιξει σε μεγαλο παραθυρο η εικονα)

Ετρεξα τις αλλαγες και με τα local branches, αυτα απο οτι καταλαβα ενημερωθηκαν κανονικα για τις αλλαγες που γινανε στο master, απλα πρεπει να τα εχω τοπικα και να κανω push --force --all για να γινουν update ολα τα κλαδια στο github.
Δύο εντολές είναι τελικά:
$ git replace --graft a32be aea18
$ git filter-branch --tag-name-filter cat -- --all
Στην δεύτερη εντολή δεν είναι λάθος το μονό --, έτσι πρέπει να είναι και μετά το --all, καλύτερα να το κάνετε copy-paste.
Κάνει αυτόματα rewrite και τα κλαδιά ώστε να είναι σωστά μετά από την εκτέλεση της διαδικασίας.
Όπως είπε ο @jimDragon για το 2ο που ζητάτε κανένας δεν θα μπορεί να κάνει αιτήματα από αυτό το αποθετήριο στο δικό μου, αφού τα αποθετήρια είναι "divergent" μετά από το rewrite των commits, θα πρέπει τα fork να γίνουν από το καινούργιο αποθετήριο για να δουλέψουν τα pull request.
@epidrome Ευχαριστώ! Επίσης υπάρχει τρόπος να "μετακομίσουμε" (αντιγραφή) όλο το wiki από το site-gr με command line στο καινούργιο αποθετήριο όταν χρειαστεί!
git clone https://github.com/ioniodi/site-gr.wiki.git
... προσθέτουμε σαν remote το wiki repo του καινούργιου αποθετηρίου και κάνουμε push 🎉
Ότι νομίζετε για την γρήγορη μεταφορά, απλά αν κάποιος δουλεύει ενεργά σε κάποιο PR για τα Δύσκολα να τον περιμένουμε μέχρι να τελειώσει. Πιστεύω σύντομα θα έχουν τελειώσει όλοι με τα PR τους για τα δύσκολα. Μετά είναι το μόνο εύκολο να βρούμε κάποια μικρά πράγματα να αλλάξουμε.. έχουμε 2 εβδομάδες ακόμη τουλάχιστον.
Κάποια σχόλια για κάτι τεστ που τρέχω σε δικά μου dummy αποθετήρια.
Τελικά κατάφερα να αντιγράψω το wiki από ένα αποθετήριο σε ένα άλλο. Όπως φαίνεται στην εικόνα έχουμε 2 github αποθετήρια testing01 και testing02 με τα δικά τους wiki που είναι ολόιδια, τσέκαρα και τα commits στα ιστορικά των wiki pages και ειναι ακριβώς τα ίδια hashes άρα είναι ολόιδια.

Links: https://github.com/constantinexisc/testing01/wiki/second-page-test/_history https://github.com/constantinexisc/testing02/wiki/second-page-test/_history
Βγήκε λίγο πρόβλημα γιατί όποιος χρησιμοποιεί ssh δεν μπορεί να κάνει την δουλειά αυτή γιατί το git σου δίνει μόνο το https link για να κάνεις clone τα αποθετήρια των wikis. Πρέπει με το χέρι να μετατρέψεις το https σε ssh format link git@github.com:constantinexisc/testing02.wiki.git για να δουλέψει. Μετά η διαδικασία ήταν όπως την σχολίασα πιο πάνω.

=> Επίσης υπάρχει τρόπος να μεταφερθούν όσα και όποια issues θέλουμε που είναι ανοιχτά ή δεν έχουν λυθεί στο νέο αποθετήριο, το δοκίμασα και αυτό, δυστυχώς θα πρέπει να το κάνω με το χέρι ένα-ένα η να προσπαθήσω με κάποια browser plugins που κοίταξα, από το github καθεαυτού δεν γίνεται να κάνουμε mass transfer των θεμάτων.

=> Δώστε μου λίγο χρόνο ακόμη να τρέξω τις εντολές σε cloned αποθετήριο ενημερωμένο με το site όπως είναι τώρα, να τις κάνω push σε ένα καινούργιο repo και να το κάνω deploy στο netlify σαν τελική επιβεβαίωση..
=> Το μόνο που δεν βρήκα τρόπο να μεταφέρω είναι τα pull requests.
=> Edit: updated repo: https://github.com/constantinexisc/site-gr-final deploy: https://suspicious-hugle-28f74c.netlify.app/index