Αλλαγή 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