Skip to content

Latest commit

 

History

History
109 lines (82 loc) · 7.54 KB

import-svn.asc

File metadata and controls

109 lines (82 loc) · 7.54 KB

Subversion

Όπως αναφέρεται στην προηγούμενη ενότητα σχετικά με τη χρήση του git svn, μπορούμε εύκολα να χρησιμοποιήσουμε αυτές τις οδηγίες για να κλωνοποιήσουμε ένα αποθετήριο SVN με την git svn clone· στη συνέχεια, σταματούμε να χρησιμοποιούμε τον διακομιστή Subversion, ωθούμε στον νέο διακομιστή Git και αρχίζουμε να χρησιμοποιούμε αυτόν. Εάν θέλουμε το ιστορικό, αυτό είναι κάτι που μπορούμε να το πετύχουμε τόσο γρήγορα όσο γρήγορα μπορούμε να τραβήξουμε τα δεδομένα από τον διακομιστή Subversion (αυτό μπορεί να πάρει διαρκέσει αρκετά).

Ωστόσο, η εισαγωγή δεν είναι τέλεια· και επειδή θα διαρκέσει τόσο πολύ ούτως ή άλλως, ας την κάνουμε σωστά. Το πρώτο πρόβλημα είναι οι πληροφορίες του συγγραφέα. Στο Subversion, κάθε άτομο που υποβάλλει έχει έναν χρήστη στο σύστημα που καταγράφεται καταγραφεί στις πληροφορίες της υποβολής. Τα παραδείγματα στην προηγούμενη ενότητα δείχνουν schacon σε ορισμένα σημεία, όπως στις εξόδους των blame και git svn log. Εάν θέλουμε να αντιστοιχίσουμε αυτό για να βελτιώσουμε τις πληροφορίες των συγγραφέων στο Git, χρειάζεστε μια απεικόνιση από τους χρήστες του Subversion στους συγγραφείς του Git. Δημιουργούμε ένα αρχείο με όνομα users.txt που έχει αυτήν την απεικόνιση στην παρακάτω μορφή:

schacon = Scott Chacon <[email protected]>
selse = Someo Nelse <[email protected]>

Για να αποκτήσουμε μια λίστα με τα ονόματα συγγραφέων που χρησιμοποιεί το SVN, μπορούμε να εκτελέσουμε το εξής:

$ svn log --xml | grep author | sort -u | \
  perl -pe 's/.*>(.*?)<.*/$1 = /'

Αυτό δίνει την έξοδο του αρχείου καταγραφής σε μορφή XML, διατηρεί μόνο τις γραμμές με πληροφορίες συγγραφέα, απορρίπτει διπλότυπα, απομακρύνει τις ετικέτες XML. (Προφανώς αυτό λειτουργεί μόνο σε ένα μηχάνημα που έχει εγκατεστημένα τα προγράμματα grep, sort και perl.) Στη συνέχεια, ανακατευθύνουμε την έξοδο στο αρχείο users.txt, ώστε να μπορούμε να προσθέσουμε τα αντίστοιχα δεδομένα χρήστη Git δίπλα σε κάθε καταχώρηση.

Μπορούμε να δώσουμε αυτό το αρχείο στην git svn για να το βοηθήσουμε να αντιστοιχίσει τα δεδομένα των συγγραφέων με μεγαλύτερη ακρίβεια. Μπορούμε επίσης να πούμε στο git svn να μην συμπεριλάβει τα μεταδεδομένα που εισάγει το Subversion υπό κανονικές συνθήκες, περνώντας την επιλογή --no-metadata στην εντολή clone ή την init. Αυτό κάνει την εντολή import μας να μοιάζει με αυτή:

$ git svn clone http://my-project.googlecode.com/svn/ \
      --authors-file=users.txt --no-metadata -s my_project

Τώρα θα πρέπει να έχουμε μια καλύτερη εισαγωγή από το Subversion στον κατάλογο my_project. Αντί οι υποβολές που μοιάζουν με αυτό:

commit 37efa680e8473b615de980fa935944215428a35a
Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

    git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de-
    be05-5f7a86268029

μοιάζουν με αυτό:

commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2
Author: Scott Chacon <[email protected]>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

Όχι μόνο το πεδίο `Author'' φαίνεται πολύ καλύτερα, αλλά επιπλέον το `git-svn-id δεν βρίσκεται πια εκεί.

Θα πρέπει επίσης να κάνουμε ένα συμμαζεματάκι μετά την εισαγωγή. Καταρχάς, θα πρέπει να καθαρίσουμε τις περίεργες αναφορές που έβαλε η git svn. Αρχικά θα μετακινήσουμε τις ετικέτες έτσι ώστε να είναι πραγματικές ετικέτες και όχι περίεργοι απομακρυσμένοι κλάδοι και στη συνέχεια θα μετακινήσουμε τους υπόλοιπους κλάδους έτσι ώστε να είναι τοπικοί.

Για να μετακινήσουμε τις ετικέτες ώστε να είναι κατάλληλες ετικέτες Git, εκτελούμε:

$ cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
$ rm -Rf .git/refs/remotes/origin/tags

Το παραπάνω παίρνει τις αναφορές που ήταν απομακρυσμένοι κλάδοι που ξεκίνησαν με remotes/origin/tags/ και τα κάνει πραγματικές (ελαφριές) ετικέτες.

Στη συνέχεια μετακινούμε τις υπόλοιπες αναφορές του φακέλου refs/remotes ώστε να είναι τοπικοί κλάδοι:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/
$ rm -Rf .git/refs/remotes

Τώρα όλοι οι παλιοί κλάδοι είναι πραγματικοί κλάδοι Git και όλες οι παλιές ετικέτες είναι πραγματικές ετικέτες Git. Το τελευταίο πράγμα που πρέπει να κάνουμε είναι να προσθέσουμε τον νέο μας διακομιστή Git ως απομακρυσμένο και να τον ωθήσουμε. Ακολουθεί ένα παράδειγμα προσθήκης του διακομιστή μας ως απομακρυσμένου αποθετηρίου:

$ git remote add origin git@my-git-server:myrepository.git

Επειδή θέλουμε να ανέβουν όλοι οι κλάδοι και οι ετικέτες μας, μπορούμε τώρα να εκτελέσουμε το εξής:

$ git push origin --all

Όλοι οι κλάδοι μας και οι ετικέτες μας θα πρέπει να βρίσκονται στο νέο μας διακομιστή Git σε μια ωραία και καθαρή εισαγωγή.