Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Άσχετο αλλά το κάνω post εδώ για να μην ανοίγω καινούριο θέμα.

Υπάρχει κάτι αντίστοιχο στο git με το $Id$ που υπάρχει στο CVS και SVN;

Επεξ/σία από Dr.Fuzzy
Δημοσ.
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 συστήνεται να αποφεύγονται εκτός αν η χρήση τους είναι απολύτως απαραίτητη.

  • Thanks 2
Δημοσ.

@imitheos ωραίο write up, ευχαριστώ! Θα το δοκιμάσω απλά για να ικανοποιήσω την περιέργεια μου, αλλά μάλλον δε θα το χρησιμοποιήσω καθότι όντως hackιά.

Δημοσ.
3 hours ago, imitheos said:

pre-commit hooks

Δεν έχει σχέση με αυτό που ρώτησες, αλλά παρεπιπτόντως, ειδικά για τα pre-commit hooks υπάρχει το https://pre-commit.com/ το οποίο έχω αρχίσει να το χρησιμοποιώ τελευταία και είναι νομίζω πολύ χρήσιμο για linting, enforcing style guides κτλ.

  • 2 μήνες μετά...
Δημοσ.

Έγραψα ένα 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 δεν νομίζω ότι υπάρχει κανένας κίνδυνος για να το τεστάρει κάποιος.

 

  • Like 1
  • Thanks 1
Δημοσ.
4 ώρες πριν, pmav99 είπε

Δεν το έχω τεστάρει ιδιαίτερα, αλλά δεν έχω βρει και κάτι που να μη δουλεύει.

Αυτό είναι λίγο τρομακτικό 😛

Δημοσ.
23 λεπτά πριν, vadou είπε

Αυτό είναι λίγο τρομακτικό 😛

Τρομακτικό ή όχι, σε alpha testing είναι δύσκολο να κάνεις trigger τα πάντα. Για αυτό υπάρχει και το beta testing που αναλαμβάνουν οι χρήστες. Πάντα μπορείς να βασιστείς σε χρήστες να έχουν κάποιο τρελό workflow που να κάνει expose κάτι που δεν θα σκεφτόταν ποτέ κανείς :)

Εκτός αυτού, ούτε πολύ τρομακτικό είναι όταν υπάρχει το reflog και μπορείς να διορθώσεις ό,τι βλακεία και να γίνει με το script του pmav99.

Δημοσ. (επεξεργασμένο)

@imitheos Ναι βρε, πλάκα κάνω. Μου θύμισε λίγο famous last words ;)
Thanks για τη διευκρίνηση πάντως. Παρόλο που χρησιμοποιώ καθημερινά git, οι γνώσεις μου περιορίζονται στα βασικά.
Δεν μου έχουν χρειαστεί - ή καλύτερα, επειδή δεν έχω ασχοληθεί τόσο πολύ, νομίζω εσφαλμένα ότι δε μου χρειάζονται - ιδιαίτερα advanced πράγματα.

Επεξ/σία από vadou
Δημοσ. (επεξεργασμένο)

@vadou έχεις δίκιο γιατί δεν εκφράστηκα με αρκετή σαφήνεια.

Το script δεν αλλάζει την ιστορία από μόνο του. Απλά φτιάχνει ένα νέο branch με αλλαγμένη ιστορία και το αφήνει στο χρήστη να διαλέξει αν θα τρέξει

  • git reset --hard
  • git push --force

οι οποίες είναι και οι εντολές που αλλάζουν την ιστορία (locally και remotely αντίστοιχα).

Έκανα λίγο πιο αναλυτικό το readme και πρόσθεσα μερικά tests. Αν θες ρίξε ένα μάτι: https://github.com/pmav99/git-rewrite

Επεξ/σία από pmav99
Δημοσ.

Τώρα είναι κάπως πιο ξεκάθαρα τα πράγματα.
Θέλω να συνεισφέρω και εγώ λίγο μέσω της άγνοιάς μου, σε περίπτωση που έχουν και άλλοι τις ίδιες απορίες.
Κάποια πράγματα που δεν ήξερα:

Στα 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

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...