Skip to content

Latest commit

 

History

History
144 lines (109 loc) · 8.75 KB

import-svn.asc

File metadata and controls

144 lines (109 loc) · 8.75 KB

Subversion

Ако сте читали претходни одељак о коришћењу git svn, та упутства можете лако да следите и направите git svn clone репозиторијума; па затим престанете да користите Subversion сервер, гурнете на нови Гит сервер и почнете то да користите. Ако вам је потребна историја, добићете је онолико брзо колико је потребно да повучете податке са Subversion сервера (што може да потраје).

Међутим, увоз није савршен; а пошто ће потрајати прилично дуго, такође можете да га урадите и како треба. Први проблем су информације о аутору. У програму Subversion, свака особа која комитује има корисничко име на систему које се бележи у комит информацијама. Примери у претходном одељку приказују на неким местима schacon, као што је излаз команди blame и git svn log. Ако ово желите да мапирате у боље Гит податке о аутору, потребно вам је мапирање из Subversion корисника на Гит ауторе. Креирајте фајл под именом 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 фајл тако да уз сваку ставку можете додати податке еквивалентног Гит корисника.

Note

Ако ово пробате на Виндоуз машини, на овом месту ћете наићи на проблем. Мајкрософт је понудио неколико добрих савета и примера на адреси https://docs.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git.

Овај фајл можете доставити команди git svn и помогнете јој да прецизније мапира податке о аутору. git svn такође можете наложити да не укључи метаподатке које Subversion обично увози, ако команди clone или init проследите --no-metadata. Метаподаци садрже git-svn-id у свакој комит поруци коју ће програм Гит генерисати током увоза. То ће да претрпа ваш Гит лог, па може постати донекле нејасан.

Note

Ако комитове направљене у Гит репозиторијуму желите да пресликате назад у оригинални SVN репозиторијум, мораћете да очувате метаподатке. Ако у свом логу комитова не желите синхронизацију, слободно изоставите параметар --no-metadata.

Тако да ваша import команда изгледа овако:

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

Сада би у my_project директоријуму требало да имате лепше увезене Subversion податке. Уместо да комитови изгледају на следећи начин:

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. Најпре ћете преместити ознаке тако заиста постану ознаке, е не чудне удаљене гране, па ћете затим преместити остатак грана тако да постану локалне.

Да би ознаке постале прописне Гит ознаке, извршите:

$ 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

Ово узима референце које су биле удаљене гране, а почињу на remotes/origin/tags/ и претвара их у праве (просте) ознаке.

Затим, преместите остатак референци под refs/remotes тако да постану локалне гране:

$ 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

Може се догодити да видите неке додатне гране које имају @xxx суфикс (где је xxx број), док у Subversion видите само једну грану. Ово је заправо Subversion могућност под називом „peg-revisions” и програм Гит за то једноставно нема одговарајући синтаксни елемент. Стога, git svn просто додаје број svn верзије имену гране на исти начин као што бисте ви и ви урадили у svn како би се обратили peg-ревизији те гране. Ако више не водите рачуна о peg-ревизијама, једноставно их уклоните:

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

Сада су све старе гране праве Гит гране и све старе ознаке праве Гит ознаке.

Постоји још једна ствар која треба да се почисти. Нажалост, git svn креира додатну грану под називом trunk и која се мапира на подразумевану грану у Subversion, али trunk референца показује на исто место као и master. Пошто master више одговара Гит стилу, ево како да уклоните додатну грану:

$ git branch -d trunk

Последња ствар који треба да урадите је да свој нови Гит сервер додате као удаљени репозиторијум и да гурнете на њега. Ево примера како да додате свој сервер као удаљени репозиторијум:

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

Пошто желите да све ваше гране и ознаке оду узводно, требало би да извршите следеће:

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

Сада би све ваше гране и ознаке требало да се налазе на Гит серверу након финог, чистог увоза.