Αλλαγή committer name σε hg repositories

George Notaras gnot at g-loaded.eu
Thu Mar 29 01:18:06 EEST 2012


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"
__________________________


Ωραία. Βρέθηκε η άκρη. Τώρα πρέπει να τα ξανακάνω δηλαδή;


More information about the Linux-greek-users mailing list