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

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

Δημοσ.

Στο αρχικό μήνυμα έλεγες ότι έκανες rebase -i για αυτό σου έγραψα όλη την χειροκίνητη διαδικασία. Για κάποιο λόγο το --c..author-date δεν παίζει σε interactive rebase. Αν δεν μιλάμε για interactive rebase, τότε ναι μπορείς να το κάνεις κατευθείαν.

Δημοσ.

Ναι τελικά το έκανα κατευθείαν και γλύτωσα και το ποβλημα με τα CR. Τελευταίες δυο ερωτήσεις, έστω το παρακάτω log:

commit 32323b3be08d197783c3bff3e463750d42c47e98
Author:     Imitheos <[email protected]>
AuthorDate: Tue Jun 6 19:52:36 2017 +0300
Commit:     Imitheos <[email protected]>
CommitDate: Tue Jun 6 19:52:36 2017 +0300

    Implement blah blah
    Update README 

commit 2dba928652cdb3b261c7175d4e65ea0350278eca
Author:     Dr.Fuzzy <[email protected]>
AuthorDate: Wed Feb 1 14:51:27 2017 +0200
Commit:     Dr.Fuzzy <[email protected]>
CommitDate: Wed Feb 1 14:51:27 2017 +0200

    Remove blah blah

commit 1574f8806097ea863fe1cabec8a3624b81a466eb
Author:     delk <[email protected]>
AuthorDate: Fri Mar 18 14:18:27 2016 +0200
Commit:     Dr.Fuzzy <[email protected]>
CommitDate: Fri Mar 18 14:18:27 2016 +0200

    Add blah blah
    Add README

commit 1ff5045716c5235720b543769a005b5d0d33e373
Author:     delk <[email protected]>
AuthorDate: Mon Nov 16 02:20:08 2015 +0200
Commit:     delk <[email protected]>
CommitDate: Mon Nov 16 02:20:08 2015 +0200

    Initial commit

1. O user delk=Dr.Fuzzy, αλλά το commit εγινε σε διαφορετικά μηχανήματα και το git user και mail environment ήταν διαφορετικά ορισμένα. Μπορώ να αλλάξω στο 1ο commit 1ff5045716c5235720b543769a005b5d0d33e373 το Commit user/mail απο delk <[email protected]> σε Dr.Fuzzy <[email protected]> χωρίς όμως α. να διαφοροποιηθεί το CommitDate σε σχέση με το AuthorDate, β. να μην αλλάξουν τα Commit/CommitDate στα απο πάνω commits; Κάνοντας git rebase -i --root --committer-date-is-author-date επηρεάζει και όλα τα άλλα εκτός από το 1o commit.

 

2. Μπορώ να κάνω το Commit=Author στα πρώτα 3 commits εκτος του HEAD (32323b3be08d197783c3bff3e463750d42c47e98) με την προυπόθεση ότι πρώτα εχει γίνει επιτυχώς το 1., χωρίς να διαφοροποιηθούν τα CommitDate σε σχέση με τα AuthorDate;

 

Imithee βρίσε ελεύθερα... :-D

Δημοσ.

Με τις ημερομηνίες και τους authors μπορείς να κάνεις ό,τι θέλεις. Όσον αφορά το β "να μην αλλάξουν τα Commit/CommitDate" αν όπου Commit εννοείς το sha1 hash, τότε όχι δεν μπορείς. Εφόσον θα αλλάξει ο χρήστης (ή η ημερομηνία ή το tree ή οτιδήποτε απαρτίζει ένα commit), τότε θα αλλάξει το commit hash και κατά συνέπεια οποιοδήποτε commit από εκεί και πέρα μια και θα αλλάξει ο parent του.

  • Like 1
Δημοσ.

ΟΚ, πάντως δεν εχω καταλάβει τη λογική πίσω απο το αν αλλάξει o user του parent commit να πρέπει να αλλάξει το CommitDate των children commits.

Δημοσ.

Το hash του commit μαγειρεύει μέσα ένα κάρο πράγματα, βασικά metadata του εαυτού του, αλλά επιπλέον και το hash του parent commit.

 

Οπότε αν έχεις commits Α -> Β και κάτι αλλάξει στο Α, ακόμα και το πιο ασήμαντο κομμάτι metadata, δεν είναι πλέον το commit A αλλά το A'. Το Β με τη σειρά του αφού πλέον δεν έχει parent το A δεν είναι το B αλλά το Β', που είναι ένα τελείως μα τελείως καινούριο commit "παντελώς άσχετο" με το Β, "απλά τυχαίνει" να κωδικοποιεί το ίδιο changeset. Και αφού είναι καινούριο διαφορετικό commit τότε προφανώς έχει δικό του καινούριο date κλπ.

  • Like 1
Δημοσ.

Δεν το εξηγώ καλά μάλλον και σε μπερδεύω.

 

Όταν αλλάζει ο author ενός commit φυσικά και _ΔΕΝ_ χρειάζεται να αλλάξει η CommitDate. Δεν είπα ποτέ κάτι τέτοιο. Αυτό που είναι υποχρεωτικό να αλλάξει είναι το Commit SHA1 Hash.

  • Like 1
Δημοσ.

Αμ ΟΚ τοτε, μα και εμένα μου φάνηκε περίεργο ! Δε με απασχολεί να αλλάξει το SHA1 hash καθόλου. Αν μπορεις πες μου πως θα πετύχω τα 1 και 2 με τους περιορισμούς που εχω στο προηγούμενο post μου γιατι με αυτα που δοκίμασα μέχρι στιγμής δεν τα εχω καταφέρει.

Δημοσ.

Υπάρχουν πολλοί τρόποι να γίνει αυτό αλλά δεν θυμάμαι αν κάποιος θεωρείται πιο δόκιμος και έχω την εντύπωση ότι όλοι θα αλλάξουν την commitdate οπότε μετά θα χρειαστεί να κάνεις αυτό που περιγράψαμε πριν.

 

Ένας τρόπος που μου ήρθε στο μυαλό είναι να τρέξεις interactive rebase και να επιλέξεις edit αντί για pick στα commit με λάθος author οπότε θα σταματάει το rebase εκεί και θα μπορείς να τρέξεις git commit --ammend για να διορθώσεις το commit. Για να αλλάξεις τον author είτε θα έχεις κάνει export τις απαραίτητες μεταβλητές (GIT_AUTHOR_NAME/EMAIL και αντίστοιχα για committer) ή να σαν επιλογή στο git-commit "--author τάδε"

 

Ο κλασικός τρόπος που προτείνεται για να πειράξεις οτιδήποτε στο repo είναι το filter-branch. Από ό,τι θυμάμαι (και από ό,τι λέπω στην manpage) εσύ θέλεις το env-filter μια και θέλεις να πειράξεις το authorship.

 

git filter-branch --env-filter '
                   if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
                   then
                           [email protected]
                   fi
                   if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
                   then
                           [email protected]
                   fi
           ' -- --all
Το παράδειγμα που έχει στην manpage είναι το παραπάνω οπότε εσύ θα βάλεις τα δικά σου και επίσης θα προσθέσεις 2 if ακόμη για τα _NAME αντί για _EMAIL.
  • Like 1
Δημοσ.

Σ' ευχαριστω πολυ. Κοίτα, ο 1ος τρόπος που περιγράφεις τον δοκίμασα και απο εκεί έβγαλα τους περιορισμούς που έθεσα στα 1 και 2. Κοντολογίς δεν κατάφερα να διατηρήσω όλους του περιορισμούς (διατηρώντας ενα περιορισμό αναιρούσα κάποιον άλλο, κοκ).

 

Θα δοκιμάσω το 2ο τροπο με filter-branch και θα ενημερώσω.

Δημοσ.

Καταρχήν θέλω να ευχαριστήσω τον Imitheo για τη βοήθεια και την υπομονή του να μου απαντήσει σε όλες τις ψυχαναγκαστικές μου ερωτήσεις!

 

Συνοπτικά:

 

έφτιαξα τις ημερομηνίες με:

git rebase --committer-date-is-author-date SHA 

και τα διαφορετικά ονόματα και mail με (διατηρώντας τα tags):

git filter-branch --env-filter '
                   if test "$GIT_AUTHOR_EMAIL" = "[email protected]"
                   then
                           [email protected]
                   fi
                   ...
           ' --tag-name-filter cat -- --all

 και τέλος έκανα push (commits, tags) στο remote:

git push -f origin master
git push -f origin --tags

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...