Skip to content

Latest commit

 

History

History
144 lines (109 loc) · 5.77 KB

import-svn.asc

File metadata and controls

144 lines (109 loc) · 5.77 KB

Subversion

Če ste prebrali prejšnji razdelek o uporabi git svn, lahko enostavno uporabite ta navodila za git svn clone repozitorija; nato prenehajte uporabljati strežnik Subversion, potisnite na novi strežnik Git in ga začnite uporabljati. Če želite zgodovino, lahko to dosežete, kakor hitro lahko povlečete podatke iz strežnika Subversion (kar lahko vzame nekaj časa).

Vendar uvažanje ni popolno; in ker bo vzelo nekaj časa, lahko tudi naredite, kakor je prav. Prvi problem so informacije avtorja. V Subversionu ima vsaka oseba, ki potrjuje, uporabnika na sistemu, ki je posnet v informacijah potrditve. Primeri v prejšnjem razdelku prikazujejo na nekaterih mestih schacon, kot je izpis blame in git svn log. Če želite preslikati to na boljše podatke avtorja v Gitu, morate preslikati uporabnike iz Subversiona na avtorje Git. Ustvarite datoteko imenovano users.txt, ki ima to preslikavo v naslednji obliki:

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

Da dobite seznam imen avtorjev, ki jih uporablja SVN, lahko poženete to:

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

To generira izpis dnevnika v formatu XML, nato obdrži samo vrstice z informacijami avtorja, opusti duplikate in izpusti značke XML. Očitno to deluje samo na napravi z nameščenimi grep, sort in perl. Nato preusmerite ta izpis v vašo datoteko users.txt, da lahko dodate enakovredne podatke uporabnika Git zraven vsakega vnosa.

Note

Če to poskušate na napravi Windows, je to točka, kjer boste naleteli na težave. Microsoft je ponudil nekaj dobrih nasvetov in primerov na https://learn.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git.

To datoteko lahko ponudite git svn, da bolj točno pomaga preslikati podatke avtorja. Poveste lahko tudi, naj git svn ne vključuje metapodatkov, ki jih Subvestion običajno uvaža s podajanjem --no-metadata k ukazoma clone ali init. Ti metapodatki vključujejo git-svn-id znotraj vsakega sporočila potrditve, ki jih bo Git generiral med vnosom. To lahko napihne vaš dnevnik Git in ga naredi nekoliko nejasnega.

Note

Te metapodatke morate obdržati, ko želite prezrcaliti potrditve narejene v repozitoriju Git nazaj na prvotni repozitorij SVN. Če ne želite te sinhronizacije v svojem dnevniku potrditev, lahko tudi spustite parameter --no-metadata.

To naredi, da je vaš ukaz import videti naslednje:

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

Sedaj morate imeti lepši uvoz Subversiona v vašem direktoriju my_project. Namesto potrditev, ki so videti takole:

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

so videti takole:

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

    fixed install - go to trunk

Ne samo, da je polje Author videti veliko boljše, ampak tudi git-svn-id ni več tam.

Sedaj bi morali narediti tudi nekaj čiščenja po uvozu. Za eno stvar, bi morali počistiti čudne reference, ki jih je nastavil git svn. Najprej boste premaknili oznake, da so dejansko oznake namesto čudnih oddaljenih vej in nato boste premaknili preostanek vej, da so lokalne.

Da premaknete oznake, da so ustrezne oznake Git, poženite:

$ for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done

To vzame reference, ki so oddaljene veje in se začnejo z refs/remotes/tags/, ter jih naredi realne (enostavne) oznake.

Naslednje, premaknite preostanek referenc pod refs/remotes, da so lokalne veje:

$ for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done

Lahko se zgodi, da boste videli nekatere dodatne veje, ki nimajo pripone @xxx (kjer je xxx število), medtem ko boste v Subversion videli samo eno vejo. To je dejansko lastnost v Subversionu imenovana »peg-revisions«, kar je nekaj, za kar Git enostavno nima sintaktične protipostavke. Torej, git svn enostavno doda številko različice SVN k imenu veje na isti način, kot bi napisali, da naslovite SVN za peg-revision tiste veje. Če vas peg-revision ne skrbi več, jih enostavno odstranite:

$ for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done

Sedaj so vse stare veje prave veje Git in vse stare oznake so prave oznake Git.

Še nekaj je treba počistiti. Na žalost git svn ustvari dodatno vejo imenovano trunk, ki preslika privzete veje Subversiona, vendar pa kaže točka ref trunk na isto mesto kot master. Ker je master idiomatsko bolj Gitov, takole odstranite dodatno vejo:

$ git branch -d trunk

Zadnja stvar, ki jo morate narediti, je dodati vaš novi strežnik Git kot daljavo in potisniti nanj. Tu je primer dodajanja vašega strežnika kot daljavo:

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

Ker želite dodati gor vse vaše veje in oznake, lahko sedaj poženete to:

$ git push origin --all
$ git push origin --tags

Vse vaše veje in oznake bi morale biti na vašem novem strežniku Git z lepim in čistim uvozom.