svn branching

Giorgos Keramidas keramida at ceid.upatras.gr
Mon May 7 17:40:52 EEST 2007


On 2007-05-07 16:18, Harris Kosmidhs <hkosmidi at softnet.tuc.gr> wrote:
> Sorry gia to slightly off-topic.
>
> Caxno kanena katanohto documentation/tutorial gia to svn kai basika
> sto 8ema tou branching.  (o keramidas se paliotero post eixe proteinei
> kapoia tools gia branching alla de 8elo na 3efygo apo to svn pou exo
> sthmeno)
>
> Xrhsimopoio to svn gia na krataei version ton web pages pou kano. 8elo
> na kano kati pou mou fainetai logiko na mporei kapoios na kanei me to
> svn.
>
> 8elo na alla3o px 5-10 selides (as poume apo html se xhtml) alla oxi
> sto version pou einai productive auth th stigmh. An autes oi allages
> pai3oun sosta tote na ensomato8oun stis kanonikes version ton selidon.
> Prospa8ousa se ena test repository na kano kati tetoio alla den
> kator8osa (me tortoise SVN gia win)
>
> Mporei kapoios na dosei ena hint h kanena URL gia kanena tutorial.

Το handbook του Subversion είναι πολύ καλή πηγή από οδηγίες για το
Subversion, αλλά είναι λίγο μεγάλο για να κάνεις απλά «ένα quick n'
dirty branch».

Αν δε σε πειράζει τόσο πολύ το «dirty» κομμάτι, το παρακάτω μπορεί να σε
βοηθήσει κάπως:

Υπερβολικά μικρός «οδηγός» για Subversion branches
==================================================

Ένα Subversion repository έχει, τυπικά, μια δομή που αποθηκεύει όλα τα
branches ενός project ως 'καταλόγους' κάτω από μια κύρια δομή.  Ετσι
π.χ. μπορεί το 'repository tree' να περιέχει τα εξής:

    /trunk
    /branches/foo
    /branches/bar
    /tags/foo-1.0-demo

Το σημαντικό σημείο σε αυτό το 'σχεδιασμό' είναι ότι το Subversion δεν
έχει 'tags'.  Ουσιαστικά τα directories /tags/XXXX είναι full copies από
ένα άλλο κατάλογο (lightweight, shallow copies, ευτυχώς, οπότε δεν είναι
τόσο μεγάλο το κόστος σε δίσκο για κάθε branch/tag).

Δημιουργία ενός branch
======================

Αν το repository είναι διαθέσιμο μέσω του URI:

    svn+ssh://example.net/repos/foo/trunk

Τότε ένα branch μπορεί να δημιουργηθεί με την εντολή "svn cp":

    $ svn cp svn+ssh://example.net/repos/foo/trunk \
        svn+ssh://example.net/repos/foo/branches/gker

Αυτό μπορεί να γίνει ακόμα και χωρίς διαθέσιμο 'checkout' του 'trunk'
directory (repository-to-repository copy).

Ύστερα από αυτό μπορείς να κάνεις checkout το branch με:

    $ svn co svn+ssh://example.net/repos/foo/branches/gker

Merging
=======

Το merging στο Subversion είναι σχεδόν τόσο εύκολο (και απλοϊκό στα
features που παρέχει, αλλά αυτό το ξέρεις ήδη) όσο και στο CVS.

Γενικά η διαδικασία είναι:

  [0] Δημιουργείς το branch 'gker' με "svn cp" στο changeset
      με αριθμό 1099.

  [1] Κάνεις checkout το 'trunk'

  [2] Κάνεις κάποιες αλλαγές στο trunk

      [2.1] Κάνεις commit τις αλλαγές του trunk, π.χ. με το
            changeset 1100

  [3] Κάνεις checkout το 'gker' branch σε κάποιο άλλο workspace

  [4] Κάνεις κάποιες αλλαγές στο 'gker' branch

      [4.1] Κάνεις commit τις αλλαγές του gker branch, π.χ. με
            τα changesets 1101, 1102 και 1103

  [5] Αφού κάνεις commit και στο trunk και στο branch 'gker' το
      repository έχει συνολικά revision number 1103.

  [6] Το changeset με το οποίο έγινε δημιουργία το branch 'gker'
      ήταν το 1099.  Οι αλλαγές που υπάρχουν στο repository από
      τότε που το 'gker' ήταν ισοδύναμο με το 'trunk' είναι οι:
      1099:1103.

Η εντολή "svn merge" δέχεται διάφορες μορφές από options, αλλά σε ένα
checkout από το 'gker' μπορείς να κάνεις αυτό που συνήθως είναι το
πιο χρήσιμο:

  [7] merge changes 1099:1103 from trunk to 'gker'

      $ cd gker
      $ svn merge -r 1099:1103 \
          svn+ssh://example.net/repos/foo/trunk .

Αυτό θα πάρει ότι αλλαγές έχουν γίνει μεταξύ των revisions 1099 και 1103
στο trunk (πιθανόν να μην έχουν ΟΛΑ τα ενδιάμεσα revision αλλαγές που
αλλάζουν το trunk -- δεν πειράζει τίποτα αυτό), και θα προσπαθήσει να
τις κάνει 'merge' στο working checkout του 'gker'.

Αν υπάρχει conflict, το subversion είναι λίγο χαζό, απλά θα σου αφήσει
στο working directory αρχεία όπως:

    src/bin/ls/ls.c
    src/bin/ls/ls.c.r1099
    src/bin/ls/ls.c.r1033

Εδώ θα πρέπει με το χέρι ή με κάποιο 3-way merge tool (kdiff2, meld,
filemerge, gpyfm) να κάνεις "merge" τις διαφορές που θέλεις μεταξύ των
3 αρχείων.

Σου προτείνω οπωσδήποτε κάποιο 3-way merge tool όπως το kdiff3, γιατί το
default του Subversion είναι να μην κάνει απολύτως τίποτα.

Το πιο 3-way merge tool θα χρησιμοποιήσει το Subversion για να μην σου
αφήνει τέτοια "σκουπίδια" στο workspace και σε αναγκάζει να καθαρίσεις
με το χέρι, μπορείς να το ρυθμίσεις κεντρικά στο αρχείο:

    ~/.subversion/config

ορίζοντας την παράμετρο:

    [helpers]
    diff3-cmd = kdiff3

Το μόνο που θα σε "παραξενέψει" λογικά σε λίγο καιρό είναι ότι το
Subversion δε "θυμάται" ότι έχεις κάνει merge το -r 1099:1103 από το
trunk στο 'gker' branch, οπότε την επόμενη φορά που θα θες να κάνεις
merge θα πρέπει να κοιτάξεις στο log του 'gker' branch και να βρεις
εσύ με το χέρι ποια trunk versions είναι merged, για να δώσεις ύστερα:

    $ cd gker
    $ svn merge -r 1103:1257 \
        svn+ssh://example.net/repos/foo/trunk .





More information about the Linux-greek-users mailing list