Dr.Fuzzy Δημοσ. 23 Μαρτίου 2019 Μέλος Δημοσ. 23 Μαρτίου 2019 (επεξεργασμένο) Άσχετο αλλά το κάνω post εδώ για να μην ανοίγω καινούριο θέμα. Υπάρχει κάτι αντίστοιχο στο git με το $Id$ που υπάρχει στο CVS και SVN; Επεξ/σία 23 Μαρτίου 2019 από Dr.Fuzzy
imitheos Δημοσ. 23 Μαρτίου 2019 Δημοσ. 23 Μαρτίου 2019 10 ώρες πριν, Dr.Fuzzy είπε Άσχετο αλλά το κάνω post εδώ για να μην ανοίγω καινούριο θέμα. Υπάρχει κάτι αντίστοιχο στο git με το $Id$ που υπάρχει στο CVS και SVN; Εγγενής υποστήριξη δεν υπάρχει. Υπάρχουν διάφορες hackιές όπως pre-commit hooks και gitattributes αλλά αν δεν έχεις μια καλή εμπειρία με το git, μην μπλέξεις μαζί τους. Η διαδικασία είναι η εξής: Αντίστοιχα με το αρχείο .gitignore στο οποίο εισάγεις patterns προς αγνόηση, υπάρχει και το αρχείο .gitattributes στο οποίο ορίζεις patterns για διάφορες μετατροπές όπως πχ να γίνονται diff με κάποιο συγκεκριμένο πρόγραμμα (πχ για συμπιεσμένα ή κρυπτογραφημένα αρχεία), να αλλάζει ο χαρακτήρας αλλαγής γραμμής ώστε να μην έχεις προβλήματα σε repos που οι devs δουλεύουν windows, unix, mac, κτλ. Ένα από αυτά τα patterns είναι το ident το οποίο κάνει περίπου αυτό που θέλεις % mkcd tmp.repo % git init Initialized empty Git repository in /tmp/tmp.repo/.git/ % cat > tmp.sh << EOF #!/bin/bash # \$Id\$ echo Hello World EOF % git add tmp.sh % git ci -m "add tmp.sh" [master (root-commit) ff19510] add tmp.sh 1 file changed, 3 insertions(+) create mode 100644 tmp.sh Όπως βλέπεις δημιούργησα ένα repo που περιέχει ένα απλό shell script στο οποίο έβαλα μέσα το string $Id$ με κεφαλαίο γιώτα και μικρό ντι. % echo "*.sh ident > .gitattributes % git add .gitattributes % git ci -m "add gitattributes so clones behave the same way" [master c9b5dd2] add gitattributes so clones behave the same way 1 file changed, 1 insertion(+) create mode 100644 .gitattributes Δημιούργησα ένα αρχείο με όνομα .gitattributes το οποίο περιέχει το pattern "*.sh ident" δηλαδή μόνο στα αρχεία .sh θα ψάχνει να βρει τους χαρακτήρες $Id$ και θα τους αλλάζει με το εκάστοτε id. % cat tmp.sh #!/bin/bash # $Id$ echo Hello World % rm tmp.sh % git co tmp.sh Updated 1 path from the index % cat tmp.sh #!/bin/bash # $Id: 54753734acabb47888cc3f64491398cea190e6de $ echo Hello World Κάνοντας cat το αρχείο, δεν βλέπω πουθενά να έχει αλλάξει κάτι. Αυτό γίνεται επειδή το git ελέγχει τα περιεχόμενα μόνο κατά το checkout άρα πρέπει να κάνουμε κάποια αλλαγή (πχ να αλλάξουμε branch σε κάποιο άλλο που έχει διαφορετικό tmp.sh, να το σβήσουμε, κτλ). Σβήνοντας το και κάνοντας το πάλι checkout, βλέπουμε ότι περιέχει το sha1 hash id του αρχείου. % git cat-file -t 54753734acabb47888cc3f64491398cea190e6de blob % git cat-file -p 54753734acabb47888cc3f64491398cea190e6de #!/bin/bash # $Id$ echo Hello World % git status Στον κλάδο master δεν υπάρχει τίποτα προς υποβολή, το δέντρο εργασίας είναι καθαρό Τρέχοντας τις χαμηλού επιπέδου plumbing εντολές του git, βλέπουμε ότι στο repo το αρχείο έχει αποθηκευτεί με "$Id$" εννοείται. Όλοι οι μετασχηματισμοί γίνονται από το git μόνο στο working tree κατά το checkout, και ξέρει να τις αντιστρέψει πριν οποιαδήποτε εργασία για αυτό και βλέπουμε ότι το status δεν μας δείχνει ότι έχουμε αλλαγμένο αρχείο tmp.sh. Λόγω αυτής της λειτουργίας όμως, πολλές φορές όμως δημιουργούνται προβλήματα και τα attributes συστήνεται να αποφεύγονται εκτός αν η χρήση τους είναι απολύτως απαραίτητη. 2
Dr.Fuzzy Δημοσ. 23 Μαρτίου 2019 Μέλος Δημοσ. 23 Μαρτίου 2019 @imitheos ωραίο write up, ευχαριστώ! Θα το δοκιμάσω απλά για να ικανοποιήσω την περιέργεια μου, αλλά μάλλον δε θα το χρησιμοποιήσω καθότι όντως hackιά.
pmav99 Δημοσ. 23 Μαρτίου 2019 Δημοσ. 23 Μαρτίου 2019 3 hours ago, imitheos said: pre-commit hooks Δεν έχει σχέση με αυτό που ρώτησες, αλλά παρεπιπτόντως, ειδικά για τα pre-commit hooks υπάρχει το https://pre-commit.com/ το οποίο έχω αρχίσει να το χρησιμοποιώ τελευταία και είναι νομίζω πολύ χρήσιμο για linting, enforcing style guides κτλ.
pmav99 Δημοσ. 11 Ιουνίου 2019 Δημοσ. 11 Ιουνίου 2019 Έγραψα ένα script-άκι που επιτρέπει να κάνεις κατά βούληση edit στα: AUTHOR_NAME AUTHOR_EMAIL AUTHOR_DATE COMMITTER_NAME COMMITTER_EMAIL COMMITTER_DATE Το script ονομάζεται git-rewrite και μπορείτε να το βρείτε στο github Για να τρέξει απαιτεί python 3.7. Πιθανά να παίζει και σε python 3.6 αλλά δεν το έχω τεστάρει. Δεν έχει 3rd party dependencies. μπορείτε να το κατεβάσετε ως εξής: wget https://raw.githubusercontent.com/pmav99/git-rewrite/master/git_rewrite/__init__.py -O git-rewrite chmod +x git-rewrite Η διαδικασία είναι η εξής: 1. Διαλέγεις το root commit. Έστω ότι το hash του είναι το a84477f 2. Tρέχεις το script χρησιμοποιώντας το subcommand "dump": "git-rewrite dump a84477f". Η εντολή αυτή σώζει τα commit data σε ένα αρχείο JSON. { "root_hash": "a84477f", "commits": [ { "commit_hash": "6726ad10be585c21c38726630f7dadf85833f10f", "author_name": "John Doe", "author_email": "[email protected]", "author_date": "Thu Jun 6 15:51:30 2019 +0300", "committer_name": "john Doe", "committer_email": "[email protected]", "committer_date": "Thu Jun 6 15:53:56 2019 +0300" }, { "commit_hash": "4bf077761d21090b46f178b5da534fb9a9da0ca9", "author_name": "John Doe", "author_email": "[email protected]", "author_date": "Thu Jun 6 18:12:34 2019 +0300", "committer_name": "John Doe", "committer_email": "[email protected]", "committer_date": "Thu Jun 6 18:12:34 2019 +0300" } ] } 3. Κάνεις edit στο αρχείο JSON και αλλάζεις όποιο field θέλεις (πχ με sed) 4. Τρέχεις για δεύτερη φορά το script χρησιμοποιώντας το subcommand "apply": "git-rewrite apply" Το script θα δημιουργήσει ένα νέο branch και θα κάνει "git cherry pick" και "git commit --amend" σε όλα τα commits. Δεν το έχω τεστάρει ιδιαίτερα, αλλά δεν έχω βρει και κάτι που να μη δουλεύει. Καθώς δουλεύει σε νέο branch και κάνει cherry-pick δεν νομίζω ότι υπάρχει κανένας κίνδυνος για να το τεστάρει κάποιος. 1 1
vadou Δημοσ. 11 Ιουνίου 2019 Δημοσ. 11 Ιουνίου 2019 4 ώρες πριν, pmav99 είπε Δεν το έχω τεστάρει ιδιαίτερα, αλλά δεν έχω βρει και κάτι που να μη δουλεύει. Αυτό είναι λίγο τρομακτικό 😛
imitheos Δημοσ. 11 Ιουνίου 2019 Δημοσ. 11 Ιουνίου 2019 23 λεπτά πριν, vadou είπε Αυτό είναι λίγο τρομακτικό 😛 Τρομακτικό ή όχι, σε alpha testing είναι δύσκολο να κάνεις trigger τα πάντα. Για αυτό υπάρχει και το beta testing που αναλαμβάνουν οι χρήστες. Πάντα μπορείς να βασιστείς σε χρήστες να έχουν κάποιο τρελό workflow που να κάνει expose κάτι που δεν θα σκεφτόταν ποτέ κανείς Εκτός αυτού, ούτε πολύ τρομακτικό είναι όταν υπάρχει το reflog και μπορείς να διορθώσεις ό,τι βλακεία και να γίνει με το script του pmav99.
vadou Δημοσ. 11 Ιουνίου 2019 Δημοσ. 11 Ιουνίου 2019 (επεξεργασμένο) @imitheos Ναι βρε, πλάκα κάνω. Μου θύμισε λίγο famous last words Thanks για τη διευκρίνηση πάντως. Παρόλο που χρησιμοποιώ καθημερινά git, οι γνώσεις μου περιορίζονται στα βασικά. Δεν μου έχουν χρειαστεί - ή καλύτερα, επειδή δεν έχω ασχοληθεί τόσο πολύ, νομίζω εσφαλμένα ότι δε μου χρειάζονται - ιδιαίτερα advanced πράγματα. Επεξ/σία 11 Ιουνίου 2019 από vadou
pmav99 Δημοσ. 12 Ιουνίου 2019 Δημοσ. 12 Ιουνίου 2019 (επεξεργασμένο) @vadou έχεις δίκιο γιατί δεν εκφράστηκα με αρκετή σαφήνεια. Το script δεν αλλάζει την ιστορία από μόνο του. Απλά φτιάχνει ένα νέο branch με αλλαγμένη ιστορία και το αφήνει στο χρήστη να διαλέξει αν θα τρέξει git reset --hard git push --force οι οποίες είναι και οι εντολές που αλλάζουν την ιστορία (locally και remotely αντίστοιχα). Έκανα λίγο πιο αναλυτικό το readme και πρόσθεσα μερικά tests. Αν θες ρίξε ένα μάτι: https://github.com/pmav99/git-rewrite Επεξ/σία 12 Ιουνίου 2019 από pmav99
vadou Δημοσ. 12 Ιουνίου 2019 Δημοσ. 12 Ιουνίου 2019 Τώρα είναι κάπως πιο ξεκάθαρα τα πράγματα. Θέλω να συνεισφέρω και εγώ λίγο μέσω της άγνοιάς μου, σε περίπτωση που έχουν και άλλοι τις ίδιες απορίες. Κάποια πράγματα που δεν ήξερα: Στα commit meta, διαφορά μεταξύ author και commiter: Αναφορά σε κείμενο You may be wondering what the difference is between author and committer. The author is the person who originally wrote the patch, whereas the committer is the person who last applied the patch. So, if you send in a patch to a project and one of the core members applies the patch, both of you get credit — you as the author and the core member as the committer. Τι κάνει το git commit --amend: Καλή εξήγηση με παραδείγματα από την atlassian. Τι είναι το cherry-pick στο git: Απάντηση στο SO 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα