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

George Notaras gnot at g-loaded.eu
Wed Mar 28 15:59:52 EEST 2012


On 28/3/2012 11:57 πμ, Giorgos Keramidas wrote:
> 2012/3/27 George Notaras <gnot at g-loaded.eu>:
>>> Επίσης μπορείς να δημιουργήσεις ένα νέο repository, με τα σωστά
>>> committer names, χρησιμοποιώντας το authormap flag του
>>> convert extension
> 
>> Ευχαριστώ. Χαίρομαι που αυτή είναι η ενδεδειγμένη λύση, γιατί αυτό
>> ακριβώς σκόπευα να κάνω.
>>
>> Επειδή τα repositories έχουν 1) uncommitted changes και 2) αρχεία που
>> δεν υπόκεινται σε version control και θέλω να τα παραλάβω από όλη αυτή
>> τη διαδικασία όπως *ακριβώς* είναι τώρα με τη μόνη αλλαγή το όνομα του
>> committer, σκέφτομαι να ακολουθήσω την παρακάτω διαδικασία για κάθε
>> repository:
>>
>> ---------------------------------------
>> # Store local revision number of repo-old
>> CUR_REV=`hg -q -R repo-old identify -n | sed 's#\+$##'`
>>
>> # Convert repo-old using author map -> gives repo-new
>> hg -q convert -s hg -d hg -A authors.map repo-old repo-new
>>
>> # Update repo-new to the CUR_REV revision
>> hg -R repo-new update $CUR_REV
>>
>> # Now move the .hg directory of repo-new to repo-old and delete repo-new
>> rm -fr repo-old/.hg
>> mv repo-new/.hg repo-old/
>> rm -fr repo-new
>> ---------------------------------------
>>
>> Όλα αυτά βασίζονται στην υπόθεση ότι το νέο repository (repo-new) που θα
>> προκύψει από το conversion έχει *ακριβώς* τα ίδια revision numbers στα
>> αντίστοιχα changesets με το παλιο (repo-old). Ισχύει αυτό, έτσι δεν
>> είναι; Επίσης, αν βλέπεις κάτι στραβό με τη διαδικασία (ή φυσικά
>> οποιοσδήποτε άλλος), please let me know!
> 
> Τα hash που λειτουργούν ως identifiers των changesets ΔΕ θα ειναι
> ιδια μετά.  Μη βασιστεις σε αυτό.
> 
> 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 -
αν χρησιμοποιώ σωστά την ορολογία) δεν φαίνεται να αλλάζουν.

> Γιατί χρειάζεται αυτό όμως; Αν έχεις uncommitted αλλαγές γιατί
> δεν τις κάνεις πρώτα commit, να χεις και το κεφάλι σου ήσυχο ότι
> δε θα τις χάσεις επειδή ξεχάστηκες κι έτρεξες τη λάθος εντολή
> στο λάθος working directory;

Νομίζω ότι θα μου πάρει πολύ περισσότερο χρόνο να κάνω commit τα
uncommitted changes και να ψάξω να βρω τα αρχεία που δεν υπόκεινται σε
version control μέσα στο κάθε original repository και να τα μεταφέρω στο
repository που θα προκύψει από το conversion.

Το να φέρω το repository που προκύπτει από το conversion στο ίδιο state
που ήταν το original και στη συνέχεια να αντικαταστήσω το history του
original repo με το νέο history μου φαίνεται πρακτικά πιο γρήγορο και
*μάλλον* δεν υπάρχει λόγος να μην δουλέψει. Από όσο πρόλαβα να δω τα νέα
repositories δεν έχουν προβλήματα όταν κάνω update σε κάποιο προηγούμενο
changeset. Αλλά, εντάξει, έχω και backup τα original για παν ενδεχόμενο.

Παρακάτω παραθέτω το script που χρησιμοποίησα. Ελπίζω να μην χρειαστεί
σε κανέναν, αλλά αν χρειαστεί να αλλάξετε το committer name, here it is:
_____________________________________________________________
#! /usr/bin/env bash

REPOS_ROOT="."
AUTHOR_MAPPINGS="
myoldname = FirstName LastName <me at example.org>
"

echo
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 local revision number of the \
current state of $repo..."
    CUR_REV=`hg -q -R $repo identify -n | 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_REV revision
    hg -q -R $repo-tmp update $CUR_REV

    # 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"
________________________________________________________________

Ελπίζω να φαίνεται σωστά.

ΟΔΗΓΙΕΣ

1. Βάζετε τα repositories στον ίδιο κατάλογο με το script ή στον
κατάλογο που έχετε βάλει στο ``REPOS_ROOT`` (no trailing slash)
2. Βάλτε τα author mappings στο ``AUTHOR_MAPPINGS``
3. Run script


More information about the Linux-greek-users mailing list