Ако сте читали претходни одељак о коришћењу 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 репозиторијум, мораћете да очувате метаподатке.
Ако у свом логу комитова не желите синхронизацију, слободно изоставите параметар |
Тако да ваша 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
Сада би све ваше гране и ознаке требало да се налазе на Гит серверу након финог, чистог увоза.