Αλλαγή committer name σε hg repositories
George Notaras
gnot at g-loaded.eu
Fri Mar 30 18:51:53 EEST 2012
On 29/3/2012 1:18 πμ, George Notaras wrote:
> On 28/3/2012 11:03 μμ, Giorgos Keramidas wrote:
>> 2012/3/28 George Notaras <gnot at g-loaded.eu>:
>>>> FWIW, υπάρχει τρόπος να βρεις από ποιο "old changeset id" βγήκε
>>>> κάθε νέο commit id στο converted repository. Η αντιστοιχία σώζεται
>>>> στο αρχείο ".hg/shamap" στο target repository του conversion.
>>>> Με λίγο scripting μπορείς να βρεις το νέο changeset id οποιουδήποτε
>>>> παλιού commit και να κάνεις update σε αυτό.
>>>
>>> Αχά! Το ".hg/shamap" ακούγεται πολύ χρήσιμο. Αν το ήξερα πιο πριν, θα
>>> βασιζόμουν πιθανότατα σε αυτό και όχι στο revision number.
>>>
>>> Από την άλλη, επειδή έκανα ήδη το conversion (έχω κρατήσει backup τα
>>> παλιά βέβαια :P), αυτό που παρατήρησα είναι ότι το revision number του
>>> κάθε changeset στο repository που προκύπτει από το conversion είναι
>>> ακριβώς το ίδιο me to revision number που είχε το ίδιο changeset στο
>>> original repository. Δηλαδή τα revision numbers (ή local identifiers -
>>> αν χρησιμοποιώ σωστά την ορολογία) δεν φαίνεται να αλλάζουν.
>>
>> Αυτό έτυχε να συμβαίνει στο δικό σου repository, επειδή το hg προσπαθεί
>> να διατηρήσει την ίδια "τοπολογία" στο γράφο του source history όπου
>> αυτό είναι δυνατόν.
>>
>> ΠΡΟΣΟΧΗ όμως, δεν ισχύει πάντα. Π.χ. αν χρησιμοποιήσεις τα options:
>>
>> hg convert --branchsort
>> hg convert --datesort
>>
>> Στο help του convert extension λέει το εξής:
>>
>> % hg help convert
>> [...]
>> By default, all sources except Mercurial will use --branchsort. Mercurial
>> uses --sourcesort to preserve original revision numbers order. Sort modes
>> have the following effects:
>>
>> --branchsort convert from parent to child revision when possible, which
>> means branches are usually converted one after the other.
>> It generates more compact repositories.
>> --datesort sort revisions by date. Converted repositories have good-
>> looking changelogs but are often an order of magnitude
>> larger than the same ones generated by --branchsort.
>> --sourcesort try to preserve source revisions order, only supported by
>> Mercurial sources.
>>
>> Οπότε στη δική σου περίπτωση επειδή το source repository είναι τύπου
>> Mercurial και επειδή _μπορούσε_ να γίνει conversion με 'sourcesort',
>> έτυχε να ισχύει αυτό που λες με τα local revision numbers.
>>
>
> Έχεις δίκιο. Ο Σωστός(ΤΜ) τρόπος είναι να γίνει η επαναφορά του state
> χρησιμοποιώντας το changeset id, αφού πρώτα γίνει η αντιστοιχία
> παλιού->καινούριου μέσω του shamap.
>
> Οπότε το παραπάνω θα γίνει κάπως έτσι:
> ________________________________
> #! /usr/bin/env bash
>
> REPOS_ROOT="."
> AUTHOR_MAPPINGS="
> myoldname = FirstName LastName <me at example.org>
> "
>
> echo
> # First reset the authors.map file
> echo "info: reseting authors.map..."
> echo $AUTHOR_MAPPINGS > authors.map
>
> for repo in $REPOS_ROOT/*
> do
> test -d $repo/.hg && \
> echo "info: found hg repository at $repo" || continue
>
> echo "info: storing the id of the current changeset of $repo"
> CUR_ID=`hg -q -R $repo identify -i | sed 's#\+$##'`
>
> echo "info: converting the repository using author mappings..."
> # A temporary repository is created to hold updated history
> hg -q convert -s hg -d hg -A authors.map $repo $repo-tmp
>
> echo "info: moving updated history back to $repo..."
>
> # Step 1: Update the state of the temporary repository
> # to the CUR_ID changeset
>
> # First, translate the old id to the new id using
> # repo-new/.hg/shamap
> NEW_ID=`grep $CUR_ID $repo-tmp/.hg/shamap | \
> cut -d ' ' -f 2 | cut -c -13`
> # Update the state of the temporary repo to the NEW_ID
> hg -q -R $repo-tmp update $NEW_ID
>
> # Step 2: Now move the history back to the original repository
>
> # Delete .hg directory from the original repository
> rm -fr $repo/.hg
> # Move the .hg directory from the temporary repo
> # to the original repo
> mv $repo-tmp/.hg $repo/
> # Delete the temporary repo directory
> rm -rf $repo-tmp
>
> echo "info: ok"
> echo
> -----------------------------------------------------------------------
>
> done | tee hg-convert.log
>
> echo "operation complete"
> __________________________
>
>
> Ωραία. Βρέθηκε η άκρη. Τώρα πρέπει να τα ξανακάνω δηλαδή;
>
Υπάρχει ακόμη μια μικρή λεπτομέρεια. Εάν διατηρούμε tags, τότε η πρώτη
δουλειά που θα πρέπει να γίνει μόλις παραλάβουμε το repository με το
updated history είναι να κάνουμε *revert* το αρχείο .hgtags, ώστε να
περιέχει τα updated hashes.
Το τονίζω, γιατί κυκλοφορούν και κάποιοι (μα ποιος άραγε;) που μόλις
δουν ότι το αρχείο με τα tags περιέχει uncommited changes, θα σπεύσουν
να το κάνουν commit χωρίς σκέψη και περισυλλογή και μετά θα
αναρωτιούνται γιατί το ``hg tags`` δεν δείχνει τα παλιά tags.
More information about the Linux-greek-users
mailing list